示例#1
0
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
  struct params *params = state->input;

  switch (key)
    {
    case ARGP_KEY_NO_ARGS:
      printf ("NO ARGS\n");
      break;

    case ARGP_KEY_ARG:
      if (state->arg_num > 0)
	return ARGP_ERR_UNKNOWN; /* Leave it for the sub-arg parser.  */
      printf ("ARG: %s\n", arg);
      break;

    case 'f':
      if (arg)
	params->foonly = atoi (arg);
      else
	params->foonly = params->foonly_default;
      popt (key, arg);
      break;

    case 'p': case 'P': case OPT_PGRP: case 'x': case 'Q':
    case 'r': case OPT_SESS: case 'z':
      popt (key, arg);
      break;

    default:
      return ARGP_ERR_UNKNOWN;
    }
  return 0;
}
示例#2
0
void Minimizer_minimizeManyTimes (Minimizer me, long numberOfTimes, long maxIterationsPerTime, double tolerance) {
	double fopt = my minimum;
	int monitorSingle = numberOfTimes == 1;

	autoNUMvector<double> popt (NUMvector_copy<double> (my p, 1, my nParameters), 1);

	if (! monitorSingle) {
		Melder_progress (0.0, L"Minimize many times");
	}
	/* on first iteration start with current parameters 27/11/97 */
	for (long i = 1; i <= numberOfTimes; i++) {
		Minimizer_minimize (me, maxIterationsPerTime, tolerance, monitorSingle);
		Melder_casual ("Current %ld: minimum = %.17g", i, my minimum);
		if (my minimum < fopt) {
			NUMvector_copyElements (my p, popt.peek(), 1, my nParameters);
			fopt = my minimum;
		}
		Minimizer_reset (me, 0);
		if (! monitorSingle) {
			try {
				Melder_progress ( (double) i / numberOfTimes, Melder_integer (i), L" from ",
				                   Melder_integer (numberOfTimes)); therror
			} catch (MelderError) {
				Melder_clearError ();   // interrurpt, no error
				break;
			}
		}
	}
	if (! monitorSingle) {
		Melder_progress (1.0, 0);
	}
	Minimizer_reset (me, popt.peek());
}
示例#3
0
int main(int argc, char* argv[])
{
  // Number of threads
  unsigned int n_threads = boost::thread::hardware_concurrency();
  std::cout << "Number of available threads " << n_threads << std::endl;

  likelihood l(5, 5, 9);
  double nexp[5][5] = {{1.,  1.6,  0.6, 0.2,  0.0},
                       {0., 15.4,  2.3, 0.0,  0.0},
                       {0.,  2.5,  4.1, 0.0,  0.0},
                       {0.,  3.3,  0.0, 1.1,  0.0},
                       {0.,  9.5, 10.0, 0.7, 39.2}};
  std::cout << "n(regions) = " << l.nr()
            << ", n(processes) = " << l.np()
            << ", n(systematics) = " << l.ns() << std::endl;
  for (unsigned int ir = 0; ir < l.nr(); ir++)
    for (unsigned int ip = 0; ip < l.np(); ip++) {
      l.set_nexp(ir, ip, nexp[ir][ip]);
      for (unsigned int is = 0; is < l.ns(); is++) {
        double dsyst = 0.;
        if (is < 2 && ip != 4) // Jet/MET
          dsyst = (0.1 - 0.05 * is) * (1. + ir * 0.05);
        else if (is < 7 && (is - 2 == ip)) // Theory
          dsyst = (ip == 4) ? 1. : 0.5;
        else if (is == 7 && (ir == 1 || ir == 2)) // b-tagging
          dsyst = (-1. + (ir - 1) * 2.) * 0.1;
        else if (is == 8) // Photon id efficiency
          dsyst = 0.05;
        l.set_dsyst(ir, ip, is, dsyst);
      }      
    }

  // Setup minimizer
  unsigned int nparams = l.np()+l.ns();
  boost::scoped_array<double> p0(new double[nparams]);
  boost::scoped_array<double> popt(new double[nparams]);
  for (unsigned int i = 0; i < nparams; i++)
    p0[i] = (i < l.np()) ? 1. : 0.;
  boost::function<double (double * const)> feval;
  feval = boost::bind(&likelihood::eval, &l, _1);
  optimize::minimizer_nm   mle_nm(feval, l.np()+l.ns());
  optimize::minimizer_bfgs mle_bfgs(feval, l.np()+l.ns());

  // Setup random generation of poisson distributed numbers
  boost::mt19937 gen;
  typedef boost::poisson_distribution<unsigned int> t_poisson;
  typedef boost::scoped_ptr< t_poisson > t_ptr_poisson;
  typedef boost::variate_generator< boost::mt19937&, t_poisson > t_gen;
  typedef boost::scoped_ptr< t_gen > t_ptr_gen;
  boost::scoped_array< t_ptr_poisson > pdist(new t_ptr_poisson[l.nr()]);
  boost::scoped_array< t_ptr_gen > rndgen(new t_ptr_gen[l.ns()]);
  for (unsigned int ir = 0; ir < l.nr(); ir++) {
    std::cout << "region" << ir << " nexp = " 
              << l.nexp(ir, p0.get()) << std::endl;
    pdist[ir].reset(new t_poisson(l.nexp(ir, p0.get())));
    rndgen[ir].reset(new t_gen(gen, *(pdist[ir])));
  }

  boost::timer time_monitor;
  double dt[3] = {0., 0., 0.};
  unsigned int ntoys = 10;
  for (unsigned int iexp = 0; iexp < ntoys; iexp++) {
    std::cout << "Starting experiment " << iexp << std::endl;

    // Generate pseudo-experiment random numbers
    for (unsigned int ir = 0; ir < l.nr(); ir++) {
      l.set_nobs(ir, (*(rndgen[ir]))());
      std::cout << "  region" << ir
                << " nobs = " << l.nobs(ir)
                << " nexp = " << l.nexp(ir, p0.get()) << std::endl;
    }

    std::cout << "  Perform a minimization " << std::endl;
    
    // Minimize with Nelder-Mean without mt
    mle_nm.set_is_mt(false);
    time_monitor.restart();
    mle_nm.minimize(p0.get());
    dt[0] = time_monitor.elapsed();
    std::cout << "  min = (";
    for (size_t i = 0; i < nparams; i++)
       popt[i] = mle_nm.get_opt_var(i).value();
    for (size_t i = 0; i < nparams; i++) {
      if (i < l.nr())
        std::cout << l.nexp(i, popt.get());
      else
        std::cout << mle_nm.get_opt_var(i).value();
      if (i < nparams - 1) std::cout << ", ";
    }
    std::cout << ") fmin = " << mle_nm.get_fmin() << std::endl;

    // Minimize with Nelder-Mean with mt
    mle_nm.set_is_mt(true);
    time_monitor.restart();
    mle_nm.minimize(p0.get());
    dt[1] = time_monitor.elapsed();
    std::cout << "  min = (";
    for (size_t i = 0; i < nparams; i++)
       popt[i] = mle_nm.get_opt_var(i).value();
    for (size_t i = 0; i < nparams; i++) {
      if (i < l.nr())
        std::cout << l.nexp(i, popt.get());
      else
        std::cout << mle_nm.get_opt_var(i).value();
      if (i < nparams - 1) std::cout << ", ";
    }
    std::cout << ") fmin = " << mle_nm.get_fmin() << std::endl;

    // Minimize with BFGS
    time_monitor.restart();
    mle_bfgs.minimize(p0.get());
    dt[2] = time_monitor.elapsed();
    std::cout << "  min = (";
    for (size_t i = 0; i < nparams; i++)
       popt[i] = mle_bfgs.get_opt_var(i).value();
    for (size_t i = 0; i < nparams; i++) {
      if (i < l.nr())
        std::cout << l.nexp(i, popt.get());
      else
        std::cout << mle_bfgs.get_opt_var(i).value();
      if (i < nparams - 1) std::cout << ", ";
    }
    std::cout << ") fmin = " << mle_bfgs.get_fmin() << std::endl;

    std::cout << "  timing " << dt[0] << " " << dt[1] << " " << dt[2] 
              << std::endl;
    std::cout << "  ... done." << std::endl;
  }

  return 0;
}