matcaffe: allow destruction of individual networks and solvers #4737

Merged
merged 1 commit into from Feb 17, 2017
Jump to file or symbol
Failed to load files and symbols.
+30 −0
Split
View
@@ -68,6 +68,9 @@
self.layer_names = self.attributes.layer_names;
self.blob_names = self.attributes.blob_names;
end
+ function delete (self)
+ caffe_('delete_net', self.hNet_self);
+ end
function layer = layers(self, layer_name)
CHECK(ischar(layer_name), 'layer_name must be a string');
layer = self.layer_vec(self.name2layer_index(layer_name));
View
@@ -36,6 +36,9 @@
self.test_nets(n) = caffe.Net(self.attributes.hNet_test_nets(n));
end
end
+ function delete (self)
+ caffe_('delete_solver', self.hSolver_self);
+ end
function iter = iter(self)
iter = caffe_('solver_get_iter', self.hSolver_self);
end
@@ -197,6 +197,17 @@ static void get_solver(MEX_ARGS) {
mxFree(solver_file);
}
+// Usage: caffe_('delete_solver', hSolver)
+static void delete_solver(MEX_ARGS) {
+ mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
+ "Usage: caffe_('delete_solver', hSolver)");
+ Solver<float>* solver = handle_to_ptr<Solver<float> >(prhs[0]);
+ solvers_.erase(std::remove_if(solvers_.begin(), solvers_.end(),
+ [solver] (const shared_ptr< Solver<float> > &solverPtr) {
+ return solverPtr.get() == solver;
+ }), solvers_.end());
+}
+
// Usage: caffe_('solver_get_attr', hSolver)
static void solver_get_attr(MEX_ARGS) {
mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
@@ -271,6 +282,17 @@ static void get_net(MEX_ARGS) {
mxFree(phase_name);
}
+// Usage: caffe_('delete_solver', hSolver)
+static void delete_net(MEX_ARGS) {
+ mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
+ "Usage: caffe_('delete_solver', hNet)");
+ Net<float>* net = handle_to_ptr<Net<float> >(prhs[0]);
+ nets_.erase(std::remove_if(nets_.begin(), nets_.end(),
+ [net] (const shared_ptr< Net<float> > &netPtr) {
+ return netPtr.get() == net;
+ }), nets_.end());
+}
+
// Usage: caffe_('net_get_attr', hNet)
static void net_get_attr(MEX_ARGS) {
mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
@@ -522,12 +544,14 @@ struct handler_registry {
static handler_registry handlers[] = {
// Public API functions
{ "get_solver", get_solver },
+ { "delete_solver", delete_solver },
{ "solver_get_attr", solver_get_attr },
{ "solver_get_iter", solver_get_iter },
{ "solver_restore", solver_restore },
{ "solver_solve", solver_solve },
{ "solver_step", solver_step },
{ "get_net", get_net },
+ { "delete_net", delete_net },
{ "net_get_attr", net_get_attr },
{ "net_forward", net_forward },
{ "net_backward", net_backward },