Exemple #1
0
void param_init_bounded_number_vector::allocate(int min1,int max1,
  const double_index_type & bmin,const double_index_type & bmax,
  const index_type& phase_start,const char * s)
{
  int size = max1 - min1 + 1;
  if (size > 0)
  {
    v = new param_init_bounded_number[size];
    if (!v)
    {
        cerr << " error trying to allocate memory in "
          "param_init_bounded_number_vector " << endl;
        exit(1);
    }
    index_min=min1;
    index_max=max1;
    v-=indexmin();
    for (int i=indexmin();i<=indexmax();i++)
    {
       if (it) v[i].set_initial_value(ad_double((*it)[i]));
       adstring ss=s + adstring("[") + str(i) + adstring("]");
       v[i].allocate(ad_double(bmin[i]),ad_double(bmax[i]),
         ad_integer(phase_start[i]),(char*)(ss) );
    }
  }
}
void param_init_bounded_number_matrix::allocate(int rowmin, int rowmax,
  int colmin, int colmax,
  const dmatrix& bmin, const dmatrix& bmax,
  const imatrix& phase_start,
  const char* s)
{
#ifndef OPT_LIB
  assert(v == NULL);
#endif

  int size  = rowmax - rowmin + 1;
  if (size > 0)
  {
    index_min = rowmin;
    index_max = rowmax;
    v = new param_init_bounded_number_vector[size];
    if (!v)
    {
      cerr << " error trying to allocate memory in "
               "param_init_bounded_number_vector " << endl;
      ad_exit(1);
    }
    v -= index_min;

    for (int i = index_min; i <= index_max; i++)
    {
      /*if (it) v[i].set_initial_value(it[i]);*/
      adstring a = s + adstring("[") + str(i) + adstring("]");
      v[i].allocate(colmin, colmax, bmin[i], bmax[i], phase_start[i],
       (char*)(a));
    }
  }
}
TEST_F(test_df1b2variable, copy_constructor_null)
{
  adpool* save = df1b2variable::pool;

  extern df1b2_gradlist* f1b2gradlist;
  df1b2_gradlist* save2 = f1b2gradlist;
  {
    adpool a;
    const size_t n = 10;
    size_t size = sizeof(double) * df1b2variable::get_blocksize(n);
    a.set_size(size);
    df1b2variable::pool = &a;

    df1b2_gradlist gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));
    f1b2gradlist = &gradlist;;

    df1b2variable::noallocate = 1;
    df1b2variable empty;
    df1b2variable v(empty);

    ASSERT_EQ(NULL, v.ptr);
    ASSERT_EQ(NULL, v.ncopies);
    ASSERT_EQ(NULL, v.u);
    ASSERT_EQ(NULL, v.u_dot);
    ASSERT_EQ(NULL, v.u_bar);
    ASSERT_EQ(NULL, v.u_dot_bar);
    ASSERT_EQ(NULL, v.u_tilde);
    ASSERT_EQ(NULL, v.u_dot_tilde);
    ASSERT_EQ(NULL, v.u_bar_tilde);
    ASSERT_EQ(NULL, v.u_dot_bar_tilde);
    ASSERT_EQ(0, v.indindex);
  }
  df1b2variable::pool = save;
  f1b2gradlist = save2;
}
Exemple #4
0
Gear::Gear(data_int syr, data_int eyr, data_int sage, data_int eage){
  static int m_gearcount = 1;

  m_syr = syr;
  m_eyr = eyr;
  m_sage = sage;
  m_eage = eage;
  adstring gearalloc = adstring("gearalloc") + str(m_gearcount);
  m_allocation.allocate(gearalloc);
  m_is_fishery = m_allocation > 0 ? true : false;
  catches = new Catch;
  adstring name = adstring("gear") + str(m_gearcount);
  catches->allocate(name);

  m_gearcount++;
}
TEST_F(test_df1b2atan2, df1b2_gradlist_default_constructor)
{
  int argc = 1;
  char* argv[] = {"./gtest-all"};
  ad_comm::argc = argc;
  ad_comm::argv = argv;

  int get_f1b2buffer_size(const char * s);

  int bs  = get_f1b2buffer_size("-l1");
  int nbs = get_f1b2buffer_size("-nl1");
  ASSERT_EQ(0, bs);
  ASSERT_EQ(0, nbs);
  int bs2 = get_f1b2buffer_size("-l2");
  int nbs2 = get_f1b2buffer_size("-nl2");
  ASSERT_EQ(0, bs2);
  ASSERT_EQ(0, nbs2);
  int bs3 = get_f1b2buffer_size("-l3");
  int nbs3 = get_f1b2buffer_size("-nl3");
  ASSERT_EQ(0, bs3);
  ASSERT_EQ(0, nbs3);

  df1b2_gradlist f1b2gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));

  ad_comm::argc = 0;
  ad_comm::argv = 0;
}
TEST_F(test_df1b2atan2, atan2)
{
  int argc = 1;
  char* argv[] = {"./gtest-all"};
  ad_comm::argc = argc;
  ad_comm::argv = argv;

  adpool pool;
  pool.set_size(808);
  pool.nvar = 808;
  df1b2variable::pool = &pool;
  df1b2_gradlist::no_derivatives = 0;
  df1b2variable::noallocate = 0;

  extern df1b2_gradlist* f1b2gradlist;
  df1b2_gradlist gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));
  f1b2gradlist = &gradlist;;

  df1b2variable y(0.0);
  df1b2variable x(0.0);

  df1b2variable atan2(const df1b2variable& y, const df1b2variable& x);
  df1b2variable v = atan2(y, x);
  ASSERT_DOUBLE_EQ(std::atan2(0, 0), value(v));

  ad_comm::argc = 0;
  ad_comm::argv = 0;
}
Exemple #7
0
 void function_minimizer::set_runtime_crit(const char * s)
 {
   adstring opt="{" + adstring(s) + "}";
   dvector temp1((char*)(opt));
   if (allocated(convergence_criteria)) convergence_criteria.deallocate();
   convergence_criteria.allocate(temp1.indexmin(),temp1.indexmax());
   convergence_criteria=temp1;
 }
Exemple #8
0
 void function_minimizer::set_runtime_maxfn(const char * s)
 {
   adstring opt="{" + adstring(s) + "}";
   dvector temp1((char*)(opt));
   if (allocated(maximum_function_evaluations))
     maximum_function_evaluations.deallocate();
   maximum_function_evaluations.allocate(temp1.indexmin(),temp1.indexmax());
   maximum_function_evaluations=temp1;
 }
