44
55#include < expected>
66#include < string>
7+ #include < vector>
78
89namespace lfmc {
910
1011class Estimator {
1112 public:
12- virtual std::expected<void , std::string> add_payoffs (const Payoffs& payoffs) = 0;
13+ virtual std::expected<void , std::string> add_payoffs (const std::vector< Payoffs> & payoffs) = 0;
1314 virtual bool converged () const = 0;
1415 virtual std::expected<double , std::string> result () const = 0;
1516 // virtual void merge(Estimator const& other) = 0;
@@ -22,7 +23,29 @@ class MonteCarloEstimator : public Estimator {
2223 std::size_t count = 0 ;
2324
2425 public:
25- std::expected<void , std::string> add_payoffs (const Payoffs& payoffs) override ;
26+ std::expected<void , std::string> add_payoffs (const std::vector<Payoffs>& payoffs) override ;
27+ bool converged () const override ;
28+ std::expected<double , std::string> result () const override ;
29+ // void merge(Estimator const& other) override;
30+ };
31+
32+ // TODO if control is analytically known, can put it at payoff level
33+ class ControlVariateEstimator : public Estimator {
34+ private:
35+ std::size_t count = 0 ;
36+
37+ double sum_x = 0.0 ; // Sum of original payoffs
38+ double sum_y = 0.0 ; // Sum of control variate values
39+ double sum_xy = 0.0 ; // Sum of products of payoffs and control variate
40+ double sum_yy = 0.0 ; // Sum of squares of control variate values
41+
42+ double control_expectation_ = 0.0 ; // Expected value of control variate (known analytically)
43+
44+ public:
45+ explicit ControlVariateEstimator (double control_expectation)
46+ : control_expectation_(control_expectation) {}
47+
48+ std::expected<void , std::string> add_payoffs (const std::vector<Payoffs>& payoffs) override ;
2649 bool converged () const override ;
2750 std::expected<double , std::string> result () const override ;
2851 // void merge(Estimator const& other) override;
0 commit comments