~yade-dev/yade/0.80

« back to all changes in this revision

Viewing changes to py/mathWrap/miniEigen.cpp

  • Committer: Anton Gladky
  • Date: 2012-05-02 21:50:42 UTC
  • Revision ID: gladky.anton@gmail.com-20120502215042-v1fa9r65usqe7kfk
0.80.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// 2009 © Václav Šmilauer <eudoxos@arcig.cz>
 
2
#include<boost/python.hpp>
 
3
#include<boost/lexical_cast.hpp>
 
4
#include<boost/algorithm/string/trim.hpp>
 
5
#include<string>
 
6
#include<stdexcept>
 
7
#include<sstream>
 
8
#include<iostream>
 
9
 
 
10
#include<yade/lib/base/Math.hpp>
 
11
#include<yade/lib/pyutil/doc_opts.hpp>
 
12
 
 
13
 
 
14
namespace bp=boost::python;
 
15
 
 
16
#define IDX_CHECK(i,MAX){ if(i<0 || i>=MAX) { PyErr_SetString(PyExc_IndexError, ("Index out of range 0.." + boost::lexical_cast<std::string>(MAX-1)).c_str()); bp::throw_error_already_set(); } }
 
17
#define IDX2_CHECKED_TUPLE_INTS(tuple,max2,arr2) {int l=bp::len(tuple); if(l!=2) { PyErr_SetString(PyExc_IndexError,"Index must be integer or a 2-tuple"); bp::throw_error_already_set(); } for(int _i=0; _i<2; _i++) { bp::extract<int> val(tuple[_i]); if(!val.check()) throw std::runtime_error("Unable to convert "+boost::lexical_cast<std::string>(_i)+"-th index to int."); int v=val(); IDX_CHECK(v,max2[_i]); arr2[_i]=v; }  }
 
18
 
 
19
void Vector6r_set_item(Vector6r & self, int idx, Real value){ IDX_CHECK(idx,6); self[idx]=value; }
 
20
void Vector6i_set_item(Vector6i & self, int idx, int  value){ IDX_CHECK(idx,6); self[idx]=value; }
 
21
void Vector3r_set_item(Vector3r & self, int idx, Real value){ IDX_CHECK(idx,3); self[idx]=value; }
 
22
void Vector3i_set_item(Vector3i & self, int idx, int  value){ IDX_CHECK(idx,3); self[idx]=value; }
 
23
void Vector2r_set_item(Vector2r & self, int idx, Real value){ IDX_CHECK(idx,2); self[idx]=value; }
 
24
void Vector2i_set_item(Vector2i & self, int idx, int  value){ IDX_CHECK(idx,2); self[idx]=value; }
 
25
 
 
26
void Quaternionr_set_item(Quaternionr & self, int idx, Real value){ IDX_CHECK(idx,4);  if(idx==0) self.x()=value; else if(idx==1) self.y()=value; else if(idx==2) self.z()=value; else if(idx==3) self.w()=value; }
 
27
void Matrix3r_set_item(Matrix3r & self, bp::tuple _idx, Real value){ int idx[2]; int mx[2]={3,3}; IDX2_CHECKED_TUPLE_INTS(_idx,mx,idx); self(idx[0],idx[1])=value; }
 
28
void Matrix3r_set_item_linear(Matrix3r & self, int idx, Real value){ IDX_CHECK(idx,9); self(idx/3,idx%3)=value; }
 
29
 
 
30
void Matrix6r_set_item(Matrix6r & self, bp::tuple _idx, Real value){ int idx[2]; int mx[2]={6,6}; IDX2_CHECKED_TUPLE_INTS(_idx,mx,idx); self(idx[0],idx[1])=value; }
 
31
void Matrix6r_set_item_linear(Matrix6r & self, int idx, Real value){ IDX_CHECK(idx,36); self(idx/6,idx%6)=value; }
 
32
 
 
33
Real Vector6r_get_item(const Vector6r & self, int idx){ IDX_CHECK(idx,6); return self[idx]; }
 
34
int  Vector6i_get_item(const Vector6r & self, int idx){ IDX_CHECK(idx,6); return self[idx]; }
 
35
Real Vector3r_get_item(const Vector3r & self, int idx){ IDX_CHECK(idx,3); return self[idx]; }
 
36
int  Vector3i_get_item(const Vector3i & self, int idx){ IDX_CHECK(idx,3); return self[idx]; }
 
37
Real Vector2r_get_item(const Vector2r & self, int idx){ IDX_CHECK(idx,2); return self[idx]; }
 
38
int  Vector2i_get_item(const Vector2i & self, int idx){ IDX_CHECK(idx,2); return self[idx]; }
 
39
 
 
40
Real Quaternionr_get_item(const Quaternionr & self, int idx){ IDX_CHECK(idx,4); if(idx==0) return self.x(); if(idx==1) return self.y(); if(idx==2) return self.z(); return self.w(); }
 
41
Real Matrix3r_get_item(Matrix3r & self, bp::tuple _idx){ int idx[2]; int mx[2]={3,3}; IDX2_CHECKED_TUPLE_INTS(_idx,mx,idx); return self(idx[0],idx[1]); }
 
42
Real Matrix3r_get_item_linear(Matrix3r & self, int idx){ IDX_CHECK(idx,9); return self(idx/3,idx%3); }
 
43
Real Matrix6r_get_item(Matrix6r & self, bp::tuple _idx){ int idx[2]; int mx[2]={6,6}; IDX2_CHECKED_TUPLE_INTS(_idx,mx,idx); return self(idx[0],idx[1]); }
 
44
Real Matrix6r_get_item_linear(Matrix6r & self, int idx){ IDX_CHECK(idx,36); return self(idx/6,idx%6); }
 