Exemple #9
0
void initial_params::save()
{
  adstring extension;
  if (current_phase == max_number_phases)
  {
    extension = "ar";
  }
  else if (current_phase >= 10)
  {
    extension = str(current_phase);
  }
  else
  {
    extension = "0" + str(current_phase);
  }
  {
    adstring tadstring=ad_comm::adprogram_name + adstring(".p") + extension;
    ofstream parfile((char*)tadstring);
    if (parfile.good())
    {
      parfile << setshowpoint()
        <<  "# Number of parameters = " << initial_params::nvarcalc()
        <<  " Objective function value = " << *objective_function_value::pobjfun
        <<  "  Maximum gradient component = " << objective_function_value::gmax
        << endl;

      for (int i = 0; i < num_initial_params; ++i)
      {
        varsptr[i]->save_value(parfile);
      }
    }
  }
  {
    adstring tadstring = ad_comm::adprogram_name + adstring(".b") + extension;
    uostream barfile((char*)tadstring);
    if (barfile.good())
    {
      for (int i = 0; i < num_initial_params; ++i)
      {
        (varsptr[i])->bsave_value(barfile);
      }
    }
  }
}
TEST_F(test_df1b2variable, copy_constructor_noallocate_false)
{
  adpool* save = df1b2variable::pool;

  extern df1b2_gradlist* f1b2gradlist;
  df1b2_gradlist* save2 = f1b2gradlist;
  {
    adpool a;
    const size_t n = 10;
    size_t size = sizeof(double) * df1b2variable::get_blocksize(n);
    a.set_size(size);
    df1b2variable::pool = &a;

    df1b2_gradlist gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));
    f1b2gradlist = &gradlist;;

    df1b2variable::noallocate = 0;
    df1b2variable v;

    ASSERT_TRUE(v.ptr);
    ASSERT_EQ(0, ((twointsandptr*)v.ptr)->nvar);
    ASSERT_EQ(0, ((twointsandptr*)v.ptr)->ncopies);
    ASSERT_TRUE(((twointsandptr*)v.ptr)->ptr == &a);
    ASSERT_EQ(0, *v.ncopies);
    ASSERT_TRUE(v.u == (v.ptr + 2));
    ASSERT_TRUE(v.u_dot == (v.u + 1));
    int nvar = v.get_local_nvar();
    ASSERT_TRUE(v.u_bar == (v.u_dot + nvar));
    ASSERT_TRUE(v.u_dot_bar == (v.u_bar + nvar));
    ASSERT_TRUE(v.u_tilde == (v.u_dot_bar + nvar));
    ASSERT_TRUE(v.u_dot_tilde == (v.u_tilde + 1));
    ASSERT_TRUE(v.u_bar_tilde == (v.u_dot_tilde + nvar));
    ASSERT_TRUE(v.u_dot_bar_tilde == (v.u_bar_tilde + nvar));
    ASSERT_FALSE(0 == v.indindex);

    df1b2variable copy(v);
    ASSERT_TRUE(v.ptr);
    ASSERT_EQ(0, ((twointsandptr*)copy.ptr)->nvar);
    ASSERT_EQ(1, ((twointsandptr*)copy.ptr)->ncopies);
    ASSERT_TRUE(((twointsandptr*)copy.ptr)->ptr == &a);

    ASSERT_EQ(1, *copy.ncopies);
    ASSERT_TRUE(v.u == copy.u);
    ASSERT_TRUE(v.u_dot == copy.u_dot);
    ASSERT_TRUE(v.u_bar == copy.u_bar);
    ASSERT_TRUE(v.u_dot_bar == copy.u_dot_bar);
    ASSERT_TRUE(v.u_tilde == copy.u_tilde);
    ASSERT_TRUE(v.u_dot_tilde == copy.u_dot_tilde);
    ASSERT_TRUE(v.u_bar_tilde == copy.u_bar_tilde);
    ASSERT_TRUE(v.u_dot_bar_tilde == copy.u_dot_bar_tilde);
    ASSERT_TRUE(v.indindex != copy.indindex);
    ASSERT_TRUE(0 == copy.indindex);
  }
  df1b2variable::pool = save;
  f1b2gradlist = save2;
}
Exemple #11
0
void val(const adstring& s, int& v, int& code)
{
  int z;
  if ( (s.size() > 2) && (s(1,2) == adstring("0x") ))
    z = sscanf((const char*)s,"%x",&v);
  else
    z = sscanf((const char*)s,"%d",&v);

  if (z != 1)
    code = 1;
  else
    code = 0;
}
Exemple #12
0
int val(const adstring& s)
{
  int code;
  int v;
  int z;
  if ( (s.size() > 2) && (s(1,2) == adstring("0x") ))
    z = sscanf((const char*)s,"%x",&v);
  else
    z = sscanf((const char*)s,"%d",&v);

  if (z != 1)
    code = 1;
  else
    code = 0;

  return v;
}
TEST_F(test_df1b2variable, constructor_double)
{
  adpool* save = df1b2variable::pool;

  extern df1b2_gradlist* f1b2gradlist;
  df1b2_gradlist* save2 = f1b2gradlist;
  {
    adpool a;
    const size_t n = 10;
    size_t size = sizeof(double) * df1b2variable::get_blocksize(n);
    a.set_size(size);
    df1b2variable::pool = &a;

    df1b2_gradlist gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));
    f1b2gradlist = &gradlist;;
  
    double expected = 6.5;
    df1b2variable v(expected);

    ASSERT_TRUE(v.ptr);
    ASSERT_EQ(0, ((twointsandptr*)v.ptr)->nvar);
    ASSERT_EQ(0, ((twointsandptr*)v.ptr)->ncopies);
    ASSERT_TRUE(((twointsandptr*)v.ptr)->ptr == &a);
    ASSERT_EQ(0, *v.ncopies);
    ASSERT_DOUBLE_EQ(*v.u, expected);
    ASSERT_TRUE(v.u == (v.ptr + 2));
    ASSERT_TRUE(v.u_dot == (v.u + 1));
    int nvar = v.get_local_nvar();
    ASSERT_TRUE(v.u_bar == (v.u_dot + nvar));
    ASSERT_TRUE(v.u_dot_bar == (v.u_bar + nvar));
    ASSERT_TRUE(v.u_tilde == (v.u_dot_bar + nvar));
    ASSERT_TRUE(v.u_dot_tilde == (v.u_tilde + 1));
    ASSERT_TRUE(v.u_bar_tilde == (v.u_dot_tilde + nvar));
    ASSERT_TRUE(v.u_dot_bar_tilde == (v.u_bar_tilde + nvar));
    ASSERT_FALSE(0 == v.indindex);
  }
  df1b2variable::pool = save;
  f1b2gradlist = save2;
}
Exemple #14
0
TEST_F(test_df1b2atan2, no_derivatives_0)
{
  int argc = 1;
  char* argv[] = {"./gtest-all"};
  ad_comm::argc = argc;
  ad_comm::argv = argv;

  adpool pool;
  pool.set_size(808);
  pool.nvar = 808;
  df1b2variable::pool = &pool;
  df1b2_gradlist::no_derivatives = 0;
  df1b2variable::noallocate = 0;

  extern df1b2_gradlist* f1b2gradlist;
  df1b2_gradlist gradlist(4000000U,200000U,8000000U,400000U,2000000U,100000U,adstring("f1b2list1"));
  f1b2gradlist = &gradlist;;

  df1b2variable y;

  ad_comm::argc = 0;
  ad_comm::argv = 0;
}
Exemple #15
0
/**
 * Description not yet available.
 * \param
 */
