11#ifndef __epsic_covariant_h 
   12#define __epsic_covariant_h 
   27  class covariant_coordinator;
 
   29  class covariant_mode : 
public modulated_mode
 
   31    friend class covariant_coordinator;
 
   33    covariant_coordinator* coordinator;
 
   35    std::queue<double> amps;
 
   40    covariant_mode (mode* s) : modulated_mode (s) { coordinator = 0; }
 
   45    double get_mod_mean () 
const;
 
   46    double get_mod_variance () 
const;
 
   49  class covariant_coordinator
 
   52    covariant_mode* out[2];
 
   54    friend class covariant_mode;
 
   63    virtual void get_modulation (
double& A, 
double& B) = 0;
 
   68    covariant_coordinator (
double correlation);
 
   71    virtual ~covariant_coordinator () {}
 
   73    double get_correlation ()
 const { 
return correlation; }
 
   75    double get_intensity_covariance ()
 const 
   76    { 
return correlation * sqrt( get_mod_variance (0) * get_mod_variance (1) ); }
 
   78    virtual double get_mod_mean (
unsigned mode_index) 
const = 0;
 
   79    virtual double get_mod_variance (
unsigned mode_index) 
const = 0;
 
   81    modulated_mode* get_modulated_mode (
unsigned index, mode*);
 
   84  class bivariate_lognormal_modes : 
public covariant_coordinator
 
   86    Matrix<2,2,double> meansq;
 
   87    Vector<2,double> mean;
 
   90    Matrix<2,2,double> correlator;
 
   99    void get_modulation (
double& A, 
double& B);
 
  103    bivariate_lognormal_modes (
double correlation) 
 
  104    : covariant_coordinator(correlation) 
 
  105    { built = 
false; set_beta(0,1.0); set_beta(1,1.0); }
 
  107    ~bivariate_lognormal_modes ();
 
  109    void set_beta (
unsigned index, 
double);
 
  111    double get_mod_mean (
unsigned mode_index)
 const { 
return 1.0; }
 
  112    double get_mod_variance (
unsigned i)
 const { 
return exp(log_sigma[i]*log_sigma[i]) - 1.0; }
 
  115    virtual BoxMuller* get_normal () { 
return normal; }
 
  116    virtual void set_normal (BoxMuller* n) { normal = n; }