]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/python/src/numeric.cpp
1 // Copyright David Abrahams 2002.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/python/numeric.hpp>
7 #include <boost/python/handle.hpp>
8 #include <boost/python/cast.hpp>
9 #include <boost/python/tuple.hpp>
10 #include <boost/python/detail/raw_pyobject.hpp>
11 #include <boost/python/extract.hpp>
13 namespace boost
{ namespace python
{ namespace numeric
{
17 enum state_t
{ failed
= -1, unknown
, succeeded
};
18 state_t state
= unknown
;
19 std::string module_name
;
20 std::string type_name
;
22 handle
<> array_module
;
24 handle
<> array_function
;
26 void throw_load_failure()
30 , "No module named '%s' or its type '%s' did not follow the NumPy protocol"
31 , module_name
.c_str(), type_name
.c_str());
32 throw_error_already_set();
36 bool load(bool throw_on_error
)
40 if (module_name
.size() == 0)
42 module_name
= "numarray";
43 type_name
= "NDArray";
46 module_name
= "Numeric";
47 type_name
= "ArrayType";
51 PyObject
* module
= ::PyImport_Import(object(module_name
).ptr());
54 PyObject
* type
= ::PyObject_GetAttrString(module
, const_cast<char*>(type_name
.c_str()));
56 if (type
&& PyType_Check(type
))
58 array_type
= handle
<>(type
);
59 PyObject
* function
= ::PyObject_GetAttrString(module
, const_cast<char*>("array"));
61 if (function
&& PyCallable_Check(function
))
63 array_function
= handle
<>(function
);
70 if (state
== succeeded
)
80 object
demand_array_function()
83 return object(array_function
);
87 void array::set_module_and_type(char const* package_name
, char const* type_attribute_name
)
90 module_name
= package_name
? package_name
: "" ;
91 type_name
= type_attribute_name
? type_attribute_name
: "" ;
94 std::string
array::get_module_name()
102 bool array_object_manager_traits::check(PyObject
* obj
)
106 return ::PyObject_IsInstance(obj
, array_type
.get());
109 python::detail::new_non_null_reference
110 array_object_manager_traits::adopt(PyObject
* obj
)
113 return detail::new_non_null_reference(
114 pytype_check(downcast
<PyTypeObject
>(array_type
.get()), obj
));
117 PyTypeObject
const* array_object_manager_traits::get_pytype()
120 if(!array_type
) return 0;
121 return downcast
<PyTypeObject
>(array_type
.get());
124 # define BOOST_PYTHON_AS_OBJECT(z, n, _) object(x##n)
125 # define BOOST_PP_LOCAL_MACRO(n) \
126 array_base::array_base(BOOST_PP_ENUM_PARAMS(n, object const& x)) \
127 : object(demand_array_function()(BOOST_PP_ENUM_PARAMS(n, x))) \
129 # define BOOST_PP_LOCAL_LIMITS (1, 6)
130 # include BOOST_PP_LOCAL_ITERATE()
131 # undef BOOST_PYTHON_AS_OBJECT
133 array_base::array_base(BOOST_PP_ENUM_PARAMS(7, object
const& x
))
134 : object(demand_array_function()(BOOST_PP_ENUM_PARAMS(7, x
)))
137 object
array_base::argmax(long axis
)
139 return attr("argmax")(axis
);
142 object
array_base::argmin(long axis
)
144 return attr("argmin")(axis
);
147 object
array_base::argsort(long axis
)
149 return attr("argsort")(axis
);
152 object
array_base::astype(object
const& type
)
154 return attr("astype")(type
);
157 void array_base::byteswap()
162 object
array_base::copy() const
164 return attr("copy")();
167 object
array_base::diagonal(long offset
, long axis1
, long axis2
) const
169 return attr("diagonal")(offset
, axis1
, axis2
);
172 void array_base::info() const
177 bool array_base::is_c_array() const
179 return extract
<bool>(attr("is_c_array")());
182 bool array_base::isbyteswapped() const
184 return extract
<bool>(attr("isbyteswapped")());
187 array
array_base::new_(object type
) const
189 return extract
<array
>(attr("new")(type
))();
192 void array_base::sort()
197 object
array_base::trace(long offset
, long axis1
, long axis2
) const
199 return attr("trace")(offset
, axis1
, axis2
);
202 object
array_base::type() const
204 return attr("type")();
207 char array_base::typecode() const
209 return extract
<char>(attr("typecode")());
212 object
array_base::factory(
213 object
const& sequence
214 , object
const& typecode
221 return attr("factory")(sequence
, typecode
, copy
, savespace
, type
, shape
);
224 object
array_base::getflat() const
226 return attr("getflat")();
229 long array_base::getrank() const
231 return extract
<long>(attr("getrank")());
234 object
array_base::getshape() const
236 return attr("getshape")();
239 bool array_base::isaligned() const
241 return extract
<bool>(attr("isaligned")());
244 bool array_base::iscontiguous() const
246 return extract
<bool>(attr("iscontiguous")());
249 long array_base::itemsize() const
251 return extract
<long>(attr("itemsize")());
254 long array_base::nelements() const
256 return extract
<long>(attr("nelements")());
259 object
array_base::nonzero() const
261 return attr("nonzero")();
264 void array_base::put(object
const& indices
, object
const& values
)
266 attr("put")(indices
, values
);
269 void array_base::ravel()
274 object
array_base::repeat(object
const& repeats
, long axis
)
276 return attr("repeat")(repeats
, axis
);
279 void array_base::resize(object
const& shape
)
281 attr("resize")(shape
);
284 void array_base::setflat(object
const& flat
)
286 attr("setflat")(flat
);
289 void array_base::setshape(object
const& shape
)
291 attr("setshape")(shape
);
294 void array_base::swapaxes(long axis1
, long axis2
)
296 attr("swapaxes")(axis1
, axis2
);
299 object
array_base::take(object
const& sequence
, long axis
) const
301 return attr("take")(sequence
, axis
);
304 void array_base::tofile(object
const& file
) const
306 attr("tofile")(file
);
309 str
array_base::tostring() const
311 return str(attr("tostring")());
314 void array_base::transpose(object
const& axes
)
316 attr("transpose")(axes
);
319 object
array_base::view() const
321 return attr("view")();
325 }}} // namespace boost::python::numeric