void P_nominal(vector<double> &P, const vector<double> &par, const NumericMatrix &Theta, const NumericVector &ot, const int &N, const int &nfact, const int &ncat, const int &returnNum, const int &israting) { vector<double> a(nfact), ak(ncat), d(ncat); for(int i = 0; i < nfact; ++i) a[i] = par[i]; for(int i = 0; i < ncat; ++i){ ak[i] = par[i + nfact]; if(israting){ if(i) d[i] = par[i + nfact + ncat] + par[par.size()-1]; } else { d[i] = par[i + nfact + ncat]; } } const int USEOT = ot.size() > 1; NumericMatrix Num(N, ncat); vector<double> z(ncat); vector<double> Den(N, 0.0); vector<double> innerprod(N, 0.0); for(int i = 0; i < N; ++i) for(int j = 0; j < nfact; ++j) innerprod[i] += Theta(i,j) * a[j]; if(USEOT){ for(int i = 0; i < N; ++i){ for(int j = 0; j < ncat; ++j) z[j] = ak[j] * innerprod[i] + d[j] + ot[j]; double maxz = *std::max_element(z.begin(), z.end()); for(int j = 0; j < ncat; ++j){ z[j] = z[j] - maxz; if(z[j] < -ABS_MAX_Z) z[j] = -ABS_MAX_Z; Num(i,j) = exp(z[j]); Den[i] += Num(i,j); } } } else { for(int i = 0; i < N; ++i){ for(int j = 0; j < ncat; ++j) z[j] = ak[j] * innerprod[i] + d[j]; double maxz = *std::max_element(z.begin(), z.end()); for(int j = 0; j < ncat; ++j){ z[j] = z[j] - maxz; if(z[j] < -ABS_MAX_Z) z[j] = -ABS_MAX_Z; Num(i,j) = exp(z[j]); Den[i] += Num(i,j); } } } int which = 0; if(returnNum){ for(int j = 0; j < ncat; ++j){ for(int i = 0; i < N; ++i){ P[which] = Num(i,j); ++which; } } } else { for(int j = 0; j < ncat; ++j){ for(int i = 0; i < N; ++i){ P[which] = Num(i,j) / Den[i]; ++which; } } } }
// double Sound(double Dencity,double Energy); double MatterFreeE::Temperature(double Dencity,double Energy) { VecCl Den(1),En(1),Temper(1);Den[1]=Dencity;En[1]=Energy; Temperature(Temper.Ptr,Den.Ptr,En.Ptr,1); return Temper[1]; }