45
 
 
46
std::string Vector6r_str(const Vector6r & self){ return std::string("Vector6(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+","+boost::lexical_cast<std::string>(self[2])+", "+boost::lexical_cast<std::string>(self[3])+","+boost::lexical_cast<std::string>(self[4])+","+boost::lexical_cast<std::string>(self[5])+")";}
 
47
std::string Vector6i_str(const Vector6i & self){ return std::string("Vector6i(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+","+boost::lexical_cast<std::string>(self[2])+", "+boost::lexical_cast<std::string>(self[3])+","+boost::lexical_cast<std::string>(self[4])+","+boost::lexical_cast<std::string>(self[5])+")";}
 
48
std::string Vector3r_str(const Vector3r & self){ return std::string("Vector3(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+","+boost::lexical_cast<std::string>(self[2])+")";}
 
49
std::string Vector3i_str(const Vector3i & self){ return std::string("Vector3i(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+","+boost::lexical_cast<std::string>(self[2])+")";}
 
50
std::string Vector2r_str(const Vector2r & self){ return std::string("Vector2(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+")";}
 
51
std::string Vector2i_str(const Vector2i & self){ return std::string("Vector2i(")+boost::lexical_cast<std::string>(self[0])+","+boost::lexical_cast<std::string>(self[1])+")";}
 
52
std::string Quaternionr_str(const Quaternionr & self){ AngleAxisr aa(self); return std::string("Quaternion((")+boost::lexical_cast<std::string>(aa.axis()[0])+","+boost::lexical_cast<std::string>(aa.axis()[1])+","+boost::lexical_cast<std::string>(aa.axis()[2])+"),"+boost::lexical_cast<std::string>(aa.angle())+")";}
 
53
std::string Matrix3r_str(const Matrix3r & self){ std::ostringstream oss; oss<<"Matrix3("; for(int i=0; i<3; i++) for(int j=0; j<3; j++) oss<<self(i,j)<<((i==2 && j==2)?")":",")<<((i<2 && j==2)?" ":""); return oss.str(); }
 
54
std::string Matrix6r_str(const Matrix6r & self){ std::ostringstream oss; oss<<"Matrix6("; for(int i=0; i<6; i++) for(int j=0; j<6; j++) oss<<self(i,j)<<((i==5 && j==5)?")":",")<<((i<5 && j==5)?" ":""); return oss.str(); }
 
55
 
 
56
int Vector6r_len(){return 6;}
 
57
int Vector6i_len(){return 6;}
 
58
int Vector3r_len(){return 3;}
 
59
int Vector3i_len(){return 3;}
 
60
int Vector2r_len(){return 2;}
 
61
int Vector2i_len(){return 2;}
 
62
int Quaternionr_len(){return 4;}
 
63
int Matrix3r_len(){return 9;}
 
64
int Matrix6r_len(){return 36;}
 
65
 
 
66
// pickling support
 
67
struct Matrix3r_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Matrix3r& x){ return bp::make_tuple(x(0,0),x(0,1),x(0,2),x(1,0),x(1,1),x(1,2),x(2,0),x(2,1),x(2,2));} };
 
68
struct Quaternionr_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Quaternionr& x){ return bp::make_tuple(x.w(),x.x(),x.y(),x.z());} };
 
69
struct Vector6r_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector6r& x){ return bp::make_tuple(x[0],x[1],x[2],x[3],x[4],x[5]);} };
 
70
struct Vector6i_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector6i& x){ return bp::make_tuple(x[0],x[1],x[2],x[3],x[4],x[5]);} };
 
71
struct Vector3r_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector3r& x){ return bp::make_tuple(x[0],x[1],x[2]);} };
 
72
struct Vector3i_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector3i& x){ return bp::make_tuple(x[0],x[1],x[2]);} };
 
73
struct Vector2r_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector2r& x){ return bp::make_tuple(x[0],x[1]);} };
 
74
struct Vector2i_pickle: bp::pickle_suite{static bp::tuple getinitargs(const Vector2i& x){ return bp::make_tuple(x[0],x[1]);} };
 
75
 
 
76
 
 
77
/* template to define custom converter from sequence/list or approriate length and type, to eigen's Vector
 
78
   - length is stored in VT::RowsAtCompileTime
 
79
        - type is VT::Scalar
 
80
*/
 
81
template<class VT>
 
82
struct custom_VectorAnyAny_from_sequence{
 
83
        custom_VectorAnyAny_from_sequence(){ bp::converter::registry::push_back(&convertible,&construct,bp::type_id<VT>()); }
 
84
        static void* convertible(PyObject* obj_ptr){ if(!PySequence_Check(obj_ptr) || PySequence_Size(obj_ptr)!=VT::RowsAtCompileTime) return 0; return obj_ptr; }
 
85
        static void construct(PyObject* obj_ptr, bp::converter::rvalue_from_python_stage1_data* data){
 
86
                void* storage=((bp::converter::rvalue_from_python_storage<VT>*)(data))->storage.bytes;
 
87
                new (storage) VT;
 
88
                for(size_t i=0; i<VT::RowsAtCompileTime; i++) (*((VT*)storage))[i]=bp::extract<typename VT::Scalar>(PySequence_GetItem(obj_ptr,i));
 
89
                data->convertible=storage;
 
90
        }
 
91
};
 
92
 
 
93
static Matrix3r* Matrix3r_fromElements(Real m00, Real m01, Real m02, Real m10, Real m11, Real m12, Real m20, Real m21, Real m22){ Matrix3r* m(new Matrix3r); (*m)<<m00,m01,m02,m10,m11,m12,m20,m21,m22; return m; }
 
94
static Vector6r* Vector6r_fromElements(Real v0, Real v1, Real v2, Real v3, Real v4, Real v5){ Vector6r* v(new Vector6r); (*v)<<v0,v1,v2,v3,v4,v5; return v; }
 
95
static Vector6i* Vector6i_fromElements(int v0, int v1, int v2, int v3, int v4, int v5){ Vector6i* v(new Vector6i); (*v)<<v0,v1,v2,v3,v4,v5; return v; }
 
96
static Vector3r Matrix3r_diagonal(const Matrix3r& m){ return Vector3r(m.diagonal()); }
 
97
static Vector3r Matrix3r_row(const Matrix3r& m, int ix){ IDX_CHECK(ix,3); return Vector3r(m.row(ix)); }
 
98
static Vector3r Matrix3r_col(const Matrix3r& m, int ix){ IDX_CHECK(ix,3); return Vector3r(m.col(ix)); }
 
99
static Vector6r Matrix3r_toVoigt(const Matrix3r& m, bool strain=false){ return tensor_toVoigt(m,strain); }
 
100
static Matrix3r Vector6r_toSymmTensor(const Vector6r& v, bool strain=false){ return voigt_toSymmTensor(v,strain); }
 
101
static Vector6r Matrix6r_diagonal(const Matrix6r& m){ return Vector6r(m.diagonal()); }
 
102
static Vector6r Matrix6r_row(const Matrix6r& m, int ix){ IDX_CHECK(ix,6); return Vector6r(m.row(ix)); }
 
103
static Vector6r Matrix6r_col(const Matrix6r& m, int ix){ IDX_CHECK(ix,6); return Vector6r(m.col(ix)); }
 
104
static Quaternionr Quaternionr_setFromTwoVectors(Quaternionr& q, const Vector3r& u, const Vector3r& v){ return q.setFromTwoVectors(u,v); }
 
105
static Vector3r Quaternionr_Rotate(Quaternionr& q, const Vector3r& u){ return q*u; }
 
106
// supposed to return raw pointer (or auto_ptr), boost::python takes care of the lifetime management
 
107
static Quaternionr* Quaternionr_fromAxisAngle(const Vector3r& axis, const Real angle){ return new Quaternionr(AngleAxisr(angle,axis)); }
 
