#define SEPFUN1
#define SEPFUN3
#define SEPFUN4
class model_data : public ad_comm{
  public:
  data_int  nobs;
  data_int  a;
  data_matrix data;
  dmatrix Iobs;
  ivector iyr;
  dmatrix sim_nu;
  ~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;
  param_init_vector logq;
  param_init_bounded_matrix z;
  param_init_bounded_vector invSDpro;
  param_init_bounded_vector invSDobs;
  param_init_bounded_vector theta;
  param_init_bounded_number recrate;
  param_init_vector logNad;
  param_init_vector logN69;
  random_effects_matrix nu;
  param_number prior_function_value;
  param_number likelihood_function_value;
  objective_function_value  f;
  param_vector q;
  param_vector N69;
  param_vector Nad;
  param_vector sdpro;
  param_vector sdobs;
  param_matrix st;
  param_matrix nmod;
  param_matrix logn;
  param_matrix N;
  param_stddev_matrix sd_N;
  param_matrix epsilon;
  param_stddev_number  sd_var;
  param_stddev_matrix Ipred;
public:
  virtual void userfunction(void);
  virtual void report(void);
  virtual void final_calcs(void);
  model_parameters(int sz,int argc, char * argv[]);
  virtual void initializationfunction(void){}
  virtual void AD_uf_inner(void){pre_userfunction();}
  virtual void AD_uf_outer(void){pre_userfunction();}
  virtual void user_function(void){;}
  virtual void allocate(void){;}
  void calculate_process_model2(void);
  void calculate_observation_model(void);
  void calculate_objective_func(void);

};

class df1b2_pre_parameters : public model_parameters
{ 
public: 
df1b2_pre_parameters(int sz,int argc, char * argv[]) : 
model_parameters(sz,argc,argv){;}
  re_objective_function_value  f;
void begin_df1b2_funnel(void); 
void setup_quadprior_calcs(void); 
void end_df1b2_funnel(void);
}; 

class df1b2_parameters : public df1b2_pre_parameters 
{ 
public: 
static df1b2_parameters * df1b2_parameters_ptr;
static df1b2_parameters * get_df1b2_parameters_ptr(void) 
{ 
return df1b2_parameters_ptr; 
} 
df1b2_parameters(int sz,int argc, char * argv[]) : 
df1b2_pre_parameters(sz,argc,argv) 
{ 
df1b2_parameters_ptr=this;
}
  df1b2_init_vector logq;
  df1b2_init_bounded_matrix z;
  df1b2_init_bounded_vector invSDpro;
  df1b2_init_bounded_vector invSDobs;
  df1b2_init_bounded_vector theta;
  df1b2_init_bounded_number recrate;
  df1b2_init_vector logNad;
  df1b2_init_vector logN69;
  df1b2_init_matrix nu;
  df1b2variable prior_function_value;
  df1b2variable likelihood_function_value;
   // re_objective_function_value  f;
  df1b2vector q;
  df1b2vector N69;
  df1b2vector Nad;
  df1b2vector sdpro;
  df1b2vector sdobs;
  df1b2matrix st;
  df1b2matrix nmod;
  df1b2matrix logn;
  df1b2matrix N;
  df1b2matrix sd_N;
  df1b2matrix epsilon;
  df1b2variable  sd_var;
  df1b2matrix Ipred;
virtual void user_function(void); 
virtual void allocate(void); 
// void begin_df1b2_funnel(void); 
// void setup_quadprior_calcs(void); 
// void end_df1b2_funnel(void);
  void calculate_process_model2(void);
  void calculate_observation_model(void);
  void calculate_objective_func(void);

};
