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; }