108
static Quaternionr* Quaternionr_fromAngleAxis(const Real angle, const Vector3r& axis){ return new Quaternionr(AngleAxisr(angle,axis)); }
 
109
static bp::tuple Quaternionr_toAxisAngle(const Quaternionr& self){ AngleAxisr aa(self); return bp::make_tuple(aa.axis(),aa.angle());}
 
110
static bp::tuple Quaternionr_toAngleAxis(const Quaternionr& self){ AngleAxisr aa(self); return bp::make_tuple(aa.angle(),aa.axis());}
 
111
 
 
112
static Real Vector3r_dot(const Vector3r& self, const Vector3r& v){ return self.dot(v); }
 
113
static Matrix3r Vector3r_outer(const Vector3r& self, const Vector3r& v){ return self*v.transpose(); }
 
114
static Real Vector3i_dot(const Vector3i& self, const Vector3i& v){ return self.dot(v); }
 
115
static Real Vector2r_dot(const Vector2r& self, const Vector2r& v){ return self.dot(v); }
 
116
static Real Vector2i_dot(const Vector2i& self, const Vector2i& v){ return self.dot(v); }
 
117
static Vector3r Vector3r_cross(const Vector3r& self, const Vector3r& v){ return self.cross(v); }
 
118
static Vector3i Vector3i_cross(const Vector3i& self, const Vector3i& v){ return self.cross(v); }
 
119
static Vector3r Vector6r_head(const Vector6r& self){ return self.start<3>(); }
 
120
static Vector3r Vector6r_tail(const Vector6r& self){ return self.end<3>(); }
 
121
static Vector3i Vector6i_head(const Vector6i& self){ return self.start<3>(); }
 
122
static Vector3i Vector6i_tail(const Vector6i& self){ return self.end<3>(); }
 
123
static bool Quaternionr__eq__(const Quaternionr& q1, const Quaternionr& q2){ return q1==q2; }
 
124
static bool Quaternionr__neq__(const Quaternionr& q1, const Quaternionr& q2){ return q1!=q2; }
 
125
#include<Eigen/SVD>
 
126
static bp::tuple Matrix3r_polarDecomposition(const Matrix3r& self){ Matrix3r unitary,positive; Matrix_computeUnitaryPositive(self,&unitary,&positive); return bp::make_tuple(unitary,positive); }
 
127
static bp::tuple Matrix3r_eigenDecomposition(const Matrix3r& self){ Matrix3r rot,diag; matrixEigenDecomposition(self,rot,diag); return bp::make_tuple(rot,Vector3r(diag.diagonal())); }
 
128
static bp::tuple Matrix6r_polarDecomposition(const Matrix6r& self){ Matrix6r unitary,positive; Matrix_computeUnitaryPositive(self,&unitary,&positive); return bp::make_tuple(unitary,positive); }
 
129
static bp::tuple Matrix6r_eigenDecomposition(const Matrix6r& self){ Matrix6r rot,diag; matrixEigenDecomposition(self,rot,diag); return bp::make_tuple(rot,Vector6r(diag.diagonal())); }
 
130
 
 
131
#undef IDX_CHECK
 
132
 
 
133
 
 
134
#define EIG_WRAP_METH1(klass,meth) static klass klass##_##meth(const klass& self){ return self.meth(); }
 
135
#define EIG_WRAP_METH0(klass,meth) static klass klass##_##meth(){ return klass().meth(); }
 
136
EIG_WRAP_METH1(Matrix3r,transpose);
 
137
EIG_WRAP_METH1(Matrix3r,inverse);
 
138
EIG_WRAP_METH1(Matrix6r,transpose);
 
139
EIG_WRAP_METH1(Matrix6r,inverse);
 
140
 
 
141
EIG_WRAP_METH0(Matrix3r,Zero);
 
142
EIG_WRAP_METH0(Matrix3r,Identity);
 
143
EIG_WRAP_METH0(Matrix6r,Zero);
 
144
EIG_WRAP_METH0(Matrix6r,Identity);
 
145
EIG_WRAP_METH0(Vector6r,Zero); EIG_WRAP_METH0(Vector6r,Ones);
 
146
EIG_WRAP_METH0(Vector6i,Zero); EIG_WRAP_METH0(Vector6i,Ones);
 
147
EIG_WRAP_METH0(Vector3r,Zero); EIG_WRAP_METH0(Vector3r,UnitX); EIG_WRAP_METH0(Vector3r,UnitY); EIG_WRAP_METH0(Vector3r,UnitZ); EIG_WRAP_METH0(Vector3r,Ones);
 
148
EIG_WRAP_METH0(Vector3i,Zero); EIG_WRAP_METH0(Vector3i,UnitX); EIG_WRAP_METH0(Vector3i,UnitY); EIG_WRAP_METH0(Vector3i,UnitZ); EIG_WRAP_METH0(Vector3i,Ones);
 
149
EIG_WRAP_METH0(Vector2r,Zero); EIG_WRAP_METH0(Vector2r,UnitX); EIG_WRAP_METH0(Vector2r,UnitY); EIG_WRAP_METH0(Vector2r,Ones);
 
150
EIG_WRAP_METH0(Vector2i,Zero); EIG_WRAP_METH0(Vector2i,UnitX); EIG_WRAP_METH0(Vector2i,UnitY); EIG_WRAP_METH0(Vector2i,Ones);
 
151
EIG_WRAP_METH0(Quaternionr,Identity);
 
152
 
 
153
#define EIG_OP1(klass,op,sym) typeof((sym klass()).eval()) klass##op(const klass& self){ return (sym self).eval();}
 
154
#define EIG_OP2(klass,op,sym,klass2) typeof((klass() sym klass2()).eval()) klass##op##klass2(const klass& self, const klass2& other){ return (self sym other).eval(); }
 
155
#define EIG_OP2_INPLACE(klass,op,sym,klass2) klass klass##op##klass2(klass& self, const klass2& other){ self sym other; return self; }
 
156
 
 
157
 
 
158
EIG_OP1(Matrix3r,__neg__,-)
 
159
EIG_OP2(Matrix3r,__add__,+,Matrix3r) EIG_OP2_INPLACE(Matrix3r,__iadd__,+=,Matrix3r)
 
160
EIG_OP2(Matrix3r,__sub__,-,Matrix3r) EIG_OP2_INPLACE(Matrix3r,__isub__,-=,Matrix3r)
 
161
EIG_OP2(Matrix3r,__mul__,*,Real) EIG_OP2(Matrix3r,__rmul__,*,Real) EIG_OP2_INPLACE(Matrix3r,__imul__,*=,Real)
 
