#ifndef __FILE_EMMUSR_H_SEEN__
#define __FILE_EMMUSR_H_SEEN__

/*-----------------------------------------------------------------------------

Copyright (C) 2005, 2006, 2007.

A. Ronald Gallant
Post Office Box 659
Chapel Hill NC 27514-0659
USA   

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

-----------------------------------------------------------------------------*/
#include "libsnp.h"
#include "libsmm.h"
#include "emm_base.h"
#include "snp.h"

namespace emm {
    
  class elec_usrmod;

  typedef elec_usrmod usrmod_type;

  class elec_usrmod : public libsmm::usrmod_base {
  private:
    scl::realmat data;
    scl::realmat rho;
    INTEGER blen;
    INTEGER lrho;
    INTEGER lstats;
    INT_32BIT variable_seed;
    scl::realmat a;
    scl::realmat B;
    scl::realmat R;
    void set_parms();
  public:
    elec_usrmod
      (const scl::realmat& dat, INTEGER len_mod_parm, INTEGER len_mod_func,
       const std::vector<std::string>& mod_pfvec,
       const std::vector<std::string>& mod_alvec, 
       std::ostream& detail);
    INTEGER len_rho() {return lrho;}
    INTEGER len_stats() {return lstats;}
    bool gen_sim(scl::realmat& sim, scl::realmat& st) 
      {st.resize(1,1,0.0); return true;}
    bool gen_bootstrap(std::vector<scl::realmat>& bs);
    void get_rho(scl::realmat& parm) { parm = rho; }
    void set_rho(const scl::realmat& parm) {rho = parm; set_parms();}
    void set_data(const scl::realmat& dat) { data = dat; }
    bool support(const scl::realmat& rho);
    scl::den_val prior(const scl::realmat& rho, 
      const scl::realmat& stats);
    scl::den_val likelihood(scl::realmat& yhat, scl::realmat& zhat);
    void write_usrvar(const char* filename) 
    { 
      scl::realmat yhat, zhat;
      if (likelihood(yhat,zhat).positive) {
        vecwrite(filename, yhat);
      }
    }
  };
}

#endif