void function_minimizer::constraint_report()
{
  adstring tmp;
  if (initial_params::current_phase==initial_params::max_number_phases)
  {
    tmp="on";
  }
  else if (initial_params::current_phase>=10)
  {
    tmp=str(initial_params::current_phase);
  }
  else
  {
    tmp="0" + str(initial_params::current_phase);
  }
  {
    adstring tadstring=ad_comm::adprogram_name + adstring(".c") + tmp;
    ofstream ofs((char*)tadstring);
    ofs << setshowpoint();
    ofs <<  "# Objective function value = " << endl << "  "
         << *objective_function_value::pobjfun << endl;
    if (function_minimizer::ph)
    {
      ofs <<  "# Equality constraint values: "<< endl;
      named_dvar_vector & w = *function_minimizer::ph;
      for (int i=w.indexmin();i<=w.indexmax();i++)
      {
        adstring ads= adstring(w.label().mychar()) + "("
          + str(i) + ")  ";
        if (i<10)
          ofs << "    ";
        else if (i<100)
          ofs << "   ";
        else
          ofs << "  ";
        ofs << ads << w(i)<< endl;
      }
    }
    if (function_minimizer::pg)
    {
      ofs <<  "# Inequality constraint values: "<< endl;
      named_dvar_vector & w = *function_minimizer::pg;
      for (int i=w.indexmin();i<=w.indexmax();i++)
      {
        if (i<10)
          ofs << "    ";
        else if (i<100)
          ofs << "   ";
        else
          ofs << "  ";
        adstring ads= adstring(w.label().mychar()) + "("
          + str(i) + ")  ";
        ofs << ads << w(i)<< endl;
      }
    }
    ofs << "#exit condition: ";
    switch(function_minimizer::constraint_exit_number)
    {
      case 1:
       ofs << "Error calculatinumberv constraint" <<endl;
       break;
      case 2:
       ofs << "Error calculatinumberv objective function" <<endl;
       break;
      case 7:
       ofs << "Current search direction is not feasible" << endl;
       break;
      case 11:
       ofs << "Kuhn-Tucker conditions satisfied" << endl;
       break;
      case 15:
       ofs << "Function munimxizer not makinumberv enough progress -- "
               "Is answer attained?" << endl;
       break;
      default:
       ofs << "Unknown error" <<endl;
       break;
    }
  }
}
Exemple #16
0
adstring& adstring::operator=(const char t)
{
  *this = adstring(t);
  return *this;
}
Exemple #17
0
                }
              }
            }

            if (!psvflag) {
              pofs_psave=
                new uostream(
                  (char*)(ad_comm::adprogram_name + adstring(".psv")),ios::app);
            } else {
              pofs_psave=
                new uostream((char*)(ad_comm::adprogram_name + adstring(".psv")));
            }

          } else {
            pofs_psave=
              new uostream((char*)(ad_comm::adprogram_name + adstring(".psv")));
          }
          if (!pofs_psave|| !(*pofs_psave))
          {
            cerr << "Error trying to open file" <<
              ad_comm::adprogram_name + adstring(".psv") << endl;
            mcsave_flag=0;
            if (pofs_psave)
            {
              delete pofs_psave;
              pofs_psave=NULL;
            }
          }
          else
          {
            if (psvflag || (mcrestart_flag == -1) )
Exemple #18
0
/**
Symmetrize and invert the hessian
*/
void function_minimizer::hess_inv(void)
{
  initial_params::set_inactive_only_random_effects();
  int nvar=initial_params::nvarcalc(); // get the number of active parameters
  independent_variables x(1,nvar);

  initial_params::xinit(x);        // get the initial values into the x vector
  //double f;
  dmatrix hess(1,nvar,1,nvar);
  uistream ifs("admodel.hes");
  int file_nvar = 0;
  ifs >> file_nvar;
  if (nvar != file_nvar)
  {
    cerr << "Number of active variables in file mod_hess.rpt is wrong"
         << endl;
  }

  for (int i = 1;i <= nvar; i++)
  {
    ifs >> hess(i);
    if (!ifs)
    {
      cerr << "Error reading line " << i  << " of the hessian"
           << " in routine hess_inv()" << endl;
      exit(1);
    }
  }
  int hybflag = 0;
  ifs >> hybflag;
  dvector sscale(1,nvar);
  ifs >> sscale;
  if (!ifs)
  {
    cerr << "Error reading sscale"
         << " in routine hess_inv()" << endl;
  }

  double maxerr=0.0;
  for (int i = 1;i <= nvar; i++)
  {
    for (int j=1;j<i;j++)
    {
      double tmp=(hess(i,j)+hess(j,i))/2.;
      double tmp1=fabs(hess(i,j)-hess(j,i));
      tmp1/=(1.e-4+fabs(hess(i,j))+fabs(hess(j,i)));
      if (tmp1>maxerr) maxerr=tmp1;
      hess(i,j)=tmp;
      hess(j,i)=tmp;
    }
  }
  /*
  if (maxerr>1.e-2)
  {
    cerr << "warning -- hessian aprroximation is poor" << endl;
  }
 */

  for (int i = 1;i <= nvar; i++)
  {
    int zero_switch=0;
    for (int j=1;j<=nvar;j++)
    {
      if (hess(i,j)!=0.0)
      {
        zero_switch=1;
      }
    }
    if (!zero_switch)
    {
      cerr << " Hessian is 0 in row " << i << endl;
      cerr << " This means that the derivative if probably identically 0 "
              " for this parameter" << endl;
    }
  }

  int ssggnn;
  ln_det(hess,ssggnn);
  int on1=0;
  {
    ofstream ofs3((char*)(ad_comm::adprogram_name + adstring(".eva")));
    {
      dvector se=eigenvalues(hess);
      ofs3 << setshowpoint() << setw(14) << setprecision(10)
           << "unsorted:\t" << se << endl;
     se=sort(se);
     ofs3 << setshowpoint() << setw(14) << setprecision(10)
     << "sorted:\t" << se << endl;
     if (se(se.indexmin())<=0.0)
      {
        negative_eigenvalue_flag=1;
        cout << "Warning -- Hessian does not appear to be"
         " positive definite" << endl;
      }
    }
    ivector negflags(0,hess.indexmax());
    int num_negflags=0;
    {
      int on = option_match(ad_comm::argc,ad_comm::argv,"-eigvec");
      on1=option_match(ad_comm::argc,ad_comm::argv,"-spmin");
      if (on > -1 || on1 >-1 )
      {
        ofs3 << setshowpoint() << setw(14) << setprecision(10)
          << eigenvalues(hess) << endl;
        dmatrix ev=trans(eigenvectors(hess));
        ofs3 << setshowpoint() << setw(14) << setprecision(10)
          << ev << endl;
        for (int i=1;i<=ev.indexmax();i++)
        {
          double lam=ev(i)*hess*ev(i);
          ofs3 << setshowpoint() << setw(14) << setprecision(10)
            << lam << "  "  << ev(i)*ev(i) << endl;
          if (lam<0.0)
          {
            num_negflags++;
            negflags(num_negflags)=i;
          }
        }
        if ( (on1>-1) && (num_negflags>0))   // we will try to get away from
        {                                     // saddle point
          negative_eigenvalue_flag=0;
          spminflag=1;
          if(negdirections)
          {
            delete negdirections;
          }
          negdirections = new dmatrix(1,num_negflags);
          for (int i=1;i<=num_negflags;i++)
          {
            (*negdirections)(i)=ev(negflags(i));
          }
        }
        int on2 = option_match(ad_comm::argc,ad_comm::argv,"-cross");
        if (on2>-1)
        {                                     // saddle point
          dmatrix cross(1,ev.indexmax(),1,ev.indexmax());
          for (int i = 1;i <= ev.indexmax(); i++)
          {
            for (int j=1;j<=ev.indexmax();j++)
            {
              cross(i,j)=ev(i)*ev(j);
            }
          }
          ofs3 <<  endl << "  e(i)*e(j) ";
          ofs3 << endl << cross << endl;
        }
      }
    }

    if (spminflag==0)
    {
      if (num_negflags==0)
      {
        hess=inv(hess);
        int on=0;
        if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-eigvec"))>-1)
        {
          int i;
          ofs3 << "choleski decomp of correlation" << endl;
          dmatrix ch=choleski_decomp(hess);
          for (i=1;i<=ch.indexmax();i++)
            ofs3 << ch(i)/norm(ch(i)) << endl;
          ofs3 << "parameterization of choleski decomnp of correlation" << endl;
          for (i=1;i<=ch.indexmax();i++)
          {
            dvector tmp=ch(i)/norm(ch(i));
            ofs3 << tmp(1,i)/tmp(i) << endl;
          }
        }
      }
    }
  }
  if (spminflag==0)
  {
    if (on1<0)
    {
      for (int i = 1;i <= nvar; i++)
      {
        if (hess(i,i) <= 0.0)
        {
          hess_errorreport();
          ad_exit(1);
        }
      }
    }
    {
      adstring tmpstring="admodel.cov";
      if (ad_comm::wd_flag)
        tmpstring = ad_comm::adprogram_name + ".cov";
      uostream ofs((char*)tmpstring);
      ofs << nvar << hess;
      ofs << gradient_structure::Hybrid_bounded_flag;
      ofs << sscale;
    }
  }
}
Exemple #19
0
void function_minimizer::shmc_mcmc_routine(int nmcmc,int iseed0,double dscale,
					  int restart_flag) {

  if (nmcmc<=0)
    {
      cerr << endl << "Error: Negative iterations for MCMC not meaningful" << endl;
      ad_exit(1);
    }

  uostream * pofs_psave=NULL;
  if (mcmc2_flag==1)
    {
      initial_params::restore_start_phase();
    }
  initial_params::set_inactive_random_effects();
  initial_params::set_active_random_effects();
  int nvar_re=initial_params::nvarcalc();
  int nvar=initial_params::nvarcalc(); // get the number of active parameters
  if (mcmc2_flag==0)
    {
      initial_params::set_inactive_random_effects();
      nvar=initial_params::nvarcalc(); // get the number of active parameters
    }
  initial_params::restore_start_phase();

  independent_variables parsave(1,nvar_re);
  // dvector x(1,nvar);
  // initial_params::xinit(x);
  // dvector pen_vector(1,nvar);
  // {
  //   initial_params::reset(dvar_vector(x),pen_vector);
  // }
  initial_params::mc_phase=1;

  int old_Hybrid_bounded_flag=-1;
  int on,nopt = 0;

  //// ------------------------------ Parse input options
  // Step size. If not specified, will be adapted. If specified must be >0
  // and will not be adapted.
  double eps=0.1;
  double _eps=-1.0;
  int useDA=1; 			// whether to adapt step size
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-hyeps",nopt))>-1)
    {
      if (!nopt) // not specified means to adapt, using function below to find reasonable one
	{
	  cerr << "Warning: No step size given after -hyeps, ignoring" << endl;
	  useDA=1;
	}
      else			// read in specified value and do not adapt
	{
	  istringstream ist(ad_comm::argv[on+1]);
	  ist >> _eps;
	  if (_eps<=0)
	    {
	      cerr << "Error: step size (-hyeps argument) needs positive number";
	      ad_exit(1);
	    }
	  else
	    {
	      eps=_eps;
	      useDA=0;
	    }
	}
    }
  // Chain number -- for console display purposes only
  int chain=1;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-chain",nopt))>-1) {
    if (nopt) {
      int iii=atoi(ad_comm::argv[on+1]);
      if (iii <1) {
	cerr << "Error: chain must be >= 1" << endl;
	ad_exit(1);
      } else {
	chain=iii;
      }
    }
  }
  // Number of leapfrog steps. Defaults to 10.
  int L=10;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-hynstep",nopt))>-1)
    {
      if (nopt)
	{
	  int _L=atoi(ad_comm::argv[on+1]);
	  if (_L < 1 )
	    {
	      cerr << "Error: hynstep argument must be integer > 0 " << endl;
	      ad_exit(1);
	    }
	  else
	    {
	      L=_L;
	    }
	}
    }

  // Number of warmup samples if using adaptation of step size. Defaults to
  // half of iterations.
  int nwarmup= (int)nmcmc/2;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-nwarmup",nopt))>-1)
    {
      if (nopt)
        {
          int iii=atoi(ad_comm::argv[on+1]);
          if (iii <=0 || iii > nmcmc)
	    {
	      cerr << "Error: nwarmup must be 0 < nwarmup < nmcmc" << endl;
	      ad_exit(1);
	    }
          else
	    {
	      nwarmup=iii;
	    }
        }
    }

  // Target acceptance rate for step size adaptation. Must be
  // 0<adapt_delta<1. Defaults to 0.8.
  double adapt_delta=0.8; // target acceptance rate specified by the user
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-adapt_delta",nopt))>-1)
    {
      if (nopt)
	{
	  istringstream ist(ad_comm::argv[on+1]);
	  double _adapt_delta;
	  ist >> _adapt_delta;
	  if (_adapt_delta < 0 || _adapt_delta > 1 )
	    {
	      cerr << "Error: adapt_delta must be between 0 and 1"
		" using default of 0.8" << endl;
	    }
	  else
	    {
	      adapt_delta=_adapt_delta;
	    }
	}
    }
  // Use diagnoal covariance (identity mass matrix)
  int diag_option=0;
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcdiag"))>-1)
    {
      diag_option=1;
      cout << " Setting covariance matrix to diagonal with entries " << dscale
	   << endl;
    }
  // Restart chain from previous run?
  int mcrestart_flag=option_match(ad_comm::argc,ad_comm::argv,"-mcr");
  if(mcrestart_flag > -1){
    cerr << endl << "Error: -mcr option not implemented for HMC" << endl;
    ad_exit(1);
  }

  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcec"))>-1)
    {
      cerr << endl << "Error: -mcec option not yet implemented with HMC" << endl;
      ad_exit(1);
      // use_empirical_flag=1;
      // read_empirical_covariance_matrix(nvar,S,ad_comm::adprogram_name);
    }

  // Prepare the mass matrix for use. Depends on many factors below.
  dmatrix S(1,nvar,1,nvar);
  dvector old_scale(1,nvar);
  int old_nvar;
  // Need to grab old_scale values still, since it is scaled below
  read_covariance_matrix(S,nvar,old_Hybrid_bounded_flag,old_scale);
  if (diag_option)		// set covariance to be diagonal
    {
      S.initialize();
      for (int i=1;i<=nvar;i++)
	{
	  S(i,i)=dscale;
	}
    }

  // How much to thin, for now fixed at 1.
  if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcsave"))>-1)
    {
      cerr << "Option -mcsave does not currently work with HMC -- every iteration is saved" << endl;
      ad_exit(1);
    }
  //// ------------------------------ End of input processing


  //// Setup more inputs and outputs
  pofs_psave=
    new uostream((char*)(ad_comm::adprogram_name + adstring(".psv")));
  if (!pofs_psave|| !(*pofs_psave))
    {
      cerr << "Error trying to open file" <<
	ad_comm::adprogram_name + adstring(".psv") << endl;
      ad_exit(1);
    }
  if (mcrestart_flag == -1 )
    {
      (*pofs_psave) << nvar;
    }
  // need to rescale the hessian
  // get the current scale
  dvector x0(1,nvar);
  dvector current_scale(1,nvar);
  initial_params::xinit(x0);
  int mctmp=initial_params::mc_phase;
  initial_params::mc_phase=0;
  initial_params::stddev_scale(current_scale,x0);
  initial_params::mc_phase=mctmp;
  // cout << "old scale=" <<  old_scale << endl;
  // cout << "current scale=" << current_scale << endl;
  // cout << "S before=" << S << endl;
  // I think this is only needed if mcmc2 is used??
  // for (int i=1;i<=nvar;i++)
  //   {
  //     for (int j=1;j<=nvar;j++)
  // 	{
  // 	  S(i,j)*=old_scale(i)*old_scale(j);
  // 	}
  //   }
  if(diag_option){
    for (int i=1;i<=nvar;i++)
      {
	for (int j=1;j<=nvar;j++)
	  {
	    S(i,j)*=current_scale(i)*current_scale(j);
	  }
      }
  }
  //  cout << "S after=" << S << endl;
  gradient_structure::set_NO_DERIVATIVES();
  if (mcmc2_flag==0)
    {
      initial_params::set_inactive_random_effects();
    }
  // Setup random number generator, based on seed passed
  int iseed=2197;
  if (iseed0) iseed=iseed0;
  random_number_generator rng(iseed);
  gradient_structure::set_YES_DERIVATIVES();
  initial_params::xinit(x0);

  // Dual averaging components
  dvector epsvec(1,nmcmc+1), epsbar(1,nmcmc+1), Hbar(1,nmcmc+1);
  epsvec.initialize(); epsbar.initialize(); Hbar.initialize();
  double time_warmup=0;
  double time_total=0;
  std::clock_t start = clock();
  time_t now = time(0);
  tm* localtm = localtime(&now);
  cout << endl << "Starting static HMC for model '" << ad_comm::adprogram_name <<
    "' at " << asctime(localtm);
  // write sampler parameters
  ofstream adaptation("adaptation.csv", ios::trunc);
  adaptation << "accept_stat__,stepsize__,int_time__,energy__,lp__" << endl;

  // Declare and initialize the variables needed for the algorithm
  dmatrix chd = choleski_decomp(S); // cholesky decomp of mass matrix
  dvector y(1,nvar); // unbounded parameters
  y.initialize();
  // transformed params
  independent_variables z(1,nvar); z=chd*y;
  dvector gr(1,nvar);		// gradients in unbounded space
  // Need to run this to fill gr with current gradients and initial NLL.
  double nllbegin=get_hybrid_monte_carlo_value(nvar,z,gr);
  if(std::isnan(nllbegin)){
    cerr << "Starting MCMC trajectory at NaN -- something is wrong!" << endl;
    ad_exit(1);
  }
  // initial rotated gradient
  dvector gr2(1,nvar); gr2=gr*chd;
  dvector p(1,nvar);		// momentum vector
  p.fill_randn(rng);
  // Copy initial value to parsave in case first trajectory rejected
  initial_params::copy_all_values(parsave,1.0);
  double iaccept=0.0;
  // The gradient and params at beginning of trajectory, in case rejected.
  dvector gr2begin(1,nvar); gr2begin=gr2;
  dvector ybegin(1,nvar); ybegin=y;
  double nll=nllbegin;
  // if(useDA){
  //   eps=find_reasonable_stepsize(nvar,y,p,chd);
  //   epsvec(1)=eps; epsbar(1)=eps; Hbar(1)=0;
  // }
  double mu=log(10*eps);

  // Start of MCMC chain
  for (int is=1;is<=nmcmc;is++) {
    // Random momentum for next iteration, only affects Ham values
    p.fill_randn(rng);
    double H0=nll+0.5*norm2(p);

    // Generate trajectory
    int divergence=0;
    for (int i=1;i<=L;i++) {
      // leapfrog updates gr, p, y, and gr2 by reference
      nll=leapfrog(nvar, gr, chd, eps, p, y, gr2);
      // Break trajectory early if a divergence occurs to save computation
      if(std::isnan(nll)){
	divergence=1; break;
      }
    } // end of trajectory

    // Test whether to accept the proposed state
    double Ham=nll+0.5*norm2(p); // Update Hamiltonian for proposed set
    double alpha=min(1.0, exp(H0-Ham)); // acceptance ratio
    double rr=randu(rng);	   // Runif(1)
    if (rr<alpha && !divergence){ // accept
      iaccept++;
      // Update for next iteration: params, Hamiltonian and gr2
      ybegin=y;
      gr2begin=gr2;
      nllbegin=nll;
      initial_params::copy_all_values(parsave,1.0);
    } else {
      // Reject and don't update anything to reuse initials for next trajectory
      y=ybegin;
      gr2=gr2begin;
      nll=nllbegin;
    }
    // Save parameters to psv file, duplicated if rejected
    (*pofs_psave) << parsave;

    // Adaptation of step size (eps).
    if(useDA && is <= nwarmup){
      eps=adapt_eps(is, eps,  alpha, adapt_delta, mu, epsvec, epsbar, Hbar);
    }
    adaptation << alpha << "," <<  eps << "," << eps*L << "," << H0 << "," << -nll << endl;
    if(is ==nwarmup) time_warmup = ( std::clock()-start)/(double) CLOCKS_PER_SEC;
    print_mcmc_progress(is, nmcmc, nwarmup, chain);
  } // end of MCMC chain

  // This final ratio should closely match adapt_delta
  if(useDA){
    cout << "Final acceptance ratio=" << iaccept/nmcmc << " and target is " << adapt_delta<<endl;
    cout << "Final step size=" << eps << "; after " << nwarmup << " warmup iterations"<< endl;
  } else {
    cout << "Final acceptance ratio=" << iaccept/nmcmc << endl;
  }

  time_total = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
  print_mcmc_timing(time_warmup, time_total);

  // I assume this closes the connection to the file??
  if (pofs_psave)
    {
      delete pofs_psave;
      pofs_psave=NULL;
    }
} // end of HMC function
Exemple #20
0
void function_minimizer::pvm_master_mcmc_routine(int nmcmc,int iseed0,double dscale,
  int restart_flag)
{
  uostream * pofs_psave=NULL;
  dmatrix mcmc_display_matrix;
  int mcmc_save_index=1;
  int mcmc_wrap_flag=0;
  int mcmc_gui_length=10000;
  int no_sd_mcmc=0;

  int on2=-1;
  if ( (on2=option_match(ad_comm::argc,ad_comm::argv,"-nosdmcmc"))>-1)
    no_sd_mcmc=1;

  if (stddev_params::num_stddev_params==0)
  {
    cerr << " You must declare at least one object of type sdreport "
         << endl << " to do the mcmc calculations" << endl;
     return;
  }
  {
    //ofstream of_bf("testbf");

    //if (adjm_ptr) set_labels_for_mcmc();

    ivector number_offsets;
    dvector lkvector;
    //double current_bf=0;
    double lcurrent_bf=0;
    double size_scale=1.0;
    double total_spread=200;
    //double total_spread=2500;
    uostream * pofs_sd = NULL;
    int nvar=initial_params::nvarcalc(); // get the number of active parameters
    int scov_option=0;
    dmatrix s_covar;
    dvector s_mean;
    int on=-1;
    int ncsim=25000;
    int nslots=800;
    //int nslots=3600;
    int initial_nsim=4800;
    int ntmp=0;
    int ncor=0;
    double bfsum=0;
    int ibfcount=0;
    double llbest;
    double lbmax;

    //if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcscov",ntmp))>-1)
    //{
    scov_option=1;
    s_covar.allocate(1,nvar,1,nvar);
    s_mean.allocate(1,nvar);
    s_mean.initialize();
    s_covar.initialize();

    int ndvar=stddev_params::num_stddev_calc();
    int numdvar=stddev_params::num_stddev_number_calc();
    /*
    if (adjm_ptr)
    {
      mcmc_display_matrix.allocate(1,numdvar,1,mcmc_gui_length);
      number_offsets.allocate(1,numdvar);
      number_offsets=stddev_params::copy_all_number_offsets();
    }
    */
    dvector x(1,nvar);
    dvector scale(1,nvar);
    dmatrix values;
    int have_hist_flag=0;
    initial_params::xinit(x);
    dvector pen_vector(1,nvar);
    {
      initial_params::reset(dvar_vector(x),pen_vector);
      cout << pen_vector << endl << endl;
    }

    initial_params::mc_phase=0;
    initial_params::stddev_scale(scale,x);
    initial_params::mc_phase=1;
    dvector bmn(1,nvar);
    dvector mean_mcmc_values(1,ndvar);
    dvector s(1,ndvar);
    dvector h(1,ndvar);
    //dvector h;
    dvector square_mcmc_values(1,ndvar);
    square_mcmc_values.initialize();
    mean_mcmc_values.initialize();
    bmn.initialize();
    int use_empirical_flag=0;
    int diag_option=0;
    int topt=0;
    if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcdiag"))>-1)
    {
      diag_option=1;
      cout << " Setting covariance matrix to diagonal with entries " << dscale
           << endl;
    }
    dmatrix S(1,nvar,1,nvar);
    dvector sscale(1,nvar);
    if (!diag_option)
    {
      int on,nopt;
      int rescale_bounded_flag=0;
      double rescale_bounded_power=0.5;
      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcrb",nopt))>-1)
      {
        if (nopt)
        {
          int iii=atoi(ad_comm::argv[on+1]);
          if (iii < 1 || iii > 9)
          {
            cerr << " -mcrb argument must be integer between 1 and 9 --"
                    " using default of 5" << endl;
            rescale_bounded_power=0.5;
          }
          else
            rescale_bounded_power=iii/10.0;
        }
        else
        {
          rescale_bounded_power=0.5;
        }
        rescale_bounded_flag=1;
      }
      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcec"))>-1)
      {
        use_empirical_flag=1;
      }
      if (use_empirical_flag)
      {
        read_empirical_covariance_matrix(nvar,S,ad_comm::adprogram_name);
      }
      else if (!rescale_bounded_flag)
      {
        int tmp;
        read_covariance_matrix(S,nvar,tmp,sscale);
      }
      else
      {
        read_hessian_matrix_and_scale1(nvar,S,rescale_bounded_power,
          mcmc2_flag);
        //read_hessian_matrix_and_scale(nvar,S,pen_vector);
      }

      {  // scale covariance matrix for model space
        dmatrix tmp(1,nvar,1,nvar);
        for (int i=1;i<=nvar;i++)
        {
          tmp(i,i)=S(i,i)*(scale(i)*scale(i));
          for (int j=1;j<i;j++)
          {
            tmp(i,j)=S(i,j)*(scale(i)*scale(j));
            tmp(j,i)=tmp(i,j);
          }
        }
        S=tmp;
      }
    }
    else
    {
      S.initialize();
      for (int i=1;i<=nvar;i++)
      {
        S(i,i)=dscale;
      }
    }

    cout << sort(eigenvalues(S)) << endl;
    dmatrix chd = choleski_decomp( (dscale*2.4/sqrt(double(nvar))) * S);
    dmatrix chdinv=inv(chd);
    int sgn;

    dmatrix symbds(1,2,1,nvar);
    initial_params::set_all_simulation_bounds(symbds);
    ofstream ofs_sd1((char*)(ad_comm::adprogram_name + adstring(".mc2")));

    {
      long int iseed=0;
      int number_sims;
      if (nmcmc<=0)
      {
        number_sims=  100000;
      }
      else
      {
        number_sims=  nmcmc;
      }
      //cin >> iseed;
      if (iseed0<=0)
      {
        iseed=-36519;
      }
      else
      {
        iseed=-iseed0;
      }
      if (iseed>0)
      {
        iseed=-iseed;
      }
      cout << "Initial seed value " << iseed << endl;
      random_number_generator rng(iseed);
      rng.better_rand();
      //better_rand(iseed);
      double lprob=0.0;
      double lpinv=0.0;
      double lprob3=0.0;
      // get lower and upper bounds

      independent_variables y(1,nvar);
      independent_variables parsave(1,nvar);

      // read in the mcmc values to date
      int ii=1;
      dmatrix hist;
      if (restart_flag)
      {
        int tmp=0;
        if (!no_sd_mcmc) {
          hist.allocate(1,ndvar,-nslots,nslots);
          tmp=read_hist_data(hist,h,mean_mcmc_values,s,parsave,iseed,
            size_scale);
          values.allocate(1,ndvar,-nslots,nslots);
          for (int i=1;i<=ndvar;i++)
          {
            values(i).fill_seqadd(mean_mcmc_values(i)-0.5*total_spread*s(i)
              +.5*h(i),h(i));
          }
        }
        if (iseed>0)
        {
          iseed=-iseed;
        }
        double br=rng.better_rand();
        if (tmp) have_hist_flag=1;
        chd=size_scale*chd;
        chdinv=chdinv/size_scale;
      }
      else
      {
        int on=-1;
        int nopt=0;
        if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcpin",nopt))>-1)
        {
          if (nopt)
          {
            cifstream cif((char *)ad_comm::argv[on+1]);
            if (!cif)
            {
              cerr << "Error trying to open mcmc par input file "
                   << ad_comm::argv[on+1] << endl;
              exit(1);
            }
            cif >> parsave;
            if (!cif)
            {
              cerr << "Error reading from mcmc par input file "
                   << ad_comm::argv[on+1] << endl;
              exit(1);
            }
          }
          else
          {
            cerr << "Illegal option with -mcpin" << endl;
          }
        }
        else
        {
          ii=1;
          initial_params::copy_all_values(parsave,ii);
        }
      }

      ii=1;
      initial_params::restore_all_values(parsave,ii);

      gradient_structure::set_NO_DERIVATIVES();
      ofstream ogs("sims");
      ogs << nvar << " " << number_sims << endl;
      initial_params::xinit(y);

      send_int_to_slaves(1);
      double llc=-pvm_master_get_monte_carlo_value(nvar,y);
      send_int_to_slaves(1);
      llbest=-pvm_master_get_monte_carlo_value(nvar,y);



      lbmax=llbest;
      // store current mcmc variable values in param_values
      //dmatrix store_mcmc_values(1,number_sims,1,ndvar);
#if defined(USE_BAYES_FACTORS)
      lkvector.allocate(1,number_sims);
#endif
      dvector mcmc_values(1,ndvar);
      dvector mcmc_number_values;
      //if (adjm_ptr) mcmc_number_values.allocate(1,numdvar);
      int offs=1;
      stddev_params::copy_all_values(mcmc_values,offs);

      /*
      if (adjm_ptr)
      {
        offs=1;
        stddev_params::copy_all_number_values(mcmc_number_values,offs);
      }
      */
      int change_ball=2500;
      int nopt;
      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcscale",nopt))>-1)
      {
        if (nopt)
        {
          int iii=atoi(ad_comm::argv[on+1]);
          if (iii <=0)
          {
            cerr << " Invalid option following command line option -mcball -- "
              << endl << " ignored" << endl;
          }
          else
            change_ball=iii;
        }
      }
      int iac=0;
      int liac=0;
      int isim=0;
      int itmp=0;
      double logr;
      int u_option=0;
      double ll;
      int s_option=1;
      int psvflag=0;
      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcu"))>-1)
      {
        u_option=1;
      }
      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcnoscale"))>-1)
      {
        s_option=0;
      }
      //cout << llc << " " << llc << endl;
      int iac_old=0;
      int i_old=0;

      {
       if (!restart_flag)
       {
         pofs_sd =
           new uostream((char*)(ad_comm::adprogram_name + adstring(".mcm")));
       }

      int mcsave_flag=0;
      int mcrestart_flag=option_match(ad_comm::argc,ad_comm::argv,"-mcr");

      if ( (on=option_match(ad_comm::argc,ad_comm::argv,"-mcsave"))>-1)
      {
        int jj=(int)atof(ad_comm::argv[on+1]);
        if (jj <=0)
        {
          cerr << " Invalid option following command line option -mcsave -- "
            << endl;
        }
        else
        {
          mcsave_flag=jj;
          if ( mcrestart_flag>-1)
          {
            // check that nvar is correct
            {
              uistream uis((char*)(ad_comm::adprogram_name + adstring(".psv")));
              if (!uis)
              {
                cerr << "Error trying to open file" <<
                  ad_comm::adprogram_name + adstring(".psv") <<
                  " for mcrestart" <<   endl;
                cerr << " I am starting a new file " << endl;
                psvflag=1;
              }
              else
              {
                int nv1;
                uis >> nv1;
                if (nv1 !=nvar)
                {
                  cerr << "wrong number of independent variables in" <<
                    ad_comm::adprogram_name + adstring(".psv") <<
                  cerr << " I am starting a new file " << endl;
                  psvflag=1;
                }
              }
            }

            if (!psvflag) {
              pofs_psave=
                new uostream(
                  (char*)(ad_comm::adprogram_name + adstring(".psv")),ios::app);
            } else {
              pofs_psave=
                new uostream((char*)(ad_comm::adprogram_name + adstring(".psv")));
            }

          } else {
Exemple #21
0
void ad_comm::allocate(void)
{
#if defined (_WIN32)
    directory_prefix='\\';
#else
    directory_prefix='/';
#endif
    adstring tmpstring;

#if defined(_MSC_VER)
    //remove path
    for (int i = (int)adprogram_name.size(); i >= 1; i--)
    {
        if (adprogram_name(i)==directory_prefix)
        {
            adprogram_name=adprogram_name(i+1,adprogram_name.size());
            break;
        }
    }
#endif

#if defined(_WIN32)
    // strip off the .exe
#ifdef __MINGW64__
    size_t _n = adprogram_name.size();
    assert(_n <= INT_MAX);
    int n = (int)_n;
#else
    int n = (int)adprogram_name.size();
#endif
    if (n > 4)
    {
        if (adprogram_name(n - 3) == '.'
                && tolower(adprogram_name(n - 2)) == 'e'
                && tolower(adprogram_name(n - 1)) == 'x'
                && tolower(adprogram_name(n)) == 'e')
        {
            n -= 4;
        }
    }
    adprogram_name=adprogram_name(1,n);
#endif

    // change the working directory name
    if (argc > 1)
    {
        int on=0;
        if ( (on=option_match(argc,argv,"-wd"))>-1)
        {
            if (on>argc-2 || argv[on+1][0] == '-')
            {
                cerr << "Invalid input data command line option"
                     " -- ignored" << endl;
            }
            else
            {
                tmpstring = adstring(argv[on+1]);
                wd_flag=1;
            }
        }
    }
    if (length(tmpstring))
    {
        if (tmpstring(length(tmpstring)) == directory_prefix)
        {
            adprogram_name=tmpstring + adprogram_name;
            working_directory_path = tmpstring;
        }
        else
        {
            adprogram_name=tmpstring + directory_prefix + adprogram_name;
            working_directory_path = tmpstring + directory_prefix;
        }
    }

    tmpstring=adprogram_name + adstring(".dat");
    if (argc > 1)
    {
        int on=0;
        if ( (on=option_match(argc,argv,"-ind"))>-1)
        {
            if (on>argc-2 || argv[on+1][0] == '-')
            {
                cerr << "Invalid input data command line option"
                     " -- ignored" << endl;
            }
            else
            {
                tmpstring = adstring(argv[on+1]);
            }
        }
    }
    global_datafile= new cifstream(tmpstring);
    if (!global_datafile)
    {
        cerr << "Error trying to open data input file "
             << tmpstring << endl;
    }
    else
    {
        if (!(*global_datafile))
        {
            cerr << "Error trying to open data input file "
                 << tmpstring << endl;
            delete global_datafile;
            global_datafile=NULL;
        }
    }
    adstring ts=adprogram_name + adstring(".log");
    global_logfile= new ofstream( (char*)ts);

    int biopt=-1;
    int aiopt=-1;
    biopt=option_match(argc,argv,"-binp");
    aiopt=option_match(argc,argv,"-ainp");

    tmpstring=adprogram_name + adstring(".bin");
    if (!global_bparfile && aiopt == -1)
    {
        if (biopt>-1)
        {
            if (biopt>argc-2 || argv[biopt+1][0] == '-')
            {
                cerr << "Invalid input parameter file command line option"
                     " -- ignored" << endl;
            }
            else
            {
                tmpstring = adstring(argv[biopt+1]);
            }
        }
        global_bparfile= new uistream(tmpstring);
        if (global_bparfile)
        {
            if (!(*global_bparfile))
            {
                if (biopt>-1)
                {
                    cerr << "Error trying to open binary inoput par file "
                         << tmpstring << endl;
                    exit(1);
                }
                delete global_bparfile;
                global_bparfile=NULL;
            }
        }
    }
    tmpstring=adprogram_name + adstring(".pin");
    if (!global_parfile)
    {
        if (aiopt>-1)
        {
            if (aiopt>argc-2 || argv[aiopt+1][0] == '-')
            {
                cerr << "Invalid input parameter file command line option"
                     " -- ignored" << endl;
            }
            else
            {
                tmpstring = adstring(argv[aiopt+1]);
            }
        }
        global_parfile= new cifstream(tmpstring);
        if (global_parfile)
        {
            if (!(*global_parfile))
            {
                if (aiopt>-1)
                {
                    cerr << "Error trying to open ascii inoput par file "
                         << tmpstring << endl;
                    exit(1);
                }
                delete global_parfile;
                global_parfile=NULL;
            }
        }
    }
}