162
EIG_OP2(Matrix3r,__mul__,*,int) EIG_OP2(Matrix3r,__rmul__,*,int) EIG_OP2_INPLACE(Matrix3r,__imul__,*=,int)
 
163
EIG_OP2(Matrix3r,__mul__,*,Vector3r) EIG_OP2(Matrix3r,__rmul__,*,Vector3r)
 
164
EIG_OP2(Matrix3r,__mul__,*,Matrix3r) EIG_OP2_INPLACE(Matrix3r,__imul__,*=,Matrix3r)
 
165
EIG_OP2(Matrix3r,__div__,/,Real) EIG_OP2_INPLACE(Matrix3r,__idiv__,/=,Real)
 
166
EIG_OP2(Matrix3r,__div__,/,int) EIG_OP2_INPLACE(Matrix3r,__idiv__,/=,int)
 
167
 
 
168
EIG_OP1(Matrix6r,__neg__,-)
 
169
EIG_OP2(Matrix6r,__add__,+,Matrix6r) EIG_OP2_INPLACE(Matrix6r,__iadd__,+=,Matrix6r)
 
170
EIG_OP2(Matrix6r,__sub__,-,Matrix6r) EIG_OP2_INPLACE(Matrix6r,__isub__,-=,Matrix6r)
 
171
EIG_OP2(Matrix6r,__mul__,*,Real) EIG_OP2(Matrix6r,__rmul__,*,Real) EIG_OP2_INPLACE(Matrix6r,__imul__,*=,Real)
 
172
EIG_OP2(Matrix6r,__mul__,*,int) EIG_OP2(Matrix6r,__rmul__,*,int) EIG_OP2_INPLACE(Matrix6r,__imul__,*=,int)
 
173
EIG_OP2(Matrix6r,__mul__,*,Vector6r) EIG_OP2(Matrix6r,__rmul__,*,Vector6r)
 
174
EIG_OP2(Matrix6r,__mul__,*,Matrix6r) EIG_OP2_INPLACE(Matrix6r,__imul__,*=,Matrix6r)
 
175
EIG_OP2(Matrix6r,__div__,/,Real) EIG_OP2_INPLACE(Matrix6r,__idiv__,/=,Real)
 
176
EIG_OP2(Matrix6r,__div__,/,int) EIG_OP2_INPLACE(Matrix6r,__idiv__,/=,int)
 
177
 
 
178
EIG_OP1(Vector6r,__neg__,-);
 
179
EIG_OP2(Vector6r,__add__,+,Vector6r); EIG_OP2_INPLACE(Vector6r,__iadd__,+=,Vector6r)
 
180
EIG_OP2(Vector6r,__sub__,-,Vector6r); EIG_OP2_INPLACE(Vector6r,__isub__,-=,Vector6r)
 
181
EIG_OP2(Vector6r,__mul__,*,Real) EIG_OP2(Vector6r,__rmul__,*,Real) EIG_OP2_INPLACE(Vector6r,__imul__,*=,Real) EIG_OP2(Vector6r,__div__,/,Real) EIG_OP2_INPLACE(Vector6r,__idiv__,/=,Real)
 
182
EIG_OP2(
 
183
Vector6r,__mul__,*,int) EIG_OP2(Vector6r,__rmul__,*,int) EIG_OP2_INPLACE(Vector6r,__imul__,*=,int) EIG_OP2(Vector6r,__div__,/,int) EIG_OP2_INPLACE(Vector6r,__idiv__,/=,int)
 
184
 
 
185
EIG_OP1(Vector6i,__neg__,-);
 
186
EIG_OP2(Vector6i,__add__,+,Vector6i); EIG_OP2_INPLACE(Vector6i,__iadd__,+=,Vector6i)
 
187
EIG_OP2(Vector6i,__sub__,-,Vector6i); EIG_OP2_INPLACE(Vector6i,__isub__,-=,Vector6i)
 
188
EIG_OP2(
 
189
Vector6i,__mul__,*,int) EIG_OP2(Vector6i,__rmul__,*,int) EIG_OP2_INPLACE(Vector6i,__imul__,*=,int) EIG_OP2(Vector6i,__div__,/,int) EIG_OP2_INPLACE(Vector6i,__idiv__,/=,int)
 
190
 
 
191
EIG_OP1(Vector3r,__neg__,-);
 
192
EIG_OP2(Vector3r,__add__,+,Vector3r); EIG_OP2_INPLACE(Vector3r,__iadd__,+=,Vector3r)
 
193
EIG_OP2(Vector3r,__sub__,-,Vector3r); EIG_OP2_INPLACE(Vector3r,__isub__,-=,Vector3r)
 
194
EIG_OP2(Vector3r,__mul__,*,Real) EIG_OP2(Vector3r,__rmul__,*,Real) EIG_OP2_INPLACE(Vector3r,__imul__,*=,Real) EIG_OP2(Vector3r,__div__,/,Real) EIG_OP2_INPLACE(Vector3r,__idiv__,/=,Real)
 
195
EIG_OP2(
 
196
Vector3r,__mul__,*,int) EIG_OP2(Vector3r,__rmul__,*,int) EIG_OP2_INPLACE(Vector3r,__imul__,*=,int) EIG_OP2(Vector3r,__div__,/,int) EIG_OP2_INPLACE(Vector3r,__idiv__,/=,int)
 
197
 
 
198
EIG_OP1(Vector3i,__neg__,-);
 
199
EIG_OP2(Vector3i,__add__,+,Vector3i); EIG_OP2_INPLACE(Vector3i,__iadd__,+=,Vector3i)
 
200
EIG_OP2(Vector3i,__sub__,-,Vector3i); EIG_OP2_INPLACE(Vector3i,__isub__,-=,Vector3i)
 
201
EIG_OP2(Vector3i,__mul__,*,int) EIG_OP2(Vector3i,__rmul__,*,int)  EIG_OP2_INPLACE(Vector3i,__imul__,*=,int)
 
202
 
 
203
EIG_OP1(Vector2r,__neg__,-);
 
204
EIG_OP2(Vector2r,__add__,+,Vector2r); EIG_OP2_INPLACE(Vector2r,__iadd__,+=,Vector2r)
 
205
EIG_OP2(Vector2r,__sub__,-,Vector2r); EIG_OP2_INPLACE(Vector2r,__isub__,-=,Vector2r)
 
206
EIG_OP2(Vector2r,__mul__,*,Real) EIG_OP2(Vector2r,__rmul__,*,Real) EIG_OP2_INPLACE(Vector2r,__imul__,*=,Real) EIG_OP2(Vector2r,__div__,/,Real) EIG_OP2_INPLACE(Vector2r,__idiv__,/=,Real)
 
