00001
00002 #ifndef bmrf_gamma_func_h_
00003 #define bmrf_gamma_func_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <vbl/vbl_ref_count.h>
00020 #include <vcl_map.h>
00021 #include "bmrf_epi_seg_sptr.h"
00022
00023
00024
00025 class bmrf_gamma_func : public vbl_ref_count
00026 {
00027 public:
00028 bmrf_gamma_func() : vbl_ref_count() {}
00029 bmrf_gamma_func(bmrf_gamma_func const& ) : vbl_ref_count() {}
00030
00031
00032
00033 double operator () (double alpha, double t=1.0) const
00034 { return this->value(alpha, t); }
00035
00036
00037 virtual double mean(double t=1.0) const = 0;
00038
00039 protected:
00040
00041 virtual double value(double alpha, double t) const = 0;
00042 };
00043
00044
00045
00046 class bmrf_const_gamma_func : public bmrf_gamma_func
00047 {
00048 public:
00049
00050 explicit bmrf_const_gamma_func(double gamma = 0.0) : gamma_(gamma) {}
00051
00052
00053 void set_gamma(double gamma) { gamma_ = gamma; }
00054
00055
00056
00057 double mean(double =1.0) const { return gamma_; }
00058
00059 protected:
00060
00061
00062 virtual double value(double , double ) const { return gamma_; }
00063
00064 private:
00065
00066 double gamma_;
00067 };
00068
00069
00070
00071 class bmrf_linear_gamma_func : public bmrf_gamma_func
00072 {
00073 public:
00074
00075 bmrf_linear_gamma_func(double m = 0.0, double b = 0.0) : m_(m), b_(b) {}
00076
00077
00078 void set_params(double m, double b) { m_ = m; b_ = b; }
00079
00080
00081
00082 virtual double mean(double =1.0) const { return b_; }
00083
00084 protected:
00085
00086
00087 virtual double value(double alpha, double ) const { return m_*alpha+b_; }
00088
00089 private:
00090
00091 double m_, b_;
00092 };
00093
00094
00095
00096 class bmrf_pwl_gamma_func : public bmrf_gamma_func
00097 {
00098 public:
00099
00100 bmrf_pwl_gamma_func( const bmrf_epi_seg_sptr& ep1,
00101 const bmrf_epi_seg_sptr& ep2,
00102 double t = 1.0 );
00103
00104
00105
00106
00107 virtual double mean(double =1.0) const;
00108
00109 protected:
00110
00111
00112 virtual double value(double alpha, double ) const;
00113
00114 private:
00115
00116 vcl_map<double, double> knots_;
00117 };
00118
00119 #endif // bmrf_gamma_func_h_