Mercurial > pytave
annotate python_to_octave.cc @ 79:d60165bfc849
Support 0D Numeric arrays
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 18 Sep 2009 10:31:15 +0200 |
parents | b0991511a16d |
children | 2e8b52a5e1b1 |
rev | line source |
---|---|
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
1 /* |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
2 * Copyright 2008 David Grundberg, HÃ¥kan Fors Nilsson |
46 | 3 * Copyright 2009 VZLU Prague |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
4 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
5 * This file is part of Pytave. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
6 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
7 * Pytave is free software: you can redistribute it and/or modify |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
6 | 9 * the Free Software Foundation, either version 3 of the License, or |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
10 * (at your option) any later version. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
11 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
12 * Pytave is distributed in the hope that it will be useful, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
16 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
18 * along with Pytave. If not, see <http://www.gnu.org/licenses/>. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
19 */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
20 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
21 #include <iostream> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
22 #include <boost/python.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
23 #include <boost/python/numeric.hpp> |
46 | 24 #include <boost/type_traits/integral_constant.hpp> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
25 #undef HAVE_STAT /* both boost.python and octave defines HAVE_STAT... */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
26 #include <octave/oct.h> |
9 | 27 #include <octave/oct-map.h> |
28 #include <octave/Cell.h> | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
29 #include <octave/Matrix.h> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
30 #include <octave/ov.h> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
31 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
32 #include "pytavedefs.h" |
75
b0991511a16d
a few fixes to numpy support
Jaroslav Hajek <highegg@gmail.com>
parents:
70
diff
changeset
|
33 #include "arrayobjectdefs.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
34 #include "exceptions.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
35 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
36 using namespace std; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
37 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
38 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
39 namespace pytave { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
40 |
9 | 41 void pyobj_to_octvalue(octave_value &oct_value, |
42 const boost::python::object &py_object); | |
43 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
44 template <class PythonPrimitive, class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
45 static void copy_pyarrobj_to_octarray(OctaveBase &matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
46 const PyArrayObject* const pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
47 const int unsigned matindex, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
48 const unsigned int matstride, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
49 const int dimension, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
50 const unsigned int offset) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
51 unsigned char *ptr = (unsigned char*) pyarr->data; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
52 if (dimension == pyarr->nd - 1) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
53 // Last dimension, base case |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
54 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
55 matrix.elem(matindex + i*matstride) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
56 = *(PythonPrimitive*) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
57 &ptr[offset + i*pyarr->strides[dimension]]; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
58 } |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
59 } else if (pyarr->nd == 0) { |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
60 matrix.elem(0) = *(PythonPrimitive*) ptr; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
61 } else { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
62 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
63 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
64 matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
65 pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
66 matindex + i*matstride, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
67 matstride * pyarr->dimensions[dimension], |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
68 dimension + 1, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
69 offset + i*pyarr->strides[dimension]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
70 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
71 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
72 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
73 |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
74 template <> |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
75 void copy_pyarrobj_to_octarray<PyObject *, Cell>(Cell &matrix, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
76 const PyArrayObject* const pyarr, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
77 const int unsigned matindex, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
78 const unsigned int matstride, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
79 const int dimension, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
80 const unsigned int offset) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
81 unsigned char *ptr = (unsigned char*) pyarr->data; |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
82 if (dimension == pyarr->nd - 1) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
83 // Last dimension, base case |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
84 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
85 PyObject *pobj = *(PyObject **) |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
86 &ptr[offset + i*pyarr->strides[dimension]]; |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
87 pyobj_to_octvalue (matrix.elem(matindex + i*matstride), |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
88 object(handle<PyObject> (borrowed (pobj)))); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
89 } |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
90 } else if (pyarr->nd == 0) { |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
91 PyObject *pobj = *(PyObject **) ptr; |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
92 pyobj_to_octvalue (matrix.elem(0), |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
93 object(handle<PyObject> (borrowed (pobj)))); |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
94 } else { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
95 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
96 copy_pyarrobj_to_octarray<PyObject *, Cell>( |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
97 matrix, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
98 pyarr, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
99 matindex + i*matstride, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
100 matstride * pyarr->dimensions[dimension], |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
101 dimension + 1, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
102 offset + i*pyarr->strides[dimension]); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
103 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
104 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
105 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
106 |
46 | 107 template <class PythonPrimitive, class OctaveBase> |
108 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
109 const PyArrayObject* const pyarr, | |
110 const boost::true_type&) { | |
111 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase> | |
112 (matrix, pyarr, 0, 1, 0, 0); | |
113 } | |
114 | |
115 template <class PythonPrimitive, class OctaveBase> | |
116 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
117 const PyArrayObject* const pyarr, | |
118 const boost::false_type&) { | |
119 assert(0); | |
120 } | |
121 | |
122 template <class X, class Y> class matching_type : public boost::false_type { }; | |
123 template <class X> class matching_type<X, X> : public boost::true_type { }; | |
124 template <class X> class matching_type<X, octave_int<X> > : public boost::true_type { }; | |
125 template <> class matching_type<float, double> : public boost::true_type { }; | |
126 template <> class matching_type<FloatComplex, Complex> : public boost::true_type { }; | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
127 template <> class matching_type<PyObject *, octave_value> : public boost::true_type { }; |
46 | 128 |
129 template <class PythonPrimitive, class OctaveBase> | |
130 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
131 const PyArrayObject* const pyarr) { | |
132 matching_type<PythonPrimitive, typename OctaveBase::element_type> inst; | |
133 copy_pyarrobj_to_octarray_dispatch<PythonPrimitive, OctaveBase> (matrix, pyarr, inst); | |
134 } | |
135 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
136 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
137 static void copy_pyarrobj_to_octarray_boot(OctaveBase &matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
138 const PyArrayObject* const pyarr) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
139 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
140 #define ARRAYCASE(AC_pyarrtype, AC_primitive) case AC_pyarrtype: \ |
46 | 141 copy_pyarrobj_to_octarray_dispatch<AC_primitive, OctaveBase>\ |
142 (matrix, pyarr); \ | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
143 break; \ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
144 |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
145 // Prefer int to other types of the same size. |
50 | 146 // E.g. on 32-bit x86 architectures: sizeof(long) == sizeof(int). |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
147 int type_num = pyarr->descr->type_num; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
148 switch (type_num) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
149 case PyArray_LONG: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
150 if (sizeof(long) == sizeof(int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
151 type_num = PyArray_INT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
152 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
153 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
154 case PyArray_SHORT: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
155 if (sizeof(short) == sizeof(int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
156 type_num = PyArray_INT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
157 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
158 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
159 case PyArray_USHORT: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
160 if (sizeof(unsigned short) == sizeof(unsigned int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
161 type_num = PyArray_UINT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
162 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
163 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
164 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
165 |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
166 switch (type_num) { |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
167 ARRAYCASE(PyArray_CHAR, char) |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
168 ARRAYCASE(PyArray_UBYTE, unsigned char) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
169 ARRAYCASE(PyArray_SBYTE, signed char) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
170 ARRAYCASE(PyArray_SHORT, signed short) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
171 ARRAYCASE(PyArray_USHORT, unsigned short) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
172 ARRAYCASE(PyArray_INT, signed int) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
173 ARRAYCASE(PyArray_UINT, unsigned int) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
174 ARRAYCASE(PyArray_LONG, signed long) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
175 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
176 /* Commonly Numeric.array(..., Numeric.Float32) */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
177 ARRAYCASE(PyArray_FLOAT, float) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
178 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
179 /* Commonly Numeric.array(..., Numeric.Float) */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
180 ARRAYCASE(PyArray_DOUBLE, double) |
46 | 181 |
182 /* Commonly Numeric.array(..., Numeric.Complex32) */ | |
183 ARRAYCASE(PyArray_CFLOAT, FloatComplex) | |
184 | |
185 /* Commonly Numeric.array(..., Numeric.Complex) */ | |
186 ARRAYCASE(PyArray_CDOUBLE, Complex) | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
187 |
70
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
188 #ifdef HAVE_NUMPY |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
189 ARRAYCASE(PyArray_BOOL, bool) |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
190 #endif |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
191 |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
192 ARRAYCASE(PyArray_OBJECT, PyObject *) |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
193 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
194 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
195 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
196 PyEval_GetFuncName((PyObject*)pyarr) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
197 + (PyEval_GetFuncDesc((PyObject*)pyarr) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
198 + string(": Unsupported Python array type"))); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
199 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
200 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
201 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
202 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
203 static void pyarrobj_to_octvalueNd(octave_value &octvalue, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
204 const PyArrayObject* const pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
205 dim_vector dims) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
206 OctaveBase array(dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
207 copy_pyarrobj_to_octarray_boot<OctaveBase>(array, pyarr); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
208 octvalue = array; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
209 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
210 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
211 static void pyarr_to_octvalue(octave_value &octvalue, |
25 | 212 const PyArrayObject *pyarr) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
213 dim_vector dims; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
214 switch (pyarr->nd) { |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
215 case 0: |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
216 dims = dim_vector (1, 1); |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
217 break; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
218 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
219 // Always make PyArray vectors row vectors. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
220 dims = dim_vector(1, pyarr->dimensions[0]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
221 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
222 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
223 dims.resize(pyarr->nd); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
224 for (int d = 0; d < pyarr->nd; d++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
225 dims(d) = pyarr->dimensions[d]; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
226 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
227 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
228 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
229 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
230 switch (pyarr->descr->type_num) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
231 case PyArray_UBYTE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
232 case PyArray_USHORT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
233 case PyArray_UINT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
234 switch (pyarr->descr->elsize) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
235 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
236 pyarrobj_to_octvalueNd<uint8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
237 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
238 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
239 pyarrobj_to_octvalueNd<uint16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
240 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
241 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
242 pyarrobj_to_octvalueNd<uint32NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
243 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
244 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
245 throw object_convert_exception("Unknown unsigned integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
246 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
247 case PyArray_SBYTE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
248 case PyArray_SHORT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
249 case PyArray_INT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
250 case PyArray_LONG: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
251 switch (pyarr->descr->elsize) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
252 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
253 pyarrobj_to_octvalueNd<int8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
254 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
255 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
256 pyarrobj_to_octvalueNd<int16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
257 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
258 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
259 pyarrobj_to_octvalueNd<int32NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
260 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
261 case 8: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
262 pyarrobj_to_octvalueNd<int64NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
263 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
264 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
265 throw object_convert_exception("Unknown integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
266 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
267 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
268 case PyArray_FLOAT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
269 pyarrobj_to_octvalueNd<FloatNDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
270 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
271 case PyArray_DOUBLE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
272 pyarrobj_to_octvalueNd<NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
273 break; |
46 | 274 case PyArray_CFLOAT: |
275 pyarrobj_to_octvalueNd<FloatComplexNDArray>(octvalue, pyarr, dims); | |
276 break; | |
277 case PyArray_CDOUBLE: | |
278 pyarrobj_to_octvalueNd<ComplexNDArray>(octvalue, pyarr, dims); | |
279 break; | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
280 case PyArray_CHAR: |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
281 pyarrobj_to_octvalueNd<charNDArray>(octvalue, pyarr, dims); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
282 // FIXME: is the following needed? |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
283 octvalue = octvalue.convert_to_str(true, true, '"'); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
284 break; |
70
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
285 #ifdef HAVE_NUMPY |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
286 case PyArray_BOOL: |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
287 pyarrobj_to_octvalueNd<boolNDArray>(octvalue, pyarr, dims); |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
288 break; |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
289 #endif |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
290 case PyArray_OBJECT: |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
291 pyarrobj_to_octvalueNd<Cell>(octvalue, pyarr, dims); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
292 break; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
293 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
294 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
295 PyEval_GetFuncDesc((PyObject*)(pyarr)) + string(" ") |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
296 + PyEval_GetFuncName((PyObject*)(pyarr)) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
297 + ": Encountered unsupported Python array"); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
298 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
299 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
300 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
301 |
25 | 302 static void pylist_to_cellarray(octave_value &oct_value, |
303 const boost::python::list &list) { | |
304 | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
305 octave_idx_type length = boost::python::extract<octave_idx_type>( |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
306 list.attr("__len__")()); |
9 | 307 octave_value_list values; |
308 | |
309 for(octave_idx_type i = 0; i < length; i++) { | |
25 | 310 octave_value val; |
9 | 311 |
312 pyobj_to_octvalue(val, list[i]); | |
313 values.append(val); | |
314 | |
315 } | |
25 | 316 |
9 | 317 oct_value = Cell(values); |
318 } | |
319 | |
25 | 320 static void pydict_to_octmap(octave_value &oct_value, |
321 const boost::python::dict &dict) { | |
9 | 322 |
323 boost::python::list list = dict.items(); | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
324 octave_idx_type length = boost::python::extract<octave_idx_type>( |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
325 list.attr("__len__")()); |
9 | 326 |
327 dim_vector dims = dim_vector(1, 1); | |
328 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
329 Array<octave_value> vals (length); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
330 Array<std::string> keys (length); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
331 |
56
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
332 // Extract all keys and convert values. Remember whether dimensions |
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
333 // match. |
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
334 |
9 | 335 for(octave_idx_type i = 0; i < length; i++) { |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
336 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
337 std::string& key = keys(i); |
9 | 338 |
339 boost::python::tuple tuple = | |
340 boost::python::extract<boost::python::tuple>(list[i])(); | |
341 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
342 boost::python::extract<std::string> str(tuple[0]); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
343 if(!str.check()) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
344 throw object_convert_exception( |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
345 string("Can not convert key of type ") |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
346 + PyEval_GetFuncName(boost::python::object(tuple[0]).ptr()) |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
347 + PyEval_GetFuncDesc(boost::python::object(tuple[0]).ptr()) |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
348 + " to a structure field name. Field names must be strings."); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
349 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
350 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
351 key = str(); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
352 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
353 if (!valid_identifier(key)) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
354 throw object_convert_exception( |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
355 string("Can not convert key `") + key + "' to a structure " |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
356 "field name. Field names must be valid Octave identifiers."); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
357 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
358 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
359 octave_value& val = vals(i); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
360 |
9 | 361 pyobj_to_octvalue(val, tuple[1]); |
362 | |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
363 if(val.is_cell()) { |
56
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
364 if(i == 0) { |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
365 dims = val.dims(); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
366 } else if (val.numel() != 1 && val.dims() != dims){ |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
367 throw object_convert_exception( |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
368 "Dimensions of the struct fields do not match"); |
9 | 369 } |
370 } | |
371 } | |
372 | |
373 Octave_map map = Octave_map(dims); | |
374 | |
375 for(octave_idx_type i = 0; i < length; i++) { | |
376 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
377 std::string& key = keys(i); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
378 octave_value val = vals(i); |
9 | 379 |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
380 if(val.is_cell()) { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
381 const Cell c = val.cell_value(); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
382 if (c.numel () == 1) { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
383 map.assign(key, Cell(dims, c(0))); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
384 } else { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
385 map.assign(key, c); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
386 } |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
387 } else { |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
388 map.assign(key, Cell(dims, val)); |
9 | 389 } |
390 } | |
391 oct_value = map; | |
392 } | |
393 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
394 void pyobj_to_octvalue(octave_value &oct_value, |
25 | 395 const boost::python::object &py_object) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
396 extract<int> intx(py_object); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
397 extract<double> doublex(py_object); |
46 | 398 extract<Complex> complexx(py_object); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
399 extract<string> stringx(py_object); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
400 extract<numeric::array> arrayx(py_object); |
9 | 401 extract<boost::python::list> listx(py_object); |
402 extract<boost::python::dict> dictx(py_object); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
403 if (intx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
404 oct_value = intx(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
405 } else if (doublex.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
406 oct_value = doublex(); |
46 | 407 } else if (complexx.check()) { |
408 oct_value = complexx(); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
409 } else if (arrayx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
410 pyarr_to_octvalue(oct_value, (PyArrayObject*)py_object.ptr()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
411 } else if (stringx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
412 oct_value = stringx(); |
9 | 413 } else if (listx.check()) { |
414 pylist_to_cellarray(oct_value, (boost::python::list&)py_object); | |
415 } else if (dictx.check()) { | |
416 pydict_to_octmap(oct_value, (boost::python::dict&)py_object); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
417 } else { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
418 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
419 PyEval_GetFuncName(py_object.ptr()) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
420 + (PyEval_GetFuncDesc(py_object.ptr()) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
421 + string(": Unsupported Python object type, " |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
422 "cannot convert to Octave value"))); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
423 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
424 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
425 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
426 void pytuple_to_octlist(octave_value_list &octave_list, |
25 | 427 const boost::python::tuple &python_tuple) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
428 int length = extract<int>(python_tuple.attr("__len__")()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
429 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
430 for (int i = 0; i < length; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
431 pyobj_to_octvalue(octave_list(i), python_tuple[i]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
432 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
433 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
434 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
435 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
436 /* Emacs |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
437 * Local Variables: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
438 * fill-column:79 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
439 * coding:utf-8 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
440 * indent-tabs-mode:nil |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
441 * c-basic-offset:3 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
442 * End: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
443 * vim: set textwidth=79 expandtab shiftwidth=3 : |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
444 */ |