207
EIG_OP2(Vector2r,__mul__,*,int) EIG_OP2(Vector2r,__rmul__,*,int) EIG_OP2_INPLACE(Vector2r,__imul__,*=,int) EIG_OP2(Vector2r,__div__,/,int) EIG_OP2_INPLACE(Vector2r,__idiv__,/=,int)
 
208
 
 
209
EIG_OP1(Vector2i,__neg__,-);
 
210
EIG_OP2(Vector2i,__add__,+,Vector2i); EIG_OP2_INPLACE(Vector2i,__iadd__,+=,Vector2i)
 
211
EIG_OP2(Vector2i,__sub__,-,Vector2i); EIG_OP2_INPLACE(Vector2i,__isub__,-=,Vector2i)
 
212
EIG_OP2(Vector2i,__mul__,*,int)  EIG_OP2_INPLACE(Vector2i,__imul__,*=,int) EIG_OP2(Vector2i,__rmul__,*,int)
 
213
 
 
214
 
 
215
BOOST_PYTHON_MODULE(miniEigen){
 
216
        bp::scope().attr("__doc__")="Basic math functions for Yade: small matrix, vector and quaternion classes. This module internally wraps small parts of the `Eigen <http://eigen.tuxfamily.org>`_ library. Refer to its documentation for details. All classes in this module support pickling.";
 
217
 
 
218
        YADE_SET_DOCSTRING_OPTS;
 
219
 
 
220
 
 
221
        custom_VectorAnyAny_from_sequence<Vector6r>();
 
222
        custom_VectorAnyAny_from_sequence<Vector6i>();
 
223
        custom_VectorAnyAny_from_sequence<Vector3r>();
 
224
        custom_VectorAnyAny_from_sequence<Vector3i>();
 
225
        custom_VectorAnyAny_from_sequence<Vector2r>();
 
226
        custom_VectorAnyAny_from_sequence<Vector2i>();
 
227
 
 
228
        bp::class_<Matrix3r>("Matrix3","3x3 float matrix.\n\nSupported operations (``m`` is a Matrix3, ``f`` if a float/int, ``v`` is a Vector3): ``-m``, ``m+m``, ``m+=m``, ``m-m``, ``m-=m``, ``m*f``, ``f*m``, ``m*=f``, ``m/f``, ``m/=f``, ``m*m``, ``m*=m``, ``m*v``, ``v*m``, ``m==m``, ``m!=m``.",bp::init<>())
 
229
                .def(bp::init<Matrix3r const &>((bp::arg("m"))))
 
230
                .def(bp::init<Quaternionr const &>((bp::arg("q"))))
 
231
                .def("__init__",bp::make_constructor(&Matrix3r_fromElements,bp::default_call_policies(),(bp::arg("m00"),bp::arg("m01"),bp::arg("m02"),bp::arg("m10"),bp::arg("m11"),bp::arg("m12"),bp::arg("m20"),bp::arg("m21"),bp::arg("m22"))))
 
232
                .def_pickle(Matrix3r_pickle())
 
233
                //
 
234
                .def("determinant",&Matrix3r::determinant)
 
235
                .def("trace",&Matrix3r::trace)
 
236
                .def("inverse",&Matrix3r_inverse)
 
237
                .def("transpose",&Matrix3r_transpose)
 
238
                .def("polarDecomposition",&Matrix3r_polarDecomposition)
 
239
                .def("eigenDecomposition",&Matrix3r_eigenDecomposition)
 
240
                .def("diagonal",&Matrix3r_diagonal)
 
241
                .def("row",&Matrix3r_row)
 
242
                .def("col",&Matrix3r_col)
 
243
 
 
244
                //
 
245
                .def("__neg__",&Matrix3r__neg__)
 
246
                .def("__add__",&Matrix3r__add__Matrix3r).def("__iadd__",&Matrix3r__iadd__Matrix3r)
 
247
                .def("__sub__",&Matrix3r__sub__Matrix3r).def("__isub__",&Matrix3r__isub__Matrix3r)
 
248
                .def("__mul__",&Matrix3r__mul__Real).def("__rmul__",&Matrix3r__rmul__Real).def("__imul__",&Matrix3r__imul__Real)
 
249
                .def("__mul__",&Matrix3r__mul__int).def("__rmul__",&Matrix3r__rmul__int).def("__imul__",&Matrix3r__imul__int)
 
250
                .def("__mul__",&Matrix3r__mul__Vector3r).def("__rmul__",&Matrix3r__rmul__Vector3r)
 
251
                .def("__mul__",&Matrix3r__mul__Matrix3r).def("__imul__",&Matrix3r__imul__Matrix3r)
 
252
                .def("__div__",&Matrix3r__div__Real).def("__idiv__",&Matrix3r__idiv__Real)
 
253
                .def("__div__",&Matrix3r__div__int).def("__idiv__",&Matrix3r__idiv__int)
 
254
                .def(bp::self == bp::self)
 
255
                .def(bp::self != bp::self)
 
256
                //
 
257
                .def("__len__",&::Matrix3r_len).staticmethod("__len__").def("__setitem__",&::Matrix3r_set_item).def("__getitem__",&::Matrix3r_get_item).def("__str__",&::Matrix3r_str).def("__repr__",&::Matrix3r_str)
 
258
                /* extras for matrices */
 
259
                .def("__setitem__",&::Matrix3r_set_item_linear).def("__getitem__",&::Matrix3r_get_item_linear)
 
260
                .add_static_property("Identity",&Matrix3r_Identity)
 
261
                .add_static_property("Zero",&Matrix3r_Zero)
 
262
                // specials
 
263
                .def("toVoigt",&Matrix3r_toVoigt,(bp::arg("strain")=false),"Convert 2nd order tensor to 6-vector (Voigt notation), symmetrizing the tensor;     if *strain* is ``True``, multiply non-diagonal compoennts by 2.")
 
264
 
 
265
        ;
 
266
        bp::class_<Matrix6r>("Matrix6","6x6 float matrix.\n\nSupported operations (``m`` is a Matrix6, ``f`` if a float/int, ``v`` is a Vector6): ``-m``, ``m+m``, ``m+=m``, ``m-m``, ``m-=m``, ``m*f``, ``f*m``, ``m*=f``, ``m/f``, ``m/=f``, ``m*m``, ``m*=m``, ``m*v``, ``v*m``, ``m==m``, ``m!=m``.",bp::init<>())
 
267
                .def(bp::init<Matrix6r const &>((bp::arg("m"))))
 
268
                //
 
269
                .def("determinant",&Matrix6r::determinant)
 
270
                .def("trace",&Matrix6r::trace)
 
271
                .def("inverse",&Matrix6r_inverse)
 
272
                .def("transpose",&Matrix6r_transpose)
 
273
                .def("diagonal",&Matrix6r_diagonal)
 
274
                .def("row",&Matrix6r_row)
 
275
                .def("col",&Matrix6r_col)
 
276
                .def("polarDecomposition",&Matrix6r_polarDecomposition)
 
277
                .def("eigenDecomposition",&Matrix6r_eigenDecomposition)
 
278
                //
 
279
                .def("__neg__",&Matrix6r__neg__)
 
280
                .def("__add__",&Matrix6r__add__Matrix6r).def("__iadd__",&Matrix6r__iadd__Matrix6r)
 
281
                .def("__sub__",&Matrix6r__sub__Matrix6r).def("__isub__",&Matrix6r__isub__Matrix6r)
 
282
                .def("__mul__",&Matrix6r__mul__Real).def("__rmul__",&Matrix6r__rmul__Real).def("__imul__",&Matrix6r__imul__Real)
 
283
                .def("__mul__",&Matrix6r__mul__int).def("__rmul__",&Matrix6r__rmul__int).def("__imul__",&Matrix6r__imul__int)
 
284
                .def("__mul__",&Matrix6r__mul__Vector6r).def("__rmul__",&Matrix6r__rmul__Vector6r)
 
285
                .def("__mul__",&Matrix6r__mul__Matrix6r).def("__imul__",&Matrix6r__imul__Matrix6r)
 
286
                .def("__div__",&Matrix6r__div__Real).def("__idiv__",&Matrix6r__idiv__Real)
 
287
                .def("__div__",&Matrix6r__div__int).def("__idiv__",&Matrix6r__idiv__int)
 
288
                .def(bp::self == bp::self)
 
289
                .def(bp::self != bp::self)
 
290
                //
 
291
                .def("__len__",&::Matrix6r_len).staticmethod("__len__").def("__setitem__",&::Matrix6r_set_item).def("__getitem__",&::Matrix6r_get_item).def("__str__",&::Matrix6r_str).def("__repr__",&::Matrix6r_str)
 
292
                /* extras for matrices */
 
293
                .def("__setitem__",&::Matrix6r_set_item_linear).def("__getitem__",&::Matrix6r_get_item_linear)
 
294
                .add_static_property("Identity",&Matrix6r_Identity)
 
295
                .add_static_property("Zero",&Matrix6r_Zero)
 
296
                // specials
 
297
        ;
 
298
        bp::class_<Quaternionr>("Quaternion","Quaternion representing rotation.\n\nSupported operations (``q`` is a Quaternion, ``v`` is a Vector3): ``q*q`` (rotation composition), ``q*=q``, ``q*v`` (rotating ``v`` by ``q``), ``q==q``, ``q!=q``.",bp::init<>())
 
299
                .def("__init__",bp::make_constructor(&Quaternionr_fromAxisAngle,bp::default_call_policies(),(bp::arg("axis"),bp::arg("angle"))))
 
300
                .def("__init__",bp::make_constructor(&Quaternionr_fromAngleAxis,bp::default_call_policies(),(bp::arg("angle"),bp::arg("axis"))))
 
301
                .def(bp::init<Real,Real,Real,Real>((bp::arg("w"),bp::arg("x"),bp::arg("y"),bp::arg("z")),"Initialize from coefficients.\n\n.. note:: The order of coefficients is *w*, *x*, *y*, *z*. The [] operator numbers them differently, 0…4 for *x* *y* *z* *w*!"))
 
302
                .def(bp::init<Matrix3r>((bp::arg("rotMatrix")))) //,"Initialize from given rotation matrix.")
 
303
                .def(bp::init<Quaternionr>((bp::arg("other"))))
 
304
                .def_pickle(Quaternionr_pickle())
 
305
                // properties
 
306
                .add_static_property("Identity",&Quaternionr_Identity)
 
307
                // methods
 
308
                .def("setFromTwoVectors",&Quaternionr_setFromTwoVectors,((bp::arg("u"),bp::arg("v"))))
 
309
                .def("conjugate",&Quaternionr::conjugate)
 
310
                .def("toAxisAngle",&Quaternionr_toAxisAngle).def("toAngleAxis",&Quaternionr_toAngleAxis)
 
311
                .def("toRotationMatrix",&Quaternionr::toRotationMatrix)
 
312
                .def("Rotate",&Quaternionr_Rotate,((bp::arg("v"))))
 
313
                .def("inverse",&Quaternionr::inverse)
 
314
                .def("norm",&Quaternionr::norm)
 
315
                .def("normalize",&Quaternionr::normalize)
 
316
                // operators
 
317
                .def(bp::self * bp::self)
 
318
                .def(bp::self *= bp::self)
 
319
                .def(bp::self * bp::other<Vector3r>())
 
320
                //.def(bp::self != bp::self).def(bp::self == bp::self) // these don't work... (?)
 
321
                .def("__eq__",&Quaternionr__eq__).def("__neq__",&Quaternionr__neq__)
 
322
                // specials
 
323
                .def("__len__",&Quaternionr_len).staticmethod("__len__")
 
324
                .def("__setitem__",&Quaternionr_set_item).def("__getitem__",&Quaternionr_get_item)
 
325
                .def("__str__",&Quaternionr_str).def("__repr__",&Quaternionr_str)
 
326
        ;
 
327
        bp::class_<Vector6r>("Vector6","6-dimensional float vector.\n\nSupported operations (``f`` if a float/int, ``v`` is a Vector6, ``m`` is Matrix6): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*f``, ``f*v``, ``v*=f``, ``v/f``, ``v/=f``, ``v==v``, ``v!=v``, ``v*m``, ``m*v``.\n\nImplicit conversion from sequence (list,tuple, …) of 6 floats.",bp::init<>())
 
328
                .def(bp::init<Vector6r>((bp::arg("other"))))
 
329
                .def("__init__",bp::make_constructor(&Vector6r_fromElements,bp::default_call_policies(),(bp::arg("v0"),bp::arg("v1"),bp::arg("v2"),bp::arg("v3"),bp::arg("v4"),bp::arg("v5"))))
 
330
                .def_pickle(Vector6r_pickle())
 
331
                // properties
 
332
                .add_static_property("Ones",&Vector6r_Ones).add_static_property("Zero",&Vector6r_Zero)
 
333
                //.add_static_property("UnitX",&Vector6r_UnitX).add_static_property("UnitY",&Vector6r_UnitY).add_static_property("UnitZ",&Vector6r_UnitZ)
 
334
                // methods
 
335
                //.def("dot",&Vector6r_dot).def("cross",&Vector6r_cross)
 
336
                .def("norm",&Vector6r::norm).def("squaredNorm",&Vector6r::squaredNorm).def("normalize",&Vector6r::normalize).def("normalized",&Vector6r::normalized)
 
337
                .def("head",&Vector6r_head).def("tail",&Vector6r_tail)
 
338
                // operators
 
339
                .def("__neg__",&Vector6r__neg__) // -v
 
340
                .def("__add__",&Vector6r__add__Vector6r).def("__iadd__",&Vector6r__iadd__Vector6r) // +, +=
 
341
                .def("__sub__",&Vector6r__sub__Vector6r).def("__isub__",&Vector6r__isub__Vector6r) // -, -=
 
342
                .def("__mul__",&Vector6r__mul__Real).def("__rmul__",&Vector6r__rmul__Real) // f*v, v*f
 
343
                .def("__div__",&Vector6r__div__Real).def("__idiv__",&Vector6r__idiv__Real) // v/f, v/=f
 
344
                .def("__mul__",&Vector6r__mul__int).def("__rmul__",&Vector6r__rmul__int) // f*v, v*f
 
345
                .def("__div__",&Vector6r__div__int).def("__idiv__",&Vector6r__idiv__int) // v/f, v/=f
 
346
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
347
                // specials
 
348
                .def("__len__",&::Vector6r_len).staticmethod("__len__")
 
349
                .def("__setitem__",&::Vector6r_set_item).def("__getitem__",&::Vector6r_get_item)
 
350
                .def("__str__",&::Vector6r_str).def("__repr__",&::Vector6r_str)
 
351
                // specials
 
352
                .def("toSymmTensor",&Vector6r_toSymmTensor,(bp::args("strain")=false),"Convert Vector6 in the Voigt notation to the corresponding 2nd order symmetric tensor (as Matrix3); if *strain* is ``True``, multiply non-diagonal components by .5")
 
353
        ;
 
354
 
 
355
        bp::class_<Vector6i>("Vector6i","6-dimensional float vector.\n\nSupported operations (``f`` if a float/int, ``v`` is a Vector6): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*f``, ``f*v``, ``v*=f``, ``v/f``, ``v/=f``, ``v==v``, ``v!=v``.\n\nImplicit conversion from sequence (list,tuple, …) of 6 floats.",bp::init<>())
 
356
                .def(bp::init<Vector6i>((bp::arg("other"))))
 
357
                .def("__init__",bp::make_constructor(&Vector6i_fromElements,bp::default_call_policies(),(bp::arg("v0"),bp::arg("v1"),bp::arg("v2"),bp::arg("v3"),bp::arg("v4"),bp::arg("v5"))))
 
358
                .def_pickle(Vector6i_pickle())
 
359
                // properties
 
360
                .add_static_property("Ones",&Vector6i_Ones).add_static_property("Zero",&Vector6i_Zero)
 
361
                //.add_static_property("UnitX",&Vector6i_UnitX).add_static_property("UnitY",&Vector6i_UnitY).add_static_property("UnitZ",&Vector6i_UnitZ)
 
362
                // methods
 
363
                //.def("dot",&Vector6i_dot).def("cross",&Vector6i_cross)
 
364
                .def("norm",&Vector6i::norm).def("squaredNorm",&Vector6i::squaredNorm).def("normalize",&Vector6i::normalize).def("normalized",&Vector6i::normalized)
 
365
                .def("head",&Vector6i_head).def("tail",&Vector6i_tail)
 
366
                // operators
 
367
                .def("__neg__",&Vector6i__neg__) // -v
 
368
                .def("__add__",&Vector6i__add__Vector6i).def("__iadd__",&Vector6i__iadd__Vector6i) // +, +=
 
369
                .def("__sub__",&Vector6i__sub__Vector6i).def("__isub__",&Vector6i__isub__Vector6i) // -, -=
 
370
                .def("__mul__",&Vector6i__mul__int).def("__rmul__",&Vector6i__rmul__int) // f*v, v*f
 
371
                .def("__div__",&Vector6i__div__int).def("__idiv__",&Vector6i__idiv__int) // v/f, v/=f
 
372
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
373
                // specials
 
374
                .def("__len__",&::Vector6i_len).staticmethod("__len__")
 
375
                .def("__setitem__",&::Vector6i_set_item).def("__getitem__",&::Vector6i_get_item)
 
376
                .def("__str__",&::Vector6i_str).def("__repr__",&::Vector6i_str)
 
377
        ;
 
378
 
 
379
        bp::class_<Vector3r>("Vector3","3-dimensional float vector.\n\nSupported operations (``f`` if a float/int, ``v`` is a Vector3): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*f``, ``f*v``, ``v*=f``, ``v/f``, ``v/=f``, ``v==v``, ``v!=v``, plus operations with ``Matrix3`` and ``Quaternion``.\n\nImplicit conversion from sequence (list,tuple, …) of 3 floats.",bp::init<>())
 
380
                .def(bp::init<Vector3r>((bp::arg("other"))))
 
381
                .def(bp::init<Real,Real,Real>((bp::arg("x"),bp::arg("y"),bp::arg("z"))))
 
382
                .def_pickle(Vector3r_pickle())
 
383
                // properties
 
384
                .add_static_property("Ones",&Vector3r_Ones).add_static_property("Zero",&Vector3r_Zero)
 
385
                .add_static_property("UnitX",&Vector3r_UnitX).add_static_property("UnitY",&Vector3r_UnitY).add_static_property("UnitZ",&Vector3r_UnitZ)
 
386
                // methods
 
387
                .def("dot",&Vector3r_dot).def("cross",&Vector3r_cross)
 
388
                .def("outer",&Vector3r_outer)
 
389
                .def("norm",&Vector3r::norm).def("squaredNorm",&Vector3r::squaredNorm).def("normalize",&Vector3r::normalize).def("normalized",&Vector3r::normalized)
 
390
                // operators
 
391
                .def("__neg__",&Vector3r__neg__) // -v
 
392
                .def("__add__",&Vector3r__add__Vector3r).def("__iadd__",&Vector3r__iadd__Vector3r) // +, +=
 
393
                .def("__sub__",&Vector3r__sub__Vector3r).def("__isub__",&Vector3r__isub__Vector3r) // -, -=
 
394
                .def("__mul__",&Vector3r__mul__Real).def("__rmul__",&Vector3r__rmul__Real) // f*v, v*f
 
395
                .def("__div__",&Vector3r__div__Real).def("__idiv__",&Vector3r__idiv__Real) // v/f, v/=f
 
396
                .def("__mul__",&Vector3r__mul__int).def("__rmul__",&Vector3r__rmul__int) // f*v, v*f
 
397
                .def("__div__",&Vector3r__div__int).def("__idiv__",&Vector3r__idiv__int) // v/f, v/=f
 
398
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
399
                // specials
 
400
                .def("__len__",&::Vector3r_len).staticmethod("__len__")
 
401
                .def("__setitem__",&::Vector3r_set_item).def("__getitem__",&::Vector3r_get_item)
 
402
                .def("__str__",&::Vector3r_str).def("__repr__",&::Vector3r_str)
 
403
        ;       
 
404
        bp::class_<Vector3i>("Vector3i","3-dimensional integer vector.\n\nSupported operations (``i`` if an int, ``v`` is a Vector3i): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*i``, ``i*v``, ``v*=i``, ``v==v``, ``v!=v``.\n\nImplicit conversion from sequence  (list,tuple, …) of 3 integers.",bp::init<>())
 
405
                .def(bp::init<Vector3i>((bp::arg("other"))))
 
406
                .def(bp::init<int,int,int>((bp::arg("x"),bp::arg("y"),bp::arg("z"))))
 
407
                .def_pickle(Vector3i_pickle())
 
408
                // properties
 
409
                .add_static_property("Ones",&Vector3i_Ones).add_static_property("Zero",&Vector3i_Zero)
 
410
                .add_static_property("UnitX",&Vector3i_UnitX).add_static_property("UnitY",&Vector3i_UnitY).add_static_property("UnitZ",&Vector3i_UnitZ)
 
411
                // methods
 
412
                .def("dot",&Vector3i_dot).def("cross",&Vector3i_cross)
 
413
                .def("norm",&Vector3i::norm).def("squaredNorm",&Vector3i::squaredNorm)
 
414
                // operators
 
415
                .def("__neg__",&Vector3i__neg__) // -v
 
416
                .def("__add__",&Vector3i__add__Vector3i).def("__iadd__",&Vector3i__iadd__Vector3i) // +, +=
 
417
                .def("__sub__",&Vector3i__sub__Vector3i).def("__isub__",&Vector3i__isub__Vector3i) // -, -=
 
418
                .def("__mul__",&Vector3i__mul__int).def("__rmul__",&Vector3i__rmul__int) // f*v, v*f
 
419
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
420
                // specials
 
421
                .def("__len__",&::Vector3i_len).staticmethod("__len__")
 
422
                .def("__setitem__",&::Vector3i_set_item).def("__getitem__",&::Vector3i_get_item)
 
423
                .def("__str__",&::Vector3i_str).def("__repr__",&::Vector3i_str)
 
424
        ;       
 
425
        bp::class_<Vector2r>("Vector2","3-dimensional float vector.\n\nSupported operations (``f`` if a float/int, ``v`` is a Vector3): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*f``, ``f*v``, ``v*=f``, ``v/f``, ``v/=f``, ``v==v``, ``v!=v``.\n\nImplicit conversion from sequence (list,tuple, …) of 2 floats.",bp::init<>())
 
426
                .def(bp::init<Vector2r>((bp::arg("other"))))
 
427
                .def(bp::init<Real,Real>((bp::arg("x"),bp::arg("y"))))
 
428
                .def_pickle(Vector2r_pickle())
 
429
                // properties
 
430
                .add_static_property("Ones",&Vector2r_Ones).add_static_property("Zero",&Vector2r_Zero)
 
431
                .add_static_property("UnitX",&Vector2r_UnitX).add_static_property("UnitY",&Vector2r_UnitY)
 
432
                // methods
 
433
                .def("dot",&Vector2r_dot)
 
434
                .def("norm",&Vector2r::norm).def("squaredNorm",&Vector2r::squaredNorm).def("normalize",&Vector2r::normalize)
 
435
                // operators
 
436
                .def("__neg__",&Vector2r__neg__) // -v
 
437
                .def("__add__",&Vector2r__add__Vector2r).def("__iadd__",&Vector2r__iadd__Vector2r) // +, +=
 
438
                .def("__sub__",&Vector2r__sub__Vector2r).def("__isub__",&Vector2r__isub__Vector2r) // -, -=
 
439
                .def("__mul__",&Vector2r__mul__Real).def("__rmul__",&Vector2r__rmul__Real) // f*v, v*f
 
440
                .def("__div__",&Vector2r__div__Real).def("__idiv__",&Vector2r__idiv__Real) // v/f, v/=f
 
441
                .def("__mul__",&Vector2r__mul__int).def("__rmul__",&Vector2r__rmul__int) // f*v, v*f
 
442
                .def("__div__",&Vector2r__div__int).def("__idiv__",&Vector2r__idiv__int) // v/f, v/=f
 
443
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
444
                // specials
 
445
                .def("__len__",&::Vector2r_len).staticmethod("__len__")
 
446
                .def("__setitem__",&::Vector2r_set_item).def("__getitem__",&::Vector2r_get_item)
 
447
                .def("__str__",&::Vector2r_str).def("__repr__",&::Vector2r_str)
 
448
        ;       
 
449
        bp::class_<Vector2i>("Vector2i","2-dimensional integer vector.\n\nSupported operations (``i`` if an int, ``v`` is a Vector2i): ``-v``, ``v+v``, ``v+=v``, ``v-v``, ``v-=v``, ``v*i``, ``i*v``, ``v*=i``, ``v==v``, ``v!=v``.\n\nImplicit conversion from sequence (list,tuple, …) of 2 integers.",bp::init<>())
 
450
                .def(bp::init<Vector2i>((bp::arg("other"))))
 
451
                .def(bp::init<int,int>((bp::arg("x"),bp::arg("y"))))
 
452
                .def_pickle(Vector2i_pickle())
 
453
                // properties
 
454
                .add_static_property("Ones",&Vector2i_Ones).add_static_property("Zero",&Vector2i_Zero)
 
455
                .add_static_property("UnitX",&Vector2i_UnitX).add_static_property("UnitY",&Vector2i_UnitY)
 
456
                // methods
 
457
                .def("dot",&Vector2i_dot)
 
458
                .def("norm",&Vector2i::norm).def("squaredNorm",&Vector2i::squaredNorm).def("normalize",&Vector2i::normalize)
 
459
                // operators
 
460
                .def("__neg__",&Vector2i__neg__) // -v
 
461
                .def("__add__",&Vector2i__add__Vector2i).def("__iadd__",&Vector2i__iadd__Vector2i) // +, +=
 
462
                .def("__sub__",&Vector2i__sub__Vector2i).def("__isub__",&Vector2i__isub__Vector2i) // -, -=
 
463
                .def("__mul__",&Vector2i__mul__int).def("__rmul__",&Vector2i__rmul__int) // f*v, v*f
 
464
                .def(bp::self != bp::self).def(bp::self == bp::self)
 
465
                // specials
 
466
                .def("__len__",&::Vector2i_len).staticmethod("__len__")
 
467
                .def("__setitem__",&::Vector2i_set_item).def("__getitem__",&::Vector2i_get_item)
 
468
                .def("__str__",&::Vector2i_str).def("__repr__",&::Vector2i_str)
 
469
        ;       
 
470
        
 
471
};
 
472
 
 
473
 
 
474
 
 
475
 
 
476
 
 
477
 
 
478
 
 
479