#define SEPFUN1
#define SEPFUN3
#define SEPFUN4
class model_data : public ad_comm{
  public:
  int genpin;
  data_int  noFleets;
  data_ivector fleetTypes;
  int ssbPhase;
  int ssbPowPhase;
  data_vector fleetTimes;
  data_int  noYears;
  data_vector years;
  dvector times;
  data_int  noObs;
  data_ivector idx1;
  data_ivector idx2;
  data_matrix data;
  dvector logObs;
  int minAgeObs;
  int maxAgeObs;
  int minYearResFleet;
  int maxYearResFleet;
  data_matrix propMature;
  data_matrix stockMeanWeight;
  data_matrix catchMeanWeight;
  data_matrix natMor;
  data_matrix landFrac;
  data_matrix catchMeanWeightD;
  data_matrix catchMeanWeightL;
  data_matrix Fprop;
  data_matrix Mprop;
  data_int  AgeErrorStartYear;
  data_int  minAge;
  data_int  maxAge;
  data_int  maxAgePlusGroup;
  data_imatrix keyLogFsta;
  int noLogFsta;
  data_int  corFlag;
  data_imatrix keyLogFpar;
  int noLogFpar;
  data_imatrix keyQpow;
  int noQpow;
  data_imatrix keyVarF;
  int noVarF;
  data_ivector keyVarLogN;
  int noVarLogN;
  data_imatrix keyVarObs;
  int noVarObs;
  data_int  stockRecruitmentModelCode;
  data_int  noScaledYears;
  data_ivector keyScaledYears;
  data_imatrix keyParScaledYA;
  int noScaledPar;
  int stateDim;
  data_ivector fbarRange;
  int pinini;
  data_number  varLogFstaInit;
  data_number  varLogNInit;
  data_number  varLogObsInit;
  data_number  logFparInit;
  data_number  rec_logaInit;
  data_number  rec_logbInit;
  ivector retro;
  int reducedRun;
  data_ivector tempretro;
  ivector lastYearData;
  dmatrix residuals;
  dvector maxAgeFleet;
  ~model_data();
  model_data(int argc,char * argv[]);
  friend class model_parameters;
};

class model_parameters : public model_data ,
  public function_minimizer
{
public:
  friend class df1b2_pre_parameters;
  friend class df1b2_parameters;
  static model_parameters * model_parameters_ptr;
  static model_parameters * get_model_parameters_ptr(void)
  {
    return model_parameters_ptr;
  }
  ~model_parameters();
  void preliminary_calculations(void);
  void set_runtime(void);
  virtual void * mycast(void) {return (void*)this;}
  static int mc_phase(void)
  {
    return initial_params::mc_phase;
  }
  static int mceval_phase(void)
  {
    return initial_params::mceval_phase;
  }
  static int sd_phase(void)
  {
    return initial_params::sd_phase;
  }
  static int current_phase(void)
  {
    return initial_params::current_phase;
  }
  static int last_phase(void)
  {
    return (initial_params::current_phase
      >=initial_params::max_number_phases);
  }
  static prevariable current_feval(void)
  {
    return *objective_function_value::pobjfun;
  }
private:
  ivector integer_control_flags;
  void begin_df1b2_funnel(void);
  void end_df1b2_funnel(void);
  dvector double_control_flags;
