As part of the discussed reorg of vector and matrix stuff, here is the patch to switch to a d-dimensional implementation for vectors.
In order to do nice error checking it adds a preprocessor macro to the _wrap compilation which is used to disable the compile time checks (since SWIG instantiates all methods, for obvious reasons) and replace them with runtime checks.
For some reason I need a typedef for Vector3D in each of the module .i files. I don't see why, but I can't get things to work without it.
Index: kernel/test/misc/test_vector3d.py =================================================================== --- kernel/test/misc/test_vector3d.py (revision 855) +++ kernel/test/misc/test_vector3d.py (working copy) @@ -94,6 +94,11 @@ for i in range(3): self.assertEqual(prod[i], expected_prod[i]) self.assertEqual(v1[i], expected_prod[i]) + def test_generators(self): + """Check the Vector3D generators""" + # test calling since it is a bit non-trivial in SWIG + v= IMP.random_vector_in_unit_sphere() + v= IMP.random_vector_in_sphere(IMP.Vector3D(0,0,0), 1)
if __name__ == '__main__': unittest.main() Index: kernel/include/Vector3D.h =================================================================== --- kernel/include/Vector3D.h (revision 855) +++ kernel/include/Vector3D.h (working copy) @@ -8,7 +8,7 @@ #ifndef IMP_VECTOR_3D_H #define IMP_VECTOR_3D_H
-#include "IMP_config.h" +#include "VectorD.h" #include "base_types.h" #include "macros.h" #include "exception.h" @@ -17,199 +17,8 @@
IMP_BEGIN_NAMESPACE
-//! Simple 3D vector class -/** \ingroup helper - */ -class IMPDLLEXPORT Vector3D -{ - bool is_default() const {return false;} -public: - // public for swig - typedef Vector3D This; +typedef VectorD<3> Vector3D;
- //! Initialize the vector from separate x,y,z values. - Vector3D(Float x, Float y, Float z) { - vec_[0] = x; - vec_[1] = y; - vec_[2] = z; - } - - //! Default constructor - Vector3D() {} - - IMP_COMPARISONS_3(vec_[0], vec_[1], vec_[2]); - - //! \return A single component of this vector (0-2). - Float operator[](unsigned int i) const { - IMP_assert(i < 3, "Invalid component of vector requested"); - return vec_[i]; - } - - //! \return A single component of this vector (0-2). - Float& operator[](unsigned int i) { - IMP_assert(i < 3, "Invalid component of vector requested"); - return vec_[i]; - } - - //! \return the scalar product of two vectors. - /** \param[in] vec2 The other vector to use in the product. - */ - Float scalar_product(const Vector3D &vec2) const { - return vec_[0] * vec2.vec_[0] + vec_[1] * vec2.vec_[1] - + vec_[2] * vec2.vec_[2]; - } - - //! scalar product - Float operator*(const Vector3D &o) const { - return scalar_product(o); - } - - //! product with scalar - Vector3D operator*(Float s) const { - return Vector3D(operator[](0) * s, - operator[](1) * s, - operator[](2) * s); - } - - //! divide by a scalar - Vector3D operator/(Float s) const { - return Vector3D(operator[](0) / s, - operator[](1) / s, - operator[](2) / s); - } - - //! negation - Vector3D operator-() const { - return Vector3D(-operator[](0), - -operator[](1), - -operator[](2)); - } - - //! \return the vector product of two vectors. - /** \param[in] vec2 The other vector to use in the product. - */ - Vector3D vector_product(const Vector3D &vec2) const { - return Vector3D(vec_[1] * vec2.vec_[2] - vec_[2] * vec2.vec_[1], - vec_[2] * vec2.vec_[0] - vec_[0] * vec2.vec_[2], - vec_[0] * vec2.vec_[1] - vec_[1] * vec2.vec_[0]); - } - - //! \return The square of the magnitude of this vector. - Float get_squared_magnitude() const { - return vec_[0] * vec_[0] + vec_[1] * vec_[1] + vec_[2] * vec_[2]; - } - - //! \return The magnitude of this vector. - Float get_magnitude() const { - return std::sqrt(get_squared_magnitude()); - } - - //! \return This vector normalized to unit length. - Vector3D get_unit_vector() const { - Float mag = get_magnitude(); - // avoid division by zero - mag = std::max(mag, static_cast<Float>(1e-12)); - return Vector3D(vec_[0] / mag, vec_[1] / mag, vec_[2] / mag); - } - - //! \return Difference between two vectors. - Vector3D operator-(const Vector3D &o) const { - return Vector3D(operator[](0)-o[0], - operator[](1)-o[1], - operator[](2)-o[2]); - } - - //! \return Sum of two vectors. - Vector3D operator+(const Vector3D &o) const { - return Vector3D(operator[](0) + o[0], - operator[](1) + o[1], - operator[](2) + o[2]); - } - - //! Accumulate the vector - Vector3D& operator+=(const Vector3D &o) { - vec_[0] += o[0]; - vec_[1] += o[1]; - vec_[2] += o[2]; - return *this; - } - - //! Rescale the vector - Vector3D& operator/=(Float f) { - vec_[0] /= f; - vec_[1] /= f; - vec_[2] /= f; - return *this; - } - - //! Rescale the vector - Vector3D& operator*=(Float f) { - vec_[0] *= f; - vec_[1] *= f; - vec_[2] *= f; - return *this; - } - - void show(std::ostream &out=std::cout) const { - out << "(" << operator[](0) << ", " << operator[](1) << ", " - << operator[](2) << ")"; - } - -private: - Float vec_[3]; -}; - -IMP_OUTPUT_OPERATOR(Vector3D); - - -//! product with scalar -inline Vector3D operator*(Float s, const Vector3D &o) { - return Vector3D(o[0]*s, - o[1]*s, - o[2]*s); -} - -//! Generate a random vector in a box with uniform density -IMPDLLEXPORT Vector3D -random_vector_in_box(const Vector3D &lb=Vector3D(0,0,0), - const Vector3D &ub=Vector3D(10,10,10)); - -//! Generate a random vector in a sphere with uniform density -IMPDLLEXPORT Vector3D -random_vector_in_sphere(const Vector3D ¢er=Vector3D(0,0,0), - Float radius=1); - -//! Generate a random vector on a sphere with uniform density -IMPDLLEXPORT Vector3D -random_vector_on_sphere(const Vector3D ¢er=Vector3D(0,0,0), - Float radius=1); - -struct SpacesIO -{ - const Vector3D &v_; - SpacesIO(const Vector3D &v): v_(v){} -}; - - -inline std::ostream &operator<<(std::ostream &out, const SpacesIO &s) -{ - out << s.v_[0] << " " << s.v_[1] << " " << s.v_[2]; - return out; -} - -struct CommasIO -{ - const Vector3D &v_; - CommasIO(const Vector3D &v): v_(v){} -}; - - -inline std::ostream &operator<<(std::ostream &out, const CommasIO &s) -{ - out << s.v_[0] << ", " << s.v_[1] << ", " << s.v_[2]; - return out; -} - IMP_END_NAMESPACE
#endif /* IMP_VECTOR_3D_H */ Index: kernel/include/SConscript =================================================================== --- kernel/include/SConscript (revision 855) +++ kernel/include/SConscript (working copy) @@ -4,7 +4,7 @@ 'Particle.h', 'ScoreState.h', 'OptimizerState.h', 'IMP_config.h', 'log.h', 'DerivativeAccumulator.h', 'Key.h', 'utility.h', 'Restraint.h', 'Optimizer.h', - 'DecoratorBase.h', 'Vector3D.h', + 'DecoratorBase.h', 'Vector3D.h', 'VectorD.h', 'UnaryFunction.h', 'PairScore.h', 'SingletonScore.h', 'macros.h', 'TripletScore.h', 'exception.h', 'VersionInfo.h', 'Object.h', 'Pointer.h', 'RefCountedObject.h', 'ParticleRefiner.h'] Index: kernel/include/VectorD.h =================================================================== --- kernel/include/VectorD.h (revision 0) +++ kernel/include/VectorD.h (revision 0) @@ -0,0 +1,365 @@ +/** + * \File VectorD.h \brief Simple D vector class. + * + * Copyright 2007-8 Sali Lab. All rights reserved. + * + */ + +#ifndef IMP_VECTOR_D_H +#define IMP_VECTOR_D_H + +#include "IMP_config.h" +#include "base_types.h" +#include "macros.h" +#include "exception.h" +#include "random.h" +#include "internal/constants.h" + +#include <boost/random/uniform_real.hpp> + +#include <cmath> + +IMP_BEGIN_NAMESPACE + +//! Simple D vector class +/** \ingroup helper + */ +template <unsigned int D> +class IMPDLLEXPORT VectorD +{ + bool is_default() const {return false;} +public: + // public for swig + typedef VectorD<D> This; + + //! Initialize the 3-vector from separate x,y,z values. + VectorD(Float x, Float y) { +#ifdef SWIG_WRAPPER + IMP_check(D==2, "Need " << D << " to construct a " + << D << "-vector.", ValueException); +#else + BOOST_STATIC_ASSERT(D==2); +#endif + vec_[0] = x; + vec_[1] = y; + } + + //! Initialize the 2-vector from separate x,y values. + VectorD(Float x, Float y, Float z) { +#ifdef SWIG_WRAPPER + IMP_check(D==3, "Need " << D << " to construct a " + << D << "-vector.", ValueException); +#else + BOOST_STATIC_ASSERT(D==3); +#endif + vec_[0] = x; + vec_[1] = y; + vec_[2] = z; + } + + //! Initialize the 2-vector from separate x,y values. + VectorD(Float w, Float x, Float y, Float z) { +#ifdef SWIG_WRAPPER + IMP_check(D==4, "Need " << D << " to construct a " + << D << "-vector.", ValueException); +#else + BOOST_STATIC_ASSERT(D==4); +#endif + vec_[0] = w; + vec_[1] = x; + vec_[2] = y; + vec_[2] = z; + } + + //! Default constructor + VectorD() {} + + IMP_COMPARISONS; + + //! \return A single component of this vector (0-D). + Float operator[](unsigned int i) const { + IMP_assert(i < D, "Invalid component of vector requested"); + return vec_[i]; + } + + //! \return A single component of this vector (0-D). + Float& operator[](unsigned int i) { + IMP_assert(i < D, "Invalid component of vector requested"); + return vec_[i]; + } + + //! \return the scalar product of two vectors. + /** \param[in] vec2 The other vector to use in the product. + */ + Float scalar_product(const This &o) const { + Float ret=0; + for (unsigned int i=0; i< D; ++i) { + ret += vec_[i]* o.vec_[i]; + } + return ret; + } + + //! scalar product + Float operator*(const This &o) const { + return scalar_product(o); + } + + //! product with scalar + VectorD operator*(Float s) const { + This ret; + for (unsigned int i=0; i< D; ++i) { + ret.vec_[i] = vec_[i] * s; + } + return ret; + } + + //! divide by a scalar + VectorD operator/(Float s) const { + This ret; + for (unsigned int i=0; i< D; ++i) { + ret.vec_[i] = vec_[i] / s; + } + return ret; + } + + //! negation + VectorD operator-() const { + This ret; + for (unsigned int i=0; i< D; ++i) { + ret.vec_[i] = -vec_[i]; + } + return ret; + } + + //! \return the vector product of two vectors. + /** \param[in] vec2 The other vector to use in the product. + */ + VectorD vector_product(const VectorD &vec2) const { + BOOST_STATIC_ASSERT(D==3); + return VectorD(vec_[1] * vec2.vec_[2] - vec_[2] * vec2.vec_[1], + vec_[2] * vec2.vec_[0] - vec_[0] * vec2.vec_[2], + vec_[0] * vec2.vec_[1] - vec_[1] * vec2.vec_[0]); + } + + //! \return The square of the magnitude of this vector. + Float get_squared_magnitude() const { + return scalar_product(*this); + } + + //! \return The magnitude of this vector. + Float get_magnitude() const { + return std::sqrt(get_squared_magnitude()); + } + + //! \return This vector normalized to unit length. + VectorD get_unit_vector() const { + Float mag = get_magnitude(); + // avoid division by zero + mag = std::max(mag, static_cast<Float>(1e-12)); + return operator/(mag); + } + + //! \return Difference between two vectors. + VectorD operator-(const VectorD &o) const { + This ret; + for (unsigned int i=0; i< D; ++i) { + ret.vec_[i] = vec_[i] - o.vec_[i]; + } + return ret; + } + + //! \return Sum of two vectors. + VectorD operator+(const VectorD &o) const { + This ret; + for (unsigned int i=0; i< D; ++i) { + ret.vec_[i] = vec_[i] + o.vec_[i]; + } + return ret; + } + + //! Accumulate the vector + VectorD& operator+=(const VectorD &o) { + for (unsigned int i=0; i< D; ++i) { + vec_[i] += o[i]; + } + return *this; + } + + //! Rescale the vector + VectorD& operator/=(Float f) { + for (unsigned int i=0; i< D; ++i) { + vec_[i] /= f; + } + return *this; + } + + //! Rescale the vector + VectorD& operator*=(Float f) { + for (unsigned int i=0; i< D; ++i) { + vec_[i] *= f; + } + return *this; + } + + void show(std::ostream &out=std::cout, std::string delim=", ") const { + out << "("; + for (unsigned int i=0; i< D; ++i) { + out << vec_[i]; + if (i != D-1) { + out << delim; + } + } + out << ")"; + } + +private: + int compare(const This &o) const { + for (unsigned int i=0; i< D; ++i) { + if (vec_[i] < o.vec_[i]) return -1; + else if (vec_[i] > o.vec_[i]) return 1; + } + return 0; + } + + Float vec_[D]; +}; + +template <unsigned int D> +std::ostream &operator<<(std::ostream &out, const VectorD<D> &v) { + v.show(out); + return out; +} + + +//! product with scalar +template <unsigned int D> +inline VectorD<D> operator*(Float s, const VectorD<D> &o) { + return o*s; +} + +//! create a constant vector +/** This is not the right name. + */ +template <unsigned int D> +VectorD<D> constant_vector(Float s) { + VectorD<D> ret; + for (unsigned int i= 0; i < D; ++i) { + ret[i]=s; + } + return ret; +} + + +//! Generate a random vector in a box with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_in_box(const VectorD<D> &lb, + const VectorD<D> &ub) { + VectorD<D> ret; + for (unsigned int i=0; i< D; ++i) { + IMP_check(lb[i] < ub[i], "Box for randomize must be non-empty", + ValueException); + ::boost::uniform_real<> rand(lb[i], ub[i]); + ret[i]=rand(random_number_generator); + } + return ret; +} + +//! Generate a random vector in a box with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_in_unit_box() { + return random_vector_in_box(VectorD<D>(0,0,0), + VectorD<D>(1,1,1)); +} + +//! Generate a random vector in a sphere with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_in_sphere(const VectorD<D> ¢er, + Float radius){ + IMP_check(radius > 0, "Radius in randomize must be postive", + ValueException); + VectorD<D> rad= constant_vector<D>(radius); + VectorD<D> min= center - rad; + VectorD<D> max= center + rad; + Float norm; + VectorD<D> ret; + // \todo This algorithm could be more efficient. + do { + ret=random_vector_in_box(min, max); + norm= (center- ret).get_magnitude(); + } while (norm > radius); + return ret; +} + +//! Generate a random vector in a unit sphere with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_in_unit_sphere(){ + return random_vector_in_sphere(VectorD<D>(0,0,0), 1); +} + +//! Generate a random vector on a sphere with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_on_sphere(const VectorD<D> ¢er, + Float radius) { + // could be made general + BOOST_STATIC_ASSERT(D==3); + IMP_check(radius > 0, "Radius in randomize must be postive", + ValueException); + ::boost::uniform_real<> rand(-1,1); + VectorD<D> up; + up[2]= rand(random_number_generator); + ::boost::uniform_real<> trand(0, 2*IMP::internal::PI); + Float theta= trand(random_number_generator); + // radius of circle + Float r= std::sqrt(1-square(up[2])); + up[0]= std::sin(theta)*r; + up[1]= std::cos(theta)*r; + IMP_assert(std::abs(up.get_magnitude() -1) < .1, + "Error generating unit vector on sphere"); + IMP_LOG(VERBOSE, "Random vector on sphere is " << up << std::endl); + return center+ up*radius; +} + +//! Generate a random vector on a sphere with uniform density +template <unsigned int D> +IMPDLLEXPORT VectorD<D> +random_vector_on_unit_sphere() { + return random_vector_on_sphere(VectorD<D>(0,0,0), 1); +} + + +template <unsigned int D> +struct SpacesIO +{ + const VectorD<D> &v_; + SpacesIO(const VectorD<D> &v): v_(v){} +}; + +template <unsigned int D> +inline std::ostream &operator<<(std::ostream &out, const SpacesIO<D> &s) +{ + s.v_.show(out, " "); + return out; +} + +template <unsigned int D> +struct CommasIO +{ + const VectorD<D> &v_; + CommasIO(const VectorD<D> &v): v_(v){} +}; + +template <unsigned int D> +inline std::ostream &operator<<(std::ostream &out, const CommasIO<D> &s) +{ + s.v_.show(out, ", "); + return out; +} + +IMP_END_NAMESPACE + +#endif /* IMP_VECTOR_D_H */ Index: kernel/include/macros.h =================================================================== --- kernel/include/macros.h (revision 855) +++ kernel/include/macros.h (working copy) @@ -8,6 +8,39 @@ #ifndef IMP_MACROS_H #define IMP_MACROS_H
+//! Implement comparison in a class using a compare function +/** The macro requires that This be defined as the type of the current class. + The compare function should take a const This & and return -1, 0, 1 as + appropriate. + */ +#define IMP_COMPARISONS \ + /** */ bool operator==(const This &o) const { \ + return (compare(o) == 0); \ + } \ + /** */ bool operator!=(const This &o) const { \ + return (compare(o) != 0); \ + } \ + /** */ bool operator<(const This &o) const { \ + IMP_assert(!is_default() && !o.is_default(), \ + "Ordering with uninitialized index is undefined"); \ + return (compare(o) <0); \ + } \ + /** */ bool operator>(const This &o) const { \ + IMP_assert(!is_default() && !o.is_default(), \ + "Ordering with uninitialized index is undefined"); \ + return (compare(o) > 0); \ + } \ + /** */ bool operator>=(const This &o) const { \ + IMP_assert(!is_default() && !o.is_default(), \ + "Ordering with uninitialized index is undefined"); \ + return !(compare(o) < 0); \ + } \ + /** */ bool operator<=(const This &o) const { \ + IMP_assert(!is_default() && !o.is_default(), \ + "Ordering with uninitialized index is undefined"); \ + return !(compare(o) > 0); \ + } + //! Implement comparison in a class using field as the variable to compare /** The macro requires that This be defined as the type of the current class. */ Index: kernel/include/internal/SConscript =================================================================== --- kernel/include/internal/SConscript (revision 855) +++ kernel/include/internal/SConscript (working copy) @@ -1,7 +1,15 @@ -files = ['AttributeTable.h', 'Vector.h', - 'ref_counting.h', 'ObjectContainer.h', - 'kernel_version_info.h', 'constants.h', 'units.h', - 'utility.h', 'Unit.h', 'ExponentialNumber.h'] +files = [ + 'AttributeTable.h', + 'ExponentialNumber.h', + 'ObjectContainer.h', + 'Unit.h', + 'Vector.h', + 'constants.h', + 'kernel_version_info.h', + 'ref_counting.h', + 'units.h', + 'utility.h', + ]
-files = [File(f) for f in files] +files = [File(x) for x in files] Return('files') Index: kernel/src/SConscript =================================================================== --- kernel/src/SConscript (revision 855) +++ kernel/src/SConscript (working copy) @@ -12,7 +12,7 @@ 'Particle.cpp', 'ScoreState.cpp', 'Object.cpp', 'OptimizerState.cpp', 'Log.cpp', 'Restraint.cpp', 'Optimizer.cpp', 'random.cpp', 'Key.cpp', 'exception.cpp', 'ParticleRefiner.cpp', - 'Vector3D.cpp', 'UnaryFunction.cpp', 'PairScore.cpp', + 'UnaryFunction.cpp', 'PairScore.cpp', 'SingletonScore.cpp', 'TripletScore.cpp' ] + internal_files
Index: kernel/src/Vector3D.cpp =================================================================== --- kernel/src/Vector3D.cpp (revision 855) +++ kernel/src/Vector3D.cpp (working copy) @@ -1,65 +0,0 @@ -/** - * \file Vector3D.cpp \brief Simple 3D vector class. - * - * Copyright 2007-8 Sali Lab. All rights reserved. - * - */ - -#include "IMP/Vector3D.h" -#include "IMP/random.h" -#include "IMP/internal/constants.h" -#include "IMP/utility.h" - -#include <boost/random/uniform_real.hpp> - -IMP_BEGIN_NAMESPACE - -Vector3D random_vector_in_box(const Vector3D &min, const Vector3D &max) -{ - Vector3D ret; - for (unsigned int i=0; i< 3; ++i) { - IMP_check(min[i] < max[i], "Box for randomize must be non-empty", - ValueException); - ::boost::uniform_real<> rand(min[i], max[i]); - ret[i]=rand(random_number_generator); - } - return ret; -} - - -Vector3D random_vector_in_sphere(const Vector3D ¢er, Float radius) -{ - IMP_check(radius > 0, "Radius in randomize must be postive", - ValueException); - Vector3D min(center[0]-radius, center[1]-radius, center[2]-radius); - Vector3D max(center[0]+radius, center[1]+radius, center[2]+radius); - float norm; - Vector3D ret; - // \todo This algorithm could be more efficient. - do { - ret=random_vector_in_box(min, max); - norm= (center- ret).get_magnitude(); - } while (norm > radius); - return ret; -} - -Vector3D random_vector_on_sphere(const Vector3D ¢er, Float radius) -{ - IMP_check(radius > 0, "Radius in randomize must be postive", - ValueException); - ::boost::uniform_real<> rand(-1,1); - Vector3D up; - up[2]= rand(random_number_generator); - ::boost::uniform_real<> trand(0, 2*internal::PI); - Float theta= trand(random_number_generator); - // radius of circle - Float r= std::sqrt(1-square(up[2])); - up[0]= std::sin(theta)*r; - up[1]= std::cos(theta)*r; - IMP_assert(std::abs(up.get_magnitude() -1) < .1, - "Error generating unit vector on sphere"); - IMP_LOG(VERBOSE, "Random vector on sphere is " << up << std::endl); - return center+ up*radius; -} - -IMP_END_NAMESPACE Index: kernel/src/internal/SConscript =================================================================== --- kernel/src/internal/SConscript (revision 855) +++ kernel/src/internal/SConscript (working copy) @@ -1,6 +1,7 @@ -Import('env') +files = [ + 'constants.cpp', + 'kernel_version_info.cpp', + ]
-files = ['kernel_version_info.cpp', 'constants.cpp'] - files = [File(x) for x in files] Return('files') Index: kernel/pyext/Vector3D.i =================================================================== --- kernel/pyext/Vector3D.i (revision 855) +++ kernel/pyext/Vector3D.i (working copy) @@ -1,30 +1,31 @@ + /* Provide our own implementations for some operators */ -%ignore IMP::Vector3D::operator[]; -%ignore IMP::Vector3D::operator+=; -%ignore IMP::Vector3D::operator*=; -%ignore IMP::Vector3D::operator/=; +%ignore IMP::VectorD::operator[]; +%ignore IMP::VectorD::operator+=; +%ignore IMP::VectorD::operator*=; +%ignore IMP::VectorD::operator/=;
/* Make sure that we return the original Python object from C++ inplace operators (not a new Python proxy around the same C++ object) */ namespace IMP { - %feature("shadow") Vector3D::__iadd__(const Vector3D &) %{ + %feature("shadow") VectorD::__iadd__(const VectorD &) %{ def __iadd__(self, *args): $action(self, *args) return self %} - %feature("shadow") Vector3D::__imul__(Float) %{ + %feature("shadow") VectorD::__imul__(Float) %{ def __imul__(self, *args): $action(self, *args) return self %} - %feature("shadow") Vector3D::__idiv__(Float) %{ + %feature("shadow") VectorD::__idiv__(Float) %{ def __idiv__(self, *args): $action(self, *args) return self %} }
-%extend IMP::Vector3D { +%extend IMP::VectorD { Float __getitem__(unsigned int index) const { return self->operator[](index); } @@ -33,9 +34,19 @@ } /* Ignore C++ return value from inplace operators, so that SWIG does not generate a new SWIG wrapper for the return value (see above). */ - void __iadd__(const Vector3D &o) { self->operator+=(o); } + void __iadd__(const VectorD &o) { self->operator+=(o); } void __imul__(Float f) { self->operator*=(f); } void __idiv__(Float f) { self->operator/=(f); } };
-%include "IMP/Vector3D.h" +%include "IMP/VectorD.h" + +namespace IMP { + %template(Vector3D) VectorD<3>; + %template(random_vector_on_sphere) random_vector_on_sphere<3>; + %template(random_vector_in_sphere) random_vector_in_sphere<3>; + %template(random_vector_in_box) random_vector_in_box<3>; + %template(random_vector_on_unit_sphere) random_vector_on_unit_sphere<3>; + %template(random_vector_in_unit_sphere) random_vector_in_unit_sphere<3>; + %template(random_vector_in_unit_box) random_vector_in_unit_box<3>; +} \ No newline at end of file Index: kernel/pyext/SConscript =================================================================== --- kernel/pyext/SConscript (revision 855) +++ kernel/pyext/SConscript (working copy) @@ -5,6 +5,7 @@ # Get a modified build environment suitable for building Python extensions: e = get_pyext_environment(env, 'IMP', cplusplus=True) e.Append(CPPPATH=['#/build/include', e['BOOST_CPPPATH']]) +e.Append(CPPDEFINES=['SWIG_WRAPPER']) e.Append(LIBPATH=['#/build/lib'], LIBS='imp')
# Build the Python extension from SWIG interface file: Index: kernel/pyext/IMP.i =================================================================== --- kernel/pyext/IMP.i (revision 855) +++ kernel/pyext/IMP.i (working copy) @@ -97,6 +97,7 @@ %feature("director") IMP::ParticleRefiner;
%include "IMP/base_types.h" +%include "Vector3D.i" %include "IMP/Object.h" %include "IMP/RefCountedObject.h" %include "IMP/Index.h" @@ -113,7 +114,6 @@ %include "IMP/SingletonScore.h" %include "IMP/TripletScore.h" %include "Particle.i" -%include "Vector3D.i" %include "IMP/DecoratorBase.h" %include "IMP/Optimizer.h"
@@ -137,4 +137,8 @@ %template(Floats) ::std::vector<Float>; %template(Strings) ::std::vector<String>; %template(Ints) ::std::vector<Int>; + /*%template(Vector3D) VectorD<3>; + %template(random_vector_on_sphere) random_vector_on_sphere<3>; + %template(random_vector_in_sphere) random_vector_in_sphere<3>; + %template(random_vector_in_box) random_vector_in_box<3>;*/ } Index: modules/core/test/states/test_close_pairs_score_state.py =================================================================== --- modules/core/test/states/test_close_pairs_score_state.py (revision 855) +++ modules/core/test/states/test_close_pairs_score_state.py (working copy) @@ -59,7 +59,7 @@
for p in ps: d= IMP.core.XYZRDecorator.cast(p) - d.set_coordinates(IMP.random_vector_in_box()) + d.set_coordinates(IMP.random_vector_in_unit_box()) self._compare_lists(m, cpss) print "changing radius" cpss.set_radius_key(IMP.core.XYZDecorator.get_xyz_keys()[0]) Index: modules/core/test/states/test_close_bipartite_pairs_score_state.py =================================================================== --- modules/core/test/states/test_close_bipartite_pairs_score_state.py (revision 855) +++ modules/core/test/states/test_close_bipartite_pairs_score_state.py (working copy) @@ -64,12 +64,12 @@
for p in ps0: d= IMP.core.XYZRDecorator.cast(p) - d.set_coordinates(IMP.random_vector_in_box()) + d.set_coordinates(IMP.random_vector_in_unit_box()) self._compare_lists(m, cpss)
for p in ps1: d= IMP.core.XYZRDecorator.cast(p) - d.set_coordinates(IMP.random_vector_in_box()) + d.set_coordinates(IMP.random_vector_in_unit_box()) self._compare_lists(m, cpss)
print "changing radius" Index: modules/core/test/states/test_maximum_change.py =================================================================== --- modules/core/test/states/test_maximum_change.py (revision 855) +++ modules/core/test/states/test_maximum_change.py (working copy) @@ -25,7 +25,7 @@ print "perturbing" for i in range(0,len(ps)): d= IMP.core.XYZDecorator(ps[i]) - v= IMP.random_vector_in_sphere() + v= IMP.random_vector_in_unit_sphere() print v[0] mmax=max(mmax, float(v[0]), float(v[1]), float(v[2])) d.set_coordinates(d.get_coordinates()+v) Index: modules/core/pyext/core.i =================================================================== --- modules/core/pyext/core.i (revision 855) +++ modules/core/pyext/core.i (working copy) @@ -57,6 +57,10 @@ %import "kernel/pyext/IMP_keys.i"
namespace IMP { + typedef VectorD<3> Vector3D; +} + +namespace IMP { namespace core { %template(AtomTypeBase) ::IMP::KeyBase<IMP_ATOM_TYPE_INDEX>; %template(ResidueTypeBase) ::IMP::KeyBase<IMP_RESIDUE_TYPE_INDEX>; Index: modules/misc/pyext/misc.i =================================================================== --- modules/misc/pyext/misc.i (revision 857) +++ modules/misc/pyext/misc.i (working copy) @@ -17,6 +17,10 @@ /* Get definitions of kernel base classes (but do not wrap) */ %import "kernel/pyext/IMP.i"
+namespace IMP { + typedef VectorD<3> Vector3D; +} + namespace IMP::misc { IMP_OWN_FIRST_CONSTRUCTOR(BondCoverPairScore) IMP_OWN_FIRST_SECOND_CONSTRUCTOR(RefineOncePairScore)
participants (1)
-
Daniel Russel