classdef Solver < handle %
        Wrapper class of caffe::SGDSolver in matlab

            properties(Access = private) hSolver_self attributes %
        attribute fields % hNet_net % hNet_test_nets end
        properties(SetAccess = private) net test_nets end

        methods function self =
    Solver(varargin) % decide whether to construct a solver from solver_file or
    handle if ~(nargin == 1 && isstruct(varargin{1})) % construct a solver from
        solver_file self = caffe.get_solver(varargin{ : });
return end % construct a solver from handle hSolver_solver = varargin{1};
CHECK(is_valid_handle(hSolver_solver), 'invalid Solver handle');

% setup self handle and attributes self.hSolver_self = hSolver_solver;
self.attributes = caffe_('solver_get_attr', self.hSolver_self);

% setup net and test_nets self.net = caffe.Net(self.attributes.hNet_net);
self.test_nets = caffe.Net.empty();
      for
        n = 1 : length(self.attributes.hNet_test_nets) self.test_nets(n) =
            caffe.Net(self.attributes.hNet_test_nets(n));
      end end function iter = iter(self) iter =
          caffe_('solver_get_iter', self.hSolver_self);
      end function restore(self, snapshot_filename)
          CHECK(ischar(snapshot_filename),
                'snapshot_filename must be a string');
      CHECK_FILE_EXIST(snapshot_filename);
      caffe_('solver_restore', self.hSolver_self, snapshot_filename);
      end function solve(self) caffe_('solver_solve', self.hSolver_self);
      end function step(self, iters)
          CHECK(isscalar(iters) && iters > 0, 'iters must be positive integer');
      iters = double(iters);
      caffe_('solver_step', self.hSolver_self, iters);
      end end end
