summaryrefslogtreecommitdiffstats
path: root/ml/dlib/tools/python/src/vector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/tools/python/src/vector.cpp')
-rw-r--r--ml/dlib/tools/python/src/vector.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/ml/dlib/tools/python/src/vector.cpp b/ml/dlib/tools/python/src/vector.cpp
new file mode 100644
index 000000000..a9f81c65e
--- /dev/null
+++ b/ml/dlib/tools/python/src/vector.cpp
@@ -0,0 +1,182 @@
+// Copyright (C) 2013 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+
+#include "opaque_types.h"
+#include <dlib/python.h>
+#include <dlib/matrix.h>
+#include <dlib/geometry/vector.h>
+#include <pybind11/stl_bind.h>
+#include "indexing.h"
+
+using namespace dlib;
+using namespace std;
+
+typedef matrix<double,0,1> cv;
+
+
+void cv_set_size(cv& m, long s)
+{
+ m.set_size(s);
+ m = 0;
+}
+
+double dotprod ( const cv& a, const cv& b)
+{
+ return dot(a,b);
+}
+
+string cv__str__(const cv& v)
+{
+ ostringstream sout;
+ for (long i = 0; i < v.size(); ++i)
+ {
+ sout << v(i);
+ if (i+1 < v.size())
+ sout << "\n";
+ }
+ return sout.str();
+}
+
+string cv__repr__ (const cv& v)
+{
+ std::ostringstream sout;
+ sout << "dlib.vector([";
+ for (long i = 0; i < v.size(); ++i)
+ {
+ sout << v(i);
+ if (i+1 < v.size())
+ sout << ", ";
+ }
+ sout << "])";
+ return sout.str();
+}
+
+std::shared_ptr<cv> cv_from_object(py::object obj)
+{
+ try {
+ long nr = obj.cast<long>();
+ auto temp = std::make_shared<cv>(nr);
+ *temp = 0;
+ return temp;
+ } catch(py::cast_error &e) {
+ py::list li = obj.cast<py::list>();
+ const long nr = len(obj);
+ auto temp = std::make_shared<cv>(nr);
+ for ( long r = 0; r < nr; ++r)
+ {
+ (*temp)(r) = li[r].cast<double>();
+ }
+ return temp;
+ }
+}
+
+long cv__len__(cv& c)
+{
+ return c.size();
+}
+
+
+void cv__setitem__(cv& c, long p, double val)
+{
+ if (p < 0) {
+ p = c.size() + p; // negative index
+ }
+ if (p > c.size()-1) {
+ PyErr_SetString( PyExc_IndexError, "index out of range"
+ );
+ throw py::error_already_set();
+ }
+ c(p) = val;
+}
+
+double cv__getitem__(cv& m, long r)
+{
+ if (r < 0) {
+ r = m.size() + r; // negative index
+ }
+ if (r > m.size()-1 || r < 0) {
+ PyErr_SetString( PyExc_IndexError, "index out of range"
+ );
+ throw py::error_already_set();
+ }
+ return m(r);
+}
+
+
+cv cv__getitem2__(cv& m, py::slice r)
+{
+ size_t start, stop, step, slicelength;
+ if (!r.compute(m.size(), &start, &stop, &step, &slicelength))
+ throw py::error_already_set();
+
+ cv temp(slicelength);
+
+ for (size_t i = 0; i < slicelength; ++i) {
+ temp(i) = m(start); start += step;
+ }
+ return temp;
+}
+
+py::tuple cv_get_matrix_size(cv& m)
+{
+ return py::make_tuple(m.nr(), m.nc());
+}
+
+// ----------------------------------------------------------------------------------------
+
+string point__repr__ (const point& p)
+{
+ std::ostringstream sout;
+ sout << "point(" << p.x() << ", " << p.y() << ")";
+ return sout.str();
+}
+
+string point__str__(const point& p)
+{
+ std::ostringstream sout;
+ sout << "(" << p.x() << ", " << p.y() << ")";
+ return sout.str();
+}
+
+long point_x(const point& p) { return p.x(); }
+long point_y(const point& p) { return p.y(); }
+
+// ----------------------------------------------------------------------------------------
+void bind_vector(py::module& m)
+{
+ {
+ py::class_<cv, std::shared_ptr<cv>>(m, "vector", "This object represents the mathematical idea of a column vector.")
+ .def(py::init())
+ .def("set_size", &cv_set_size)
+ .def("resize", &cv_set_size)
+ .def(py::init(&cv_from_object))
+ .def("__repr__", &cv__repr__)
+ .def("__str__", &cv__str__)
+ .def("__len__", &cv__len__)
+ .def("__getitem__", &cv__getitem__)
+ .def("__getitem__", &cv__getitem2__)
+ .def("__setitem__", &cv__setitem__)
+ .def_property_readonly("shape", &cv_get_matrix_size)
+ .def(py::pickle(&getstate<cv>, &setstate<cv>));
+
+ m.def("dot", &dotprod, "Compute the dot product between two dense column vectors.");
+ }
+ {
+ typedef point type;
+ py::class_<type>(m, "point", "This object represents a single point of integer coordinates that maps directly to a dlib::point.")
+ .def(py::init<long,long>(), py::arg("x"), py::arg("y"))
+ .def("__repr__", &point__repr__)
+ .def("__str__", &point__str__)
+ .def_property("x", &point_x, [](point& p, long x){p.x()=x;}, "The x-coordinate of the point.")
+ .def_property("y", &point_y, [](point& p, long y){p.x()=y;}, "The y-coordinate of the point.")
+ .def(py::pickle(&getstate<type>, &setstate<type>));
+ }
+ {
+ typedef std::vector<point> type;
+ py::bind_vector<type>(m, "points", "An array of point objects.")
+ .def("clear", &type::clear)
+ .def("resize", resize<type>)
+ .def("extend", extend_vector_with_python_list<point>)
+ .def(py::pickle(&getstate<type>, &setstate<type>));
+ }
+}