00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef ETIRM_ICRF_PCM_H_
00020 #define ETIRM_ICRF_PCM_H_
00021
00022 #ifdef ETIRM_NO_DIR_PREFIX
00023 #include "etirmtypes.h"
00024 #else
00025 #include "etirm/etirmtypes.h"
00026 #endif
00027
00028 #include <string>
00029
00030 namespace etirm
00031 {
00032
00033
00034 class ICRF_PCM
00035 {
00036
00037 public:
00038
00039
00040 ICRF_PCM(int ncat, Response firstResp, Real a = 1.0) :
00041 mNumCat(ncat), mNumParameters(ncat-1), mFirstResponse(firstResp), mExpz(ncat), mA(a)
00042 {
00043 }
00044
00045 Real ICRF(Response r, const RealVector ¶m, Real theta) const;
00046
00047
00048
00049
00050
00051 Real OpenICRF(Response r, const RealVector ¶m, Real theta) const;
00052
00053
00054 void ICRFDeriv1(Response r, const RealVector ¶m, Real theta, RealVector &deriv);
00055
00056
00057 bool GradientDefined() const
00058 {
00059 return true;
00060 }
00061
00062
00063 bool HessianDefined() const
00064 {
00065 return false;
00066 }
00067
00068
00069 void Scale(Real slope, Real intercept, RealVector ¶m);
00070
00071
00072 int NumParameters() const
00073 {
00074 return mNumParameters;
00075 }
00076
00077
00078 int NumAllParameters() const
00079 {
00080 return mNumParameters+1;
00081 }
00082
00083
00084 int NumRespCat() const
00085 {
00086 return mNumCat;
00087 }
00088
00089
00090 std::string Name() const
00091 {
00092 return std::string("PCM");
00093 }
00094
00095
00096 IRTModel Model() const
00097 {
00098 return PCM;
00099 }
00100
00101
00102 void GetAllParameters(const RealVector &estParam, RealVector &allParam) const;
00103
00104
00105
00106
00107
00108
00109 template <class I> void SetAllParameters(I begin_param, I end_param, RealVector &estParam)
00110 {
00111
00112 if ((end_param - begin_param) != (mNumParameters+1) || estParam.size() != mNumParameters)
00113 throw InvalidArgument("Wrong number of parameters", "ICRF_PCM::SetAllParameters");
00114
00115 mA = *begin_param++;
00116 RealVector::iterator ie = estParam.begin();
00117 while (begin_param != end_param)
00118 {
00119 *ie = *begin_param;
00120 ++ie;
00121 ++begin_param;
00122 }
00123 }
00124
00125 private:
00126
00127 int mNumCat;
00128
00129 int mNumParameters;
00130
00131 Real mA;
00132
00133
00134 Response mFirstResponse;
00135
00136
00137 RealVector mExpz;
00138
00139
00140
00141
00142
00143 Real mDenom;
00144
00145 Real mDenom2;
00146
00147 void ExpZ(const RealVector ¶m, Real theta);
00148
00149
00150 };
00151
00152 }
00153
00154 #endif // ETIRM_ICRF_GPCM_H_