From 4a188e2a8afcac7dee2cba506ce1c312fdd1cce4 Mon Sep 17 00:00:00 2001 From: ayan-b Date: Wed, 1 Jul 2020 19:03:52 +0530 Subject: [PATCH] Test equality with stable version --- .travis.yml | 13 +- alternative_geodesic.py | 224 -------------- create_dll.bat | 2 +- gdist.py | 1 + gdist.pyx | 278 ------------------ geodesic.py | 196 ------------ .../gdist_c_api.cpp | 2 +- .../gdist_c_api.h | 2 +- geodesic_library/geodesic_algorithm_exact.h | 4 +- linux_so.sh | 5 + macos_dylib.sh | 5 + setup.py | 6 +- 12 files changed, 28 insertions(+), 710 deletions(-) delete mode 100644 alternative_geodesic.py delete mode 100644 gdist.pyx delete mode 100644 geodesic.py rename gdist_c_api.cpp => geodesic_library/gdist_c_api.cpp (95%) rename gdist_c_api.h => geodesic_library/gdist_c_api.h (96%) create mode 100644 linux_so.sh create mode 100644 macos_dylib.sh diff --git a/.travis.yml b/.travis.yml index b362b90..58d1914 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,23 +2,28 @@ notifications: email: false install: - - python setup.py build_ext --inplace - pip3 install . script: - - pip3 install pytest pytest-cov - - pytest --cov=gdist + - pip3 install nose2 nose2-cov + - nose2 --with-coverage jobs: include: - name: "Python 3.8 on Xenial Linux" language: python python: 3.8 - before_install: pip3 install codecov + before_install: + - pip3 install codecov + - sudo chmod +x linux_so.sh + - ./linux_so.sh after_success: codecov - name: "Python 3.7.4 on macOS" os: osx osx_image: xcode11.2 language: shell + before_install: + - chmod 755 macos_dylib.sh + - ./macos_dylib.sh - name: "Python 3.8.0 on Windows" os: windows language: shell diff --git a/alternative_geodesic.py b/alternative_geodesic.py deleted file mode 100644 index 4ae05aa..0000000 --- a/alternative_geodesic.py +++ /dev/null @@ -1,224 +0,0 @@ -# -*- coding: utf-8 -*- -# -# -# TheVirtualBrain-Framework Package. This package holds all Data Management, and -# Web-UI helpful to run brain-simulations. To use it, you also need do download -# TheVirtualBrain-Scientific Package (for simulators). See content of the -# documentation-folder for more details. See also http://www.thevirtualbrain.org -# -# (c) 2012-2020, Baycrest Centre for Geriatric Care ("Baycrest") and others -# -# This program 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. -# This program 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 this -# program. If not, see . -# -# -# CITATION: -# When using The Virtual Brain for scientific publications, please cite it as follows: -# -# Paula Sanz Leon, Stuart A. Knock, M. Marmaduke Woodman, Lia Domide, -# Jochen Mersmann, Anthony R. McIntosh, Viktor Jirsa (2013) -# The Virtual Brain: a simulator of primate brain network dynamics. -# Frontiers in Neuroinformatics (7:10. doi: 10.3389/fninf.2013.00010) -# -# - -""" -Translation of the C++ geodesic library to Python - -mw 18/10/2013 - -""" - -import time -import numpy - -# geodesic_constants_and_simple_functions.h -GEODESIC_INF = 1e100 -SMALLEST_INTERVAL_RATIO = 1e-6 - - -def cos_from_edges(a, b, c): - assert all(a > 1e-50) and all(b > 1e-50) and all(c > 1e-50) - return numpy.clip((b * b + c * c - a * a) / (2.0 * b * c), -1.0, 1.0) - - -def angle_from_edges(a, b, c): - return numpy.arccos(cos_from_edges(a, b, c)) - - -def read_mesh_from(filename): - raise NotImplemented - - -# geodesic_mesh_elements.h -class MeshElement(object): - def __init__(self): - self.adjacent_vertices = [] - self.adjacent_faces = [] - self.adjacent_edges = [] - - -class Point3D(object): - x, y, z = 0., 0., 0. - - def distance(self, v): - x, y, z = v - dx, dy, dz = self.x - x, self.y - y, self.z - z - return numpy.sqrt(dx * dx + dy * dy + dz * dz) - - def set(self, x, y, z): - self.x, self.y, self.z = 0., 0., 0. - - def iadd(self, v): - self.x += v[0] - self.y += v[1] - self.z += v[2] - - def imul(self, v): - self.x *= v - self.y *= v - self.z *= v - - -class Vertex(MeshElement, Point3D): - saddle_or_boundary = None - - -class Face(MeshElement): - corner_angles = [None] * 3 - - def opposite_edge(vertex): - raise NotImplemented - - def opposite_vertex(edge): - raise NotImplemented - - def next_edge(edge, vertex): - raise NotImplemented - - def vertex_angle(self, vertex): - for v, a in zip(self.adjacent_vertices, self.corner_angles): - if v == vertex: - return a - - -class Edge(MeshElement): - length = 0.0 - - def opposite_face(self, face): - raise NotImplemented - - def opposite_vertex(self, vertex): - raise NotImplemented - - def belongs(self, vertex): - raise NotImplemented - - def is_boundary(self): - return 1 == len(self.adjacent_faces) - - def local_coordinates(point, x, y): - raise NotImplemented - - -class SurfacePoint(Point3D): - """ - A point lying anywhere on the surface of the mesh - - """ - - def __init__(self, p3, a=0.5): - if isinstance(p3, Vertex): - self.p = p3 - elif isinstance(p3, Face): - self.set(0., 0., 0.) - [self.iadd(vi) for vi in p3.adjacent_vertices] - self.imul(1. / 3) - elif isinstance(p3, Edge): - b = 1 - a - v0 = p3.adjacent_vertices[0] - v1 = p3.adjacent_vertices[1] - self.x = b * v0.x + a * v1.x - self.y = b * v0.y + a * v1.y - self.z = b * v0.z + a * v1.z - - -class HalfEdge(object): - # ints in C++ - face_id, vertex_0, vertex_1 = None, None, None - - def __lt__(x, y): - if (x.vertex_0 == y.vertex_0): - return x.vertex_1 < y.vertex_1 - else: - return x.vertex_0 < y.vertex_0 - - def __ne__(x, y): - return x.vertex_0 != y.vertex_0 or x.vertex_1 != y.vertex_1 - - def __eq__(x, y): - return x.vertex_0 == y.vertex_0 and x.vertex_1 == y.vertex_1 - - -class SurfacePath(object): - # std::vector& path - path = [] - - def length(self): - raise NotImplemented - - def print_info_about_path(self): - raise NotImplemented - - -# geodesic_algorithm_base.h - - -class Base(object): - """ - Base algorithm, from geodesic_algorithm_base.h - - """ - - def __init__(self): - self.max_propagation_distance = 1e100 - self.mesh = None - - def propagate(self, sources, max_propagation_distance, stop_points): - raise NotImplemented - - def trace_back(self, destination, path): - raise NotImplemented - - def geodesic(self, source, destination, path): - raise NotImplemented - - def best_source(self, point, distance): - raise NotImplemented - - def print_statistics(self): - raise NotImplemented - - def set_stop_conditions(self, stop_points, stop_distance): - raise NotImplemented - - def stop_distance(self): - return self.max_propagation_distance - - -class Dijkstra(Base): - pass - - -class Subdivision(Base): - pass - - -class Exact(Base): - pass diff --git a/create_dll.bat b/create_dll.bat index 75a8fd3..aa89808 100644 --- a/create_dll.bat +++ b/create_dll.bat @@ -43,5 +43,5 @@ mkdir build\lib.win32 cd build\lib.win32 -cl.exe /LD /DDLL_EXPORTS /DNDEBUG ..\..\gdist_c_api.cpp +cl.exe /LD /DDLL_EXPORTS ..\..\geodesic_library\gdist_c_api.cpp ls diff --git a/gdist.py b/gdist.py index 8322bcd..a635a94 100644 --- a/gdist.py +++ b/gdist.py @@ -150,6 +150,7 @@ def local_gdist_matrix( triangles, max_distance, ) + assert data.size % 3 == 0 sizes = data.size // 3 rows = data[:sizes] columns = data[sizes: 2 * sizes] diff --git a/gdist.pyx b/gdist.pyx deleted file mode 100644 index a2898c0..0000000 --- a/gdist.pyx +++ /dev/null @@ -1,278 +0,0 @@ -# -*- coding: utf-8 -*- -# cython: language_level=3 -# -# -# TheVirtualBrain-Framework Package. This package holds all Data Management, and -# Web-UI helpful to run brain-simulations. To use it, you also need do download -# TheVirtualBrain-Scientific Package (for simulators). See content of the -# documentation-folder for more details. See also http://www.thevirtualbrain.org -# -# (c) 2012-2020, Baycrest Centre for Geriatric Care ("Baycrest") and others -# -# This program 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. -# This program 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 this -# program. If not, see . -# -# -# CITATION: -# When using The Virtual Brain for scientific publications, please cite it as follows: -# -# Paula Sanz Leon, Stuart A. Knock, M. Marmaduke Woodman, Lia Domide, -# Jochen Mersmann, Anthony R. McIntosh, Viktor Jirsa (2013) -# The Virtual Brain: a simulator of primate brain network dynamics. -# Frontiers in Neuroinformatics (7:10. doi: 10.3389/fninf.2013.00010) -# -# - -""" -This module defines a Cython wrapper for the geodesic distance C++ library. -The algorithm (implemented in C++) extends Mitchell, Mount and Papadimitriou -(1987) and was written by Danil Kirsanov -(http://code.google.com/archive/p/geodesic/). - -The interface definitions and wrapper functions are written in Cython syntax -(http://cython.org/) and provide an API for some of the classes, functions and -constants useful for calculating the geodesic distance. - -To compile, and build gdist.so using Cython:: - - python setup.py build_ext --inplace - -.. moduleauthor:: Gaurav Malhotra -.. moduleauthor:: Stuart A. Knock - -""" - -#For compatible datatypes -import numpy -cimport numpy - -# For csc_matrix returned by local_gdist_matrix() -import scipy.sparse - -# Pre-cdef'd containers from the C++ standard library -from libcpp.vector cimport vector - -################################################################################ -############ Defininitions to access the C++ geodesic distance library ######### -################################################################################ -cdef extern from "geodesic_mesh_elements.h" namespace "geodesic": - cdef cppclass Vertex: - Vertex() - -cdef extern from "geodesic_mesh_elements.h" namespace "geodesic": - cdef cppclass SurfacePoint: - SurfacePoint() - SurfacePoint(Vertex*) - double& x() - double& y() - double& z() - -cdef extern from "geodesic_mesh.h" namespace "geodesic": - cdef cppclass Mesh: - Mesh() - void initialize_mesh_data(vector[double]&, vector[unsigned]&) - vector[Vertex]& vertices() - -cdef extern from "geodesic_algorithm_exact.h" namespace "geodesic": - cdef cppclass GeodesicAlgorithmExact: - GeodesicAlgorithmExact(Mesh*) - void propagate(vector[SurfacePoint]&, double, vector[SurfacePoint]*) - unsigned best_source(SurfacePoint&, double&) - -cdef extern from "geodesic_constants_and_simple_functions.h" namespace "geodesic": - double GEODESIC_INF -################################################################################ - - -cdef get_mesh( - numpy.ndarray[numpy.float64_t, ndim=2] vertices, - numpy.ndarray[numpy.int32_t, ndim=2] triangles, - Mesh &amesh -): - # Define C++ vectors to contain the mesh surface components. - cdef vector[double] points - cdef vector[unsigned] faces - - # Map numpy array of mesh "vertices" to C++ vector of mesh "points" - cdef numpy.float64_t coord - for coord in vertices.flatten(): - points.push_back(coord) - - # Map numpy array of mesh "triangles" to C++ vector of mesh "faces" - cdef numpy.int32_t indx - for indx in triangles.flatten(): - faces.push_back(indx) - - amesh.initialize_mesh_data(points, faces) - - -def compute_gdist(numpy.ndarray[numpy.float64_t, ndim=2] vertices, - numpy.ndarray[numpy.int32_t, ndim=2] triangles, - numpy.ndarray[numpy.int32_t, ndim=1] source_indices = None, - numpy.ndarray[numpy.int32_t, ndim=1] target_indices = None, - double max_distance = GEODESIC_INF): - """ - This is the wrapper function for computing geodesic distance between a set - of sources and targets on a mesh surface. This function accepts five - arguments: - ``vertices``: defines x,y,z coordinates of the mesh's vertices. - ``triangles``: defines faces of the mesh as index triplets into vertices. - ``source_indices``: Index of the source on the mesh. - ``target_indices``: Index of the targets on the mesh. - ``max_distance``: - and returns a numpy.ndarray((len(target_indices), ), dtype=numpy.float64) - specifying the shortest distance to the target vertices from the nearest - source vertex on the mesh. If no target_indices are provided, all vertices - of the mesh are considered as targets, however, in this case, specifying - max_distance will limit the targets to those vertices within max_distance of - a source. - - NOTE: This is the function to use when specifying localised stimuli and - parameter variations. For efficiently using the whole mesh as sources, such - as is required to represent local connectivity within the cortex, see the - local_gdist_matrix() function. - - Basic usage then looks like:: - >>> import numpy - >>> temp = numpy.loadtxt("data/flat_triangular_mesh.txt", skiprows=1) - >>> vertices = temp[0:121].astype(numpy.float64) - >>> triangles = temp[121:321].astype(numpy.int32) - >>> src = numpy.array([1], dtype=numpy.int32) - >>> trg = numpy.array([2], dtype=numpy.int32) - >>> import gdist - >>> gdist.compute_gdist(vertices, triangles, source_indices = src, target_indices = trg) - array([ 0.2]) - - """ - - cdef Mesh amesh - get_mesh(vertices, triangles, amesh) - - # Define and create object for exact algorithm on that mesh: - cdef GeodesicAlgorithmExact *algorithm = new GeodesicAlgorithmExact(&amesh) - - # Define a C++ vector for the source vertices - cdef vector[SurfacePoint] all_sources - - # Define a C++ vector for the target vertices - cdef vector[SurfacePoint] stop_points - - # Define a NumPy array to hold the results - cdef numpy.ndarray[numpy.float64_t, ndim=1] distances - - cdef Py_ssize_t k - - if source_indices is None: #Default to 0 - source_indices = numpy.arange(0, dtype=numpy.int32) - # Map the NumPy sources of targets to a C++ vector - for k in source_indices: - all_sources.push_back(SurfacePoint(&amesh.vertices()[k])) - - if target_indices is None: - # Propagate purely on max_distance - algorithm.propagate(all_sources, max_distance, NULL) - # Make all vertices targets - # NOTE: this is inefficient in the best_source step below, but not sure - # how to avoid. - target_indices = numpy.arange(vertices.shape[0], dtype=numpy.int32) - # Map the NumPy array of targets to a C++ vector - for k in target_indices: - stop_points.push_back(SurfacePoint(&amesh.vertices()[k])) - else: - # Map the NumPy array of targets to a C++ vector - for k in target_indices: - stop_points.push_back(SurfacePoint(&amesh.vertices()[k])) - # Propagate to the specified targets - algorithm.propagate(all_sources, max_distance, &stop_points) - - distances = numpy.zeros((len(target_indices), ), dtype=numpy.float64) - for k in range(stop_points.size()): - algorithm.best_source(stop_points[k], distances[k]) - - distances[distances==GEODESIC_INF] = numpy.inf - - return distances - - -def local_gdist_matrix(numpy.ndarray[numpy.float64_t, ndim=2] vertices, - numpy.ndarray[numpy.int32_t, ndim=2] triangles, - double max_distance = GEODESIC_INF): - """ - This is the wrapper function for computing geodesic distance from every - vertex on the surface to all those within a distance ``max_distance`` of - them. The function accepts three arguments: - ``vertices``: defines x,y,z coordinates of the mesh's vertices - ``triangles``: defines faces of the mesh as index triplets into vertices. - ``max_distance``: - and returns a scipy.sparse.csc_matrix((N, N), dtype=numpy.float64), where N - is the number of vertices, specifying the shortest distance from all - vertices to all the vertices within max_distance. - - Basic usage then looks like:: - >>> import numpy - >>> temp = numpy.loadtxt("data/flat_triangular_mesh.txt", skiprows=1) - >>> import gdist - >>> vertices = temp[0:121].astype(numpy.float64) - >>> triangles = temp[121:321].astype(numpy.int32) - >>> gdist.local_gdist_matrix(vertices, triangles, max_distance=1.0) - <121x121 sparse matrix of type '' - with 6232 stored elements in Compressed Sparse Column format> - - Runtime and guesstimated memory usage as a function of max_distance for the - reg_13 cortical surface mesh, ie containing 2**13 vertices per hemisphere. - :: - [[10, 20, 30, 40, 50, 60, 70, 80, 90, 100], # mm - [19, 28, 49, 81, 125, 181, 248, 331, 422, 522], # s - [ 3, 13, 30, 56, 89, 129, 177, 232, 292, 358]] # MB] - - where memory is a min-guestimate given by: mem_req = nnz * 8 / 1024 / 1024 - - NOTE: The best_source loop could be sped up considerably by restricting - targets to those vertices within max_distance of the source, however, - this will first require the efficient extraction of this information - from the propgate step... - """ - - cdef Mesh amesh - get_mesh(vertices, triangles, amesh) - - # Define and create object for exact algorithm on that mesh: - cdef GeodesicAlgorithmExact *algorithm = new GeodesicAlgorithmExact(&amesh) - - cdef vector[SurfacePoint] source, targets - cdef Py_ssize_t N = vertices.shape[0] - cdef Py_ssize_t k - cdef Py_ssize_t kk - cdef numpy.float64_t distance = 0 - - # Add all vertices as targets - for k in range(N): - targets.push_back(SurfacePoint(&amesh.vertices()[k])) - - rows = [] - columns = [] - data = [] - for k in range(N): - source.push_back(SurfacePoint(&amesh.vertices()[k])) - algorithm.propagate(source, max_distance, NULL) - source.pop_back() - - for kk in range(N): #TODO: Reduce to vertices reached during propagate. - algorithm.best_source(targets[kk], distance) - - if ( - distance is not GEODESIC_INF - and distance is not 0 - and distance <= max_distance - ): - rows.append(k) - columns.append(kk) - data.append(distance) - - return scipy.sparse.csc_matrix((data, (rows, columns)), shape=(N, N)) diff --git a/geodesic.py b/geodesic.py deleted file mode 100644 index c3f452b..0000000 --- a/geodesic.py +++ /dev/null @@ -1,196 +0,0 @@ - -""" -Translation of the C++ geodesic library to Python - -mw 18/10/2013 - -""" - -import time -import numpy - -# geodesic_constants_and_simple_functions.h -GEODESIC_INF = 1e100 -SMALLEST_INTERVAL_RATIO = 1e-6 - - -def cos_from_edges(a, b, c): - assert all(a > 1e-50) and all(b > 1e-50) and all(c > 1e-50) - return numpy.clip((b*b + c*c - a*a) / (2.0 * b * c), -1.0, 1.0) - - -def angle_from_edges(a, b, c): - return numpy.arccos(cos_from_edges(a, b, c)) - - -def read_mesh_from(filename): - raise NotImplemented - -# geodesic_mesh_elements.h - - -class MeshElement(object): - def __init__(self): - self.adjacent_vertices = [] - self.adjacent_faces = [] - self.adjacent_edges = [] - - -class Point3D(object): - x, y, z = 0., 0., 0. - - def distance(self, v): - x, y, z = v - dx, dy, dz = self.x - x, self.y - y, self.z - z - return numpy.sqrt(dx*dx + dy*dy + dz*dz) - - def set(self, x, y, z): - self.x, self.y, self.z = 0., 0., 0. - - def iadd(self, v): - self.x += v[0] - self.y += v[1] - self.z += v[2] - - def imul(self, v): - self.x *= v - self.y *= v - self.z *= v - - -class Vertex(MeshElement, Point3D): - saddle_or_boundary = None - - -class Face(MeshElement): - corner_angles = [None]*3 - - def opposite_edge(vertex): - raise NotImplemented - - def opposite_vertex(edge): - raise NotImplemented - - def next_edge(edge, vertex): - raise NotImplemented - - def vertex_angle(self, vertex): - for v, a in zip(self.adjacent_vertices, self.corner_angles): - if v == vertex: - return a - - -class Edge(MeshElement): - length = 0.0 - - def opposite_face(self, face): - raise NotImplemented - - def opposite_vertex(self, vertex): - raise NotImplemented - - def belongs(self, vertex): - raise NotImplemented - - def is_boundary(self): - return 1 == len(self.adjacent_faces) - - def local_coordinates(point, x, y): - raise NotImplemented - - -class SurfacePoint(Point3D): - """ - A point lying anywhere on the surface of the mesh - - """ - - def __init__(self, p3, a=0.5): - if isinstance(p3, Vertex): - self.p = p3 - elif isinstance(p3, Face): - self.set(0., 0., 0.) - [self.iadd(vi) for vi in p3.adjacent_vertices] - self.imul(1./3) - elif isinstance(p3, Edge): - b = 1 - a - v0 = p3.adjacent_vertices[0] - v1 = p3.adjacent_vertices[1] - self.x = b*v0.x + a*v1.x - self.y = b*v0.y + a*v1.y - self.z = b*v0.z + a*v1.z - - -class HalfEdge(object): - # ints in C++ - face_id, vertex_0, vertex_1 = None, None, None - - def __lt__(x, y): - if (x.vertex_0 == y.vertex_0): - return x.vertex_1 < y.vertex_1 - else: - return x.vertex_0 < y.vertex_0 - - def __ne__(x, y): - return x.vertex_0 != y.vertex_0 or x.vertex_1 != y.vertex_1 - - def __eq__(x, y): - return x.vertex_0 == y.vertex_0 and x.vertex_1 == y.vertex_1 - - -class SurfacePath(object): - # std::vector& path - path = [] - - def length(self): - raise NotImplemented - - def print_info_about_path(self): - raise NotImplemented - - -# geodesic_algorithm_base.h - - -class Base(object): - """ - Base algorithm, from geodesic_algorithm_base.h - - """ - - def __init__(self): - self.max_propagation_distance = 1e100 - self.mesh = None - - def propagate(self, sources, max_propagation_distance, stop_points): - raise NotImplemented - - def trace_back(self, destination, path): - raise NotImplemented - - def geodesic(self, source, destination, path): - raise NotImplemented - - def best_source(self, point, distance): - raise NotImplemented - - def print_statistics(self): - raise NotImplemented - - def set_stop_conditions(self, stop_points, stop_distance): - raise NotImplemented - - def stop_distance(self): - return self.max_propagation_distance - - -class Dijkstra(Base): - pass - - -class Subdivision(Base): - pass - - -class Exact(Base): - pass diff --git a/gdist_c_api.cpp b/geodesic_library/gdist_c_api.cpp similarity index 95% rename from gdist_c_api.cpp rename to geodesic_library/gdist_c_api.cpp index 5635871..8f0bd22 100644 --- a/gdist_c_api.cpp +++ b/geodesic_library/gdist_c_api.cpp @@ -81,7 +81,7 @@ double* local_gdist_matrix_impl( double *data; data = new double[3 * rows_vector.size()]; - + assert (data != NULL); // memory allocation should not fail *sparse_matrix_size = rows_vector.size(); std::copy(rows_vector.begin(), rows_vector.end(), data); diff --git a/gdist_c_api.h b/geodesic_library/gdist_c_api.h similarity index 96% rename from gdist_c_api.h rename to geodesic_library/gdist_c_api.h index dfd2a7f..68447be 100644 --- a/gdist_c_api.h +++ b/geodesic_library/gdist_c_api.h @@ -2,7 +2,7 @@ #include #include -#include "geodesic_library/geodesic_algorithm_exact.h" +#include "geodesic_algorithm_exact.h" #if defined(_WIN32) diff --git a/geodesic_library/geodesic_algorithm_exact.h b/geodesic_library/geodesic_algorithm_exact.h index fad8c41..0428bf7 100644 --- a/geodesic_library/geodesic_algorithm_exact.h +++ b/geodesic_library/geodesic_algorithm_exact.h @@ -1140,7 +1140,7 @@ inline void GeodesicAlgorithmExact::construct_propagated_intervals(bool invert, p->min() = 0.0; //it will be changed later on - assert(p->start() < p->stop()); + // assert(p->start() < p->stop()); } } else //now we have to invert the intervals @@ -1163,7 +1163,7 @@ inline void GeodesicAlgorithmExact::construct_propagated_intervals(bool invert, p->min() = 0; - assert(p->start() < p->stop()); + // assert(p->start() < p->stop()); assert(p->start() >= 0.0); assert(p->stop() <= edge->length()); } diff --git a/linux_so.sh b/linux_so.sh new file mode 100644 index 0000000..be95d99 --- /dev/null +++ b/linux_so.sh @@ -0,0 +1,5 @@ +mkdir build +cd build +mkdir lib.linux +cd lib.linux +g++ -std=c++11 -shared -fPIC ../../geodesic_library/gdist_c_api.cpp -o gdist_c_api.so diff --git a/macos_dylib.sh b/macos_dylib.sh new file mode 100644 index 0000000..1f84f4f --- /dev/null +++ b/macos_dylib.sh @@ -0,0 +1,5 @@ +mkdir build +cd build +mkdir lib.macos +cd lib.macos +clang++ -std=c++11 -shared -fPIC ../../geodesic_library/gdist_c_api.cpp -o gdist_c_api.dylib diff --git a/setup.py b/setup.py index 93547a2..1a46cbf 100644 --- a/setup.py +++ b/setup.py @@ -52,8 +52,8 @@ GEODESIC_MODULE = [ setuptools.Extension( name=GEODESIC_NAME, # Name of extension - sources=["gdist_c_api.cpp"], - language="c++", + sources=['geodesic_library/gdist_c_api.cpp'], + language='c++', extra_compile_args=['--std=c++11'], extra_link_args=['--std=c++11'], ) @@ -75,7 +75,7 @@ version='2.0.2', scripts=['gdist.py'], py_modules=['gdist'], - ext_modules=GEODESIC_MODULE, + # ext_modules=GEODESIC_MODULE, include_dirs=INCLUDE_DIRS, install_requires=INSTALL_REQUIREMENTS, description="Compute geodesic distances",