annotate octave_to_python.cc @ 70:e3de0f6f1552

experimental NumPy support
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 19 Jun 2009 13:51:36 +0200
parents 2f4d6286fb36
children b0991511a16d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
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
d95e9d46f538 License change to GPLv3
David Grundberg <individ@acc.umu.se>
parents: 0
diff changeset
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 "arrayobjectdefs.h"
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>
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
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 define HAVE_STAT... */
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
26 #include <octave/oct.h>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
27 #include <octave/Matrix.h>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
28 #include <octave/ov.h>
9
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
29 #include <octave/oct-map.h>
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
30
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
31 #include <iostream>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
32 #include "pytavedefs.h"
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
33 #include "exceptions.h"
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
34 #include "octave_to_python.h"
0
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 /* From docs:
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
37 * Note that the names of the element type constants refer to the C data
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
38 * types, not the Python data types. A Python int is equivalent to a C long,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
39 * and a Python float corresponds to a C double . Many of the element types
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
40 * listed above do not have corresponding Python scalar types
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
41 * (e.g. PyArray_INT ).
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
42 */
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
43
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
44 using namespace std;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
45 using namespace boost::python;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
46
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
47 namespace pytave {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
48
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
49 template <class PythonPrimitive, class OctaveBase>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
50 static void copy_octarray_to_pyarrobj(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
51 PyArrayObject *pyarr,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
52 const OctaveBase &matrix,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
53 const unsigned int matindex,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
54 const unsigned int matstride,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
55 const int dimension,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
56 const unsigned int offset) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
57 unsigned char *ptr = (unsigned char*) pyarr->data;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
58 if (dimension == pyarr->nd - 1) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
59 // Last dimension, base case
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
60 for (int i = 0; i < pyarr->dimensions[dimension]; i++) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
61 *(PythonPrimitive *)&ptr[offset + i*pyarr->strides[dimension]]
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
62 = matrix.elem(matindex + i*matstride);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
63 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
64 } else {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
65 for (int i = 0; i < pyarr->dimensions[dimension]; i++) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
66 copy_octarray_to_pyarrobj<PythonPrimitive, OctaveBase>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
67 pyarr,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
68 matrix,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
69 matindex + i*matstride,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
70 matstride * pyarr->dimensions[dimension],
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
71 dimension + 1,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
72 offset + i*pyarr->strides[dimension]);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
73 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
74 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
75 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
76
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
77 template <>
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
78 void copy_octarray_to_pyarrobj<PyObject *, Cell>(
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
79 PyArrayObject *pyarr,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
80 const Cell &matrix,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
81 const unsigned int matindex,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
82 const unsigned int matstride,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
83 const int dimension,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
84 const unsigned int offset) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
85 unsigned char *ptr = (unsigned char*) pyarr->data;
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
86 if (dimension == pyarr->nd - 1) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
87 // Last dimension, base case
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
88 for (int i = 0; i < pyarr->dimensions[dimension]; i++) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
89 object pyobj;
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
90 octvalue_to_pyobj (pyobj, matrix.elem(matindex + i*matstride));
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
91 Py_INCREF (pyobj.ptr());
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
92 *(PyObject **)&ptr[offset + i*pyarr->strides[dimension]]
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
93 = pyobj.ptr();
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
94 }
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
95 } else {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
96 for (int i = 0; i < pyarr->dimensions[dimension]; i++) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
97 copy_octarray_to_pyarrobj<PyObject *, Cell>(
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
98 pyarr,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
99 matrix,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
100 matindex + i*matstride,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
101 matstride * pyarr->dimensions[dimension],
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
102 dimension + 1,
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
103 offset + i*pyarr->strides[dimension]);
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
104 }
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
105 }
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
106 }
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
107
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
108 static PyArrayObject *createPyArr(const dim_vector &dims,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
109 int pyarrtype) {
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
110 int len = dims.length();
70
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
111 npy_intp dimensions[len];
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
112 for (int i = 0; i < dims.length(); i++) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
113 dimensions[i] = dims(i);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
114 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
115
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
116 return (PyArrayObject *)PyArray_FromDims(
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
117 len, dimensions, pyarrtype);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
118 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
119
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
120 template <class PythonPrimitive, class OctaveBase>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
121 static PyArrayObject *create_array(const OctaveBase &octarr,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
122 int pyarraytype) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
123 PyArrayObject *pyarr = createPyArr(octarr.dims(), pyarraytype);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
124 try {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
125 copy_octarray_to_pyarrobj
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
126 <PythonPrimitive, OctaveBase>(pyarr, octarr, 0, 1, 0, 0);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
127 } catch (value_convert_exception &pe) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
128 Py_DECREF(pyarr);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
129 throw;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
130 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
131 return pyarr;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
132 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
133
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
134 template <class PythonPrimitive, class OctaveBase>
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
135 static PyArrayObject *create_array(const OctaveBase &octarr,
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
136 int pyarraytype, boost::true_type) {
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
137 return create_array<PythonPrimitive, OctaveBase> (octarr, pyarraytype);
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
138 }
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
139
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
140 template <class PythonPrimitive, class OctaveBase>
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
141 static PyArrayObject *create_array(const OctaveBase &octarr,
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
142 int pyarraytype, boost::false_type) {
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
143 assert(0);
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
144 return 0;
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
145 }
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
146
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
147 template <class CLASS, size_t bytes>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
148 inline static PyArrayObject *create_uint_array(CLASS value) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
149 if (bytes == sizeof(int)) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
150 boost::integral_constant<bool, bytes == sizeof(int)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
151 return create_array<unsigned int, CLASS>(value, PyArray_UINT, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
152 } else if (bytes == sizeof(char)) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
153 boost::integral_constant<bool, bytes == sizeof(char)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
154 return create_array<unsigned char, CLASS>(value, PyArray_UBYTE, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
155 } else if (bytes == sizeof(short)) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
156 boost::integral_constant<bool,
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
157 bytes == sizeof(short) && bytes != sizeof(int)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
158 return create_array<unsigned short, CLASS>(value, PyArray_USHORT, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
159 } else {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
160 ostringstream os;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
161 os << "Numeric arrays doesn't support unsigned " << (bytes*8)
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
162 << "-bit values on this architecture.";
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
163 throw value_convert_exception(os.str());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
164 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
165 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
166
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
167 template <class CLASS, size_t bytes>
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
168 inline static PyArrayObject *create_sint_array(CLASS value) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
169 if (bytes == sizeof(int)) {
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
170 // We test int first since we prefer int to other datatypes of the
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
171 // same size.
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
172 boost::integral_constant<bool, bytes == sizeof(int)> inst;
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
173 return create_array<signed int, CLASS>(value, PyArray_INT, inst);
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
174 } else if (bytes == sizeof(long)) {
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
175 boost::integral_constant<bool,
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
176 bytes==sizeof(long) && bytes != sizeof(int)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
177 return create_array<long, CLASS>(value, PyArray_LONG, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
178 } else if (bytes == sizeof(char)) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
179 boost::integral_constant<bool, bytes == sizeof(char)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
180 return create_array<signed char, CLASS>(value, PyArray_SBYTE, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
181 } else if (bytes == sizeof(short)) {
47
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
182 boost::integral_constant<bool,
c83754e57d26 Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents: 46
diff changeset
183 bytes==sizeof(short) && bytes != sizeof(int)> inst;
45
3eb653452a38 avoid useless instances in octave_to_python.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 41
diff changeset
184 return create_array<signed short, CLASS>(value, PyArray_SHORT, inst);
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
185 } else {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
186 ostringstream os;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
187 os << "Numeric arrays doesn't support signed " << (bytes*8)
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
188 << "-bit values on this architecture.";
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
189 throw value_convert_exception(os.str());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
190 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
191 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
192
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
193 static PyArrayObject *octvalue_to_pyarrobj(const octave_value &matrix) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
194 if (matrix.is_double_type ()) {
46
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
195 if (matrix.is_complex_type ()) {
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
196 return create_array<Complex, ComplexNDArray>
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
197 (matrix.complex_array_value(), PyArray_CDOUBLE);
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
198 } else if (matrix.is_real_type()) {
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
199 return create_array<double, NDArray>(matrix.array_value(),
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
200 PyArray_DOUBLE);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
201 } else
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
202 throw value_convert_exception("Unknown double matrix type");
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
203 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
204
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
205 if (matrix.is_single_type ()) {
46
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
206 if (matrix.is_complex_type ()) {
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
207 return create_array<FloatComplex, FloatComplexNDArray>
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
208 (matrix.float_complex_array_value(), PyArray_CFLOAT);
095e26d93935 support complex numbers
Jaroslav Hajek <highegg@gmail.com>
parents: 45
diff changeset
209 } else if (matrix.is_real_type()) {
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
210 return create_array<float, FloatNDArray>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
211 matrix.float_array_value(), PyArray_FLOAT);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
212 } else
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
213 throw value_convert_exception("Unknown float matrix type");
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
214 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
215
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
216 if (matrix.is_int64_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
217 return create_sint_array<int64NDArray, sizeof(int64_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
218 matrix.int64_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
219 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
220 if (matrix.is_uint32_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
221 return create_uint_array<uint32NDArray, sizeof(uint32_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
222 matrix.uint32_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
223 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
224 if (matrix.is_int32_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
225 return create_sint_array<int32NDArray, sizeof(int32_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
226 matrix.int32_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
227 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
228 if (matrix.is_uint16_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
229 return create_uint_array<uint16NDArray, sizeof(uint16_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
230 matrix.uint16_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
231 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
232 if (matrix.is_int16_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
233 return create_sint_array<int16NDArray, sizeof(int16_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
234 matrix.int16_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
235 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
236 if (matrix.is_uint8_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
237 return create_uint_array<uint8NDArray, sizeof(uint8_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
238 matrix.uint8_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
239 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
240 if (matrix.is_int8_type()) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
241 return create_sint_array<int8NDArray, sizeof(int8_t)>(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
242 matrix.int8_array_value());
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
243 }
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
244 if (matrix.is_bool_type()) {
70
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
245 #ifdef HAVE_NUMPY
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
246 // NumPY has logical arrays, and even provides an old-style #define.
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
247 return create_array<bool, boolNDArray>(
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
248 matrix.bool_array_value(), PyArray_BOOL);
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
249 #else
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
250 // Numeric does not support bools, use uint8.
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
251 return create_uint_array<uint8NDArray, sizeof(uint8_t)>(
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
252 matrix.uint8_array_value());
70
e3de0f6f1552 experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents: 68
diff changeset
253 #endif
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
254 }
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
255 if (matrix.is_string()) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
256 return create_array<char, charNDArray>(
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
257 matrix.char_array_value(), PyArray_CHAR);
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
258 }
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
259 if (matrix.is_cell()) {
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
260 return create_array<PyObject *, Cell>(
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
261 matrix.cell_value(), PyArray_OBJECT);
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
262 }
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
263
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
264 throw value_convert_exception("Octave matrix type not known, "
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
265 "conversion not implemented");
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
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
268 static void octvalue_to_pyarr(boost::python::object &py_object,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
269 const octave_value& octvalue) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
270 PyArrayObject *pyarr = octvalue_to_pyarrobj(octvalue);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
271 py_object = object(handle<PyObject>((PyObject *)pyarr));
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
272 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
273
9
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
274 static void octmap_to_pyobject(boost::python::object &py_object,
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
275 const Octave_map& map) {
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
276 py_object = boost::python::dict();
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
277 string_vector keys = map.keys();
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
278
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
279 for(octave_idx_type i = 0 ; i < keys.length(); i++) {
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
280 boost::python::object py_val;
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
281
56
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
282 const Cell c = map.contents(keys[i]);
43a413b7c151 improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 50
diff changeset
283
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
284 octvalue_to_pyarr(py_val, c);
9
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
285
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
286 py_object[keys[i]] = py_val;
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
287 }
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
288 }
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
289
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
290 void octvalue_to_pyobj(boost::python::object &py_object,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
291 const octave_value& octvalue) {
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
292 if (octvalue.is_undefined()) {
27
c3cba408a7e6 Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents: 25
diff changeset
293 throw value_convert_exception(
c3cba408a7e6 Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents: 25
diff changeset
294 "Octave value `undefined'. Can not convert to a Python object");
68
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
295 } else if (octvalue.is_numeric_type() || octvalue.is_string()
2f4d6286fb36 make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents: 56
diff changeset
296 || octvalue.is_cell()) {
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
297 octvalue_to_pyarr(py_object, octvalue);
27
c3cba408a7e6 Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents: 25
diff changeset
298 } else if (octvalue.is_map()) {
9
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
299 octmap_to_pyobject(py_object, octvalue.map_value());
27
c3cba408a7e6 Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents: 25
diff changeset
300 } else
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
301 throw value_convert_exception(
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
302 "Conversion from Octave value not implemented");
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
303 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
304
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
305 void octlist_to_pytuple(boost::python::tuple &python_tuple,
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
306 const octave_value_list &octave_list) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
307 boost::python::list seq;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
308 int length = octave_list.length();
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
309 for (int i = 0; i < length; i++) {
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
310 boost::python::object py_object;
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
311 octvalue_to_pyobj(py_object, octave_list(i));
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
312 seq.append(py_object);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
313 }
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
314 python_tuple = tuple(seq);
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
315 }
25
113428ba033c Whitespace fixes
David Grundberg <individ@acc.umu.se>
parents: 21
diff changeset
316 }
9
9a773d71a973 celler & structar ^_^
Håkan Fors nilsson <c04hfn@cs.umu.se>
parents: 6
diff changeset
317
0
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
318 /* Emacs
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
319 * Local Variables:
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
320 * fill-column:79
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
321 * coding:utf-8
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
322 * indent-tabs-mode:nil
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
323 * c-basic-offset:3
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
324 * End:
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
325 * vim: set textwidth=79 expandtab shiftwidth=3 :
4da14cce0890 First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff changeset
326 */