예제 #1
0
void NLPQLPOptimizer::initialize()
{
  // NLPQLP does not support internal calculation of numerical derivatives
  if (vendorNumericalGradFlag) {
    Cerr << "\nError: vendor numerical gradients not supported by nlpql_sqp."
	 << "\n       Please select dakota numerical instead." << std::endl;
    abort_handler(-1);
  }

  // Prevent nesting of an instance of a Fortran iterator within another
  // instance of the same iterator (which would result in data clashes since
  // Fortran does not support object independence).  Recurse through all
  // sub-models and test each sub-iterator for NLPQL presence.
  Iterator sub_iterator = iteratedModel.subordinate_iterator();
  if (!sub_iterator.is_null() && 
       ( strbegins(sub_iterator.method_name(), "nlpql") ||
	 strbegins(sub_iterator.uses_method(), "nlpql") ) )
    sub_iterator.method_recourse();
  ModelList& sub_models = iteratedModel.subordinate_models();
  for (ModelLIter ml_iter = sub_models.begin();
       ml_iter != sub_models.end(); ml_iter++) {
    sub_iterator = ml_iter->subordinate_iterator();
    if (!sub_iterator.is_null() && 
	 ( strbegins(sub_iterator.method_name(), "nlpql") ||
	   strbegins(sub_iterator.uses_method(), "nlpql") ) )
      sub_iterator.method_recourse();
  }

  // Set NLPQL optimization controls 
  L      = 1;
  ACC    = 1.0e-9;
  ACCQP  = 1.0e-11;
  STPMIN = 0;
  MAXFUN = 10; // max fn evals per line search
  MAXIT  = maxIterations;
  MAX_NM = 10;
  TOL_NM = 0.1;
  MODE   = 0;
  IOUT   = 6;
  LQL    = 1;

  switch (outputLevel) {
  case DEBUG_OUTPUT:
    IPRINT = 4; break;
  case VERBOSE_OUTPUT:
    IPRINT = 2; break;
  case SILENT_OUTPUT:
    IPRINT = 0; break;
  case NORMAL_OUTPUT: default:
    IPRINT = 1; break;
  }
}
void SharedPecosApproxData::
approx_type_to_basis_type(const String& approx_type, short& basis_type)
{
  basis_type = Pecos::NO_BASIS;
  if (strends(approx_type, "orthogonal_polynomial")) {
    if (strbegins(approx_type, "global_regression"))
      basis_type = Pecos::GLOBAL_REGRESSION_ORTHOGONAL_POLYNOMIAL;
    else if (strbegins(approx_type, "global_projection"))
      basis_type = Pecos::GLOBAL_PROJECTION_ORTHOGONAL_POLYNOMIAL;
    else if (strbegins(approx_type, "global"))
      basis_type = Pecos::GLOBAL_ORTHOGONAL_POLYNOMIAL;
    //else if (strbegins(approx_type, "piecewise_regression"))
    //  basis_type = Pecos::PIECEWISE_REGRESSION_ORTHOGONAL_POLYNOMIAL;
    //else if (strbegins(approx_type, "piecewise_projection"))
    //  basis_type = Pecos::PIECEWISE_PROJECTION_ORTHOGONAL_POLYNOMIAL;
    //else if (strbegins(approx_type, "piecewise"))
    //  basis_type = Pecos::PIECEWISE_ORTHOGONAL_POLYNOMIAL;
  }
  else if (strends(approx_type, "interpolation_polynomial")) {
    if (strbegins(approx_type, "global_nodal"))
      basis_type = Pecos::GLOBAL_NODAL_INTERPOLATION_POLYNOMIAL;
    else if (strbegins(approx_type, "global_hierarchical"))
      basis_type = Pecos::GLOBAL_HIERARCHICAL_INTERPOLATION_POLYNOMIAL;
    else if (strbegins(approx_type, "piecewise_nodal"))
      basis_type = Pecos::PIECEWISE_NODAL_INTERPOLATION_POLYNOMIAL;
    else if (strbegins(approx_type, "piecewise_hierarchical"))
      basis_type = Pecos::PIECEWISE_HIERARCHICAL_INTERPOLATION_POLYNOMIAL;
  }
}
예제 #3
0
void CONMINOptimizer::initialize()
{
  // Prevent nesting of an instance of a Fortran iterator within another
  // instance of the same iterator (which would result in data clashes since
  // Fortran does not support object independence).  Recurse through all
  // sub-models and test each sub-iterator for CONMIN presence.
  // Note: This check is performed for DOT, CONMIN, and SOLBase, but not
  //       for LHS since it is only active in pre-processing.
  Iterator sub_iterator = iteratedModel.subordinate_iterator();
  if (!sub_iterator.is_null() && 
       ( strbegins(sub_iterator.method_name(), "conmin_") ||
	 strbegins(sub_iterator.uses_method(), "conmin_") ) )
    sub_iterator.method_recourse();
  ModelList& sub_models = iteratedModel.subordinate_models();
  for (ModelLIter ml_iter = sub_models.begin();
       ml_iter != sub_models.end(); ml_iter++) {
    sub_iterator = ml_iter->subordinate_iterator();
    if (!sub_iterator.is_null() && 
	 ( strbegins(sub_iterator.method_name(), "conmin_") ||
	   strbegins(sub_iterator.uses_method(), "conmin_") ) )
      sub_iterator.method_recourse();
  }

  // Initialize CONMIN specific data
  NFDG   = 0;       // default finite difference flag
  IPRINT = 1;       // default flag to control amount of output info
  ITMAX  = 100;     // default max number of iterations
  FDCH   =  1.0e-5; // default relative finite difference step size
  FDCHM  =  1.0e-5; // default absolute finite difference step size
  CT     = -0.1;    // default constraint thickness tolerance
                    // (for determining active/inactive constraint status)
  CTMIN  =  0.001;  // default absolute constraint tolerance 
                    // (note: the CONMIN manual default is 0.004)
  CTL    = -0.01;   // default side constraint thickness tolerance (see CT)
  CTLMIN =  0.001;  // default absolute side constraint tolerance
  DELFUN =  1.0e-7; // default minimum relative change in the objective
                    // function needed for convergence
  DABFUN =  1.0e-7; // default minimum absolute change in the objective
                    // function needed for convergence

  conminInfo = 0; // Must be set to 0 before calling CONMIN
  ITMAX = maxIterations;

  // Set the print control flag
  if (outputLevel > NORMAL_OUTPUT) {
    IPRINT = printControl = 4;
    Cout << "CONMIN print control = " << printControl << endl;
  }
  else
    IPRINT = printControl = 2;

  // assigns a nondefault constraint tolerance if a valid value has been 
  // set in dakota.in; otherwise use CONMIN default.
  if (constraintTol > 0.0) {
    CTMIN = CTLMIN = constraintTol;
    if (outputLevel > QUIET_OUTPUT)
      Cout << "constraint violation tolerance = " << constraintTol << '\n';
  }

  // convergenceTol is an optional parameter in dakota.input.nspec, but
  // defining our own default (in the DataMethod constructor) and
  // always assigning it applies some consistency across methods.
  // Therefore, the CONMIN default is not used.
  DELFUN = DABFUN = convergenceTol; // needed in CONMIN

  // Default CONMIN gradients = numerical;forward;vendor setting.
  if ( gradientType == "analytic" || gradientType == "mixed" || 
       ( gradientType == "numerical" && methodSource == "dakota" ) )
    // Set NFDG=1 before calling CONMIN. This invokes the
    // user-supplied gradient mode which DAKOTA uses for analytic,
    // dakota numerical, or mixed analytic/dakota numerical gradients.
    NFDG=1; 
  else if (gradientType == "none") {
    Cerr << "\nError: gradientType = none is invalid with CONMIN.\n"
         << "Please select numerical, analytic, or mixed gradients." << endl;
    abort_handler(-1);
  }
  else if (intervalType == "central") {
    Cerr << "\nFinite Difference Type = 'central' is invalid with CONMIN.\n"
         << "Forward difference is only available internal to CONMIN." << endl;
    abort_handler(-1);
  }
  else { // Vendor numerical gradients with forward differences
    NFDG = 0; // use CONMIN's default internal forward difference method

    // CONMIN's forward differencing uses fdss*X_i as one would expect
    FDCH = fdGradStepSize;

    // for FDCHM (minimum delta), use 2 orders of magnitude smaller than fdss to
    // be consistent with Model::estimate_derivatives():
    FDCHM = fdGradStepSize*.01;
  }
}
void cut_substitute_all (cut_env_t *env, cut_buf_t *tgt, cut_buf_t *src)
{
  int sr_ctr;
  int lineidx;
  tgt->cb_lines_count = src->cb_lines_count;
  tgt->cb_lines = malloc (sizeof (char *) * (src->cb_len));
  for (lineidx = 0; lineidx < src->cb_lines_count; lineidx++)
    {
      char *hit1, *hit2;
      char *srcline = src->cb_lines[lineidx];
      char *tgtline;
      if (
	('\0' == srcline[0]) ||
	strbegins (srcline, "--#") ||
	strbegins (srcline, "--src ") ||
	strbegins (srcline, "OpenLink Interactive SQL (Virtuoso), version ") ||
	!strcmp (srcline, "Type HELP; for help and EXIT; to exit.") )
	{
	  tgt->cb_lines[lineidx] = tgtline = strdup ("");
	  continue;
	}
      if (
	(hit1 = strstr (srcline, "-- ")) &&
	(hit2 = strstr (hit1, " msec")) &&
	stralphabet (hit1 + strlen("-- "), hit2, "0123456789") )
	{
	  tgtline = malloc (strlen (srcline) + 6);
	  strcpy (tgtline, srcline);
	  sprintf (tgtline + (hit1 - srcline), "-- 00000%s", hit2);
	  srcline = tgtline;
	}
      if (
	(hit1 = strstr (srcline, "Connected to OpenLink Virtuoso VDBMS")) )
	{
	  tgtline = malloc (strlen (srcline)+1);
	  strcpy (tgtline, srcline);
	  strcpy (tgtline + (hit1 - srcline), hit1 + strlen ("Connected to OpenLink Virtuoso VDBMS"));
	  srcline = tgtline;
	}
      if (
	(hit1 = strstr (srcline, "Driver: ")) &&
	(hit2 = strstr (hit1, " OpenLink Virtuoso ODBC Driver")) &&
	stralphabet (hit1 + strlen ("Driver: "), hit2, "0123456789.") )
	{
	  tgtline = malloc (strlen (srcline)+1);
	  strcpy (tgtline, srcline);
	  strcpy (tgtline + (hit1 - srcline), hit2 + strlen (" OpenLink Virtuoso ODBC Driver"));
	  srcline = tgtline;
	}
      if (
	(hit1 = strstr (srcline, "parse error [")) &&
	(hit2 = strstr (hit1, "] at")) &&
	stralphabet (hit1 + strlen ("parse error ["), hit2, "0123456789.-") )
	{
	  tgtline = strdup (srcline);
	  sprintf (tgtline + (hit1 - srcline), "parse error at%s", hit2 + strlen ("] at"));
	  srcline = tgtline;
	}
      if (strends (srcline, "parse error"))
	{
	  tgtline = malloc (strlen (srcline) + 4);
	  sprintf (tgtline, "%s at", srcline);
	  srcline = tgtline;
	}
      if (
	(hit1 = strstr (srcline, "-- Line ")) &&
	(hit2 = strstr (hit1, ": exit")) &&
	stralphabet (hit1 + strlen("-- Line "), hit2, "0123456789") )
	{
	  tgtline = strdup (srcline);
	  sprintf (tgtline + (hit1 - srcline), "exit%s", hit2 + strlen (": exit"));
	  srcline = tgtline;
	}

      for (sr_ctr = 0; sr_ctr < env->ce_cfg.cc_replace_count; sr_ctr++)
        {
	  cut_search_replace_t *sr = env->ce_cfg.cc_replaces[sr_ctr];
	  char *search = sr->csr_search;
	  char *replace = sr->csr_replace;
	  while (NULL != (hit1 = strstr (srcline, search)))
	    {
	      tgtline = malloc (strlen (srcline) + strlen (replace) + 1 - strlen (search));
	      memcpy (tgtline, srcline, (hit1 - srcline));
	      strcpy (tgtline + (hit1 - srcline), replace);
	      strcat (tgtline, hit1 + strlen (search));
	      srcline = tgtline;
	    }
	}
      tgt->cb_lines[lineidx] = tgtline = strdup (srcline);
	      
    }
}