11#include < RcppEigen.h>
22
3- double calculateDOptimality (const Eigen::MatrixXd& currentDesign) {
4- Eigen::MatrixXd XtX = currentDesign.transpose ()*currentDesign;
5- return (XtX.partialPivLu ().determinant ()); // works without partialPivLu()
6- }
7-
8- double calculateDOptimalityLog (const Eigen::MatrixXd& currentDesign) {
9- Eigen::MatrixXd XtX = currentDesign.transpose ()*currentDesign;
10- return (XtX.llt ().matrixL ().toDenseMatrix ().diagonal ().array ().log ().sum ());
11- }
12-
13- double calculateIOptimality (const Eigen::MatrixXd& currentV, const Eigen::MatrixXd& momentsMatrix) {
14- return ((currentV * momentsMatrix).trace ());
15- }
16-
17-
18- double calculateGOptimality (const Eigen::MatrixXd& currentV, const Eigen::MatrixXd& currentDesign) {
19- Eigen::MatrixXd results = currentDesign*currentV*currentDesign.transpose ();
20- return (results.diagonal ().maxCoeff ());
21- }
22-
23- double calculateTOptimality (const Eigen::MatrixXd& currentDesign) {
24- Eigen::MatrixXd XtX = currentDesign.transpose ()*currentDesign;
25- return (XtX.trace ());
26- }
27-
28- double calculateEOptimality (const Eigen::MatrixXd& currentDesign) {
29- Eigen::MatrixXd XtX = currentDesign.transpose ()*currentDesign;
30- Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eigensolver (XtX);
31- return (eigensolver.eigenvalues ().minCoeff ());
32- }
33-
343double calculateAOptimality (const Eigen::MatrixXd& currentV) {
354 return (currentV.trace ());
365}
@@ -53,10 +22,6 @@ double calculateDEff(const Eigen::MatrixXd& currentDesign, double numbercols, do
5322 return (pow (XtX.partialPivLu ().determinant (), 1 /numbercols) / numberrows);
5423}
5524
56- double calculateDEffLog (const Eigen::MatrixXd& currentDesign, double numbercols, double numberrows) {
57- return (exp (calculateDOptimalityLog (currentDesign)/numbercols) / numberrows);
58- }
59-
6025double calculateDEffNN (const Eigen::MatrixXd& currentDesign, double numbercols) {
6126 Eigen::MatrixXd XtX = currentDesign.transpose ()*currentDesign;
6227 return (pow (XtX.partialPivLu ().determinant (), 1.0 /numbercols));
@@ -107,71 +72,3 @@ void search_candidate_set(const Eigen::MatrixXd& V, const Eigen::MatrixXd& candi
10772 }
10873 }
10974}
110-
111- // **********************************************************
112- // Everything below is for generating blocked optimal designs
113- // **********************************************************
114-
115- double calculateBlockedDOptimality (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& gls) {
116- return ((currentDesign.transpose ()*gls*currentDesign).partialPivLu ().determinant ());
117- }
118-
119- double calculateBlockedDOptimalityLog (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& gls) {
120- Eigen::MatrixXd XtX = (currentDesign.transpose ()*gls*currentDesign);
121- return (exp (XtX.llt ().matrixL ().toDenseMatrix ().diagonal ().array ().log ().sum ()));
122- }
123-
124- double calculateBlockedIOptimality (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& momentsMatrix,const Eigen::MatrixXd& gls) {
125- return (((currentDesign.transpose ()*gls*currentDesign).llt ().solve (momentsMatrix)).trace ());
126- }
127-
128- double calculateBlockedAOptimality (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
129- return ((currentDesign.transpose ()*gls*currentDesign).partialPivLu ().inverse ().trace ());
130- }
131-
132- double calculateBlockedAliasTrace (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& aliasMatrix,const Eigen::MatrixXd& gls) {
133- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
134- Eigen::MatrixXd A = XtX.llt ().solve (currentDesign.transpose ()*aliasMatrix);
135- return ((A.transpose () * A).trace ());
136- }
137-
138- double calculateBlockedGOptimality (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& gls) {
139- Eigen::MatrixXd results = currentDesign*(currentDesign.transpose ()*gls*currentDesign).partialPivLu ().solve (currentDesign.transpose ())*gls;
140- return (results.diagonal ().maxCoeff ());
141- }
142-
143- double calculateBlockedTOptimality (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
144- return ((currentDesign.transpose ()*gls*currentDesign).trace ());
145- }
146-
147- double calculateBlockedEOptimality (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
148- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
149- Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eigensolver (XtX);
150- return (eigensolver.eigenvalues ().minCoeff ());
151- }
152-
153- double calculateBlockedDEff (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
154- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
155- return (pow (XtX.partialPivLu ().determinant (), 1 /currentDesign.cols ()) / currentDesign.rows ());
156- }
157-
158- double calculateBlockedDEffNN (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
159- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
160- return (pow (XtX.partialPivLu ().determinant (), 1.0 /currentDesign.cols ()));
161- }
162-
163- double calculateBlockedAliasTracePseudoInv (const Eigen::MatrixXd& currentDesign, const Eigen::MatrixXd& aliasMatrix,const Eigen::MatrixXd& gls) {
164- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
165- Eigen::MatrixXd A = XtX.partialPivLu ().solve (currentDesign.transpose ()*aliasMatrix);
166- return ((A.transpose () * A).trace ());
167- }
168-
169- bool isSingularBlocked (const Eigen::MatrixXd& currentDesign,const Eigen::MatrixXd& gls) {
170- Eigen::MatrixXd XtX = currentDesign.transpose ()*gls*currentDesign;
171- return (!XtX.colPivHouseholderQr ().isInvertible ());
172- }
173-
174- double calculateBlockedCustomOptimality (const Eigen::MatrixXd& currentDesign, Rcpp::Function customBlockedOpt, const Eigen::MatrixXd& gls) {
175- return Rcpp::as<double >(customBlockedOpt (Rcpp::Named (" currentDesign" , currentDesign),Rcpp::Named (" vInv" , gls)));
176- }
177-
0 commit comments