def parse(self): """ Get data into a Fitting Problem via cutest. :return: The fully parsed fitting problem :rtype: fitbenchmarking.parsing.fitting_problem.FittingProblem """ self.mastsif_dir = TemporaryDirectory() # set the MASTSIF environment variable so that pycutest # can find the sif files os.environ["MASTSIF"] = self.mastsif_dir.name self._num_params = None # get just the short filename (minus the .SIF) fp = FittingProblem(self.options) # Collect x and create new file with blank y fname, fp.data_x, fp.data_y, fp.data_e = self._setup_data() self._p = _import_problem(fname) fp.name = self._p.name fp.function = self._function # self._p.objcons fp.jacobian = self._jacobian # self._p.lagjac fp.equation = None fp.starting_values = self._get_starting_values() fp.start_x = None fp.end_x = None fp.format = "cutest" # Create a list of x and f (function evaluation) and x and g (Jacobian # evaluation). # If a new x is given we will create and parse a new file self._cache_f = [(fp.data_x, self._p.objcons)] self._cache_g = [(fp.data_x, self._p.lagjac)] return fp
def parse(self): """ Parse the NIST problem file into a Fitting Problem. :return: The fully parsed fitting problem :rtype: fitbenchmarking.parsing.fitting_problem.FittingProblem """ fitting_problem = FittingProblem(self.options) equation, data, starting_values, name = self._parse_line_by_line() data = self._parse_data(data) fitting_problem.data_x = data[:, 1] fitting_problem.data_y = data[:, 0] if len(data[0, :]) > 2: fitting_problem.data_e = data[:, 2] fitting_problem.name = name # String containing a mathematical expression fitting_problem.equation = self._parse_equation(equation) fitting_problem.starting_values = starting_values fitting_problem.function = \ nist_func_definition(function=fitting_problem.equation, param_names=starting_values[0].keys()) fitting_problem.format = "nist" try: jacobian = self._parse_jacobian(name) fitting_problem.jacobian = \ nist_jacobian_definition(jacobian=jacobian, param_names=starting_values[0].keys()) except NoJacobianError: LOGGER.warn("WARNING: Could not find analytic Jacobian " "information for {} problem".format(name)) return fitting_problem