#define PyArray_SetBaseObject(arr, x) (PyArray_BASE(arr) = (x))
#endif
+/* Fix to avoid registration warnings in pycaffe (#3960) */
+#define BP_REGISTER_SHARED_PTR_TO_PYTHON(PTR) do { \
+ const boost::python::type_info info = \
+ boost::python::type_id<shared_ptr<PTR > >(); \
+ const boost::python::converter::registration* reg = \
+ boost::python::converter::registry::query(info); \
+ if (reg == NULL) { \
+ bp::register_ptr_to_python<shared_ptr<PTR > >(); \
+ } else if ((*reg).m_to_python == NULL) { \
+ bp::register_ptr_to_python<shared_ptr<PTR > >(); \
+ } \
+} while (0)
+
namespace bp = boost::python;
namespace caffe {
.def("_set_input_arrays", &Net_SetInputArrays,
bp::with_custodian_and_ward<1, 2, bp::with_custodian_and_ward<1, 3> >())
.def("save", &Net_Save);
- bp::register_ptr_to_python<shared_ptr<Net<Dtype> > >();
+ BP_REGISTER_SHARED_PTR_TO_PYTHON(Net<Dtype>);
bp::class_<Blob<Dtype>, shared_ptr<Blob<Dtype> >, boost::noncopyable>(
"Blob", bp::no_init)
NdarrayCallPolicies()))
.add_property("diff", bp::make_function(&Blob<Dtype>::mutable_cpu_diff,
NdarrayCallPolicies()));
- bp::register_ptr_to_python<shared_ptr<Blob<Dtype> > >();
+ BP_REGISTER_SHARED_PTR_TO_PYTHON(Blob<Dtype>);
bp::class_<Layer<Dtype>, shared_ptr<PythonLayer<Dtype> >,
boost::noncopyable>("Layer", bp::init<const LayerParameter&>())
.def("setup", &Layer<Dtype>::LayerSetUp)
.def("reshape", &Layer<Dtype>::Reshape)
.add_property("type", bp::make_function(&Layer<Dtype>::type));
- bp::register_ptr_to_python<shared_ptr<Layer<Dtype> > >();
+ BP_REGISTER_SHARED_PTR_TO_PYTHON(Layer<Dtype>);
bp::class_<LayerParameter>("LayerParameter", bp::no_init);
.def("step", &Solver<Dtype>::Step)
.def("restore", &Solver<Dtype>::Restore)
.def("snapshot", &Solver<Dtype>::Snapshot);
- bp::register_ptr_to_python<shared_ptr<Solver<Dtype> > >();
+ BP_REGISTER_SHARED_PTR_TO_PYTHON(Solver<Dtype>);
bp::class_<SGDSolver<Dtype>, bp::bases<Solver<Dtype> >,
shared_ptr<SGDSolver<Dtype> >, boost::noncopyable>(