From e30171458a8eb1ffed77c4e2a277db09b1eb3979 Mon Sep 17 00:00:00 2001 From: YangPeterXiaolong <83687041+xiaolong-y@users.noreply.github.com> Date: Sun, 5 Nov 2023 17:44:57 -0500 Subject: [PATCH 1/5] fix test_itr bug --- .DS_Store | Bin 14340 -> 14340 bytes R/itr_helpers.R | 62 +++++++++++++++++++++++++++++++++++++----------- R/main.r | 15 ++++++------ 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/.DS_Store b/.DS_Store index e9d789b3fe9c204c6c463280c4514e6d291eec77..6ac1fdcd7f3790edc6c460b99641b58e5ed20ceb 100644 GIT binary patch delta 1075 zcmaiyT}%{L7>2)hM4U;_k+Up+g21*Lk3E$q!`l9BpgwCr2R!*NhV^&h7FIBt7&syPrl%#e5oq@YIJnae0S7LkGqW(m7ML+ zV`*bkLU&qq@tvx<6@Mk?15TwaX~?&(s_ypkYR)1lX-&lDe+<+z7TIfBx=6`Uj++%B z#^1=qV}nLq=vuaKWi#WwV@5J%CM?l4zq$HV#-qCu!^6^e%7eiCc36&n%NgArOQpAr z7?wNTJwzpcO;!7x+In3#baz}wC+GdCJ+Y**^f^t@X*x&e zX@;)QHTsSIpa=Ab{)2)A$N|SXo3iZO|69L*D$#D08=&u~C8 zJ0z(&%)Y|cIEHU<5~nbY(>Q|}{D2F%h@Ws3w{XXvDyqcY>6xOn+Vl&)e~SMHz61SQ delta 453 zcmZoEXerpBFEE*3DVf8%$>% zi6g2wBe5vezdSFs2qqrD!4WUO4;BZRU)O zo~n~-IhS!B<8sCgj2js@Gj3r#%y@?J8sl}w8;lPbA2B{*e9HKN@h9Ui#@|f5Okzyp zOcG4mOeRdWOkPaEljo|*3x@#BV`K=*DK0BW%E?b+U|^aH4jp$7cTX?m&`}V+$q(|g zh^Uyjgd!-EENq=7{}u_J+^W|qXwSnVz#z!P#>sg_Qc7CJ*=4eXzB;CR_cZW4z7yWb#@udB&%k&x+Y`PJF<(nOotfH~_A}ew_dS diff --git a/R/itr_helpers.R b/R/itr_helpers.R index 598163c..262d5df 100644 --- a/R/itr_helpers.R +++ b/R/itr_helpers.R @@ -397,29 +397,63 @@ getAupecOutput = function( } # transformation function for taucv matrix -gettaucv <- function( - fit, - ... -){ - estimates <- fit$estimates +# gettaucv <- function( +# estimates, +# ... +# ){ +# # estimates <- fit$estimates +# fit_ml <- estimates$fit_ml +# n_folds <- estimates$params$n_folds +# tau_cv <- list() +# +# # for one model +# for (k in seq(n_folds)) { +# tau_cv[[k]] <- fit_ml[["causal_forest"]][[k]][["tau_cv"]] +# } +# +# # convert to a single matrix +# tau_cv <- do.call(cbind, tau_cv) +# +# return(tau_cv) +# +# } +gettaucv <- function(estimates, ...) { + # Assuming fit_ml is a named list of models fit_ml <- estimates$fit_ml n_folds <- estimates$params$n_folds - tau_cv <- list() - # for one model - for (k in seq(n_folds)) { - tau_cv[[k]] <- fit_ml[["causal_forest"]][[k]][["tau_cv"]] + # Prepare a list to store tau_cv for each model and each fold + all_models_tau_cv <- list() + + # Loop over all models in fit_ml + for (model_name in names(fit_ml)) { + model_tau_cv <- list() + + # For one model, loop over all k folds + for (k in seq(n_folds)) { + # Check if the k-th fold exists for the current model + if (is.list(fit_ml[[model_name]]) && k <= length(fit_ml[[model_name]])) { + # Check if tau_cv exists for the k-th fold of the current model + if ("tau_cv" %in% names(fit_ml[[model_name]][[k]])) { + model_tau_cv[[k]] <- fit_ml[[model_name]][[k]][["tau_cv"]] + } else { + warning(paste("tau_cv not found in fold", k, "of model", model_name)) + } + } else { + warning(paste("Fold", k, "not found in model", model_name)) + } + } + + # Convert to a single matrix and store it with the model's name + all_models_tau_cv[[model_name]] <- do.call(cbind, model_tau_cv) } - # convert to a single matrix - tau_cv <- do.call(cbind, tau_cv) - - return(tau_cv) - + return(all_models_tau_cv) } + # rename the columns of the data frame with the interaction terms rename_interaction_terms <- function(interaction_df){ colnames(interaction_df) <- gsub(":", "_", colnames(interaction_df)) diff --git a/R/main.r b/R/main.r index c40af4c..6ebc186 100644 --- a/R/main.r +++ b/R/main.r @@ -818,13 +818,14 @@ evaluate_itr <- function( #' @return An object of \code{test_itr} class #' @export test_itr <- function( - fit, + est, nsim = 1000, ... ) { # test parameters - estimates <- fit$estimates + out_algs <- est$out_algs + estimates <- out_algs$estimates cv <- estimates$params$cv fit_ml <- estimates$fit_ml Tcv <- estimates$Tcv @@ -832,8 +833,8 @@ test_itr <- function( indcv <- estimates$indcv n_folds <- estimates$params$n_folds ngates <- estimates$params$ngates - algorithms <- fit$df$algorithms - outcome <- fit$df$outcome + algorithms <- out_algs$df$algorithms + outcome <- out_algs$df$outcome # caret and rlearner parameters caret_algorithms <- estimates$params$caret_algorithms @@ -849,7 +850,7 @@ test_itr <- function( ## ================================= if(cv == FALSE){ - cat('Conduct hypothesis tests for GATEs unde sample splitting ...\n') + cat('Conduct hypothesis tests for GATEs unde sample-splitting ...\n') # create empty lists to for consistcv and hetcv consist <- list() @@ -893,14 +894,14 @@ test_itr <- function( consistcv[[i]] <- consistcv.test( T = Tcv, - tau = gettaucv(fit)[[i]], + tau = gettaucv(estimates)[[i]], Y = Ycv, ind = indcv, ngates = ngates) hetcv[[i]] <- hetcv.test( T = Tcv, - tau = gettaucv(fit)[[i]], + tau = gettaucv(estimates)[[i]], Y = Ycv, ind = indcv, ngates = ngates) From a42d8dd455c776664b3b1199d1e168a52dde306c Mon Sep 17 00:00:00 2001 From: YangPeterXiaolong <83687041+xiaolong-y@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:32:56 -0500 Subject: [PATCH 2/5] fix summary_test_itr --- .DS_Store | Bin 14340 -> 0 bytes .Rbuildignore | 11 - .github/.gitignore | 1 - .github/workflows/pkgdown.yaml | 23 - .gitignore | 4 - .travis.yml | 12 - CRAN-RELEASE | 2 - CRAN-SUBMISSION | 3 - DESCRIPTION | 66 - NAMESPACE | 56 - NEWS.md | 12 - R/.DS_Store | Bin 6148 -> 0 bytes R/AUPEC.R | 112 - R/AUPECcv.R | 125 - R/GATE.R | 56 - R/GATEcv.R | 93 - R/PAPD.R | 83 - R/PAPDcv.R | 118 - R/PAPE.R | 89 - R/PAPEcv.R | 150 - R/PAV.R | 59 - R/PAVcv.R | 89 - R/consist.test.R | 83 - R/consistcv.test.R | 130 - R/data.R | 23 - R/het.test.R | 70 - R/hetcv.test.R | 117 - R/itr_helpers.R | 488 - R/itr_plot.R | 216 - R/itr_qoi.R | 249 - R/itr_run_bagging.R | 152 - R/itr_run_bart.R | 101 - R/itr_run_bartmachine.R | 81 - R/itr_run_boost.R | 131 - R/itr_run_caret.r | 130 - R/itr_run_cart.R | 148 - R/itr_run_causal-forest.R | 101 - R/itr_run_lasso.R | 145 - R/itr_run_random-forest.R | 148 - R/itr_run_superlearner.R | 132 - R/itr_run_svm.R | 129 - R/itr_run_user.R | 127 - R/itr_summary.R | 408 - R/main.r | 923 -- README.Rmd | 34 - README.md | 22 - _pkgdown.yml | 59 - cran-comments.md | 12 - data/star.rda | Bin 15271 -> 0 bytes docs/404.html | 102 - docs/articles/cv_multiple_alg.html | 234 - docs/articles/cv_single_alg.html | 222 - docs/articles/index.html | 97 - docs/articles/install.html | 145 - docs/articles/paper_alg1.html | 206 - docs/articles/sample_split.html | 250 - docs/articles/sample_split_caret.html | 269 - docs/articles/user_itr.html | 226 - docs/articles/user_itr_algs.html | 420 - docs/authors.html | 117 - .../bootstrap-5.1.3/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - docs/deps/bootstrap-5.1.3/bootstrap.min.css | 1 - docs/deps/bootstrap-5.1.3/font.css | 32 - ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 26128 -> 0 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 25804 -> 0 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 133368 -> 0 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 39164 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 116784 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 33424 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 15776 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 49368 -> 0 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 74956 -> 0 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 16232 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 74620 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 74604 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 16180 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 74420 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 16160 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 16692 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff | Bin 29712 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff | Bin 75144 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 16424 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff | Bin 68108 -> 0 bytes .../fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff | Bin 68180 -> 0 bytes .../fonts/JTUSjIg1_i6t8kCHKm45xW0.woff | Bin 68308 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff | Bin 20532 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9vAA.woff | Bin 65492 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff | Bin 20404 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5vAA.woff | Bin 64952 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff | Bin 20396 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlvAA.woff | Bin 65292 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Me5g.woff | Bin 65244 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxM.woff | Bin 20332 -> 0 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 89708 -> 0 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 29836 -> 0 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 35444 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 28052 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVeww.woff | Bin 33380 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 30024 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USeww.woff | Bin 35168 -> 0 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 28660 -> 0 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 34040 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 139368 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 137916 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 128624 -> 0 bytes .../fonts/XRXV3I6Li01BKof4MQ.woff | Bin 63952 -> 0 bytes .../fonts/XRXW3I6Li01BKofA6sKkZQ.woff | Bin 64560 -> 0 bytes .../fonts/XRXW3I6Li01BKofAjsOkZQ.woff | Bin 63804 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 21884 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 74676 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 21816 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff | Bin 74548 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 21204 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 71692 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 20136 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 68632 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 20720 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 70492 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 20676 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff | Bin 70772 -> 0 bytes .../fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff | Bin 57672 -> 0 bytes .../fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff | Bin 57300 -> 0 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 31624 -> 0 bytes .../bootstrap-5.2.2/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - docs/deps/bootstrap-5.2.2/bootstrap.min.css | 6 - docs/deps/bootstrap-5.2.2/font.css | 32 - ...txg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff | Bin 26240 -> 0 bytes ...txg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff | Bin 25916 -> 0 bytes .../1adeadb2fe618c5ed46221f15e12b9c8.woff | Bin 46088 -> 0 bytes .../fonts/4iCs6KVjbNBYlgo6ew.woff | Bin 134032 -> 0 bytes .../fonts/4iCs6KVjbNBYlgoKfw7w.woff | Bin 39832 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvTtA.woff | Bin 117140 -> 0 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff | Bin 34452 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff | Bin 17760 -> 0 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff | Bin 49156 -> 0 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff | Bin 74684 -> 0 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff | Bin 18420 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff | Bin 74348 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff | Bin 74332 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff | Bin 18388 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff | Bin 74148 -> 0 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff | Bin 18340 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff | Bin 16724 -> 0 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff | Bin 29672 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff | Bin 75128 -> 0 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff | Bin 16516 -> 0 bytes ...xRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM0.woff | Bin 56036 -> 0 bytes ...xRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM0.woff | Bin 56044 -> 0 bytes ...g3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSg.woff | Bin 47776 -> 0 bytes ...g3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSg.woff | Bin 47984 -> 0 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew9.woff | Bin 50800 -> 0 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew9.woff | Bin 50768 -> 0 bytes ...HjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w9.woff | Bin 51152 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff | Bin 20544 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmEU9vAA.woff | Bin 65756 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff | Bin 20416 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmSU5vAA.woff | Bin 65164 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff | Bin 20408 -> 0 bytes .../fonts/KFOlCnqEu92Fr1MmWUlvAA.woff | Bin 65556 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Me5g.woff | Bin 65456 -> 0 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxM.woff | Bin 20344 -> 0 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff | Bin 89776 -> 0 bytes .../fonts/S6u8w4BMUTPHjxsAXC-s.woff | Bin 29864 -> 0 bytes .../fonts/S6u8w4BMUTPHjxswWA.woff | Bin 35436 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPHw.woff | Bin 28044 -> 0 bytes .../fonts/S6u9w4BMUTPHh6UVeww.woff | Bin 33296 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USSwiPHw.woff | Bin 30016 -> 0 bytes .../fonts/S6u9w4BMUTPHh7USeww.woff | Bin 35168 -> 0 bytes .../fonts/S6uyw4BMUTPHjx4wWA.woff | Bin 28648 -> 0 bytes .../fonts/S6uyw4BMUTPHvxo.woff | Bin 34020 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff | Bin 140344 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff | Bin 138892 -> 0 bytes ...HuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff | Bin 129252 -> 0 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTA.woff | Bin 53296 -> 0 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTA.woff | Bin 54248 -> 0 bytes .../XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTA.woff | Bin 53960 -> 0 bytes .../a98f7a7574819ba83bec6279a2cecd95.woff | Bin 45884 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVQ.woff | Bin 72136 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff | Bin 23636 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff | Bin 74700 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff | Bin 23576 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff | Bin 74564 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVQ.woff | Bin 74940 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVQ.woff | Bin 74644 -> 0 bytes ...SCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff | Bin 22964 -> 0 bytes ...cVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff | Bin 71660 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff | Bin 22332 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff | Bin 68664 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4k.woff | Bin 70652 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4k.woff | Bin 69392 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff | Bin 22940 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff | Bin 70524 -> 0 bytes ...X2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff | Bin 22908 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff | Bin 70792 -> 0 bytes ...vWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4k.woff | Bin 71144 -> 0 bytes .../fonts/q5uGsou0JOdh94bfvQlr.woff | Bin 31584 -> 0 bytes docs/deps/data-deps.txt | 4 - docs/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ---------------- docs/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 - docs/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 - docs/index.html | 154 - docs/link.svg | 12 - docs/news/index.html | 90 - docs/pkgdown.js | 156 - docs/pkgdown.yml | 14 - docs/reference/AUPEC.html | 148 - docs/reference/AUPECcv.html | 147 - docs/reference/GATE.html | 141 - docs/reference/GATEcv.html | 146 - docs/reference/PAPD.html | 157 - docs/reference/PAPDcv.html | 161 - docs/reference/PAPE.html | 153 - docs/reference/PAPEcv.html | 158 - docs/reference/PAV.html | 144 - docs/reference/PAVcv.html | 149 - docs/reference/Rplot001.png | Bin 1011 -> 0 bytes docs/reference/compute_qoi.html | 99 - docs/reference/compute_qoi_user.html | 119 - docs/reference/consist.test.html | 149 - docs/reference/consistcv.test.html | 154 - docs/reference/create_ml_args.html | 95 - docs/reference/create_ml_args_bart.html | 95 - docs/reference/create_ml_args_bartc.html | 95 - .../create_ml_args_causalforest.html | 95 - docs/reference/create_ml_args_lasso.html | 95 - .../create_ml_args_superLearner.html | 95 - docs/reference/create_ml_args_svm.html | 95 - docs/reference/create_ml_args_svm_cls.html | 95 - docs/reference/create_ml_arguments.html | 103 - docs/reference/estimate_itr.html | 178 - docs/reference/evaluate_itr.html | 140 - .../figures/README-caret_model-1.png | Bin 86581 -> 0 bytes .../figures/README-caret_model-2.png | Bin 32345 -> 0 bytes .../figures/README-compare_itr_aupec-1.png | Bin 84037 -> 0 bytes .../figures/README-compare_itr_gate-1.png | Bin 34621 -> 0 bytes .../README-compare_itr_model_summary-1.png | Bin 105697 -> 0 bytes .../figures/README-cv_estimate-1.png | Bin 77286 -> 0 bytes docs/reference/figures/README-cv_plot-1.png | Bin 86712 -> 0 bytes .../figures/README-est_extract-1.png | Bin 30961 -> 0 bytes docs/reference/figures/README-manual.png | Bin 131602 -> 0 bytes .../figures/README-multiple_plot-1.png | Bin 140897 -> 0 bytes docs/reference/figures/README-plot-1.png | Bin 88032 -> 0 bytes docs/reference/figures/README-sl_plot-1.png | Bin 93719 -> 0 bytes docs/reference/figures/README-sp_plot-1.png | Bin 81559 -> 0 bytes docs/reference/figures/README-sv_plot-1.png | Bin 26416 -> 0 bytes .../figures/README-user_itr_aupec-1.png | Bin 53163 -> 0 bytes .../figures/README-user_itr_gate-1.png | Bin 28508 -> 0 bytes docs/reference/figures/README-workflow.png | Bin 72357 -> 0 bytes docs/reference/figures/gate.png | Bin 62969 -> 0 bytes docs/reference/figures/plot_5folds.png | Bin 97862 -> 0 bytes docs/reference/figures/rf.png | Bin 79798 -> 0 bytes docs/reference/fit_itr.html | 125 - docs/reference/het.test.html | 145 - docs/reference/hetcv.test.html | 152 - docs/reference/index.html | 268 - docs/reference/itr_single_outcome.html | 125 - docs/reference/plot.itr.html | 106 - docs/reference/plot_estimate.html | 109 - docs/reference/print.summary.itr.html | 100 - docs/reference/print.summary.test_itr.html | 100 - docs/reference/star.html | 135 - docs/reference/summary.itr.html | 100 - docs/reference/summary.test_itr.html | 100 - docs/reference/test_itr.html | 109 - docs/search.json | 1 - docs/sitemap.xml | 156 - evalITR.Rproj | 21 - inst/WORDLIST | 39 - man/.DS_Store | Bin 8196 -> 0 bytes man/AUPEC.Rd | 45 - man/AUPECcv.Rd | 45 - man/GATE.Rd | 41 - man/GATEcv.Rd | 44 - man/PAPD.Rd | 51 - man/PAPDcv.Rd | 55 - man/PAPE.Rd | 49 - man/PAPEcv.Rd | 52 - man/PAV.Rd | 44 - man/PAVcv.Rd | 47 - man/compute_qoi.Rd | 16 - man/compute_qoi_user.Rd | 26 - man/consist.test.Rd | 46 - man/consistcv.test.Rd | 49 - man/create_ml_args.Rd | 14 - man/create_ml_args_bart.Rd | 14 - man/create_ml_args_bartc.Rd | 14 - man/create_ml_args_causalforest.Rd | 14 - man/create_ml_args_lasso.Rd | 14 - man/create_ml_args_superLearner.Rd | 14 - man/create_ml_args_svm.Rd | 14 - man/create_ml_args_svm_cls.Rd | 14 - man/create_ml_arguments.Rd | 18 - man/estimate_itr.Rd | 64 - man/evaluate_itr.Rd | 42 - man/figures/README-caret_model-1.png | Bin 5999 -> 0 bytes man/figures/README-caret_model-2.png | Bin 5030 -> 0 bytes man/figures/README-compare_itr_aupec-1.png | Bin 81533 -> 0 bytes man/figures/README-compare_itr_gate-1.png | Bin 34621 -> 0 bytes .../README-compare_itr_model_summary-1.png | Bin 110584 -> 0 bytes man/figures/README-cv_estimate-1.png | Bin 77286 -> 0 bytes man/figures/README-cv_plot-1.png | Bin 86712 -> 0 bytes man/figures/README-est_extract-1.png | Bin 28601 -> 0 bytes man/figures/README-manual.png | Bin 131602 -> 0 bytes man/figures/README-multiple_plot-1.png | Bin 141480 -> 0 bytes man/figures/README-plot-1.png | Bin 88032 -> 0 bytes man/figures/README-sl_plot-1.png | Bin 10047 -> 0 bytes man/figures/README-sp_plot-1.png | Bin 84248 -> 0 bytes man/figures/README-sv_plot-1.png | Bin 26416 -> 0 bytes man/figures/README-user_itr_aupec-1.png | Bin 53163 -> 0 bytes man/figures/README-user_itr_gate-1.png | Bin 28508 -> 0 bytes man/figures/README-workflow.png | Bin 72357 -> 0 bytes man/figures/gate.png | Bin 62969 -> 0 bytes man/figures/plot_5folds.png | Bin 97862 -> 0 bytes man/figures/rf.png | Bin 79798 -> 0 bytes man/fit_itr.Rd | 29 - man/het.test.Rd | 44 - man/hetcv.test.Rd | 47 - man/plot.itr.Rd | 19 - man/plot_estimate.Rd | 21 - man/print.summary.itr.Rd | 16 - man/print.summary.test_itr.Rd | 16 - man/star.Rd | 32 - man/summary.itr.Rd | 16 - man/summary.test_itr.Rd | 16 - man/test_itr.Rd | 21 - tests/spelling.R | 3 - tests/testthat.R | 4 - tests/testthat/star.rda | Bin 15271 -> 0 bytes tests/testthat/test-high_level.R | 42 - tests/testthat/test-low_level.R | 59 - vignettes/.gitignore | 2 - vignettes/cv_multiple_alg.Rmd | 80 - vignettes/cv_single_alg.Rmd | 81 - vignettes/install.Rmd | 54 - vignettes/paper_alg1.Rmd | 33 - vignettes/sample_split.Rmd | 106 - vignettes/sample_split_caret.Rmd | 137 - vignettes/user_itr.Rmd | 105 - vignettes/user_itr_algs.Rmd | 209 - 341 files changed, 26347 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .Rbuildignore delete mode 100644 .github/.gitignore delete mode 100644 .github/workflows/pkgdown.yaml delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 CRAN-RELEASE delete mode 100644 CRAN-SUBMISSION delete mode 100644 DESCRIPTION delete mode 100644 NAMESPACE delete mode 100644 NEWS.md delete mode 100644 R/.DS_Store delete mode 100644 R/AUPEC.R delete mode 100644 R/AUPECcv.R delete mode 100644 R/GATE.R delete mode 100644 R/GATEcv.R delete mode 100644 R/PAPD.R delete mode 100644 R/PAPDcv.R delete mode 100644 R/PAPE.R delete mode 100644 R/PAPEcv.R delete mode 100644 R/PAV.R delete mode 100644 R/PAVcv.R delete mode 100644 R/consist.test.R delete mode 100644 R/consistcv.test.R delete mode 100644 R/data.R delete mode 100644 R/het.test.R delete mode 100644 R/hetcv.test.R delete mode 100644 R/itr_helpers.R delete mode 100644 R/itr_plot.R delete mode 100644 R/itr_qoi.R delete mode 100644 R/itr_run_bagging.R delete mode 100644 R/itr_run_bart.R delete mode 100644 R/itr_run_bartmachine.R delete mode 100644 R/itr_run_boost.R delete mode 100644 R/itr_run_caret.r delete mode 100644 R/itr_run_cart.R delete mode 100644 R/itr_run_causal-forest.R delete mode 100644 R/itr_run_lasso.R delete mode 100644 R/itr_run_random-forest.R delete mode 100644 R/itr_run_superlearner.R delete mode 100644 R/itr_run_svm.R delete mode 100644 R/itr_run_user.R delete mode 100644 R/itr_summary.R delete mode 100644 R/main.r delete mode 100644 README.Rmd delete mode 100644 README.md delete mode 100644 _pkgdown.yml delete mode 100644 cran-comments.md delete mode 100644 data/star.rda delete mode 100644 docs/404.html delete mode 100644 docs/articles/cv_multiple_alg.html delete mode 100644 docs/articles/cv_single_alg.html delete mode 100644 docs/articles/index.html delete mode 100644 docs/articles/install.html delete mode 100644 docs/articles/paper_alg1.html delete mode 100644 docs/articles/sample_split.html delete mode 100644 docs/articles/sample_split_caret.html delete mode 100644 docs/articles/user_itr.html delete mode 100644 docs/articles/user_itr_algs.html delete mode 100644 docs/authors.html delete mode 100644 docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js delete mode 100644 docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js.map delete mode 100644 docs/deps/bootstrap-5.1.3/bootstrap.min.css delete mode 100644 docs/deps/bootstrap-5.1.3/font.css delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/4iCs6KVjbNBYlgo6ew.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/4iCs6KVjbNBYlgoKfw7w.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/JTURjIg1_i6t8kCHKm45_ZpC7g0.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/JTURjIg1_i6t8kCHKm45_dJE7g0.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/JTUSjIg1_i6t8kCHKm45xW0.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmEU9vAA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmSU5vAA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOlCnqEu92Fr1MmWUlvAA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOmCnqEu92Fr1Me5g.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/KFOmCnqEu92Fr1Mu4mxM.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u8w4BMUTPHjxsAXC-s.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u8w4BMUTPHjxswWA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u9w4BMUTPHh6UVeww.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u9w4BMUTPHh7USSwiPHw.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6u9w4BMUTPHh7USeww.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6uyw4BMUTPHjx4wWA.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/S6uyw4BMUTPHvxo.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/XRXV3I6Li01BKof4MQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/XRXW3I6Li01BKofA6sKkZQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/XRXW3I6Li01BKofAjsOkZQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/pe03MImSLYBIv1o4X1M8cc9iB_5p.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/pe0qMImSLYBIv1o4X1M8cfe5.woff delete mode 100644 docs/deps/bootstrap-5.1.3/fonts/q5uGsou0JOdh94bfvQlr.woff delete mode 100644 docs/deps/bootstrap-5.2.2/bootstrap.bundle.min.js delete mode 100644 docs/deps/bootstrap-5.2.2/bootstrap.bundle.min.js.map delete mode 100644 docs/deps/bootstrap-5.2.2/bootstrap.min.css delete mode 100644 docs/deps/bootstrap-5.2.2/font.css delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pbCIPrc.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrc.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/1adeadb2fe618c5ed46221f15e12b9c8.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/4iCs6KVjbNBYlgo6ew.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/4iCs6KVjbNBYlgoKfw7w.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/4iCv6KVjbNBYlgoCxCvTtA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/4iCv6KVjbNBYlgoCxCvjsGyL.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPa7j.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3aPA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7j.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rAkw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vAkw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdo.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zAkw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdo.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNRevw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvaNA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/CSR64z1Qlv-GDxkbKVQ_TOQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKSw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM0.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM0.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSg.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSg.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew9.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew9.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w9.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmEU9vAA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmSU5vAA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOlCnqEu92Fr1MmWUlvAA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOmCnqEu92Fr1Me5g.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/KFOmCnqEu92Fr1Mu4mxM.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhL.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u8w4BMUTPHjxsAXC-s.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u8w4BMUTPHjxswWA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh6UVSwiPHw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh6UVeww.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh7USSwiPHw.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6u9w4BMUTPHh7USeww.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6uyw4BMUTPHjx4wWA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/S6uyw4BMUTPHvxo.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYMZs.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fMZs.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfMZs.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTA.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/a98f7a7574819ba83bec6279a2cecd95.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk0ZjaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk5hkaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk8ZkaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0Rk_RkaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkxhjaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjWVAexg.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memQYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWq8tWZ0Pw86hd0RkyFjaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1x4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsg-1y4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsgH1y4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgshZ1y4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0C4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVQ.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0C4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjr0C4k.woff delete mode 100644 docs/deps/bootstrap-5.2.2/fonts/q5uGsou0JOdh94bfvQlr.woff delete mode 100644 docs/deps/data-deps.txt delete mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.js delete mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.js delete mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.map delete mode 100644 docs/index.html delete mode 100644 docs/link.svg delete mode 100644 docs/news/index.html delete mode 100644 docs/pkgdown.js delete mode 100644 docs/pkgdown.yml delete mode 100644 docs/reference/AUPEC.html delete mode 100644 docs/reference/AUPECcv.html delete mode 100644 docs/reference/GATE.html delete mode 100644 docs/reference/GATEcv.html delete mode 100644 docs/reference/PAPD.html delete mode 100644 docs/reference/PAPDcv.html delete mode 100644 docs/reference/PAPE.html delete mode 100644 docs/reference/PAPEcv.html delete mode 100644 docs/reference/PAV.html delete mode 100644 docs/reference/PAVcv.html delete mode 100644 docs/reference/Rplot001.png delete mode 100644 docs/reference/compute_qoi.html delete mode 100644 docs/reference/compute_qoi_user.html delete mode 100644 docs/reference/consist.test.html delete mode 100644 docs/reference/consistcv.test.html delete mode 100644 docs/reference/create_ml_args.html delete mode 100644 docs/reference/create_ml_args_bart.html delete mode 100644 docs/reference/create_ml_args_bartc.html delete mode 100644 docs/reference/create_ml_args_causalforest.html delete mode 100644 docs/reference/create_ml_args_lasso.html delete mode 100644 docs/reference/create_ml_args_superLearner.html delete mode 100644 docs/reference/create_ml_args_svm.html delete mode 100644 docs/reference/create_ml_args_svm_cls.html delete mode 100644 docs/reference/create_ml_arguments.html delete mode 100644 docs/reference/estimate_itr.html delete mode 100644 docs/reference/evaluate_itr.html delete mode 100644 docs/reference/figures/README-caret_model-1.png delete mode 100644 docs/reference/figures/README-caret_model-2.png delete mode 100644 docs/reference/figures/README-compare_itr_aupec-1.png delete mode 100644 docs/reference/figures/README-compare_itr_gate-1.png delete mode 100644 docs/reference/figures/README-compare_itr_model_summary-1.png delete mode 100644 docs/reference/figures/README-cv_estimate-1.png delete mode 100644 docs/reference/figures/README-cv_plot-1.png delete mode 100644 docs/reference/figures/README-est_extract-1.png delete mode 100644 docs/reference/figures/README-manual.png delete mode 100644 docs/reference/figures/README-multiple_plot-1.png delete mode 100644 docs/reference/figures/README-plot-1.png delete mode 100644 docs/reference/figures/README-sl_plot-1.png delete mode 100644 docs/reference/figures/README-sp_plot-1.png delete mode 100644 docs/reference/figures/README-sv_plot-1.png delete mode 100644 docs/reference/figures/README-user_itr_aupec-1.png delete mode 100644 docs/reference/figures/README-user_itr_gate-1.png delete mode 100644 docs/reference/figures/README-workflow.png delete mode 100644 docs/reference/figures/gate.png delete mode 100644 docs/reference/figures/plot_5folds.png delete mode 100644 docs/reference/figures/rf.png delete mode 100644 docs/reference/fit_itr.html delete mode 100644 docs/reference/het.test.html delete mode 100644 docs/reference/hetcv.test.html delete mode 100644 docs/reference/index.html delete mode 100644 docs/reference/itr_single_outcome.html delete mode 100644 docs/reference/plot.itr.html delete mode 100644 docs/reference/plot_estimate.html delete mode 100644 docs/reference/print.summary.itr.html delete mode 100644 docs/reference/print.summary.test_itr.html delete mode 100644 docs/reference/star.html delete mode 100644 docs/reference/summary.itr.html delete mode 100644 docs/reference/summary.test_itr.html delete mode 100644 docs/reference/test_itr.html delete mode 100644 docs/search.json delete mode 100644 docs/sitemap.xml delete mode 100644 evalITR.Rproj delete mode 100644 inst/WORDLIST delete mode 100644 man/.DS_Store delete mode 100644 man/AUPEC.Rd delete mode 100644 man/AUPECcv.Rd delete mode 100644 man/GATE.Rd delete mode 100644 man/GATEcv.Rd delete mode 100644 man/PAPD.Rd delete mode 100644 man/PAPDcv.Rd delete mode 100644 man/PAPE.Rd delete mode 100644 man/PAPEcv.Rd delete mode 100644 man/PAV.Rd delete mode 100644 man/PAVcv.Rd delete mode 100644 man/compute_qoi.Rd delete mode 100644 man/compute_qoi_user.Rd delete mode 100644 man/consist.test.Rd delete mode 100644 man/consistcv.test.Rd delete mode 100644 man/create_ml_args.Rd delete mode 100644 man/create_ml_args_bart.Rd delete mode 100644 man/create_ml_args_bartc.Rd delete mode 100644 man/create_ml_args_causalforest.Rd delete mode 100644 man/create_ml_args_lasso.Rd delete mode 100644 man/create_ml_args_superLearner.Rd delete mode 100644 man/create_ml_args_svm.Rd delete mode 100644 man/create_ml_args_svm_cls.Rd delete mode 100644 man/create_ml_arguments.Rd delete mode 100644 man/estimate_itr.Rd delete mode 100644 man/evaluate_itr.Rd delete mode 100644 man/figures/README-caret_model-1.png delete mode 100644 man/figures/README-caret_model-2.png delete mode 100644 man/figures/README-compare_itr_aupec-1.png delete mode 100644 man/figures/README-compare_itr_gate-1.png delete mode 100644 man/figures/README-compare_itr_model_summary-1.png delete mode 100644 man/figures/README-cv_estimate-1.png delete mode 100644 man/figures/README-cv_plot-1.png delete mode 100644 man/figures/README-est_extract-1.png delete mode 100644 man/figures/README-manual.png delete mode 100644 man/figures/README-multiple_plot-1.png delete mode 100644 man/figures/README-plot-1.png delete mode 100644 man/figures/README-sl_plot-1.png delete mode 100644 man/figures/README-sp_plot-1.png delete mode 100644 man/figures/README-sv_plot-1.png delete mode 100644 man/figures/README-user_itr_aupec-1.png delete mode 100644 man/figures/README-user_itr_gate-1.png delete mode 100644 man/figures/README-workflow.png delete mode 100644 man/figures/gate.png delete mode 100644 man/figures/plot_5folds.png delete mode 100644 man/figures/rf.png delete mode 100644 man/fit_itr.Rd delete mode 100644 man/het.test.Rd delete mode 100644 man/hetcv.test.Rd delete mode 100644 man/plot.itr.Rd delete mode 100644 man/plot_estimate.Rd delete mode 100644 man/print.summary.itr.Rd delete mode 100644 man/print.summary.test_itr.Rd delete mode 100644 man/star.Rd delete mode 100644 man/summary.itr.Rd delete mode 100644 man/summary.test_itr.Rd delete mode 100644 man/test_itr.Rd delete mode 100644 tests/spelling.R delete mode 100644 tests/testthat.R delete mode 100644 tests/testthat/star.rda delete mode 100644 tests/testthat/test-high_level.R delete mode 100644 tests/testthat/test-low_level.R delete mode 100644 vignettes/.gitignore delete mode 100644 vignettes/cv_multiple_alg.Rmd delete mode 100644 vignettes/cv_single_alg.Rmd delete mode 100644 vignettes/install.Rmd delete mode 100644 vignettes/paper_alg1.Rmd delete mode 100644 vignettes/sample_split.Rmd delete mode 100644 vignettes/sample_split_caret.Rmd delete mode 100644 vignettes/user_itr.Rmd delete mode 100644 vignettes/user_itr_algs.Rmd diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 6ac1fdcd7f3790edc6c460b99641b58e5ed20ceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14340 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 diff --git a/.Rbuildignore b/.Rbuildignore deleted file mode 100644 index 482cd87..0000000 --- a/.Rbuildignore +++ /dev/null @@ -1,11 +0,0 @@ -^.*\.Rproj$ -^\.Rproj\.user$ -^cran-comments\.md$ -^\.travis\.yml$ -^CRAN-RELEASE$ -^README\.Rmd$ -^_pkgdown\.yml$ -^docs$ -^pkgdown$ -^\.github$ -^CRAN-SUBMISSION$ diff --git a/.github/.gitignore b/.github/.gitignore deleted file mode 100644 index 2d19fc7..0000000 --- a/.github/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.html diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml deleted file mode 100644 index fa06cba..0000000 --- a/.github/workflows/pkgdown.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: Publish to GitHub Pages when a branch is merged - -on: - push: - branches: - - main - - master - - causal-ml - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Check out - uses: actions/checkout@v3 - - - name: Publish generated content to GitHub Pages - uses: crazy-max/ghaction-github-pages@v3 - with: - target_branch: gh-pages - build_dir: docs - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 093c2b1..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.Rproj.user -.Rhistory -.RData -*.DS_Store diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ceab9ee..0000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Sample .travis.yml for R projects - -language: r -cache: packages -sudo: required - -r_build_args: --resave-data - -notifications: - email: - on_success: change - on_failure: change \ No newline at end of file diff --git a/CRAN-RELEASE b/CRAN-RELEASE deleted file mode 100644 index 4837f9d..0000000 --- a/CRAN-RELEASE +++ /dev/null @@ -1,2 +0,0 @@ -This package was submitted to CRAN on 2021-10-15. -Once it is accepted, delete this file and tag the release (commit df0a395). diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION deleted file mode 100644 index 57bd491..0000000 --- a/CRAN-SUBMISSION +++ /dev/null @@ -1,3 +0,0 @@ -Version: 1.0.0 -Date: 2023-08-21 05:12:52 UTC -SHA: f3b3fcaa37bcc7e79ca3a48a46689fe48a757a55 diff --git a/DESCRIPTION b/DESCRIPTION deleted file mode 100644 index 1944aaf..0000000 --- a/DESCRIPTION +++ /dev/null @@ -1,66 +0,0 @@ -Package: evalITR -Title: Evaluating Individualized Treatment Rules -Version: 1.0.0 -Date: 2023-08-20 -Authors@R: c( - person("Michael Lingzhi", "Li", , "mili@hbs.edu", role = c("aut", "cre")), - person("Kosuke", "Imai", , "imai@harvard.edu", role = "aut"), - person("Jialu", "Li", , "jialu_li@g.harvard.edu", role = "ctb"), - person("Xiaolong", "Yang", , "xiaolong_yang@g.harvard.edu", role = "ctb") - ) -Maintainer: Michael Lingzhi Li -Description: Provides various statistical methods for evaluating - Individualized Treatment Rules under randomized data. The provided - metrics include Population Average Value (PAV), Population Average - Prescription Effect (PAPE), Area Under Prescription Effect Curve - (AUPEC). It also provides the tools to analyze Individualized - Treatment Rules under budget constraints. Detailed reference in Imai - and Li (2019) . -License: GPL (>=2) -URL: https://github.com/MichaelLLi/evalITR, - https://michaellli.github.io/evalITR/, - https://jialul.github.io/causal-ml/ -BugReports: https://github.com/MichaelLLi/evalITR/issues -Depends: - dplyr (>= 1.0), - MASS (>= 7.0), - Matrix (>= 1.0), - quadprog (>= 1.0), - R (>= 3.5.0), - stats -Imports: - caret, - cli, - e1071, - forcats, - gbm, - ggdist, - ggplot2, - ggthemes, - glmnet, - grf, - haven, - purrr, - rlang, - rpart, - rqPen, - scales, - utils, - bartCause, - SuperLearner -Suggests: - doParallel, - furrr, - knitr, - rmarkdown, - testthat, - bartMachine, - elasticnet, - randomForest, - spelling -VignetteBuilder: - knitr -Encoding: UTF-8 -LazyData: true -RoxygenNote: 7.2.2 -Language: en-US diff --git a/NAMESPACE b/NAMESPACE deleted file mode 100644 index 4ea12da..0000000 --- a/NAMESPACE +++ /dev/null @@ -1,56 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -S3method(plot,itr) -S3method(print,summary.itr) -S3method(print,summary.test_itr) -S3method(summary,itr) -S3method(summary,test_itr) -export(AUPEC) -export(AUPECcv) -export(GATE) -export(GATEcv) -export(PAPD) -export(PAPDcv) -export(PAPE) -export(PAPEcv) -export(PAV) -export(PAVcv) -export(consist.test) -export(consistcv.test) -export(estimate_itr) -export(evaluate_itr) -export(het.test) -export(hetcv.test) -export(plot_estimate) -export(test_itr) -import(dplyr) -import(ggplot2) -import(ggthemes) -import(haven) -import(rpart) -importFrom(MASS,ginv) -importFrom(MASS,mvrnorm) -importFrom(Matrix,nearPD) -importFrom(SuperLearner,SuperLearner) -importFrom(cli,cat_rule) -importFrom(dplyr,ntile) -importFrom(dplyr,pull) -importFrom(ggplot2,.data) -importFrom(purrr,map) -importFrom(quadprog,solve.QP) -importFrom(rlang,"!!") -importFrom(rlang,.data) -importFrom(rlang,sym) -importFrom(stats,as.formula) -importFrom(stats,binomial) -importFrom(stats,cov) -importFrom(stats,gaussian) -importFrom(stats,model.matrix) -importFrom(stats,pchisq) -importFrom(stats,pnorm) -importFrom(stats,predict) -importFrom(stats,quantile) -importFrom(stats,rbinom) -importFrom(stats,runif) -importFrom(stats,sd) -importFrom(stats,var) diff --git a/NEWS.md b/NEWS.md deleted file mode 100644 index c41650f..0000000 --- a/NEWS.md +++ /dev/null @@ -1,12 +0,0 @@ -# evalITR 1.0.0 - -- Revamped package structure -- Introduced the high-level function estimate_itr() to provide a easy process to train and evaluate individualized treatment rules. -- Added support for automatic training of many machine learning algorithms including Caret, Superlearner, BART, and Causal Forests. -- Provided plotting tools that automatically creates beautiful plots for evaluation metrics -- Changed output structure to provide more detailed information on evaluation metrics and confidence intervals, integrates with summary() function. - - -# evalITR 0.3.0 - -* Added a `NEWS.md` file to track changes to the package. diff --git a/R/.DS_Store b/R/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T00))/n - if (pf>0) { - Z=rbinom(1e4,n,pf) - Z=Z[Z>0] - ThatfA=numeric(n) - kAf1=numeric(n) - kAf0=numeric(n) - kAf1A=numeric(n) - kAf1B=numeric(n) - kAf0A=numeric(n) - kAf0B=numeric(n) - AUPECvec=numeric(n) - covarsum=0 - for (i in 1:n) { - cutofftemp=quantile(tau,1-i/n) - Thatftemp=as.numeric(tau>cutofftemp) - ThatftempA=as.numeric(tau>max(cutofftemp,0)) - AUPECvec[i]=1/n1*sum(T*ThatftempA*Y)+1/n0*sum(Y*(1-T)*(1-ThatftempA)) - ThatfA=ThatfA+1/n*ThatftempA - cutofftemp2=quantile(tau,(i-1)/n) - Thatftemp2=as.numeric(tau>cutofftemp2) - tempkAf1=mean(Y[T==1 & Thatftemp2==1])-mean(Y[T==0 & Thatftemp2==1]) - tempkAf0=mean(Y[T==1 & Thatftemp==0])-mean(Y[T==0 & Thatftemp==0]) - if (is.nan(tempkAf1)) { - kAf1[n-i+1]=kAf1[n-i+2] - } else { - kAf1[n-i+1]=tempkAf1 - } - if (is.nan(tempkAf0)) { - kAf0[i]=kAf0[i-1] - } else { - kAf0[i]=tempkAf0 - } - kAf1A[n-i+1]=(n-i+1)*kAf1[n-i+1] - kAf1B[n-i+1]=(i-1)*kAf1[n-i+1] - kAf0A[i]=i*kAf0[i] - kAf0B[i]=(n-i)*kAf0[i] - } - sumtemp1=cumsum(kAf1A*kAf0B) - sumtemp2=cumsum(kAf1A) - sumtemp3=cumsum(kAf1A*kAf1B) - tempM=outer(kAf1A,kAf1B) - tempM[lower.tri(tempM,diag=TRUE)] <- 0 - tempMsum=cumsum(colSums(tempM)) - covarsum1=mean(-1/(n^3*(n-1))*sumtemp1[Z]-Z*(n-Z)^2/(n^3*(n-1))*kAf1[Z]*kAf0[Z]-2/(n^4*(n-1))*tempMsum[Z]-Z^2*(n-Z)^2/(n^4*(n-1))*kAf1[Z]^2 - -2*(n-Z)^2/(n^4*(n-1))*kAf1[Z]*sumtemp2[Z]+1/n^4*sumtemp3[Z]) - covarsum2=var(1/n*(sumtemp2[Z]/n+(n-Z)*Z/n*kAf1[Z])) - ThatfA2=ThatfA-1/2 - SfA1=var((ThatfA2*Y)[T==1]) - SfA0=var((ThatfA2*Y)[T==0]) - varfA=SfA1/n1+SfA0/n0+covarsum1+covarsum2 - AUPEC=1/n1*sum(T*ThatfA*Y)+1/n0*sum(Y*(1-T)*(1-ThatfA))-0.5/n1*sum(T*Y)-0.5/n0*sum((1-T)*Y) - return(list(aupec=AUPEC,sd=sqrt(max(varfA,0)),vec=AUPECvec)) - } else { - AUPEC=1/n0*sum(Y*(1-T))-0.5/n1*sum(T*Y)-0.5/n0*sum((1-T)*Y) - AUPECvec=numeric(n) - AUPECvec[]=1/n0*sum(Y*(1-T)) - return(list(aupec=AUPEC,sd=0,vec=AUPECvec)) - } -} - diff --git a/R/AUPECcv.R b/R/AUPECcv.R deleted file mode 100644 index 1993574..0000000 --- a/R/AUPECcv.R +++ /dev/null @@ -1,125 +0,0 @@ -#' Estimation of the Area Under Prescription Evaluation Curve (AUPEC) in Randomized Experiments Under Cross Validation -#' -#' This function estimates AUPEC. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A matrix where the \code{i}th column is the unit-level continuous score for treatment assignment generated in the \code{i}th fold. -#' @param Y The outcome variable of interest. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{aupec}{The estimated -#' AUPEC.} \item{sd}{The estimated standard deviation -#' of AUPEC.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = matrix(c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9),nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' aupeclist <- AUPECcv(T, tau, Y, ind) -#' aupeclist$aupec -#' aupeclist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export AUPECcv -AUPECcv <- function (T, tau, Y, ind, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - if ((length(T)!=dim(tau)[1]) | (dim(tau)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - T=as.numeric(T) - tau=as.matrix(tau) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - nfolds = max(ind) - aupecfold = c() - SfA1 = 0 - SfA0 = 0 - covarsum1 = 0 - covarsum2 = c() - for (i in 1:nfolds) { - Tind = T[ind==i] - tauind = tau[ind==i,i] - Yind = Y[ind==i] - n=length(Yind) - n1=sum(Tind) - n0=n-n1 - pf=sum(as.numeric(tauind>0))/n - if (pf>0) { - Z=rbinom(1e4,n,pf) - Z=Z[Z>0] - ThatfA=numeric(n) - kAf1=numeric(n) - kAf0=numeric(n) - kAf1A=numeric(n) - kAf1B=numeric(n) - kAf0A=numeric(n) - kAf0B=numeric(n) - AUPECvec=numeric(n) - - covarsum=0 - for (i in 1:n) { - cutofftemp=quantile(tauind,1-i/n) - Thatftemp=as.numeric(tauind>cutofftemp) - ThatftempA=as.numeric(tauind>max(cutofftemp,0)) - AUPECvec[i]=1/n1*sum(Tind*ThatftempA*Yind)+1/n0*sum(Yind*(1-Tind)*(1-ThatftempA)) - ThatfA=ThatfA+1/n*ThatftempA - cutofftemp2=quantile(tauind,(i-1)/n) - Thatftemp2=as.numeric(tauind>cutofftemp2) - tempkAf1=mean(Yind[Tind==1 & Thatftemp2==1])-mean(Yind[Tind==0 & Thatftemp2==1]) - tempkAf0=mean(Yind[Tind==1 & Thatftemp==0])-mean(Yind[Tind==0 & Thatftemp==0]) - if (is.nan(tempkAf1)) { - kAf1[n-i+1]=kAf1[n-i+2] - } else { - kAf1[n-i+1]=tempkAf1 - } - if (is.nan(tempkAf0)) { - kAf0[i]=kAf0[i-1] - } else { - kAf0[i]=tempkAf0 - } - kAf1A[n-i+1]=(n-i+1)*kAf1[n-i+1] - kAf1B[n-i+1]=(i-1)*kAf1[n-i+1] - kAf0A[i]=i*kAf0[i] - kAf0B[i]=(n-i)*kAf0[i] - } - sumtemp1=cumsum(kAf1A*kAf0B) - sumtemp2=cumsum(kAf1A) - sumtemp3=cumsum(kAf1A*kAf1B) - tempM=outer(kAf1A,kAf1B) - tempM[lower.tri(tempM,diag=TRUE)] <- 0 - tempMsum=cumsum(colSums(tempM)) - covarsum1 = covarsum1 + mean(-1/(n^3*(n-1))*sumtemp1[Z]-Z*(n-Z)^2/(n^3*(n-1))*kAf1[Z]*kAf0[Z]-2/(n^4*(n-1))*tempMsum[Z]-Z^2*(n-Z)^2/(n^4*(n-1))*kAf1[Z]^2 - -2*(n-Z)^2/(n^4*(n-1))*kAf1[Z]*sumtemp2[Z]+1/n^4*sumtemp3[Z]) / nfolds - covarsum2 = c(covarsum2, 1/n*(sumtemp2[Z]/n+(n-Z)*Z/n*kAf1[Z])) - ThatfA2=ThatfA-1/2 - SfA1=SfA1 + var((ThatfA2*Yind)[Tind==1]) / (n1 * nfolds) - SfA0=SfA0 + var((ThatfA2*Yind)[Tind==0]) / (n0 * nfolds) - aupecfold = c(aupecfold, 1/n1*sum(Tind*ThatfA*Yind)+1/n0*sum(Yind*(1-Tind)*(1-ThatfA))-0.5/n1*sum(Tind*Yind)-0.5/n0*sum((1-Tind)*Yind)) - } else { - aupecfold = c(aupecfold, 1/n0*sum(Yind*(1-Tind))-0.5/n1*sum(Tind*Yind)-0.5/n0*sum((1-Tind)*Yind)) - AUPECvec=numeric(n) - AUPECvec[]=1/n0*sum(Yind*(1-Tind)) - - } - } - SF2 = var(aupecfold) - varexp = SfA1 + SfA0 + covarsum1 + var(covarsum2) - vartotal = varexp - (nfolds - 1) / nfolds * min(varexp, SF2) - return(list(aupec=mean(aupecfold),sd=sqrt(max(vartotal,0)))) -} - diff --git a/R/GATE.R b/R/GATE.R deleted file mode 100644 index 0d10393..0000000 --- a/R/GATE.R +++ /dev/null @@ -1,56 +0,0 @@ -#' Estimation of the Grouped Average Treatment Effects (GATEs) in Randomized Experiments -#' -#' This function estimates the Grouped Average Treatment Effects (GATEs) where the groups are determined by a continuous score. The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A vector of the unit-level continuous score. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @return A list that contains the following items: \item{gate}{The estimated -#' vector of GATEs of length \code{ngates} arranged in order of increasing \code{tau}.} \item{sd}{The estimated vector of standard deviation -#' of GATEs.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7) -#' Y = c(4,5,0,2,4,1,-4,3) -#' gatelist <- GATE(T,tau,Y,ngates=5) -#' gatelist$gate -#' gatelist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export GATE -GATE <- function(T, tau, Y, ngates = 5) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=length(tau)) | (length(tau)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - n = length(Y) - n1 = sum(T) - n0 = n-n1 - fd_label = ntile(tau, ngates) - vargts = numeric(ngates) - gates = numeric(ngates) - for (i in 1:ngates) { - That = as.numeric(fd_label == i) - plim = sum(That)/ length(That) - gates[i] = ngates * (1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That))-1/n0*sum(Y * (1-T))) - Sfp1 = var((That*Y)[T==1]) - Sfp0 = var((That*Y)[T==0]) - if (length(Y[T==1 & That==1])>0 & length(Y[T==0 & That==1])>0) { - kf1 = mean(Y[T==1 & That==1])-mean(Y[T==0 & That==1]) - vargts[i] = ngates * ngates * (Sfp1 / n1+Sfp0 / n0 - (ngates -1) / ((ngates ^ 2) * (n-1)) * kf1 ^ 2) - } else { - vargts[i] = NA - } - } - return(list(gate=gates,sd=sqrt(pmax(vargts,0)))) -} diff --git a/R/GATEcv.R b/R/GATEcv.R deleted file mode 100644 index 5dd3041..0000000 --- a/R/GATEcv.R +++ /dev/null @@ -1,93 +0,0 @@ -#' Estimation of the Grouped Average Treatment Effects (GATEs) in Randomized Experiments Under Cross Validation -#' -#' This function estimates the Grouped Average Treatment Effects (GATEs) under cross-validation where the groups are determined by a continuous score. The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A matrix where the \code{i}th column is the unit-level continuous score for treatment assignment generated in the \code{i}th fold. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @return A list that contains the following items: \item{gate}{The estimated -#' vector of GATEs under cross-validation of length \code{ngates} arranged in order of increasing \code{tau}.} \item{sd}{The estimated vector of standard deviation -#' of GATEs under cross-validation.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = matrix(c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9),nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' gatelist <- GATEcv(T, tau, Y, ind, ngates = 2) -#' gatelist$gate -#' gatelist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export GATEcv -#' -#' -GATEcv <- function(T, tau, Y, ind, ngates = 5) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=dim(tau)[1]) | (dim(tau)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - nfolds = max(ind) - gatesm = matrix(0,nfolds,ngates) - Sfp1 = numeric(ngates) - Sfp0 = numeric(ngates) - Sfpt = numeric(ngates) - kf1t = matrix(NA,nfolds,ngates) - vargts = numeric(ngates) - kf1cv = matrix(NA,nfolds,ngates) - for (i in 1:nfolds) { - Tind = T[ind==i] - tauind = tau[ind==i, i] - Yind = Y[ind==i] - tauind_full = tau[, i] - n = length(Yind) - n1 = sum(Tind) - n0 = n-n1 - fd_label = ntile(tauind, ngates) - for (j in 1:ngates) { - That = as.numeric(fd_label == j) - tau_hcutoff = max(tauind[fd_label == j]) - if (j==1) { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = -Inf - } else if (j==ngates) { - tau_hcutoff = Inf - tau_lcutoff = min(tauind[fd_label==j]) - } else { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = min(tauind[fd_label==j]) - } - That_full = as.numeric((tauind_full <= tau_hcutoff) & (tauind_full >=tau_lcutoff)) - if (length(Y[T==1 & That_full==1])>0 & length(Y[T==0 & That_full==1])>0) { - kf1cv[i, j] = mean(Y[T==1 & That_full==1])-mean(Y[T==0 & That_full==1]) - } - plim = sum(That)/ length(That) - gatesm[i,j] = (1/n1*sum(Tind*That*Yind)+1/n0*sum(Yind*(1-Tind)*(1-That))-1/n0*sum(Yind * (1-Tind))) - Sfp1[j] = Sfp1[j] + var((That*Yind)[Tind==1]) / (n1 * nfolds) - Sfp0[j] = Sfp0[j] + var((That*Yind)[Tind==0])/ (n0 * nfolds) - Sfpt[j] = Sfpt[j] + var(That*Yind * (Tind/(n1/n) - (1-Tind)/(n0/n)))/ (n * nfolds) - if (length(Yind[Tind==1 & That==1])>0 & length(Yind[Tind==0 & That==1])>0) { - kf1t[i,j] = (mean(Yind[Tind==1 & That==1])-mean(Yind[Tind==0 & That==1])) - } - } - } - gates = ngates * colMeans(gatesm) - for (i in 1:ngates) { - kf12 = mean(kf1t[,i]^2, na.rm = TRUE) - Sfp = var(gatesm[,i]) - extra_var_term = var(kf1cv[,i], na.rm=TRUE) - vargtsi = Sfp1[i] + Sfp0[i] - (ngates -1) / ((ngates ^ 2) * (n-1)) * kf12 + extra_var_term / (ngates * ngates) - vargts[i] = ngates * ngates * (vargtsi - (nfolds - 1) / nfolds * min(vargtsi, Sfp)) - } - return(list(gate=gates,sd=sqrt(pmax(vargts,0)))) -} diff --git a/R/PAPD.R b/R/PAPD.R deleted file mode 100644 index 1b9fffc..0000000 --- a/R/PAPD.R +++ /dev/null @@ -1,83 +0,0 @@ -#' Estimation of the Population Average Prescription Difference in Randomized Experiments -#' -#' This function estimates the Population Average Prescription Difference with a budget -#' constraint. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param Thatfp A vector of the unit-level binary treatment that would have been assigned by the -#' first individualized treatment rule. Please ensure that the percentage of treatment units of That is lower than the budget constraint. -#' @param Thatgp A vector of the unit-level binary treatment that would have been assigned by the -#' second individualized treatment rule. Please ensure that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param budget The maximum percentage of population that can be treated under the -#' budget constraint. Should be a decimal between 0 and 1. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{papd}{The estimated -#' Population Average Prescription Difference} \item{sd}{The estimated standard deviation -#' of PAPD.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = c(0,1,1,0,0,1,1,0) -#' That2 = c(1,0,0,1,1,0,0,1) -#' Y = c(4,5,0,2,4,1,-4,3) -#' papdlist <- PAPD(T,That,That2,Y,budget = 0.5) -#' papdlist$papd -#' papdlist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export PAPD -PAPD <- function (T, Thatfp,Thatgp , Y, budget, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!(identical(as.numeric(Thatfp),as.numeric(as.logical(Thatfp))))) { - stop("Thatfp should be binary.") - } - if (!(identical(as.numeric(Thatgp),as.numeric(as.logical(Thatgp))))) { - stop("Thatgp should be binary.") - } - if ((budget<0) | (budget>1)) { - stop("Budget constraint should be between 0 and 1") - } - if ((length(T)!=length(Thatfp)) | (length(Thatfp)!=length(Thatgp)) | (length(Thatgp)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - if ((sum(Thatfp)>floor(length(T)*budget)+1) | (sum(Thatgp)>floor(length(T)*budget)+1)) { - stop("The proportion of treated units in Thatfp or Thatgp should be below or equal to budget.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - T=as.numeric(T) - Thatfp=as.numeric(Thatfp) - Thatgp=as.numeric(Thatgp) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - n=length(Y) - n1=sum(T) - n0=n-n1 - SAPEfp=1/n1*sum(T*Thatfp*Y)+1/n0*sum(Y*(1-T)*(1-Thatfp))-budget/n1*sum(Y*T)-(1-budget)/n0*sum(Y*(1-T)) - SAPEgp=1/n1*sum(T*Thatgp*Y)+1/n0*sum(Y*(1-T)*(1-Thatgp))-budget/n1*sum(Y*T)-(1-budget)/n0*sum(Y*(1-T)) - Sfp1=var(((Thatfp-budget)*Y)[T==1]) - Sfp0=var(((Thatfp-budget)*Y)[T==0]) - kf1=mean(Y[T==1 & Thatfp==1])-mean(Y[T==0 & Thatfp==1]) - kf0=mean(Y[T==1 & Thatfp==0])-mean(Y[T==0 & Thatfp==0]) - PAPD=SAPEfp-SAPEgp - Sfgp1=var(((Thatfp-Thatgp)*Y)[T==1]) - Sfgp0=var(((Thatfp-Thatgp)*Y)[T==0]) - kg1=mean(Y[T==1 & Thatgp==1])-mean(Y[T==0 & Thatgp==1]) - kg0=mean(Y[T==1 & Thatgp==0])-mean(Y[T==0 & Thatgp==0]) - varfgp=Sfgp1/n1+Sfgp0/n0-floor(n*budget)*(n-floor(n*budget))/(n^2*(n-1))*(kf1^2+kg1^2)+ - 2*floor(n*budget)*max(floor(n*budget),n-floor(n*budget))/(n^2*(n-1))*abs(kf1*kg1) - return(list(papd=PAPD,sd=sqrt(max(varfgp,0)))) -} diff --git a/R/PAPDcv.R b/R/PAPDcv.R deleted file mode 100644 index 396b9e8..0000000 --- a/R/PAPDcv.R +++ /dev/null @@ -1,118 +0,0 @@ -#' Estimation of the Population Average Prescription Difference in Randomized Experiments Under Cross Validation -#' -#' This function estimates the Population Average Prescription Difference with a budget constaint under cross validation. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param Thatfp A matrix where the \code{i}th column is the unit-level binary treatment that would have been assigned by the first -#' individualized treatment rule generated in the \code{i}th fold. Please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Thatgp A matrix where the \code{i}th column is the unit-level binary treatment that would have been assigned by the second -#' individualized treatment rule generated in the \code{i}th fold. Please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y The outcome variable of interest. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param budget The maximum percentage of population that can be treated under the -#' budget constraint. Should be a decimal between 0 and 1. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{papd}{The estimated -#' Population Average Prescription Difference.} \item{sd}{The estimated standard deviation -#' of PAPD.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = matrix(c(0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1), nrow = 8, ncol = 2) -#' That2 = matrix(c(0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0), nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' papdlist <- PAPDcv(T, That, That2, Y, ind, budget = 0.5) -#' papdlist$papd -#' papdlist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export PAPDcv -PAPDcv <- function (T, Thatfp, Thatgp, Y, ind, budget, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - if (!(identical(as.numeric(Thatfp),as.numeric(as.logical(Thatfp))))) { - stop("Thatfp should be binary.") - } - if (!(identical(as.numeric(Thatgp),as.numeric(as.logical(Thatgp))))) { - stop("Thatgp should be binary.") - } - if ((length(T)!=dim(Thatfp)[1]) | (dim(Thatfp)[1]!=dim(Thatgp)[1]) | (dim(Thatgp)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (!is.na(budget) & !(sum(sapply(1:max(ind),function(i) sum(Thatfp[ind==i, i])<=floor(length(T[ind==i])*budget) + 1))==max(ind))) { - stop("The number of treated units in Thatfp should be below or equal to budget") - } - if (!is.na(budget) & !(sum(sapply(1:max(ind),function(i) sum(Thatgp[ind==i, i])<=floor(length(T[ind==i])*budget) + 1))==max(ind))) { - stop("The number of treated units in Thatgp should be below or equal to budget") - } - if (((budget<0) | (budget>1))) { - stop("Budget constraint should be between 0 and 1") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - T=as.numeric(T) - Thatfp=as.matrix(Thatfp) - Thatgp=as.matrix(Thatgp) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - nfolds = max(ind) - n = length(Y) - n1 = sum(T) - n0 = n - n1 - papdfold = c() - Sfgp1 = 0 - Sfgp0 = 0 - kf1 = c() - kf0 = c() - kg1 = c() - kg0 = c() - for (i in 1:nfolds) { - output = PAPD(T[ind==i],Thatfp[ind==i,i],Thatgp[ind==i,i], Y[ind==i],budget) - m = length(T[ind==i]) - m1 = sum(T[ind==i]) - m0 = m - m1 - Sfgp1=Sfgp1 + var(((Thatfp[,i]-Thatgp[,i])*Y)[T==1 & ind==i])/(m1*nfolds) - Sfgp0=Sfgp0 + var(((Thatfp[,i]-Thatgp[,i])*Y)[T==0 & ind==i])/(m0*nfolds) - tempf1 = mean(Y[T==1 & Thatfp[,i]==1 & ind ==i])-mean(Y[T==0 & Thatfp[,i]==1 & ind ==i]) - tempf0 = mean(Y[T==1 & Thatfp[,i]==0 & ind ==i])-mean(Y[T==0 & Thatfp[,i]==0 & ind ==i]) - tempg1 = mean(Y[T==1 & Thatgp[,i]==1 & ind ==i])-mean(Y[T==0 & Thatgp[,i]==1 & ind ==i]) - tempg0 = mean(Y[T==1 & Thatgp[,i]==0 & ind ==i])-mean(Y[T==0 & Thatgp[,i]==0 & ind ==i]) - if (!is.nan(tempf1)) { - kf1 = c(kf1, tempf1) - } - if (!is.nan(tempf0)) { - kf0 = c(kf0, tempf0) - } - if (!is.nan(tempf1)) { - kg1 = c(kg1, tempg1) - } - if (!is.nan(tempf0)) { - kg0 = c(kg0, tempg0) - } - papdfold = c(papdfold, output$papd) - } - kf1 = mean(kf1) - kf0 = mean(kf0) - kg1 = mean(kg1) - kg0 = mean(kg0) - mF = n / nfolds - SF2 = var(papdfold) - varfp=Sfgp1+Sfgp0-floor(mF*budget)*(mF-floor(mF*budget))/(mF^2*(mF-1))*(kf1^2+kg1^2)+ - 2*floor(mF*budget)*max(floor(mF*budget),mF-floor(mF*budget))/(mF^2*(mF-1))*abs(kf1*kg1) - vartotal = varfp - (nfolds - 1) / nfolds * min(varfp, SF2) - return(list(papd=mean(papdfold),sd=sqrt(max(vartotal,0)))) -} diff --git a/R/PAPE.R b/R/PAPE.R deleted file mode 100644 index c2f3a91..0000000 --- a/R/PAPE.R +++ /dev/null @@ -1,89 +0,0 @@ -#' Estimation of the Population Average Prescription Effect in Randomized Experiments -#' -#' This function estimates the Population Average Prescription Effect with and without a budget -#' constraint. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param That A vector of the unit-level binary treatment that would have been assigned by the -#' individualized treatment rule. If \code{budget} is specified, please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param budget The maximum percentage of population that can be treated under the -#' budget constraint. Should be a decimal between 0 and 1. Default is NA which assumes -#' no budget constraint. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{pape}{The estimated -#' Population Average Prescription Effect.} \item{sd}{The estimated standard deviation -#' of PAPE.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = c(0,1,1,0,0,1,1,0) -#' Y = c(4,5,0,2,4,1,-4,3) -#' papelist <- PAPE(T,That,Y) -#' papelist$pape -#' papelist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export PAPE -PAPE <- function (T, That, Y, budget = NA, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!(identical(as.numeric(That),as.numeric(as.logical(That))))) { - stop("That should be binary.") - } - if ((length(T)!=length(That)) | (length(That)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - if (!is.na(budget) & (sum(That)>floor(length(T)*budget)+1)) { - stop("The number of treated units in That should be below or equal to budget") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - if (!is.na(budget) & ((budget<0) | (budget>1))) { - stop("Budget constraint should be between 0 and 1") - } - T=as.numeric(T) - That=as.numeric(That) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - if (is.na(budget)) { - n=length(Y) - n1=sum(T) - n0=n-n1 - n1h=sum(That) - n0h=n-n1h - probs=sum(That)/n - SAPE=n/(n-1)*(1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That))-n1h/n1/n*sum(Y*T)-n0h/n0/n*sum(Y*(1-T))) - Sf1=var(((That-probs)*Y)[T==1]) - Sf0=var(((That-probs)*Y)[T==0]) - SATE=1/n1*sum(T*Y)-1/n0*(sum((1-T)*Y)) - covarterm=1/n^2*(SAPE^2+2*(n-1)*SAPE*SATE*(2*probs-1)-(1-probs)*probs*n*SATE^2) - varexp=(n/(n-1))^2*(Sf1/n1+Sf0/n0+covarterm) - return(list(pape=SAPE,sd=sqrt(max(varexp,0)))) - } else { - n=length(Y) - n1=sum(T) - n0=n-n1 - n1h=sum(That) - n0h=n-n1h - SAPEfp=1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That))-budget/n1*sum(Y*T)-(1-budget)/n0*sum(Y*(1-T)) - Sfp1=var(((That-budget)*Y)[T==1]) - Sfp0=var(((That-budget)*Y)[T==0]) - kf1=mean(Y[T==1 & That==1])-mean(Y[T==0 & That==1]) - kf0=mean(Y[T==1 & That==0])-mean(Y[T==0 & That==0]) - varfp=Sfp1/n1+Sfp0/n0+floor(n*budget)*(n-floor(n*budget))/(n^2*(n-1))*((2*budget-1)*kf1^2-2*budget*kf1*kf0) - return(list(pape=SAPEfp,sd=sqrt(max(varfp,0)))) - } -} diff --git a/R/PAPEcv.R b/R/PAPEcv.R deleted file mode 100644 index 913a383..0000000 --- a/R/PAPEcv.R +++ /dev/null @@ -1,150 +0,0 @@ -#' Estimation of the Population Average Prescription Effect in Randomized Experiments Under Cross Validation -#' -#' This function estimates the Population Average Prescription Effect with and without a budget -#' constraint. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param That A matrix where the \code{i}th column is the unit-level binary treatment that would have been assigned by the -#' individualized treatment rule generated in the \code{i}th fold. If \code{budget} is specified, please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y The outcome variable of interest. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param budget The maximum percentage of population that can be treated under the -#' budget constraint. Should be a decimal between 0 and 1. Default is NA which assumes -#' no budget constraint. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{pape}{The estimated -#' Population Average Prescription Effect.} \item{sd}{The estimated standard deviation -#' of PAPE.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = matrix(c(0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1), nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' papelist <- PAPEcv(T, That, Y, ind) -#' papelist$pape -#' papelist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @importFrom stats var quantile rbinom cov pchisq -#' @importFrom dplyr ntile -#' @importFrom MASS ginv mvrnorm -#' @importFrom quadprog solve.QP -#' @importFrom Matrix nearPD -#' @export PAPEcv -PAPEcv <- function (T, That, Y, ind, budget = NA, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - if (!(identical(as.numeric(That),as.numeric(as.logical(That))))) { - stop("That should be binary.") - } - if ((length(T)!=dim(That)[1]) | (dim(That)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (!is.na(budget) & !(sum(sapply(1:max(ind),function(i) sum(That[ind==i, i])<=floor(length(T[ind==i])*budget)+1))==max(ind))) { - stop("The number of treated units in That should be below or equal to budget") - } - if (!is.na(budget) & ((budget<0) | (budget>1))) { - stop("Budget constraint should be between 0 and 1") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - T=as.numeric(T) - That=as.matrix(That) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - if (is.na(budget)) { - nfolds = max(ind) - n = length(Y) - n1 = sum(T) - n0 = n - n1 - papefold = c() - pF = mean(That) - tau = 1/n1*sum(T*Y)-1/n0*(sum((1-T)*Y)) - eitaui = sum(That*Y*T)/(n1*nfolds)-sum(That*Y*(1-T))/(n0*nfolds) - Sf1 = 0 - Sf0 = 0 - covij = 0 - covijtaui = 0 - covijtauij = 0 - n1n1 = n1*(n1-1) - n1n0 = n0*n1 - n0n0 = n0*(n0-1) - Thatmean = apply(That,1,mean) - ThatYT1mean = apply(That*Y*T,1,mean) - ThatYT0mean = apply(That*Y*(1-T),1,mean) - for (i in 1:nfolds) { - output = PAPE(T[ind==i],That[ind==i,i],Y[ind==i]) - m = length(T[ind==i]) - m1 = sum(T[ind==i]) - m0 = m - m1 - probs=sum(That[ind==i,i])/m - Sf1=Sf1 + var(((That[,i]-probs)*Y)[T==1 & ind==i])/(m1*nfolds) - Sf0=Sf0 + var(((That[,i]-probs)*Y)[T==0 & ind==i])/(m0*nfolds) - papefold = c(papefold, output$pape) - covij = covij + (m-2)*(m-3)/(m-1)^2*tau^2*((sum(That[,i])^2-sum(That[,i])-sum(Thatmean)^2+sum(Thatmean^2))/(n*(n-1))) / nfolds - covijtaui = covijtaui + 2*(m-2)^2/(m-1)^2*tau*((sum(That[,i])-1)*(sum((That[,i]*Y*T))/((n-1)*n1)-sum((That[,i]*Y*(1-T)))/((n-1)*n0)) - - ((sum(Thatmean)*sum(ThatYT1mean)-sum(Thatmean*ThatYT1mean))/((n-1)*n1)- - (sum(Thatmean)*sum(ThatYT0mean)-sum(Thatmean*ThatYT0mean))/((n-1)*n0)))/ nfolds - covijtauij = covijtauij + (m^2-2*m+2)/(m-1)^2*(((sum((That[,i]*Y*T))^2-sum((That[,i]*Y^2*T)))/n1n1 - - 2*sum((That[,i]*Y*T))*sum(That[,i]*Y*(1-T))/n1n0 + - (sum((That[,i]*Y*(1-T)))^2-sum((That[,i]*Y^2*(1-T))))/n0n0) - - ((sum(ThatYT1mean)^2-sum(ThatYT1mean^2))/n1n1 - - (2*sum(ThatYT1mean)*sum(ThatYT0mean))/n1n0 + - (sum(ThatYT0mean)^2-sum(ThatYT0mean^2))/n0n0)) / nfolds - } - mF = n / nfolds - SF2 = var(papefold) - covarterm = 1/mF^2*(mean(papefold)^2+2*(mF-1)*mean(papefold)*tau*(2*pF-1)-(1-pF)*pF*mF*tau^2) - varcv = mF^2/(mF-1)^2*(Sf1+Sf0+covarterm) - varexp = varcv + covij - covijtaui + covijtauij - (nfolds - 1)/ nfolds * min(SF2, varcv + covij - covijtaui + covijtauij) - return(list(pape=mean(papefold),sd=sqrt(max(varexp,0)))) - } else { - nfolds = max(ind) - n = length(Y) - n1 = sum(T) - n0 = n - n1 - papepfold = numeric(nfolds) - Sfp1 = 0 - Sfp0 = 0 - kf1 = numeric(nfolds) - kf0 = numeric(nfolds) - for (i in 1:nfolds) { - output = PAPE(T[ind==i],That[ind==i,i],Y[ind==i],budget) - m = length(T[ind==i]) - m1 = sum(T[ind==i]) - m0 = m - m1 - probs=sum(That[ind==i,i])/m - Sfp1=Sfp1 + var(((That[,i]-budget)*Y)[T==1 & ind==i])/(m1*nfolds) - Sfp0=Sfp0 + var(((That[,i]-budget)*Y)[T==0 & ind==i])/(m0*nfolds) - temp1 = mean(Y[T==1 & That[,i]==1 & ind==i])-mean(Y[T==0 & That[,i]==1 & ind==i]) - temp0 = mean(Y[T==1 & That[,i]==0 & ind==i])-mean(Y[T==0 & That[,i]==0 & ind==i]) - if (!is.nan(temp1)) { - kf1[i] = temp1 - } - if (!is.nan(temp0)) { - kf0[i] =temp0 - } - papepfold[i] = output$pape - } - mF = n / nfolds - SF2 = var(papepfold) - kf1 = mean(kf1) - kf0 = mean(kf0) - varfp=Sfp1+Sfp0+floor(mF*budget)*(mF-floor(mF*budget))/(mF^2*(mF-1))*((2*budget-1)*kf1^2-2*budget*kf1*kf0) - vartotal = varfp - (nfolds - 1) / nfolds * min(varfp, SF2) - return(list(papep=mean(papepfold),sd=sqrt(max(vartotal,0)))) - } -} diff --git a/R/PAV.R b/R/PAV.R deleted file mode 100644 index 6105fca..0000000 --- a/R/PAV.R +++ /dev/null @@ -1,59 +0,0 @@ -#' Estimation of the Population Average Value in Randomized Experiments -#' -#' This function estimates the Population Average Value. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param That A vector of the unit-level binary treatment that would have been assigned by the -#' individualized treatment rule. If \code{budget} is specified, please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{pav}{The estimated -#' Population Average Value.} \item{sd}{The estimated standard deviation -#' of PAV.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = c(0,1,1,0,0,1,1,0) -#' Y = c(4,5,0,2,4,1,-4,3) -#' pavlist <- PAV(T,That,Y) -#' pavlist$pav -#' pavlist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export PAV -PAV <- function (T, That, Y, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!(identical(as.numeric(That),as.numeric(as.logical(That))))) { - stop("That should be binary.") - } - if ((length(T)!=length(That)) | (length(That)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - T=as.numeric(T) - That=as.numeric(That) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - n=length(Y) - n1=sum(T) - n0=n-n1 - SAV=1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That)) - Sf1=var((That*Y)[T==1]) - Sf0=var(((1-That)*Y)[T==0]) - varexp=Sf1/n1+Sf0/n0 - return(list(pav=SAV,sd=sqrt(max(varexp,0)))) -} diff --git a/R/PAVcv.R b/R/PAVcv.R deleted file mode 100644 index 4dc2e04..0000000 --- a/R/PAVcv.R +++ /dev/null @@ -1,89 +0,0 @@ -#' Estimation of the Population Average Value in Randomized Experiments Under Cross Validation -#' -#' This function estimates the Population Average Value. The details of the methods for this design are given in Imai and Li (2019). -#' -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param That A matrix where the \code{i}th column is the unit-level binary treatment that would have been assigned by the -#' individualized treatment rule generated in the \code{i}th fold. If \code{budget} is specified, please ensure -#' that the percentage of treatment units of That is lower than the budget constraint. -#' @param Y The outcome variable of interest. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param centered If \code{TRUE}, the outcome variables would be centered before processing. This minimizes -#' the variance of the estimator. Default is \code{TRUE}. -#' @return A list that contains the following items: \item{pav}{The estimated -#' Population Average Value.} \item{sd}{The estimated standard deviation -#' of PAV.} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' That = matrix(c(0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1), nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' pavlist <- PAVcv(T, That, Y, ind) -#' pavlist$pav -#' pavlist$sd -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2019). \dQuote{Experimental Evaluation of Individualized Treatment Rules}, -#' @keywords evaluation -#' @export PAVcv -PAVcv <- function (T, That, Y, ind, centered = TRUE) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if (!is.logical(centered)) { - stop("The centered parameter should be TRUE or FALSE.") - } - if (!(identical(as.numeric(That),as.numeric(as.logical(That))))) { - stop("That should be binary.") - } - if ((length(T)!=dim(That)[1]) | (dim(That)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - T=as.numeric(T) - That=as.matrix(That) - Y=as.numeric(Y) - if (centered) { - Y = Y - mean(Y) - } - nfolds = max(ind) - n = length(Y) - n1 = sum(T) - n0 = n - n1 - pavfold = c() - sdfold = c() - Sf1 = 0 - Sf0 = 0 - covijtauij = 0 - n1n1 = n1*(n1-1) - n1n0 = n0*n1 - n0n0 = n0*(n0-1) - ThatYT1mean = apply(That*Y*T,1,mean) - ThatYT0mean = apply(That*Y*(1-T),1,mean) - for (i in 1:nfolds) { - output = PAV(T[ind==i],That[ind==i,i],Y[ind==i]) - m = length(T[ind==i]) - m1 = sum(T[ind==i]) - m0 = m - m1 - probs=sum(That[ind==i,i])/m - Sf1=Sf1 + var((That[,i]*Y)[T==1 & ind==i])/(m1*nfolds) - Sf0=Sf0 + var(((1-That[,i])*Y)[T==0 & ind==i])/(m0*nfolds) - pavfold = c(pavfold, output$pav) - sdfold = c(sdfold, output$sd) - covijtauij = covijtauij + (((sum((That[,i]*Y*T))^2-sum((That[,i]*Y^2*T)))/n1n1 - - 2*sum((That[,i]*Y*T))*sum(That[,i]*Y*(1-T))/n1n0 + - (sum((That[,i]*Y*(1-T)))^2-sum((That[,i]*Y^2*(1-T))))/n0n0) - - ((sum(ThatYT1mean)^2-sum(ThatYT1mean^2))/n1n1 - - (2*sum(ThatYT1mean)*sum(ThatYT0mean))/n1n0 + - (sum(ThatYT0mean)^2-sum(ThatYT0mean^2))/n0n0)) / nfolds - } - mF = n / nfolds - SF2 = var(pavfold) - varcv = Sf1+Sf0 - varexp = (varcv + covijtauij) - (nfolds - 1)/ nfolds * min(SF2,(varcv + covijtauij)) - return(list(pav=mean(pavfold),sd=sqrt(max(varexp,0)))) -} diff --git a/R/consist.test.R b/R/consist.test.R deleted file mode 100644 index e48a475..0000000 --- a/R/consist.test.R +++ /dev/null @@ -1,83 +0,0 @@ -#' The Consistency Test for Grouped Average Treatment Effects (GATEs) in Randomized Experiments -#' -#' This function calculates statistics related to the test of treatment effect consistency across groups. -#' -#' The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A vector of the unit-level continuous score. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @param nsim Number of Monte Carlo simulations used to simulate the null distributions. Default is 10000. -#' @return A list that contains the following items: \item{stat}{The estimated -#' statistic for the test of consistency} \item{pval}{The p-value of the null -#' hypothesis (that the treatment effects are consistent)} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7) -#' Y = c(4,5,0,2,4,1,-4,3) -#' consisttestlist <- consist.test(T,tau,Y,ngates=5) -#' consisttestlist$stat -#' consisttestlist$pval -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export consist.test -consist.test <- function(T, tau, Y, ngates = 5, nsim = 10000) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=length(tau)) | (length(tau)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - n = length(Y) - n1 = sum(T) - n0 = n-n1 - fd_label = ntile(tau, ngates) - vargts = numeric(ngates) - papes = numeric(ngates) - kf1s = numeric(ngates) - kf0s = numeric(ngates) - Sfp1s = as.list(numeric(ngates)) - Sfp0s = as.list(numeric(ngates)) - mcov = matrix(0, nrow = ngates, ncol = ngates) - for (i in 1:ngates) { - That = as.numeric(fd_label == i) - plim = 1 / ngates - papes[i] = ngates * (1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That))-plim/n1*sum(Y*T)-(1-plim)/n0*sum(Y*(1-T))) - Sfp1s[[i]] = (That*Y)[T==1] - Sfp0s[[i]] = (That*Y)[T==0] - kf1s[i] = mean(Y[T==1 & That==1])-mean(Y[T==0 & That==1]) - kf0s[i] = mean(Y[T==1 & That==0])-mean(Y[T==0 & That==0]) - } - for (i in 1:ngates) { - for (j in 1:ngates) { - mcov[i,j] = ngates ^ 2 * (cov(Sfp1s[[i]],Sfp1s[[j]]) / n1 + cov(Sfp0s[[i]],Sfp0s[[j]]) / n0) + - 1/ (ngates * (n - 1)) *((ngates - 1)*(kf1s[i]^2-kf1s[i]*kf0s[i]+kf1s[j]^2-kf1s[j]*kf0s[j]) - ngates * (ngates - 1)* kf1s[i] * kf1s[j]) - } - } - mcov[is.nan(mcov)] = 0 - mcov = as.matrix(nearPD(mcov, eig.tol = 1e-4)$mat) - if (is.finite(determinant(mcov)$modulus)) { - mcov_inv = as.matrix(nearPD(ginv(mcov))$mat) - rsamples = mvrnorm(n=nsim, numeric(ngates), ginv(mcov_inv)) - A = matrix(data = 0, nrow= ngates-1, ncol = ngates) - for (i in 1:(ngates-1)) { - A[i,i] = -1 - A[i,i+1] = 1 - } - values = numeric(nsim) - for (i in 1:nsim) { - values[i] = (solve.QP(Dmat=mcov_inv,dvec=mcov_inv %*% rsamples[i,],Amat=t(A))$value * 2 + t(rsamples[i,]) %*% mcov_inv %*% rsamples[i,]) - } - actual_val = (solve.QP(Dmat=mcov_inv,dvec=mcov_inv %*% papes,Amat=t(A))$value * 2 + (t(papes) %*% mcov_inv %*% papes)[1,1]) - return(list(stat=actual_val,pval=1-mean(actual_val>values))) - } else { - return(list(stat=NA,pval=NA)) - } -} diff --git a/R/consistcv.test.R b/R/consistcv.test.R deleted file mode 100644 index e96ccd8..0000000 --- a/R/consistcv.test.R +++ /dev/null @@ -1,130 +0,0 @@ -#' The Consistency Test for Grouped Average Treatment Effects (GATEs) under Cross Validation in Randomized Experiments -#' -#' This function calculates statistics related to the test of treatment effect consistency across groups under cross-validation. -#' -#' The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A vector of the unit-level continuous score. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param nsim Number of Monte Carlo simulations used to simulate the null distributions. Default is 10000. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @return A list that contains the following items: \item{stat}{The estimated -#' statistic for the test of consistency under cross-validation.} \item{pval}{The p-value of the null -#' hypothesis (that the treatment effects are consistent)} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = matrix(c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9),nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' consisttestlist <- consistcv.test(T,tau,Y,ind,ngates=2) -#' consisttestlist$stat -#' consisttestlist$pval -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export consistcv.test -consistcv.test <- function(T, tau, Y, ind, ngates = 5, nsim = 10000) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=dim(tau)[1]) | (dim(tau)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - nfolds = max(ind) - papesm = matrix(0,nfolds,ngates) - Sfp1s = as.list(numeric(ngates)) - Sfp0s = as.list(numeric(ngates)) - cov1s = matrix(0,ngates,ngates) - cov0s = matrix(0, ngates, ngates) - kf1t = matrix(NA,nfolds,ngates) - kf0t = matrix(NA,nfolds,ngates) - vargts = numeric(ngates) - kf1cv = matrix(NA,nfolds,ngates) - mcov = matrix(0, nrow = ngates, ncol = ngates) - for (i in 1:nfolds) { - Tind = T[ind==i] - tauind = tau[ind==i, i] - Yind = Y[ind==i] - tauind_full = tau[, i] - n = length(Yind) - n1 = sum(Tind) - n0 = n-n1 - fd_label = ntile(tauind, ngates) - for (j in 1:ngates) { - That = as.numeric(fd_label == j) - tau_hcutoff = max(tauind[fd_label == j]) - if (j==1) { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = -Inf - } else if (j==ngates) { - tau_hcutoff = Inf - tau_lcutoff = min(tauind[fd_label==j]) - } else { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = min(tauind[fd_label==j]) - } - That_full = as.numeric((tauind_full <= tau_hcutoff) & (tauind_full >=tau_lcutoff)) - if (length(Y[T==1 & That_full==1])>0 & length(Y[T==0 & That_full==1])>0) { - kf1cv[i, j] = mean(Y[T==1 & That_full==1])-mean(Y[T==0 & That_full==1]) - } - plim = sum(That)/ length(That) - papesm[i,j] = ngates * (1/n1*sum(Tind*That*Yind)+1/n0*sum(Yind*(1-Tind)*(1-That))-plim/n1*sum(Yind*Tind)-(1-plim)/n0*sum(Yind*(1-Tind))) - Sfp1s[[j]] = (That*Yind)[Tind==1] - Sfp0s[[j]] = (That*Yind)[Tind==0] - if (length(Yind[Tind==1 & That==1])>0 & length(Yind[Tind==0 & That==1])>0) { - kf1t[i,j] = (mean(Yind[Tind==1 & That==1])-mean(Yind[Tind==0 & That==1])) - } - if (length(Yind[Tind==1 & That==0])>0 & length(Yind[Tind==0 & That==0])>0) { - kf0t[i,j] =(mean(Yind[Tind==1 & That==0])-mean(Yind[Tind==0 & That==0])) - } - } - for (i in 1:ngates) { - for (j in 1:ngates) { - cov1s[i,j] = cov1s[i,j] + cov(Sfp1s[[i]],Sfp1s[[j]]) / nfolds - cov0s[i,j] = cov0s[i,j] + cov(Sfp0s[[i]],Sfp0s[[j]]) / nfolds - } - } - } - - papes = colMeans(papesm) - for (i in 1:ngates) { - for (j in 1:ngates) { - kf1i2 = mean(kf1t[,i]^2, na.rm = TRUE) - kf1j2 = mean(kf1t[,j]^2, na.rm = TRUE) - kf11ij = mean(kf1t[,i]*kf1t[,j], na.rm = TRUE) - kf10ii = mean(kf1t[,i]*kf0t[,i], na.rm = TRUE) - kf10jj = mean(kf1t[,j]*kf0t[,j], na.rm = TRUE) - Sfp = cov(papesm[,i],papesm[,j]) - extra_var_term = cov(kf1cv[,i], kf1cv[,j], use = "complete.obs") - vargtsij = ngates ^ 2 * ((cov1s[i,j]) / n1 + (cov0s[i,j]) / n0) + - 1/ (ngates * (n - 1)) *((ngates - 1)*(kf1i2-kf10ii+kf1j2-kf10jj) - ngates * (ngates - 1)* kf11ij) + extra_var_term - mcov[i,j] = vargtsij - (nfolds - 1) / nfolds * min(vargtsij, Sfp) - } - } - mcov[is.nan(mcov)] = 0 - mcov = as.matrix(nearPD(mcov, eig.tol = 1e-4)$mat) - if (is.finite(determinant(mcov)$modulus)) { - mcov_inv = as.matrix(nearPD(ginv(mcov))$mat) - rsamples = mvrnorm(n=nsim, numeric(ngates), ginv(mcov_inv)) - A = matrix(data = 0, nrow= ngates-1, ncol = ngates) - for (i in 1:(ngates-1)) { - A[i,i] = -1 - A[i,i+1] = 1 - } - values = numeric(nsim) - for (i in 1:nsim) { - values[i] = (solve.QP(Dmat=mcov_inv,dvec=mcov_inv %*% rsamples[i,],Amat=t(A))$value * 2 + t(rsamples[i,]) %*% mcov_inv %*% rsamples[i,]) - } - actual_val = (solve.QP(Dmat=mcov_inv,dvec=mcov_inv %*% papes,Amat=t(A))$value * 2 + (t(papes) %*% mcov_inv %*% papes)[1,1]) - return(list(stat=actual_val,pval=1-mean(actual_val>values))) - } else { - return(list(stat=NA,pval=NA)) - } -} diff --git a/R/data.R b/R/data.R deleted file mode 100644 index 3c9643b..0000000 --- a/R/data.R +++ /dev/null @@ -1,23 +0,0 @@ -#' Tennessee’s Student/Teacher Achievement Ratio (STAR) project -#' -#' A longitudinal study experimentally evaluating the impacts of class size in early education on various outcomes (Mosteller, 1995) -#' -#' @name star -#' @format A data frame with 1911 observations and 14 variables: -#' \describe{ -#' \item{treatment}{A binary treatment indicating whether a student is assigned to small class and regular class without an aid} -#' \item{g3tlangss}{A continous variable measuring student's writing scores} -#' \item{g3treadss}{A continous variable measuring student's reading scores} -#' \item{g3tmathss}{A continous variable measuring student's math scores} -#' \item{gender}{Students' gender} -#' \item{race}{Students' race} -#' \item{birthmonth}{Students' birth month} -#' \item{birthyear}{Students' birth year} -#' \item{SCHLURBN}{Urban or rural} -#' \item{GKENRMNT}{Enrollment size} -#' \item{GRDRANGE}{Grade range} -#' \item{GKFRLNCH}{Number of students on free lunch} -#' \item{GKBUSED}{Number of students on school buses} -#' \item{GKWHITE}{Percentage of white students} -#' } -"star" \ No newline at end of file diff --git a/R/het.test.R b/R/het.test.R deleted file mode 100644 index 9366983..0000000 --- a/R/het.test.R +++ /dev/null @@ -1,70 +0,0 @@ -#' The Heterogeneity Test for Grouped Average Treatment Effects (GATEs) in Randomized Experiments -#' -#' This function calculates statistics related to the test of heterogeneous treatment effects across groups. -#' -#' The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A vector of the unit-level continuous score. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @return A list that contains the following items: \item{stat}{The estimated -#' statistic for the test of heterogeneity.} \item{pval}{The p-value of the null -#' hypothesis (that the treatment effects are homogeneous)} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7) -#' Y = c(4,5,0,2,4,1,-4,3) -#' hettestlist <- het.test(T,tau,Y,ngates=5) -#' hettestlist$stat -#' hettestlist$pval -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export het.test -het.test <- function(T, tau, Y, ngates = 5) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=length(tau)) | (length(tau)!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - n = length(Y) - n1 = sum(T) - n0 = n-n1 - fd_label = ntile(tau, ngates) - vargts = numeric(ngates) - papes = numeric(ngates) - kf1s = numeric(ngates) - kf0s = numeric(ngates) - Sfp1s = as.list(numeric(ngates)) - Sfp0s = as.list(numeric(ngates)) - mcov = matrix(0, nrow = ngates, ncol = ngates) - for (i in 1:ngates) { - That = as.numeric(fd_label == i) - plim = 1 / ngates - papes[i] = ngates * (1/n1*sum(T*That*Y)+1/n0*sum(Y*(1-T)*(1-That))-plim/n1*sum(Y*T)-(1-plim)/n0*sum(Y*(1-T))) - Sfp1s[[i]] = (That*Y)[T==1] - Sfp0s[[i]] = (That*Y)[T==0] - kf1s[i] = mean(Y[T==1 & That==1])-mean(Y[T==0 & That==1]) - kf0s[i] = mean(Y[T==1 & That==0])-mean(Y[T==0 & That==0]) - } - for (i in 1:ngates) { - for (j in 1:ngates) { - mcov[i,j] = ngates ^ 2 * (cov(Sfp1s[[i]],Sfp1s[[j]]) / n1 + cov(Sfp0s[[i]],Sfp0s[[j]]) / n0) + - 1/ (ngates * (n - 1)) *((ngates - 1)*(kf1s[i]^2-kf1s[i]*kf0s[i]+kf1s[j]^2-kf1s[j]*kf0s[j]) - ngates * (ngates - 1) *kf1s[i] * kf1s[j]) - } - } - mcov = diag(diag(mcov), nrow = ngates, ncol = ngates) - if (is.finite(determinant(mcov)$modulus)) { - stat = t(papes) %*% solve(mcov) %*% papes - return(list(stat=stat,pval=pchisq(stat, ngates, lower.tail = FALSE))) - } else { - return(list(stat=NA,pval=NA)) - } -} diff --git a/R/hetcv.test.R b/R/hetcv.test.R deleted file mode 100644 index eafce41..0000000 --- a/R/hetcv.test.R +++ /dev/null @@ -1,117 +0,0 @@ -#' The Heterogeneity Test for Grouped Average Treatment Effects (GATEs) under Cross Validation in Randomized Experiments -#' -#' This function calculates statistics related to the test of heterogeneous treatment effects across groups under cross-validation. -#' -#' The details of the methods for this design are given in Imai and Li (2022). -#' -#' -#' @param T A vector of the unit-level binary treatment receipt variable for each sample. -#' @param tau A vector of the unit-level continuous score. Conditional Average Treatment Effect is one possible measure. -#' @param Y A vector of the outcome variable of interest for each sample. -#' @param ind A vector of integers (between 1 and number of folds inclusive) indicating which testing set does each sample belong to. -#' @param ngates The number of groups to separate the data into. The groups are determined by \code{tau}. Default is 5. -#' @return A list that contains the following items: \item{stat}{The estimated -#' statistic for the test of heterogeneity under cross-validation.} \item{pval}{The p-value of the null -#' hypothesis (that the treatment effects are homogeneous)} -#' @examples -#' T = c(1,0,1,0,1,0,1,0) -#' tau = matrix(c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,-0.5,-0.3,-0.1,0.1,0.3,0.5,0.7,0.9),nrow = 8, ncol = 2) -#' Y = c(4,5,0,2,4,1,-4,3) -#' ind = c(rep(1,4),rep(2,4)) -#' hettestlist <- hetcv.test(T,tau,Y,ind,ngates=2) -#' hettestlist$stat -#' hettestlist$pval -#' @author Michael Lingzhi Li, Technology and Operations Management, Harvard Business School -#' \email{mili@hbs.edu}, \url{https://www.michaellz.com/}; -#' @references Imai and Li (2022). \dQuote{Statistical Inference for Heterogeneous Treatment Effects Discovered by Generic Machine Learning in Randomized Experiments}, -#' @keywords evaluation -#' @export hetcv.test -hetcv.test<- function(T, tau, Y, ind, ngates = 5) { - if (!(identical(as.numeric(T),as.numeric(as.logical(T))))) { - stop("T should be binary.") - } - if ((length(T)!=dim(tau)[1]) | (dim(tau)[1]!=length(Y))) { - stop("All the data should have the same length.") - } - if (length(T)==0) { - stop("The data should have positive length.") - } - nfolds = max(ind) - papesm = matrix(0,nfolds,ngates) - Sfp1s = as.list(numeric(ngates)) - Sfp0s = as.list(numeric(ngates)) - cov1s = matrix(0,ngates,ngates) - cov0s = matrix(0, ngates, ngates) - kf1t = matrix(NA,nfolds,ngates) - kf0t = matrix(NA,nfolds,ngates) - vargts = numeric(ngates) - kf1cv = matrix(NA,nfolds,ngates) - mcov = matrix(0, nrow = ngates, ncol = ngates) - for (i in 1:nfolds) { - Tind = T[ind==i] - tauind = tau[ind==i, i] - Yind = Y[ind==i] - tauind_full = tau[, i] - n = length(Yind) - n1 = sum(Tind) - n0 = n-n1 - fd_label = ntile(tauind, ngates) - for (j in 1:ngates) { - That = as.numeric(fd_label == j) - tau_hcutoff = max(tauind[fd_label == j]) - if (j==1) { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = -Inf - } else if (j==ngates) { - tau_hcutoff = Inf - tau_lcutoff = min(tauind[fd_label==j]) - } else { - tau_hcutoff = max(tauind[fd_label==j]) - tau_lcutoff = min(tauind[fd_label==j]) - } - That_full = as.numeric((tauind_full <= tau_hcutoff) & (tauind_full >=tau_lcutoff)) - if (length(Y[T==1 & That_full==1])>0 & length(Y[T==0 & That_full==1])>0) { - kf1cv[i, j] = mean(Y[T==1 & That_full==1])-mean(Y[T==0 & That_full==1]) - } - plim = sum(That)/ length(That) - papesm[i,j] = ngates * (1/n1*sum(Tind*That*Yind)+1/n0*sum(Yind*(1-Tind)*(1-That))-plim/n1*sum(Yind*Tind)-(1-plim)/n0*sum(Yind*(1-Tind))) - Sfp1s[[j]] = (That*Yind)[Tind==1] - Sfp0s[[j]] = (That*Yind)[Tind==0] - if (length(Yind[Tind==1 & That==1])>0 & length(Yind[Tind==0 & That==1])>0) { - kf1t[i,j] = (mean(Yind[Tind==1 & That==1])-mean(Yind[Tind==0 & That==1])) - } - if (length(Yind[Tind==1 & That==0])>0 & length(Yind[Tind==0 & That==0])>0) { - kf0t[i,j] =(mean(Yind[Tind==1 & That==0])-mean(Yind[Tind==0 & That==0])) - } - } - for (i in 1:ngates) { - for (j in 1:ngates) { - cov1s[i,j] = cov1s[i,j] + cov(Sfp1s[[i]],Sfp1s[[j]]) / nfolds - cov0s[i,j] = cov0s[i,j] + cov(Sfp0s[[i]],Sfp0s[[j]]) / nfolds - } - } - } - - papes = colMeans(papesm) - for (i in 1:ngates) { - for (j in 1:ngates) { - kf1i2 = mean(kf1t[,i]^2, na.rm = TRUE) - kf1j2 = mean(kf1t[,j]^2, na.rm = TRUE) - kf11ij = mean(kf1t[,i]*kf1t[,j], na.rm = TRUE) - kf10ii = mean(kf1t[,i]*kf0t[,i], na.rm = TRUE) - kf10jj = mean(kf1t[,j]*kf0t[,j], na.rm = TRUE) - Sfp = cov(papesm[,i],papesm[,j]) - extra_var_term = cov(kf1cv[,i], kf1cv[,j], use = "complete.obs") - vargtsij = ngates ^ 2 * ((cov1s[i,j]) / n1 + (cov0s[i,j]) / n0) + - 1/ (ngates * (n - 1)) *((ngates - 1)*(kf1i2-kf10ii+kf1j2-kf10jj) - ngates * (ngates - 1)* kf11ij) + extra_var_term - mcov[i,j] = vargtsij - (nfolds - 1) / nfolds * min(vargtsij, Sfp) - } - } - mcov = diag(diag(mcov), nrow = ngates, ncol = ngates) - if (is.finite(determinant(mcov)$modulus)) { - stat = t(papes) %*% solve(mcov) %*% papes - return(list(stat=stat,pval=pchisq(stat, ngates, lower.tail = FALSE))) - } else { - return(list(stat=NA,pval=NA)) - } -} diff --git a/R/itr_helpers.R b/R/itr_helpers.R deleted file mode 100644 index 262d5df..0000000 --- a/R/itr_helpers.R +++ /dev/null @@ -1,488 +0,0 @@ -# Split samples into training and testing data -split_samples = function(seed, data, train_prop, replace = FALSE){ - - set.seed(seed) - - train_idx = sample(1:nrow(data), size = nrow(data)*train_prop, replace = replace) - - trainset = data[train_idx,] - testset = data[-train_idx,] - - return(list(trainset = trainset, testset = testset)) -} - -#' Create arguments for ML algorithms -#' @importFrom stats as.formula -#' @param data A dataset -#' @param outcome Outcome of interests -#' @param treatment Treatment variable -create_ml_arguments = function(outcome, treatment, data){ - - Y = data %>% - dplyr::select(all_of(outcome)) %>% unlist() %>% as.numeric() - - X = data %>% - dplyr::select(-c(all_of(outcome), all_of(treatment))) %>% - as.data.frame() - - T = data %>% - dplyr::select(all_of(treatment)) %>% unlist() %>% as.numeric() - - formula = as.formula(paste(outcome, "~", paste(c(treatment, names(X)), collapse = "+"))) - - return(list(Y = Y, X = X, T = T, formula = formula)) -} - -#' Create general arguments -#' @importFrom stats model.matrix -#' @param data A dataset -create_ml_args = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T =data[["T"]] - - X_and_T = cbind(X, T) - X_expand = model.matrix(~.*T, data = X_and_T) - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T = 1) - X0t_expand = model.matrix(~.*T, data = X0t) - X1t_expand = model.matrix(~.*T, data = X1t) - - return(list(Y = Y, X = X, T = T, X_expand = X_expand, X0t_expand = X0t_expand, X1t_expand = X1t_expand)) -} - - - -#' Create arguments for causal forest -#' @importFrom stats model.matrix -#' @param data A dataset -create_ml_args_causalforest = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - X_expand = model.matrix(~. -1, data = X) - - return(list(Y = Y, X = X, T = T, X_expand = X_expand)) -} - - -#' Create arguments for bartMachine -#' @param data A dataset -create_ml_args_bart = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T=data[["T"]] - - X_and_T = cbind(X, T) - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T= 1) - - return(list(Y = Y, X = X, T = T, X_and_T = X_and_T, X0t = X0t, X1t = X1t)) -} - -#' Create arguments for bartCause -#' @param data A dataset -create_ml_args_bartc = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T =data[["T"]] - - # also needed for testing: - X0t = cbind(X, z = 0) - X1t = cbind(X, z = 1) - - return(list(Y = Y, X = X, T = T, X0t = X0t, X1t = X1t)) -} - -#' Create arguments for LASSO -#' @importFrom stats model.matrix -#' @param data A dataset -create_ml_args_lasso = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T =data[["T"]] - - X_and_T = cbind(X, T) - X_expand = model.matrix(~.*T, data = X_and_T) - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T = 1) - X0t_expand = model.matrix(~.*T, data = X0t) - X1t_expand = model.matrix(~.*T, data = X1t) - - return(list(Y = Y, X = X, T = T, X_expand = X_expand, X0t_expand = X0t_expand, X1t_expand = X1t_expand)) -} - - -#' Create arguments for super learner -#' @importFrom stats model.matrix -#' @param data A dataset -create_ml_args_superLearner = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T =data[["T"]] - - X_and_T = cbind(X, T) - X_expand = model.matrix(~.*T, data = X_and_T) %>% as.data.frame() - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T = 1) - X0t_expand = model.matrix(~.*T, data = X0t) %>% as.data.frame() - X1t_expand = model.matrix(~.*T, data = X1t) %>% as.data.frame() - - # remove intercept - X_expand = X_expand[, -1] - X0t_expand = X0t_expand[, -1] - X1t_expand = X1t_expand[, -1] - - # change : in column names to _ to avoid errors in super learner - colnames(X_expand) = gsub(":", "_", colnames(X_expand)) - colnames(X0t_expand) = gsub(":", "_", colnames(X0t_expand)) - colnames(X1t_expand) = gsub(":", "_", colnames(X1t_expand)) - - return(list(Y = Y, X = X, T = T, X_expand = X_expand, X0t_expand = X0t_expand, X1t_expand = X1t_expand)) -} - - -#' Create arguments for SVM -#' @importFrom rlang .data -#' @param data A dataset -create_ml_args_svm = function(data){ - - - formula = data[["formula"]] - Y = data[["Y"]] %>% scale() - X = data[["X"]] %>% mutate_all(.data, scale) - T = data[["T"]] %>% scale() - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, - data0t = data0t, data1t = data1t)) -} - -#' Create arguments for SVM classification -#' @importFrom stats as.formula -#' @param data A dataset -create_ml_args_svm_cls = function(data){ - - - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - formula = as.formula(paste(as.factor("Y"), "~", paste(c("T", names(X)), collapse = "+"))) - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, - data0t = data0t, data1t = data1t)) -} - -# Create arguments for LDA -create_ml_args_lda = function(data){ - - formula = data[["formula"]] - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - data = cbind(Y, X, T) - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T = 1) - data0t = cbind(Y, X0t) - data1t = cbind(Y, X1t) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - -# Create arguments for boosted trees -create_ml_args_boosted = function(data){ - - formula = data[["formula"]] - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - - -# Create arguments for random forest -create_ml_args_rf = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - if(length(unique(Y)) > 2){ - formula = data[["formula"]] - }else{ - formula = as.formula(paste("as.factor(Y) ~", paste(c("T", names(X)), collapse = "+"))) - } - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - - -# Create arguments for bagging -create_ml_args_bagging = function(data){ - - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - if(length(unique(Y)) >2){ - formula = data[["formula"]] - }else{ - formula = as.formula(paste("as.factor(Y) ~", paste(c("T", names(X)), collapse = "+"))) - } - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - - -# Create arguments for CART -create_ml_args_cart = function(data){ - - formula = data[["formula"]] - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - - - -# Create arguments for caret -create_ml_args_caret = function(data){ - - formula = data[["formula"]] - Y = data[["Y"]] - X = data[["X"]] - T = data[["T"]] - - data = cbind(Y, X, T) - - # also needed for testing: - data0t = cbind(Y, X, T = 0) - data1t = cbind(Y, X, T = 1) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - - - - -# # Create arguments for neural net -# -# create_ml_args_neuralnet = function(training_data, create_ml_arguments_outputs){ -# -# -# formula = create_ml_arguments_outputs[["formula"]] -# Y = create_ml_arguments_outputs[["Y"]] -# X = create_ml_arguments_outputs[["X"]] -# T = create_ml_arguments_outputs[["T"]] -# -# max = apply(training_data, 2 , max) -# min = apply(training_data, 2 , min) -# scaled_data = as.data.frame(scale(training_data, center = min, scale = max - min)) -# -# # also needed for testing: -# X0t = cbind(X, T = 0) -# X1t = cbind(X, T = 1) -# X0t_expand = model.matrix(~. -1, data = X0t) -# X1t_expand = model.matrix(~. -1, data = X1t) -# -# return(list(formula = formula, scaled_data = scaled_data, X0t_expand = X0t_expand, X1t_expand = X1t_expand)) -# } - - -# Create arguments for kNN -create_ml_args_knn = function(create_ml_arguments_outputs){ - - formula = create_ml_arguments_outputs[["formula"]] - Y = create_ml_arguments_outputs[["Y"]] - X = create_ml_arguments_outputs[["X"]] - T = create_ml_arguments_outputs[["T"]] - - data = cbind(Y, X, T) - - # also needed for testing: - X0t = cbind(X, T = 0) - X1t = cbind(X, T = 1) - data0t = cbind(Y, X0t) - data1t = cbind(Y, X1t) - - return(list(formula = formula, data = data, data0t = data0t, data1t = data1t)) -} - -# Re-organize cross-validation output to plot the AUPEC curve -getAupecOutput = function( - tauML, taucvML, That_pcv_mat, MLname, - NFOLDS, Ycv, Tcv, indcv -){ - aupec_grid = list() - Ycv = as.numeric(Ycv) - - for (j in 1:NFOLDS){ - tau = tauML[,j][!is.na(tauML[,j])] - aupec_grid[[j]] = AUPEC(Tcv[indcv==j], tau,Ycv[indcv==j]) - } - - ## use taucv - aupec_cv = AUPECcv(T = Tcv, tau = taucvML, Y = Ycv, ind = indcv) - - aupec_vec = data.frame(matrix(NA, ncol = NFOLDS, nrow = max(table(indcv)))) - for (j in 1:NFOLDS){ - aupec_vec[,j] = c(aupec_grid[[j]]$vec, rep(NA, nrow(aupec_vec) - length(aupec_grid[[j]]$vec))) - } - - aupec_vec = rowMeans(aupec_vec, na.rm = T) - outputdf = data.frame(type = rep(MLname,length(aupec_vec)), - fraction = seq(1,length(aupec_vec))/length(aupec_vec), - aupec = aupec_vec + mean(Ycv)) - - return(list(aupec_cv = aupec_cv, - aupec_vec = aupec_vec, - outputdf = outputdf)) -} - -# transformation function for taucv matrix -# gettaucv <- function( -# estimates, -# ... -# ){ -# # estimates <- fit$estimates -# fit_ml <- estimates$fit_ml -# n_folds <- estimates$params$n_folds -# tau_cv <- list() -# -# # for one model -# for (k in seq(n_folds)) { -# tau_cv[[k]] <- fit_ml[["causal_forest"]][[k]][["tau_cv"]] -# } -# -# # convert to a single matrix -# tau_cv <- do.call(cbind, tau_cv) -# -# return(tau_cv) -# -# } -gettaucv <- function(estimates, ...) { - # Assuming fit_ml is a named list of models - fit_ml <- estimates$fit_ml - n_folds <- estimates$params$n_folds - - # Prepare a list to store tau_cv for each model and each fold - all_models_tau_cv <- list() - - # Loop over all models in fit_ml - for (model_name in names(fit_ml)) { - model_tau_cv <- list() - - # For one model, loop over all k folds - for (k in seq(n_folds)) { - # Check if the k-th fold exists for the current model - if (is.list(fit_ml[[model_name]]) && k <= length(fit_ml[[model_name]])) { - # Check if tau_cv exists for the k-th fold of the current model - if ("tau_cv" %in% names(fit_ml[[model_name]][[k]])) { - model_tau_cv[[k]] <- fit_ml[[model_name]][[k]][["tau_cv"]] - } else { - warning(paste("tau_cv not found in fold", k, "of model", model_name)) - } - } else { - warning(paste("Fold", k, "not found in model", model_name)) - } - } - - # Convert to a single matrix and store it with the model's name - all_models_tau_cv[[model_name]] <- do.call(cbind, model_tau_cv) - } - - return(all_models_tau_cv) -} - - - - -# rename the columns of the data frame with the interaction terms -rename_interaction_terms <- function(interaction_df){ - colnames(interaction_df) <- gsub(":", "_", colnames(interaction_df)) - colnames(interaction_df) <- gsub("\\*", "_", colnames(interaction_df)) - colnames(interaction_df) <- gsub("\\(", "", colnames(interaction_df)) - colnames(interaction_df) <- gsub("\\)", "", colnames(interaction_df)) - colnames(interaction_df) <- gsub("\\+", "_", colnames(interaction_df)) - return(interaction_df) -} - - - -# function to convert formula and create new variables -convert_formula <- function(user_formula, data, treatment){ - - # get the outcome variable name from the formula - outcome <- all.vars(user_formula)[1] - - # get the covariates from the formula - interaction_df <- model.matrix(user_formula, data) - interaction_df <- rename_interaction_terms(interaction_df) - - # remove variable Intercept from covariates list by name - covariates_vec <- colnames(interaction_df) - covariates_vec <- covariates_vec[!covariates_vec %in% c("Intercept", paste0(treatment))] - # combine the interaction_df with the original data frame - new_data = data %>% dplyr::select(all_of(outcome)) - combined_data <- cbind(new_data, interaction_df) - - return(list(data = combined_data, covariates = covariates_vec, outcome = outcome)) -} - diff --git a/R/itr_plot.R b/R/itr_plot.R deleted file mode 100644 index 7d5e66d..0000000 --- a/R/itr_plot.R +++ /dev/null @@ -1,216 +0,0 @@ -#' Plot the AUPEC curve -#' @import ggplot2 -#' @import ggthemes -#' @importFrom stats sd -#' @importFrom rlang .data -#' @param x An object of \code{evaluate_itr()} class. This is typically an output of \code{evaluate_itr()} function. -#' @param ... Further arguments passed to the function. -#' @return A plot of ggplot2 object. -#' @export -plot.itr <- function(x, ...){ - -# parameters -estimate = x -estimate_algs = estimate$out_algs -estimate_user = estimate$out_user -data_algs = tibble() -data_user = tibble() - -# fit = estimate$qoi -# cv = estimate$cv -# user_itr = ifelse(is.null(estimate$user_itr), FALSE, estimate$user_itr) - -# ----------------------------------------- -# estimate ITR from ML algorithms -# ----------------------------------------- - -if(length(estimate_algs) != 0){ - - # parameters - fit = estimate_algs$qoi - cv = estimate_algs$cv - - # format output under cross validation ----------------------------------------- - - if(cv == TRUE){ - - # parameters - outcome = estimate_algs$df$outcome - data = estimate_algs$df$data - algorithms = estimate_algs$df$algorithms - treatment = estimate_algs$df$treatment - - graphLabels <- data.frame( - type = algorithms, - Pval = map( - fit$AUPEC, ~.x$aupec_cv) %>% - bind_rows() %>% - mutate(Pval = paste0("AUPEC = ", round(aupec, 2), " (s.e. = ", round(sd, 2), ")")) %>% pull(Pval)) - - Tcv = data %>% pull(treatment) %>% as.numeric() - Ycv = data %>% pull(outcome) %>% as.numeric() - - bind_rows(map(fit$AUPEC, ~.x$aupec_cv)) %>% - mutate(type = algorithms) %>% - inner_join(bind_rows( - map(fit$AUPEC, ~.x$outputdf)), - by = "type" - ) %>% - mutate(AUPECmin = aupec.y - 1.96*sd, - AUPECmax = aupec.y + 1.96*sd) %>% - rename(aupec = aupec.y) -> data_algs - - } - - # format output under sample splitting ----------------------------------------- - if(cv == FALSE){ - - # parameters - data = estimate_algs$df$data - algorithms = estimate_algs$df$algorithms - - graphLabels <- data.frame( - type = algorithms, - Pval = map( - fit$AUPEC, ~.x[c('aupec', 'sd')]) %>% - bind_rows() %>% - mutate(Pval = paste0("AUPEC = ", round(aupec, 2), " (s.e. = ", round(sd, 2), ")")) %>% pull(Pval)) - - Tcv = estimate_algs$estimates[['Tcv']] %>% as.numeric() - Ycv = estimate_algs$estimates[['Ycv']] %>% as.numeric() - - map(fit$AUPEC, ~.x) %>% - bind_rows() %>% - mutate( - aupec = vec + mean(Ycv), - fraction = rep(seq(1,length(Ycv))/length(Ycv), length(algorithms)), - type = lapply(algorithms, function(x)rep(x,length(Ycv))) %>% unlist) %>% - mutate(AUPECmin = aupec - 1.96*sd, - AUPECmax = aupec + 1.96*sd) -> data_algs - } -} - -# ----------------------------------------- -# get ITR from the user-defined function -# ----------------------------------------- -if(length(estimate_user) != 0){ - - # parameters - fit = estimate_user$qoi - cv = estimate_user$cv - - Tcv = estimate_user$estimates[['Tcv']] %>% as.numeric() - Ycv = estimate_user$estimates[['Ycv']] %>% as.numeric() - - graphLabels <- data.frame( - type = "user-defined ITR", - Pval = map( - fit$AUPEC, ~.x[c('aupec', 'sd')]) %>% - bind_rows() %>% - mutate(Pval = paste0("AUPEC = ", round(aupec, 2), " (s.e. = ", round(sd, 2), ")")) %>% pull(Pval)) - - fit$AUPEC %>% - bind_rows() %>% - mutate( - aupec = vec + mean(Ycv), - fraction = rep(seq(1,length(Ycv))/length(Ycv),1), - type = lapply("user-defined ITR", function(x)rep(x,length(Ycv))) %>% unlist) %>% - mutate(AUPECmin = aupec - 1.96*sd, - AUPECmax = aupec + 1.96*sd) -> data_user -} - -# dataframe for plotting -data <- bind_rows(data_algs, data_user) - -# plot -ggplot(data, aes(x=fraction,y=aupec,group=type)) + - geom_line(alpha=0.5,colour="red") + - scale_colour_few("Dark")+ - xlab("Maximum Proportion Treated")+ - ylab("AUPEC")+ - facet_wrap(~type)+ - scale_x_continuous(labels=scales::percent)+ - scale_y_continuous( - limits = c(min(data$AUPECmin, na.rm = TRUE)-0.5, max(data$AUPECmax, na.rm = TRUE)+ 0.5))+ - theme_few()+ - geom_ribbon( - aes(ymin=AUPECmin, ymax=AUPECmax),fill="tomato1",alpha=0.2) + - geom_abline( - intercept = sum(Ycv*(1-Tcv))/sum(1-Tcv), slope = sum(Ycv*Tcv)/sum(Tcv)-sum(Ycv*(1-Tcv))/sum(1-Tcv),linewidth=0.5) + - geom_text( - data = graphLabels, aes(x = 0.57, y = max(data$AUPECmax, na.rm = TRUE)+0.35, label = Pval),size=3) + - theme(text = element_text(size=13.5), - axis.text = element_text(size=10), - strip.text = element_text(size = 13.5)) -> out - - return(out) -} - - -#' Plot the GATE estimate -#' @import ggplot2 -#' @import ggthemes -#' @importFrom stats sd -#' @importFrom rlang .data -#' @param x An table object. This is typically an output of \code{evaluate_itr()} function. -#' @param type The metric that you wish to plot. One of GATE, PAPE, PAPEp, or PAPDp. -#' @param ... Further arguments passed to the function. -#' @importFrom ggplot2 .data -#' @return A plot of ggplot2 object. -#' @export -plot_estimate <- function(x, type, ...){ - -# parameters -estimate = x - -if(type == "GATE"){ - -gate_ggplot <- function(data) { - ggplot(data, aes( - x = .data$group, y = .data$estimate, - ymin = .data$lower , ymax = .data$upper, color = .data$algorithm)) + - ggdist::geom_pointinterval( - width = 0.5, - position = position_dodge(0.5), - interval_size_range = c(0.8, 1.5), - fatten_point = 2.5) + - theme_bw() + - theme(panel.grid = element_blank(), - panel.background = element_blank()) + - labs(x = "Group", y = "GATE estimate") + - geom_hline(yintercept = 0, linetype = "dashed", color = "#4e4e4e") -} - -out = gate_ggplot(estimate) -} - -if(type %in% c("PAPE", "PAPEp", "PAPDp")){ - - estimate <- estimate %>% - mutate( - algorithm = as.factor(algorithm), - lower = .data$estimate - 1.96 * .data$std.deviation, - upper = .data$estimate + 1.96 * .data$std.deviation) - pape_ggplot <- function(data) { - ggplot(data, aes( - x = .data$algorithm, y = .data$estimate, - ymin = .data$lower , ymax = .data$upper, color = .data$algorithm)) + - ggdist::geom_pointinterval( - width = 0.5, - position = position_dodge(0.5), - interval_size_range = c(0.8, 1.5), - fatten_point = 2.5) + - theme_bw() + - theme(panel.grid = element_blank(), - panel.background = element_blank()) + - labs(x = "Algorithm", y = type) + - geom_hline(yintercept = 0, linetype = "dashed", color = "#4e4e4e") - } - - out = pape_ggplot(estimate) - - } - -return(out) - -} diff --git a/R/itr_qoi.R b/R/itr_qoi.R deleted file mode 100644 index 47ac311..0000000 --- a/R/itr_qoi.R +++ /dev/null @@ -1,249 +0,0 @@ -#' Compute Quantities of Interest (PAPE, PAPEp, PAPDp, AUPEC, GATE, GATEcv) -#' @param fit_obj An output object from \code{fit_itr} function. -#' @param algorithms Machine learning algorithms -#' @importFrom rlang .data - -compute_qoi <- function(fit_obj, algorithms) { - - ## extract objects - fit_ml <- fit_obj$fit_ml - params <- fit_obj$params - Ycv <- fit_obj$Ycv - Tcv <- fit_obj$Tcv - indcv <- fit_obj$indcv - budget <- fit_obj$budget - cv <- fit_obj$params$cv - - ## ----------------------------------------- - ## compute quantities under cross validation - ## ----------------------------------------- - if (cv == TRUE) { - - ## PAPE and PAPEp - PAPE <- PAPEp <- vector("list", params$n_alg) - for (i in seq_len(params$n_alg)) { - ## make That_cv into matrix - That_cv_mat <- furrr::future_map(fit_ml[[ algorithms[i] ]], ~.x$That_cv) %>% do.call(cbind, .) - That_pcv_mat <- furrr::future_map(fit_ml[[ algorithms[i] ]], ~.x$That_pcv) %>% do.call(cbind, .) - - ## compute PAPE - PAPE[[i]] <- PAPEcv(Tcv, That_cv_mat, Ycv, indcv) - - ## compute PAPEp - PAPEp[[i]] <- PAPEcv(Tcv, That_pcv_mat, Ycv, indcv, budget) - - ## name - PAPE[[i]]$alg <- PAPEp[[i]]$alg <- algorithms[i] - } - - - ## PAPDp - PAPDp <- list() - if (params$n_alg > 1) { - count <- 1 - - for (i in 1:(params$n_alg-1)) { - That_pcv_i <- furrr::future_map(fit_ml[[ algorithms[i] ]], ~.x$That_pcv) %>% do.call(cbind, .) - - for (j in (i+1):params$n_alg) { - # compare algorithm[i] and algorithm[j] - That_pcv_j <- furrr::future_map(fit_ml[[ algorithms[j] ]], ~.x$That_pcv) %>% do.call(cbind, .) - - PAPDp[[count]] <- PAPDcv( - Tcv, That_pcv_i, That_pcv_j, Ycv, indcv, budget - ) - - PAPDp[[count]]$alg <- paste0(algorithms[i], " x ", algorithms[j]) - ## update iterator - count <- count + 1 - } - } - } else { - cat("Cannot compute PAPDp") - } - - - ## Compute AUPEC - aupec <- vector("list", length = length(algorithms)) - for (i in seq_along(algorithms)) { - tau <- furrr::future_map(fit_ml[[i]], ~.x$tau) %>% do.call(cbind, .) - tau_cv <- furrr::future_map(fit_ml[[i]], ~.x$tau_cv) %>% do.call(cbind, .) - That_pcv_mat <- furrr::future_map(fit_ml[[i]], ~.x$That_pcv) %>% do.call(cbind, .) - - aupec[[i]] <- getAupecOutput( - tau, tau_cv, That_pcv_mat, algorithms[i], - NFOLDS = params$n_folds, Ycv = Ycv, Tcv = Tcv, indcv = indcv - ) - } - - ## GATE - GATE <- vector("list", length = length(algorithms)) - for (i in seq_along(algorithms)) { - tau <- furrr::future_map(fit_ml[[i]], ~.x$tau) %>% do.call(cbind, .) - tau_cv <- furrr::future_map(fit_ml[[i]], ~.x$tau_cv) %>% do.call(cbind, .) - - ## Compute GATE - GATE[[i]] <- GATEcv(Tcv, tau_cv, Ycv, indcv, params$ngates) - - ## indicate algorithm - GATE[[i]]$alg <- algorithms[i] - - ## indicate group number - GATE[[i]]$group <- seq_along(GATE[[i]]$gate) - } - - } - - - ## ----------------------------------------- - ## compute quantities under sample splitting - ## ----------------------------------------- - if (cv == FALSE) { - - ## PAPE and PAPEp - PAPE <- PAPEp <- vector("list", params$n_alg) - for (i in seq_len(params$n_alg)) { - - ## compute PAPE - PAPE[[i]] <- PAPE(Tcv, fit_ml[[i]][["That_cv"]], Ycv, centered = TRUE) - - ## compute PAPEp: sp does not have papep, check PAPE.R - PAPEp[[i]] <- PAPE(Tcv, fit_ml[[i]][["That_pcv"]], Ycv, centered = TRUE, budget) - - ## name - PAPE[[i]]$alg <- PAPEp[[i]]$alg <- algorithms[i] - } - - ## PAPDp - PAPDp <- list() - if (params$n_alg > 1) { - count <- 1 - - for (i in 1:(params$n_alg-1)) { - That_pcv_i <- fit_ml[[i]][["That_pcv"]] - - for (j in (i+1):params$n_alg) { - # compare algorithm[i] and algorithm[j] - That_pcv_j <- fit_ml[[j]][["That_pcv"]] - - PAPDp[[count]] <- PAPD( - Tcv, That_pcv_i, That_pcv_j, Ycv, budget, centered = TRUE - ) - - PAPDp[[count]]$alg <- paste0(algorithms[i], " x ", algorithms[j]) - ## update iterator - count <- count + 1 - } - } - } else { - cat("Cannot compute PAPDp") - } - - ## AUPEC - aupec <- vector("list", length = length(algorithms)) - for (i in seq_along(algorithms)) { - - aupec[[i]] <- AUPEC(Tcv, fit_ml[[i]][["tau"]], Ycv, centered = TRUE) - - } - - ## GATE - GATE <- vector("list", length = length(algorithms)) - for (i in seq_along(algorithms)) { - - ## Compute GATE - GATE[[i]] <- GATE(Tcv, fit_ml[[i]][["tau"]], Ycv, params$ngates) - - ## indicate algorithm - GATE[[i]]$alg <- algorithms[i] - - ## indicate group number - GATE[[i]]$group <- seq_along(GATE[[i]]$gate) - } - } - - out <- list( - PAPE = PAPE, - PAPEp = PAPEp, - PAPDp = PAPDp, - AUPEC = aupec, - GATE = GATE) - - return(out) -} - - - -#' Compute Quantities of Interest (PAPE, PAPEp, PAPDp, AUPEC, GATE, GATEcv) with user defined functions -#' @param user_itr A user-defined function to create an ITR. The function should take the data as input and return an unit-level continuous score for treatment assignment. We assume those that have score less than 0 should not have treatment. The default is \code{NULL}, which means the ITR will be estimated from the \code{estimate_itr}. -#' @param Tcv A vector of the unit-level binary treatment. -#' @param Ycv A vector of the unit-level continuous outcome. -#' @param data A data frame containing the variables of interest. -#' @param ngates The number of gates to be used in the GATE function. -#' @param budget The maximum percentage of population that can be treated under the budget constraint. -#' @param ... Additional arguments to be passed to the user-defined function. -#' @importFrom rlang .data -compute_qoi_user <- function(user_itr, Tcv, Ycv, data, ngates, budget, ...) { - - # parameters - function_name <- as.character(substitute(user_itr)) - - # ITR - tau <- do.call(user_itr, list(data)) - That <- ifelse(tau >= 0, 1, 0) - - # ITR with budget constraint - That_p <- numeric(length(That)) - That_p[sort(tau,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau))+1)]] = 1 - - # PAPE - PAPE <- PAPEp <- vector("list", length(user_itr)) - for (i in seq_len(length(user_itr))) { - - ## compute PAPE - PAPE[[i]] <- PAPE(Tcv, That, Ycv, centered = TRUE) - - ## compute PAPEp - PAPEp[[i]] <- PAPE(Tcv, That_p, Ycv, centered = TRUE, budget) - - ## name - PAPE[[i]]$alg <- function_name[i] - - PAPEp[[i]]$alg <- function_name[i] - - } - - ## AUPEC - aupec <- vector("list", length = length(user_itr)) - for (i in seq_along(length(user_itr))) { - - # compute AUPEC - aupec[[i]] <- AUPEC(Tcv, tau, Ycv, centered = TRUE) - - # name - aupec[[i]]$alg <- function_name[i] - } - - ## GATE - GATE <- vector("list", length = length(user_itr)) - for (i in seq_along(length(user_itr))) { - - ## Compute GATE - GATE[[i]] <- GATE(Tcv, tau, Ycv, ngates) - - ## indicate algorithm - GATE[[i]]$alg <- function_name[i] - - ## indicate group number - GATE[[i]]$group <- seq_along(GATE[[i]]$gate) - } - - out <- list( - PAPE = PAPE, - PAPEp = PAPEp, - PAPDp = NULL, # single algorithm - AUPEC = aupec, - GATE = GATE) - - return(out) -} diff --git a/R/itr_run_bagging.R b/R/itr_run_bagging.R deleted file mode 100644 index be7d1c0..0000000 --- a/R/itr_run_bagging.R +++ /dev/null @@ -1,152 +0,0 @@ - - -## bagging - -run_bagging <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_bagging(dat_train) - - - ## test - fit_test <- test_bagging( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - -train_bagging <- function(dat_train) { - - ## format data - training_data_elements_bagging = create_ml_args_bagging(dat_train) - - ## train formula - formula_bagging = training_data_elements_bagging[["formula"]] - - ## tunning parameter - tune_parameter = ncol(training_data_elements_bagging[["data"]]) -1 - - ## fit - fit <- randomForest::randomForest(formula_bagging, - data = training_data_elements_bagging[["data"]], - mtry=tune_parameter, ntree = 500, - norm.votes=TRUE) - - return(fit) - -} - -#'@importFrom stats predict runif -test_bagging <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_bagging = create_ml_args_bagging(dat_test) - total_data_elements_bagging = create_ml_args_bagging(dat_total) - - ## outcome - outcome = testing_data_elements_bagging[["data"]][["Y"]] - - if(cv == TRUE){ - - if(length(unique(outcome)) > 2){ - - ## predict - Y0t_total = predict( - fit_train, - newdata = total_data_elements_bagging[["data0t"]]) - Y1t_total = predict( - fit_train, - newdata = total_data_elements_bagging[["data1t"]]) - - }else{ - - ## predict - Y0t_total = predict( - fit_train, - newdata = total_data_elements_bagging[["data0t"]], - type = "prob")[, 2] - Y1t_total = predict( - fit_train, - newdata = total_data_elements_bagging[["data1t"]], - type = "prob")[, 2] - } - - tau_total = Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - - if(length(unique(outcome)) > 2){ - - ## predict - Y0t_test = predict( - fit_train, - newdata = testing_data_elements_bagging[["data0t"]]) - Y1t_test = predict( - fit_train, - newdata = testing_data_elements_bagging[["data1t"]]) - - }else{ - - ## predict - Y0t_test = predict( - fit_train, - newdata = testing_data_elements_bagging[["data0t"]], - type = "prob")[, 2] - Y1t_test = predict( - fit_train, - newdata = testing_data_elements_bagging[["data1t"]], - type = "prob")[, 2] - } - - tau_test = Y1t_test - Y0t_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - - } - - return(cf_output) -} - - diff --git a/R/itr_run_bart.R b/R/itr_run_bart.R deleted file mode 100644 index ec71f71..0000000 --- a/R/itr_run_bart.R +++ /dev/null @@ -1,101 +0,0 @@ -#' -run_bartc <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_bartc(dat_train) - - ## test - fit_test <- test_bartc( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_bartc <- function(dat_train) { - - ## format training data - training_data_elements_bartc = create_ml_args_bartc(dat_train) - - ## fit - fit <- bartCause::bartc(response = training_data_elements_bartc[["Y"]], - treatment = training_data_elements_bartc[["T"]], - confounders = training_data_elements_bartc[["X"]], - keepTrees = TRUE) - - return(fit) -} - -#'@importFrom stats predict runif -test_bartc <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_bartc = create_ml_args_bartc(dat_test) - total_data_elements_bartc = create_ml_args_bartc(dat_total) - - if(cv == TRUE){ - ## predict - Y0t_total=predict(fit_train,total_data_elements_bartc[["X0t"]]) - Y1t_total=predict(fit_train,total_data_elements_bartc[["X1t"]]) - - tau_total=colMeans(Y1t_total)-colMeans(Y0t_total) + runif(n_df,-1e-6,1e-6) - - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t_test=predict(fit_train,testing_data_elements_bartc[["X0t"]]) - Y1t_test=predict(fit_train,testing_data_elements_bartc[["X1t"]]) - - tau_test=colMeans(Y1t_test)-colMeans(Y0t_test) - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - return(cf_output) -} - -# Y0t<-predict(barc1,X0t) -# Y1t<-predict(barc1,X1t) -# tau_test2<-Y1t-Y0t -# That2=as.numeric(tau_test2>0) diff --git a/R/itr_run_bartmachine.R b/R/itr_run_bartmachine.R deleted file mode 100644 index e1268b9..0000000 --- a/R/itr_run_bartmachine.R +++ /dev/null @@ -1,81 +0,0 @@ -#' -run_bartmachine <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - ## train - fit_train <- train_bart(dat_train) - - - ## test - fit_test <- test_bart( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget - ) - - return(list(test = fit_test, train = fit_train)) -} - - -#' @import haven -train_bart <- function(dat_train) { - - ## format training data - training_data_elements_bart = create_ml_args_bart(dat_train) - - ## format binary outcome - outcome_bart = training_data_elements_bart[["Y"]] - - if(length(unique(outcome_bart)) == 2){ - outcome_bart = factor(outcome_bart, levels = c(1,0)) - } - - ## fit - fit <- bartMachine::bartMachine( - X=training_data_elements_bart[["X_and_T"]], - y=outcome_bart, - num_trees = 30, - run_in_sample = TRUE, - serialize = TRUE) - - return(fit) -} - -#'@importFrom stats predict runif -test_bart <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget -) { - - ## format data - testing_data_elements_bart = create_ml_args_bart(dat_test) - total_data_elements_bart = create_ml_args_bart(dat_total) - - ## predict - Y0t_total=predict(fit_train,total_data_elements_bart[["X0t"]]) - Y1t_total=predict(fit_train,total_data_elements_bart[["X1t"]]) - - tau_total=Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - - return(cf_output) -} diff --git a/R/itr_run_boost.R b/R/itr_run_boost.R deleted file mode 100644 index aee6a07..0000000 --- a/R/itr_run_boost.R +++ /dev/null @@ -1,131 +0,0 @@ - -## boosted tree - -run_boost <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_boost(dat_train) - - ## test - fit_test <- test_boost( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_boost <- function(dat_train) { - - ## format training data - training_data_elements_boosted = create_ml_args_boosted(dat_train) - - ## train formula - formula_boosted = training_data_elements_boosted[["formula"]] - - ## outcome - outcome = training_data_elements_boosted[["data"]][["Y"]] - - if(length(unique(outcome)) > 2){ - ## fit - fit <- gbm::gbm(formula_boosted, data = training_data_elements_boosted[["data"]], - distribution = "gaussian", - n.trees = 5000, - interaction.depth = 4) - }else { - ## fit - fit <- gbm::gbm(formula_boosted, data = training_data_elements_boosted[["data"]], - distribution = "bernoulli", - n.trees = 5000, - interaction.depth = 4) - } - - return(fit) - -} - -#'@importFrom stats predict runif -test_boost <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, - iter, budget, cv -) { - - ## format data - testing_data_elements_boosted = create_ml_args_boosted(dat_test) - - total_data_elements_boosted = create_ml_args_boosted(dat_total) - - if(cv == TRUE){ - ## predict - Y0t_total = predict( - fit_train, - as.data.frame(total_data_elements_boosted[["data0t"]]), - type = "response") - Y1t_total = predict( - fit_train, - as.data.frame(total_data_elements_boosted[["data1t"]]), - type = "response") - - tau_total = Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t_test = predict( - fit_train, - as.data.frame(testing_data_elements_boosted[["data0t"]]), - type = "response") - Y1t_test = predict( - fit_train, - as.data.frame(testing_data_elements_boosted[["data1t"]]), - type = "response") - - tau_test = Y1t_test - Y0t_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - - - - - diff --git a/R/itr_run_caret.r b/R/itr_run_caret.r deleted file mode 100644 index b36e7a2..0000000 --- a/R/itr_run_caret.r +++ /dev/null @@ -1,130 +0,0 @@ - -## caret package - -run_caret <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget, - train_method, - ... -) { - - # split/cross-validation - cv <- params$cv - - # caret train parameters - train_params <- params$train_params - - ## train - fit_train <- train_caret(dat_train, train_params, train_method, ...) - - ## test - fit_test <- test_caret( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_caret <- function(dat_train, train_params, train_method, ...) { - - ## format training data - training_data_elements_caret = create_ml_args_caret(dat_train) - - ## train formula - covariates = training_data_elements_caret[["data"]] %>% dplyr::select(-c(Y, T)) %>% colnames() - - formula = as.formula(paste("Y ~ (", paste0(covariates, collapse = "+"), ")*T")) - - ## add additional parameters from ... - train_params = c(train_params, list(...)) - - ## train - fit <- do.call(caret::train, c(list( - formula, - data = training_data_elements_caret[["data"]], - method = train_method), - train_params)) - - return(fit) - -} - -#'@importFrom stats predict runif -test_caret <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, - iter, budget, cv -) { - - ## format data - testing_data_elements_caret = create_ml_args_caret(dat_test) - total_data_elements_caret = create_ml_args_caret(dat_total) - - if(cv == TRUE){ - ## predict - Y0t_total = predict( - fit_train, - as.data.frame(total_data_elements_caret[["data0t"]]), - type = "raw") - Y1t_total = predict( - fit_train, - as.data.frame(total_data_elements_caret[["data1t"]]), - type = "raw") - - tau_total = Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t_test = predict( - fit_train, - as.data.frame(testing_data_elements_caret[["data0t"]]), - type = "raw") - Y1t_test = predict( - fit_train, - as.data.frame(testing_data_elements_caret[["data1t"]]), - type = "raw") - - tau_test = Y1t_test - Y0t_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - - - - - diff --git a/R/itr_run_cart.R b/R/itr_run_cart.R deleted file mode 100644 index 4742ee0..0000000 --- a/R/itr_run_cart.R +++ /dev/null @@ -1,148 +0,0 @@ - - -## cart - - -run_cart <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_cart(dat_train) - - ## test - fit_test <- test_cart( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - - return(list(test = fit_test, train = fit_train)) -} - - -#' @import rpart -train_cart <- function(dat_train) { - - ## format training data - training_data_elements_cart = create_ml_args_cart(dat_train) - - ## train formula - formula_cart = training_data_elements_cart[["formula"]] - - ## outcome - outcome = training_data_elements_cart[["data"]][["Y"]] - - if(length(unique(outcome)) > 2){ - ## fit - fit <- rpart(formula_cart, data = training_data_elements_cart[["data"]], method = "anova") - # control = rpart.control(minsplit = 2, minbucket = 1, - # cp = 0.0015)) #relax the contraint for cart - }else { - ## fit - fit <- rpart(formula_cart, data = training_data_elements_cart[["data"]], method = "class") - } - - return(fit) -} - -#'@importFrom stats predict runif -test_cart <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_cart = create_ml_args_cart(dat_test) - total_data_elements_cart = create_ml_args_cart(dat_total) - - ## outcome - outcome = testing_data_elements_cart[["data"]][["Y"]] - - if(cv == TRUE){ - - if(length(unique(outcome)) > 2){ - ## predict - Y0t_total = predict(fit_train, newdata=total_data_elements_cart[["data0t"]]) - Y1t_total = predict(fit_train, newdata=total_data_elements_cart[["data1t"]]) - - }else { - ## predict - Y0t_total = predict( - fit_train, - newdata = total_data_elements_cart[["data0t"]], - type = "prob")[, 2] - Y1t_total = predict( - fit_train, - newdata = total_data_elements_cart[["data1t"]], - type = "prob")[, 2] - } - - # predicted tau - tau_total=Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - - if(length(unique(outcome)) > 2){ - ## predict - Y0t_test = predict(fit_train, newdata=testing_data_elements_cart[["data0t"]]) - Y1t_test = predict(fit_train, newdata=testing_data_elements_cart[["data1t"]]) - - }else { - ## predict - Y0t_test = predict( - fit_train, - newdata = testing_data_elements_cart[["data0t"]], - type = "prob")[, 2] - Y1t_test = predict( - fit_train, - newdata = testing_data_elements_cart[["data1t"]], - type = "prob")[, 2] - } - - # predicted tau - tau_test = Y1t_test - Y0t_test + runif(length(Y0t_test),-1e-6,1e-6) - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - - return(cf_output) -} - - diff --git a/R/itr_run_causal-forest.R b/R/itr_run_causal-forest.R deleted file mode 100644 index 7245d5c..0000000 --- a/R/itr_run_causal-forest.R +++ /dev/null @@ -1,101 +0,0 @@ - - -## causal-forest - -run_causal_forest <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_causal_forest(dat_train) - - ## test - fit_test <- test_causal_forest( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_causal_forest <- function(dat_train) { - - ## format training data - training_data_elements_cf <- create_ml_args_causalforest(dat_train) - - ## fit - fit <- grf::causal_forest( - training_data_elements_cf[["X_expand"]], - training_data_elements_cf[["Y"]], - training_data_elements_cf[["T"]], - num.trees = 2000 - ) - return(fit) -} - -#'@importFrom stats predict runif -test_causal_forest <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_cf <- create_ml_args_causalforest(dat_test) - - total_data_elements_cf <- create_ml_args_causalforest(dat_total) - - if(cv == TRUE){ - ## predict - tau_total <- predict( - fit_train, - total_data_elements_cf[["X_expand"]] - )$predictions + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - - } - - if(cv == FALSE){ - ## predict - tau_test <- predict( - fit_train, - testing_data_elements_cf[["X_expand"]])$predictions - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - diff --git a/R/itr_run_lasso.R b/R/itr_run_lasso.R deleted file mode 100644 index b706d0e..0000000 --- a/R/itr_run_lasso.R +++ /dev/null @@ -1,145 +0,0 @@ - -## lasso - -run_lasso <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_lasso(dat_train) - - ## test - fit_test <- test_lasso( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - - return(list(test = fit_test, train = fit_train)) -} - - - -train_lasso <- function(dat_train) { - - ## format training data - training_data_elements_lasso <- create_ml_args_lasso(dat_train) - - ## outcome - outcome = training_data_elements_lasso[["Y"]] - - if(length(unique(outcome)) > 2){ - ## find the best lambda - # cv.lasso <- glmnet::cv.glmnet( - # training_data_elements_lasso[["X_expand"]], - # training_data_elements_lasso[["Y"]], - # alpha = 1, - # family = "gaussian") - - ## fit - fit <- glmnet::glmnet( - training_data_elements_lasso[["X_expand"]], - training_data_elements_lasso[["Y"]], - alpha = 1, - family = "gaussian", - # lambda = cv.lasso$lambda.min) - lambda = 0.05) - - }else { - ## find the best lambda - # cv.lasso <- glmnet::cv.glmnet( - # training_data_elements_lasso[["X_expand"]], - # training_data_elements_lasso[["Y"]], - # alpha = 1, - # family = "binomial") - - ## fit - fit <- glmnet::glmnet( - training_data_elements_lasso[["X_expand"]], - training_data_elements_lasso[["Y"]], - alpha = 1, - family = "binomial", - # lambda = cv.lasso$lambda.min) - lambda = 0.05) - } - - return(fit) -} - -#'@importFrom stats predict runif -test_lasso <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_lasso <- create_ml_args_lasso(dat_test) - total_data_elements_lasso <- create_ml_args_lasso(dat_total) - - if(cv == TRUE){ - ## predict - Y0t1_total = predict( - fit_train, - total_data_elements_lasso[["X0t_expand"]], - type = "response") - Y1t1_total = predict( - fit_train, - total_data_elements_lasso[["X1t_expand"]], - type = "response") - - tau_total=Y1t1_total-Y0t1_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t1_test = predict( - fit_train, - testing_data_elements_lasso[["X0t_expand"]], - type = "response") - Y1t1_test = predict( - fit_train, - testing_data_elements_lasso[["X1t_expand"]], - type = "response") - - tau_test=Y1t1_test-Y0t1_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - - diff --git a/R/itr_run_random-forest.R b/R/itr_run_random-forest.R deleted file mode 100644 index ee39af0..0000000 --- a/R/itr_run_random-forest.R +++ /dev/null @@ -1,148 +0,0 @@ - - -## random forest - -run_random_forest <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_random_forest(dat_train) - - ## test - fit_test <- test_random_forest( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_random_forest <- function(dat_train) { - - ## format training data - training_data_elements_rf = create_ml_args_rf(dat_train) - - ## train formula - formula_rf = training_data_elements_rf[["formula"]] - - ## fit - fit <- randomForest::randomForest(formula_rf, data = training_data_elements_rf[["data"]], ntree = 500) - - return(fit) -} - -#'@importFrom stats predict runif -test_random_forest <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_rf = create_ml_args_rf(dat_test) - total_data_elements_rf = create_ml_args_rf(dat_total) - - ## outcome - outcome = testing_data_elements_rf[["data"]][["Y"]] - - if(cv == TRUE){ - - if(length(unique(outcome)) > 2){ - - ## predict - Y0t_total = predict( - fit_train, - newdata = total_data_elements_rf[["data0t"]]) - Y1t_total = predict( - fit_train, - newdata = total_data_elements_rf[["data1t"]]) - - }else { - - ## predict - Y0t_total = predict( - fit_train, - newdata = total_data_elements_rf[["data0t"]], - type = "prob")[, 2] - Y1t_total = predict( - fit_train, - newdata = total_data_elements_rf[["data1t"]], - type = "prob")[, 2] - } - - tau_total=Y1t_total - Y0t_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - - if(length(unique(outcome)) > 2){ - - ## predict - Y0t_test = predict( - fit_train, - newdata = testing_data_elements_rf[["data0t"]]) - Y1t_test = predict( - fit_train, - newdata = testing_data_elements_rf[["data1t"]]) - - }else { - - ## predict - Y0t_test = predict( - fit_train, - newdata = testing_data_elements_rf[["data0t"]], - type = "prob")[, 2] - Y1t_test = predict( - fit_train, - newdata = testing_data_elements_rf[["data1t"]], - type = "prob")[, 2] - } - - tau_test=Y1t_test - Y0t_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - - - - - - diff --git a/R/itr_run_superlearner.R b/R/itr_run_superlearner.R deleted file mode 100644 index e053322..0000000 --- a/R/itr_run_superlearner.R +++ /dev/null @@ -1,132 +0,0 @@ -## superLearner -run_superLearner <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget, - train_method, - SL_library, - ... -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_superLearner( - dat_train, - train_method, - SL_library) - - ## test - fit_test <- test_superLearner( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - -#' @importFrom stats binomial gaussian -#' @importFrom SuperLearner SuperLearner -train_superLearner <- function(dat_train, train_method, SL_library) { - - ## format training data - training_data_elements <- create_ml_args_superLearner(dat_train) - - ## parameters - Y = training_data_elements[["Y"]] - X = training_data_elements[["X_expand"]] - SL_library = SL_library - - if(length(unique(Y)) > 2){ - - fit <- SuperLearner( - Y = Y, - X = X, - family = gaussian(), - SL.library = SL_library) - - }else { - - fit <- SuperLearner( - Y = Y, - X = X, - family = binomial(), - SL.library = SL_library) - } - - return(fit) -} - -#'@importFrom stats predict runif -test_superLearner <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements <- create_ml_args_superLearner(dat_test) - total_data_elements <- create_ml_args_superLearner(dat_total) - - if(cv == TRUE){ - ## predict - Y0t1_total = predict( - fit_train, - testing_data_elements[["X0t_expand"]], - onlySL = TRUE) - Y1t1_total = predict( - fit_train, - total_data_elements[["X1t_expand"]], - onlySL = TRUE) - - tau_total=Y1t1_total$pred-Y0t1_total$pred + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t1_test = predict( - fit_train, - testing_data_elements[["X0t_expand"]], - onlySL = TRUE) - Y1t1_test = predict( - fit_train, - testing_data_elements[["X1t_expand"]], - onlySL = TRUE) - - tau_test = Y1t1_test$pred - Y0t1_test$pred - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - - diff --git a/R/itr_run_svm.R b/R/itr_run_svm.R deleted file mode 100644 index 9c3d661..0000000 --- a/R/itr_run_svm.R +++ /dev/null @@ -1,129 +0,0 @@ - -## svm - -run_svm <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget -) { - - # split/cross-validation - cv <- params$cv - - ## train - fit_train <- train_svm(dat_train) - - ## test - fit_test <- test_svm( - fit_train, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_train)) -} - - - -train_svm <- function(dat_train) { - - ## format training data - training_data_elements_svm <- create_ml_args_svm(dat_train) - formula_svm = training_data_elements_svm[["formula"]] - - ## fit - fit <- e1071::svm(formula_svm, - data = training_data_elements_svm[["data"]], - gamma = 1, - cost = 1, - scale = TRUE, - epsolon = 0.1, - type = "eps-regression") - - # fit <- fit(formula_svm, - # data=training_data_elements_svm[["data"]], - # model="svm", - # gamma = 1, - # C = 1, - # scaled = TRUE, - # epsilon = 0.1, - # kpar = list(sigma = 1), - # type = "eps-svr") - - # fit.pred =function(fit,data) {return (predict(fit,data)) } - # svm.imp <- Importance(fit, - # data=training_data_elements_svm[["data"]], - # PRED = fit.pred, - # outindex = 1, - # method = "svm") - - # fit.tune <- tune(svm, - # formula_svm, - # data = training_data_elements_svm[["data"]], - # ranges = list( - # cost = c(0.1,1,10,100,1000), - # gamma = c(0.0001,0.001,0.01,0.1,1) - # )) - # fit <- fit.tune$best.model - - return(fit) -} - -#'@importFrom stats predict runif -test_svm <- function( - fit_train, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - ## format data - testing_data_elements_svm = create_ml_args_svm(dat_test) - total_data_elements_svm = create_ml_args_svm(dat_total) - - if(cv == TRUE){ - ## predict - Y0t1_total=predict(fit_train,total_data_elements_svm[["data0t"]]) - Y1t1_total=predict(fit_train,total_data_elements_svm[["data1t"]]) - - tau_total=Y1t1_total-Y0t1_total + runif(n_df,-1e-6,1e-6) - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- as.numeric(tau_total > 0) - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - Y0t1_test=predict(fit_train,testing_data_elements_svm[["data0t"]]) - Y1t1_test=predict(fit_train,testing_data_elements_svm[["data1t"]]) - - tau_test=Y1t1_test-Y0t1_test - - ## compute quantities of interest - That = as.numeric(tau_test > 0) - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - - return(cf_output) -} diff --git a/R/itr_run_user.R b/R/itr_run_user.R deleted file mode 100644 index efb588b..0000000 --- a/R/itr_run_user.R +++ /dev/null @@ -1,127 +0,0 @@ - -## user-defined functions - -run_user <- function( - dat_train, - dat_test, - dat_total, - params, - indcv, - iter, - budget, - train_method, - ... -) { - - # split/cross-validation - cv <- params$cv - - ## train - if(cv == TRUE){ - fit_user <- do.call(train_method, list(dat_train, dat_total)) - } - - if(cv == FALSE){ - fit_user <- do.call(train_method, list(dat_train, dat_test)) - } - - ## test - fit_test <- test_user( - fit_user, dat_test, dat_total, params$n_df, params$n_tb, - indcv, iter, budget, cv - ) - - return(list(test = fit_test, train = fit_user$fit)) -} - - - -#'@importFrom stats predict runif -test_user <- function( - fit_user, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -) { - - if(cv == TRUE){ - # predict - tau_total= fit_user$score - - ## compute quantities of interest - tau_test <- tau_total[indcv == iter] - That <- fit_user$itr - That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - - ## output - cf_output <- list( - tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), - tau_cv = tau_total, - That_cv = That, - That_pcv = That_p - ) - } - - if(cv == FALSE){ - ## predict - tau_test= fit_user$score - - ## compute quantities of interest - That = fit_user$itr - That_p = numeric(length(That)) - That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - - ## output - cf_output <- list( - tau = tau_test, - tau_cv = tau_test, - That_cv = That, - That_pcv = That_p - ) - } - - return(cf_output) -} - -# #'@importFrom stats predict runif -# test_user <- function( -# fit_user, dat_test, dat_total, n_df, n_tb, indcv, iter, budget, cv -# ) { - -# if(cv == TRUE){ -# # predict -# tau_total= fit_user$score - -# ## compute quantities of interest -# tau_test <- tau_total[indcv == iter] -# That <- fit_user$itr -# That_p <- as.numeric(tau_total >= sort(tau_test, decreasing = TRUE)[floor(budget*length(tau_test))+1]) - -# ## output -# cf_output <- list( -# tau = c(tau_test, rep(NA, length(tau_total) - length(tau_test))), -# tau_cv = tau_total, -# That_cv = That, -# That_pcv = That_p -# ) -# } - -# if(cv == FALSE){ -# ## predict -# tau_test= fit_user$score - -# ## compute quantities of interest -# That = fit_user$itr -# That_p = numeric(length(That)) -# That_p[sort(tau_test,decreasing =TRUE,index.return=TRUE)$ix[1:(floor(budget*length(tau_test))+1)]] = 1 - -# ## output -# cf_output <- list( -# tau = tau_test, -# tau_cv = tau_test, -# That_cv = That, -# That_pcv = That_p -# ) -# } - -# return(cf_output) -# } - - diff --git a/R/itr_summary.R b/R/itr_summary.R deleted file mode 100644 index d8fd0d1..0000000 --- a/R/itr_summary.R +++ /dev/null @@ -1,408 +0,0 @@ -#' Summarize estimate_itr output -#' @param object An object of \code{estimate_itr} class (typically an output of \code{estimate_itr()} function). -#' @param ... Other parameters. -#' @importFrom stats pnorm -#' @export -summary.itr <- function(object, ...) { - - # parameters - out <- pape_algs_vec <- pape_user_vec <- papep_algs_vec <- papep_user_vec <- papdp_algs_vec <- papdp_user_vec <- aupec_algs_vec <- aupec_user_vec <- gate_algs_vec <- gate_user_vec <- list() - - estimate_algs = object$out_algs - estimate_user = object$out_user - - # algorithm <- object$df$algorithm - # cv <- object$cv - # fit <- object$qoi - -# ----------------------------------------- -# estimate ITR from ML algorithms -# ----------------------------------------- - -if(length(estimate_algs) != 0){ - - # parameters - algorithm <- estimate_algs$df$algorithm - cv <- estimate_algs$cv - fit <- estimate_algs$qoi - - # compute quantities under sample splitting ----------------------------------------- - - if (cv == FALSE) { - pape_algs_vec <- fit$PAPE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = pape / sd, - p.value = 2 * pnorm(abs(pape / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = pape, - std.deviation = sd, - algorithm = alg - ) - - papep_algs_vec <- fit$PAPEp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = pape / sd, - p.value = 2 * pnorm(abs(pape / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = pape, - std.deviation = sd, - algorithm = alg - ) - - # not print out papd if only one alg is selected - if (length(fit$PAPDp) == 0) { - papdp_algs_vec <- NULL - } else { - papdp_algs_vec <- fit$PAPDp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = papd / sd, - p.value = 2 * pnorm(abs(papd / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = papd, - std.deviation = sd, - algorithm = alg - ) - } - - aupec_algs_vec <- fit$AUPEC %>% - map(., ~ .x[c("aupec", "sd")]) %>% - bind_rows() %>% - mutate(algorithm = algorithm) %>% - mutate( - statistic = aupec / sd, - p.value = 2 * pnorm(abs(aupec / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = aupec, - std.deviation = sd - ) - - gate_algs_vec <- fit$GATE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = gate / sd, - p.value = 2 * pnorm(abs(gate / sd), lower.tail = FALSE), - upper = gate - qnorm(0.95) * sd, - lower = gate + qnorm(0.95) * sd - ) %>% - rename( - estimate = gate, - std.deviation = sd, - algorithm = alg, - group = group - ) - } - - # compute quantities under cross-validation ----------------------------------------- - - if (cv == TRUE) { - pape_algs_vec <- fit$PAPE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = pape / sd, - p.value = 2 * pnorm(abs(pape / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = pape, - std.deviation = sd, - algorithm = alg - ) - - papep_algs_vec <- fit$PAPEp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = papep / sd, - p.value = 2 * pnorm(abs(papep / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = papep, - std.deviation = sd, - algorithm = alg - ) - - # not print out papd if only one alg is selected - if (length(fit$PAPDp) == 0) { - papdp_algs_vec <- NULL - } else { - papdp_algs_vec <- fit$PAPDp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = papd / sd, - p.value = 2 * pnorm(abs(papd / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = papd, - std.deviation = sd, - algorithm = alg - ) - } - - aupec_algs_vec <- fit$AUPEC %>% - map(., ~ .x$aupec_cv) %>% - bind_rows() %>% - mutate( - algorithm = fit$AUPEC %>% map(., ~ .x$outputdf$type %>% unique()) %>% unlist() - ) %>% - mutate( - statistic = aupec / sd, - p.value = 2 * pnorm(abs(aupec / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = aupec, - std.deviation = sd - ) - - gate_algs_vec <- fit$GATE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = gate / sd, - p.value = 2 * pnorm(abs(gate / sd), lower.tail = FALSE), - upper = gate + qnorm(0.975) * sd, - lower = gate - qnorm(0.975) * sd - ) %>% - rename( - estimate = gate, - std.deviation = sd, - algorithm = alg, - group = group - ) - } - -} - -if(length(estimate_user) != 0){ - - # parameters - algorithm <- estimate_user$df$algorithm - cv <- estimate_user$cv - fit <- estimate_user$qoi - - pape_user_vec <- fit$PAPE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = pape / sd, - p.value = 2 * pnorm(abs(pape / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = pape, - std.deviation = sd, - algorithm = alg - ) - - papep_user_vec <- fit$PAPEp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = pape / sd, - p.value = 2 * pnorm(abs(pape / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = pape, - std.deviation = sd, - algorithm = alg - ) - - # not print out papd if only one alg is selected - if (length(fit$PAPDp) == 0) { - papdp_user_vec <- NULL - } else { - papdp_user_vec <- fit$PAPDp %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = papd / sd, - p.value = 2 * pnorm(abs(papd / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = papd, - std.deviation = sd, - algorithm = alg - ) - } - - aupec_user_vec <- fit$AUPEC %>% - map(., ~ .x[c("aupec", "sd")]) %>% - bind_rows() %>% - mutate(algorithm = algorithm) %>% - mutate( - statistic = aupec / sd, - p.value = 2 * pnorm(abs(aupec / sd), lower.tail = FALSE) - ) %>% - rename( - estimate = aupec, - std.deviation = sd - ) - - gate_user_vec <- fit$GATE %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate( - statistic = gate / sd, - p.value = 2 * pnorm(abs(gate / sd), lower.tail = FALSE), - upper = gate - qnorm(0.95) * sd, - lower = gate + qnorm(0.95) * sd - ) %>% - rename( - estimate = gate, - std.deviation = sd, - algorithm = alg, - group = group - ) - -} - out <- list( - PAPE = bind_rows(pape_algs_vec, pape_user_vec), - PAPEp = bind_rows(papep_algs_vec, papep_user_vec), - PAPDp = bind_rows(papdp_algs_vec, papdp_user_vec), - AUPEC = bind_rows(aupec_algs_vec, aupec_user_vec), - GATE = bind_rows(gate_algs_vec, gate_user_vec) - ) - - class(out) <- c("summary.itr", class(out)) - - return(out) -} - - -#' Print -#' @importFrom cli cat_rule -#' @param x An object of \code{summary.itr} class. This is typically an output of \code{summary.itr()} function. -#' @param ... Other parameters. Currently not supported. -#' @export -print.summary.itr <- function(x, ...) { - # PAPE - cli::cat_rule(left = "PAPE") - print(as.data.frame(x[["PAPE"]]), digits = 2) - cli::cat_line("") - - # PAPEp - cli::cat_rule(left = "PAPEp") - print(as.data.frame(x[["PAPEp"]]), digits = 2) - cli::cat_line("") - - # PAPDp - cli::cat_rule(left = "PAPDp") - if(length(x[["PAPDp"]]) == 0) { - cli::cat_line("Cannot compute PAPDp") - } else { - print(as.data.frame(x[["PAPDp"]]), digits = 2) - } - cli::cat_line("") - - # AUPEC - cli::cat_rule(left = "AUPEC") - print(as.data.frame(x[["AUPEC"]]), digits = 2) - cli::cat_line("") - - # GATE - cli::cat_rule(left = "GATE") - print(as.data.frame(x[["GATE"]]), digits = 2) - cli::cat_line("") -} - - -#' Summarize test_itr output -#' @param object An object of \code{test_itr} class (typically an output of \code{test_itr()} function). -#' @param ... Other parameters. -#' @importFrom stats pnorm -#' @export -summary.test_itr <- function(object, ...) { - out <- list() - consist_tibble <- tibble() - het_tibble <- tibble() - - ## ----------------------------------------- - ## hypothesis tests - ## ----------------------------------------- - if (names(object[1]) == "consist") { - - # parameters for test_itr object - consist <- object$consist - het <- object$het - consist_names <- names(consist) - het_names <- names(het) - - # reformat - out[["Consistency"]] <- consist %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate(algorithm = consist_names) %>% - rename(statistic = stat, - p.value = pval) %>% - select(algorithm, statistic, p.value) - - - out[["Heterogeneity"]] <- het %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate(algorithm = het_names) %>% - rename(statistic = stat, - p.value = pval) %>% - select(algorithm, statistic, p.value) - } - - - if (names(object[1]) == "consistcv") { - - # parameters for test_itr object - consist <- object$consistcv - het <- object$hetcv - consist_names <- names(consist) - het_names <- names(het) - - # reformat - out[["Consistency_cv"]] <- consist %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate(algorithm = consist_names) %>% - rename(statistic = stat, - p.value = pval) %>% - select(algorithm, statistic, p.value) - - out[["Heterogeneity_cv"]] <- het %>% - map(., ~ as_tibble(.)) %>% - bind_rows() %>% - mutate(algorithm = het_names) %>% - rename(statistic = stat, - p.value = pval) %>% - select(algorithm, statistic, p.value) - } - - class(out) <- c("summary.test_itr", class(out)) - - return(out) -} - -#' Print -#' @importFrom cli cat_rule -#' @param x An object of \code{summary.test_itr} class. This is typically an output of \code{summary.test_itr()} function. -#' @param ... Other parameters. -#' @export -print.summary.test_itr <- function(x, ...) { - - # Rank Consistency Test - cli::cat_rule(left = "Rank Consistency Test Results") - print(as.data.frame(x[["Consistency"]], digits = 2)) - cli::cat_line("") - - # Group Heterogeneity Test - cli::cat_rule(left = "Group Heterogeneity Test Results") - print(as.data.frame(x[["Heterogeneity"]], digits = 2)) - cli::cat_line("") -} - diff --git a/R/main.r b/R/main.r deleted file mode 100644 index 6ebc186..0000000 --- a/R/main.r +++ /dev/null @@ -1,923 +0,0 @@ -#' Estimate individual treatment rules (ITR) -#' @param treatment Treatment variable -#' @param form a formula object that takes the form \code{y ~ T + x1 + x2 + ...}. -#' @param data -#' A data frame that contains the outcome \code{y} and the treatment \code{T}. -#' @param algorithms -#' List of machine learning algorithms to be used. -#' @param budget The maximum percentage of population that can be treated under the budget constraint. -#' @param n_folds -#' Number of cross-validation folds. Default is 5. -#' @param split_ratio -#' Split ratio between train and test set under sample splitting. Default is 0. -#' @param ngates -#' The number of groups to separate the data into. The groups are determined by tau. Default is 5. -#' @param preProcess caret parameter -#' @param weights caret parameter -#' @param trControl caret parameter -#' @param tuneGrid caret parameter -#' @param tuneLength caret parameter -#' @param user_model A user-defined function to create an ITR. The function should take the data as input and return a model to estimate the ITR. -#' @param SL_library A list of machine learning algorithms to be used in the super learner. -#' @param ... Additional arguments passed to \code{caret::train} -#' @import dplyr -#' @importFrom rlang !! sym -#' @export -#' @return An object of \code{itr} class -estimate_itr <- function( - treatment, - form, - data, - algorithms, - budget, - n_folds = 5, - split_ratio = 0, - ngates = 5, - preProcess = NULL, - weights = NULL, - trControl = caret::trainControl(method = "none"), - tuneGrid = NULL, - tuneLength = ifelse(trControl$method == "none", 1, 3), - user_model = NULL, - SL_library = NULL, - ... -) { - - # specify the outcome and covariates - convert_data <- convert_formula(as.formula(form), data, treatment) - - outcome <- convert_data$outcome - covariates <- convert_data$covariates - data <- convert_data$data - - # caret parameters - metric = ifelse(is.factor(data[outcome]), "Accuracy", "RMSE") - maximize = ifelse(metric %in% c("RMSE", "logLoss", "MAE", "logLoss"), FALSE, TRUE) - - caret_algorithms <- names(caret::getModelInfo()) - - # rlearn algorithms - rlearner_algorithms <- c("rkern", "rlasso","rboost", "tkern", "tlasso", "tboost", "skern", "slasso", "sboost", "xkern", "xlasso", "xboost", "ukern", "ulasso", "uboost") - - # caret train parameters - train_params <- list( - # train_method = train_method, - preProcess = preProcess, - weights = weights, - metric = metric, - maximize = maximize, - trControl = trControl, - tuneGrid = tuneGrid, - tuneLength = tuneLength - ) - - # combine package algs with user's own function - algorithms <- c(algorithms, user_model) - - # some working variables - n_alg <- length(algorithms) - n_df <- nrow(data) - n_X <- length(data) - 1 - n_folds <- n_folds - cv <- ifelse(split_ratio > 0, FALSE, TRUE) - - params <- list( - n_df = n_df, n_folds = n_folds, n_alg = n_alg, split_ratio = split_ratio, ngates = ngates, cv = cv, - train_params = train_params, caret_algorithms = caret_algorithms, rlearner_algorithms = rlearner_algorithms, SL_library = SL_library) - - df <- list(algorithms = algorithms, outcome = outcome, data = data, treatment = treatment) - - # loop over all outcomes - estimates <- vector("list", length = length(outcome)) - - # data to use - data_filtered <- data %>% - select(Y = !!sym(outcome), T = !!sym(treatment), all_of(covariates)) - - # cross-validation - if(cv == TRUE){ - # create folds - treatment_vec <- data_filtered %>% dplyr::pull(T) - folds <- caret::createFolds(treatment_vec, k = n_folds) - } - - # sample splitting - if(cv == FALSE){ - folds = n_folds - } - - # run - estimates <- fit_itr( - data = data_filtered, - algorithms = algorithms, - params = params, - folds = folds, - budget = budget, - user_model = user_model, - ... - ) - - out <- list(estimates = estimates, df = df) - - class(out) <- c("itr", class(out)) - - return(out) - -} -#' Estimate ITR for Single Outcome -#' -#' @importFrom purrr map -#' @importFrom dplyr pull -#' @param data A dataset. -#' @param algorithms Machine learning algorithms. -#' @param params A list of parameters. -#' @param folds Number of folds. -#' @param budget The maximum percentage of population that can be treated under the budget constraint. -#' @param user_model User's own function to estimated the ITR. -#' @param ... Additional arguments passed to \code{caret::train} -#' @return A list of estimates. - -fit_itr <- function( - data, - algorithms, - params, - folds, - budget, - user_model, - ... -) { - - # obj to store outputs - fit_ml <- lapply(1:params$n_alg, function(x) vector("list", length = params$n_folds)) - names(fit_ml) <- algorithms - - models <- lapply(1:params$n_alg, function(x) vector("list", length = params$n_folds)) - names(models) <- algorithms - - # caret parameters - caret_algorithms = params$caret_algorithms - - # rlearn algorithms - rlearner_algorithms = params$rlearner_algorithms - - # super learner library - SL_library = params$SL_library - -## ================================= -## sample splitting -## ================================= - - if(params$cv == FALSE){ - - cat('Evaluate ITR under sample splitting ...\n') - - ## --------------------------------- - ## data split - ## --------------------------------- - - # create split series of test/training partitions - split <- caret::createDataPartition( - data$T, - p = params$split_ratio, - list = FALSE) - - trainset = data[split,] - testset = data[-split,] - - - Tcv <- dplyr::pull(testset, "T") - Ycv <- dplyr::pull(testset, "Y") - indcv <- rep(0, length(Ycv)) - - params$n_tb <- max(table(indcv)) - - ## --------------------------------- - ## run ML - ## --------------------------------- - - # prepare data - training_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = trainset - ) - - testing_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = testset - ) - - total_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = data - ) - - ## - ## run each ML algorithm - ## - - # loop over all algorithms - for (i in seq_along(algorithms)) { - - # check if algorithm is in the caret package - if (algorithms[i] %in% caret_algorithms) { - - # set the train_method to the algorithm - train_method = algorithms[i] - - # run the algorithm - caret_est <- run_caret( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - budget = budget, - indcv = 1, - iter = 1, - train_method = train_method, - ... - ) - - # store the results - fit_ml[[algorithms[i]]] <- caret_est$test - models[[algorithms[i]]] <- caret_est$train - - } - - # check if algorithm is in the rlearner package - if (algorithms[i] %in% rlearner_algorithms) { - - - stop("rLearner functions currently unsupported") - - # # set the train_method to the algorithm - # train_method = algorithms[i] - # - # # run the algorithm - # rlearner_est <- run_rlearner( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # budget = budget, - # indcv = 1, - # iter = 1, - # train_method = train_method) - # - # # store the results - # fit_ml[[algorithms[i]]] <- rlearner_est$test - # models[[algorithms[i]]] <- rlearner_est$train - - } - - } - - # user defined algorithm - if (!is.null(user_model)){ - - # run the algorithm - user_est <- run_user( - dat_train = trainset, - dat_test = testset, - dat_total = data, - params = params, - budget = budget, - indcv = 1, - iter = 1, - train_method = user_model, - ... - ) - - # store the results - model_names = as.character(substitute(user_model)) - fit_ml[[model_names]] <- user_est$test - models[[model_names]] <- user_est$train - - } - - if ("causal_forest" %in% algorithms) { - # run causal forest - est <- run_causal_forest( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - budget = budget, - indcv = 1, #indcv and iter set to 1 for sample splitting - iter = 1 - ) - # store the results - fit_ml[["causal_forest"]] <- est$test - models[["causal_forest"]] <- est$train - } - - if("lasso" %in% algorithms){ - # run lasso - est <- run_lasso( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = 1, - iter = 1, - budget = budget - ) - # store the results - fit_ml[["lasso"]] <- est$test - models[["lasso"]] <- est$train - } - - if("SuperLearner" %in% algorithms){ - # run SuperLearner - est <- run_superLearner( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = 1, - iter = 1, - budget = budget, - train_method = "SuperLearner", - SL_library = SL_library, - ... - ) - # store the results - fit_ml[["SuperLearner"]] <- est$test - models[["SuperLearner"]] <- est$train - } - - - if("bartc" %in% algorithms){ - # run bartcause - est <- run_bartc( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = 1, - iter = 1, - budget = budget - ) - # store the results - fit_ml[["bartc"]] <- est$test - models[["bartc"]] <- est$train - } - - # if("bart" %in% algorithms){ - # # run bart - # est <- run_bartmachine( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = 1, - # iter = 1, - # budget = budget - # ) - # # store the results - # fit_ml[["bart"]] <- est$test - # models[["bart"]] <- est$train - # } - - # if("boost" %in% algorithms){ - # # run boost - # est <- run_boost( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = 1, - # iter = 1, - # budget = budget - # ) - # # store the results - # fit_ml[["boost"]] <- est$test - # models[["boost"]] <- est$train - # } - - # if("random_forest" %in% algorithms){ - # # run random forest - # est <- run_random_forest( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = 1, - # iter = 1, - # budget = budget - # ) - # # store the results - # fit_ml[["random_forest"]] <- est$test - # models[["random_forest"]] <- est$train - # } - - if("bagging" %in% algorithms){ - # run bagging - est <- run_bagging( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = 1, - iter = 1, - budget = budget - ) - # store the results - fit_ml[["bagging"]] <- est$test - models[["bagging"]] <- est$train - } - - if("cart" %in% algorithms){ - # run cart - est <- run_cart( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = 1, - iter = 1, - budget = budget - ) - # store the results - fit_ml[["cart"]] <- est$test - models[["cart"]] <- est$train - } - - } - -## ================================= -## k-folds cross-validation -## ================================= - - if(params$cv == TRUE) { - - cat('Evaluate ITR with cross-validation ...\n') - - Tcv <- dplyr::pull(data, "T") - Ycv <- dplyr::pull(data, "Y") - indcv <- rep(0, length(Ycv)) - - params$n_tb <- max(table(indcv)) - - - # loop over j number of folds - - for (j in seq_len(params$n_folds)) { - - ## --------------------------------- - ## data split - ## --------------------------------- - testset <- data[folds[[j]], ] - trainset <- data[-folds[[j]], ] - indcv[folds[[j]]] <- rep(j, nrow(testset)) - - - ## --------------------------------- - ## run ML - ## --------------------------------- - - # prepare data - training_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = trainset - ) - - testing_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = testset - ) - - total_data_elements <- create_ml_arguments( - outcome = "Y", treatment = "T", data = data - ) - - - ## - ## run each ML algorithm - ## - - # loop over all algorithms - for (i in seq_along(algorithms)) { - - # check if algorithm is in the caret package - if (algorithms[i] %in% caret_algorithms) { - - # set the train_method to the algorithm - train_method = algorithms[i] - - # run the algorithm - caret_est <- run_caret( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - train_method = train_method, - params = params, - indcv = indcv, - iter = j, - budget = budget, - ... - ) - - # store the results - fit_ml[[algorithms[i]]][[j]] <- caret_est$test - models[[algorithms[i]]][[j]] <- caret_est$train - - } - - # check if algorithm is in the rlearner package - if (algorithms[i] %in% rlearner_algorithms) { - - stop("rLearner functions currently unsupported") - - # # set the train_method to the algorithm - # train_method = algorithms[i] - # - # # run the algorithm - # rlearner_est <- run_rlearner( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # train_method = train_method, - # params = params, - # indcv = indcv, - # iter = j, - # budget = budget, - # ... - # ) - # - # # store the results - # fit_ml[[algorithms[i]]][[j]] <- rlearner_est$test - # models[[algorithms[i]]][[j]] <- rlearner_est$train - - } - } - - # user defined algorithm - if (!is.null(user_model)){ - - # run the algorithm - user_est <- run_user( - dat_train = trainset, - dat_test = testset, - dat_total = data, - params = params, - budget = budget, - indcv = indcv, - iter = j, - train_method = user_model, - ... - ) - - # store the results - model_names <- as.character(substitute(user_model)) - - fit_ml[[model_names]][[j]] <- user_est$test - models[[model_names]][[j]] <- user_est$train - - } - - if ("causal_forest" %in% algorithms) { - # run causal forest - est <- run_causal_forest( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget - ) - # store the results - fit_ml[["causal_forest"]][[j]] <- est$test - models[["causal_forest"]][[j]] <- est$train - } - - if("lasso" %in% algorithms){ - # run lasso - est <- run_lasso( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget - ) - # store the results - fit_ml[["lasso"]][[j]] <- est$test - models[["lasso"]][[j]] <- est$train - } - - if("SuperLearner" %in% algorithms){ - # run SuperLearner - est <- run_superLearner( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget, - train_method = "SuperLearner", - SL_library = SL_library, - ... - ) - # store the results - fit_ml[["SuperLearner"]][[j]] <- est$test - models[["SuperLearner"]][[j]] <- est$train - } - - if("bartc" %in% algorithms){ - # run bartcause - est <- run_bartc( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget - ) - # store the results - fit_ml[["bartc"]][[j]] <- est$test - models[["bartc"]][[j]] <- est$train - } - - # if("bart" %in% algorithms){ - # # run bart - # est <- run_bartmachine( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = indcv, - # iter = j, - # budget = budget - # ) - # # store the results - # fit_ml[["bart"]][[j]] <- est$test - # models[["bart"]][[j]] <- est$train - # } - - # if("boost" %in% algorithms){ - # # run boost - # est <- run_boost( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = indcv, - # iter = j, - # budget = budget - # ) - # # store the results - # fit_ml[["boost"]][[j]] <- est$test - # models[["boost"]][[j]] <- est$train - # } - - # if("random_forest" %in% algorithms){ - # # run random forest - # est <- run_random_forest( - # dat_train = training_data_elements, - # dat_test = testing_data_elements, - # dat_total = total_data_elements, - # params = params, - # indcv = indcv, - # iter = j, - # budget = budget - # ) - # # store the results - # fit_ml[["random_forest"]][[j]] <- est$test - # models[["random_forest"]][[j]] <- est$train - # } - - if("bagging" %in% algorithms){ - # run bagging - est <- run_bagging( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget - ) - # store the results - fit_ml[["bagging"]][[j]] <- est$test - models[["bagging"]][[j]] <- est$train - } - - if("cart" %in% algorithms){ - # run cart - est <- run_cart( - dat_train = training_data_elements, - dat_test = testing_data_elements, - dat_total = total_data_elements, - params = params, - indcv = indcv, - iter = j, - budget = budget - ) - # store the results - fit_ml[["cart"]][[j]] <- est$test - models[["cart"]][[j]] <- est$train - } - } # end of fold - } - - return(list( - params = params, fit_ml = fit_ml, models = models, - Ycv = Ycv, Tcv = Tcv, indcv = indcv, budget = budget - )) -} - - -#' Evaluate ITR -#' @param fit Fitted model. Usually an output from \code{estimate_itr} -#' @param user_itr A user-defined function to create an ITR. The function should take the data as input and return an unit-level continuous score for treatment assignment. We assume those that have score less than 0 should not have treatment. The default is \code{NULL}, which means the ITR will be estimated from the \code{estimate_itr}. -#' @param outcome A character string of the outcome variable name. -#' @param treatment A character string of the treatment variable name. -#' @param data A data frame containing the variables specified in \code{outcome}, \code{treatment}, and \code{tau}. -#' @param budget The maximum percentage of population that can be treated under the budget constraint. -#' @param ngates The number of gates to use for the ITR. The default is 5. -#' A user-defined function to create an ITR. The function should take the data as input and return an ITR. The output is a vector of the unit-level binary treatment that would have been assigned by the individualized treatment rule. The default is \code{NULL}, which means the ITR will be estimated from the \code{estimate_itr}. -#' See \code{?evaluate_itr} for an example. -#' @param ... Further arguments passed to the function. -#' @return An object of \code{itr} class -#' @export -evaluate_itr <- function( - fit = NULL, - user_itr = NULL, - outcome = c(), - treatment = c(), - data = list(), - budget = 1, - ngates = 5, - ...){ - - # parameters - out_algs <- list() - out_user <- list() - - # estimate ITR from ML algorithms - if(!is.null(fit)){ - - # estimate ITR from the fitted model - estimates <- fit$estimates - cv <- estimates$params$cv - df <- fit$df - algorithms <- fit$df$algorithms - outcome <- fit$df$outcome - - # compute qoi - qoi <- vector("list", length = length(outcome)) - qoi <- compute_qoi(estimates, algorithms) - - # store the results - out_algs <- list( - qoi = qoi, - cv = cv, - df = df, - estimates = estimates) - } - - # get ITR from the user-defined function - if(!is.null(user_itr)){ - df = data - Ycv = data[, outcome] - Tcv = data[, treatment] - - estimates <- list( - Ycv = Ycv, - Tcv = Tcv, - algorithms = "user-defined") - cv <- FALSE - - # compute qoi - qoi <- vector("list", length = length(outcome)) - qoi <- compute_qoi_user( - user_itr, Tcv, Ycv, data, ngates, budget, ...) - - # store the results - out_user <- list( - qoi = qoi, - cv = cv, - df = df, - estimates = estimates) - } - - # store the results - out <- list( - out_algs = out_algs, - out_user = out_user) - - class(out) <- c("itr", class(out)) - - return(out) - -} - -#' Conduct hypothesis tests -#' @param fit Fitted model. Usually an output from \code{estimate_itr} -#' @param nsim Number of Monte Carlo simulations used to simulate the null distributions. Default is 1000. -#' @param ... Further arguments passed to the function. -#' @return An object of \code{test_itr} class -#' @export -test_itr <- function( - est, - nsim = 1000, - ... -) { - - # test parameters - out_algs <- est$out_algs - estimates <- out_algs$estimates - cv <- estimates$params$cv - fit_ml <- estimates$fit_ml - Tcv <- estimates$Tcv - Ycv <- estimates$Ycv - indcv <- estimates$indcv - n_folds <- estimates$params$n_folds - ngates <- estimates$params$ngates - algorithms <- out_algs$df$algorithms - outcome <- out_algs$df$outcome - - # caret and rlearner parameters - caret_algorithms <- estimates$params$caret_algorithms - rlearner_algorithms <- estimates$params$rlearner_algorithms - - # super learner library - SL_library <- estimates$params$SL_library - - # run tests - - ## ================================= - ## sample splitting - ## ================================= - - if(cv == FALSE){ - cat('Conduct hypothesis tests for GATEs unde sample-splitting ...\n') - - # create empty lists to for consistcv and hetcv - consist <- list() - het <- list() - - # run consistency and heterogeneity tests for each model - for (i in algorithms) { - - consist[[i]] <- consist.test( - T = Tcv, - tau = fit_ml[[i]]$tau, - Y = Ycv, - ngates = ngates) - - het[[i]] <- het.test( - T = Tcv, - tau = fit_ml[[i]]$tau, - Y = Ycv, - ngates = ngates) - } - - - # return a list of consist and het - out <- list(consist = consist, het = het) - - } - - ## ================================= - ## cross validation - ## ================================= - - if(cv == TRUE){ - cat('Conduct hypothesis tests for GATEs unde cross-validation ...\n') - - # create empty lists to for consistcv and hetcv - consistcv <- list() - hetcv <- list() - - # run consistency and heterogeneity tests for each model - for (i in algorithms) { - - consistcv[[i]] <- consistcv.test( - T = Tcv, - tau = gettaucv(estimates)[[i]], - Y = Ycv, - ind = indcv, - ngates = ngates) - - hetcv[[i]] <- hetcv.test( - T = Tcv, - tau = gettaucv(estimates)[[i]], - Y = Ycv, - ind = indcv, - ngates = ngates) - - } - - # return a list of consistcv and hetcv - out <- list(consistcv = consistcv, hetcv = hetcv) - } - - class(out) <- c("test_itr", class(out)) - - return(out) - -} - - -utils::globalVariables(c("T", "aupec", "sd", "pval", "Pval", "aupec.y", "fraction", "AUPECmin", "AUPECmax", ".", "fit", "out", "pape", "alg", "papep", "papd", "type", "gate", "group", "qnorm", "vec", "Y", "algorithm", "statistic", "p.value")) - diff --git a/README.Rmd b/README.Rmd deleted file mode 100644 index 7379fd7..0000000 --- a/README.Rmd +++ /dev/null @@ -1,34 +0,0 @@ ---- -output: github_document ---- - - - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>") -``` - -## evalITR [![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/evalITR)](https://cran.r-project.org/package=evalITR) ![CRAN downloads](http://cranlogs.r-pkg.org/badges/grand-total/evalITR) - - - - - -```{r pic1, echo=FALSE} -knitr::include_graphics("man/figures/README-manual.png") -``` - -R package evalITR provides various statistical methods for estimating -and evaluating Individualized Treatment Rules under randomized data. The -provided metrics include (1) population average prescriptive effect -`PAPE`; (2) population average prescriptive effect with a budget -constraint `PAPEp`; (3) population average prescriptive effect -difference with a budget constraint `PAPDp`; (4) and area under the -prescriptive effect curve `AUPEC`; (5) Grouped Average Treatment -Effects `GATEs`. The details of the methods for this design are given in [Imai and Li -(2023)](https://arxiv.org/abs/1905.05389) and -[Imai and Li](https://arxiv.org/abs/2203.14511). - -Documentation and website: https://michaellli.github.io/evalITR/ diff --git a/README.md b/README.md deleted file mode 100644 index d8d0551..0000000 --- a/README.md +++ /dev/null @@ -1,22 +0,0 @@ - - - -## evalITR [![CRAN_Status_Badge](http://www.r-pkg.org/badges/version/evalITR)](https://cran.r-project.org/package=evalITR) ![CRAN downloads](http://cranlogs.r-pkg.org/badges/grand-total/evalITR) - - - - -![](man/figures/README-manual.png) - -R package evalITR provides various statistical methods for estimating -and evaluating Individualized Treatment Rules under randomized data. The -provided metrics include (1) population average prescriptive effect -`PAPE`; (2) population average prescriptive effect with a budget -constraint `PAPEp`; (3) population average prescriptive effect -difference with a budget constraint `PAPDp`; (4) and area under the -prescriptive effect curve `AUPEC`; (5) Grouped Average Treatment Effects -`GATEs`. The details of the methods for this design are given in [Imai -and Li (2023)](https://arxiv.org/abs/1905.05389) and [Imai and -Li](https://arxiv.org/abs/2203.14511). - -Documentation and website: diff --git a/_pkgdown.yml b/_pkgdown.yml deleted file mode 100644 index 7ff6f9c..0000000 --- a/_pkgdown.yml +++ /dev/null @@ -1,59 +0,0 @@ -destination: docs - -template: - bootstrap: 5 - params: - bootswatch: spacelab - -navbar: - title: "evalITR" - left: - - text: "User's Guide" - menu: - - text: "Installation" - href: articles/install.html - - text: "Sample Splitting" - href: articles/sample_split.html - - text: "Sample Splitting with Caret/SuperLearner" - href: articles/sample_split_caret.html - - text: "Cross-Validation" - href: articles/cv_single_alg.html - - text: "Cross-Validation with Multiple Algorithms" - href: articles/cv_multiple_alg.html - - text: "User-Defined ITR" - href: articles/user_itr.html - - text: "Compare Estimated and User Defined ITR" - href: articles/user_itr_algs.html - - text: "Reference" - href: reference/index.html - - text: "Changelog" - href: news/index.html - -# reference: -# - title: Fitting models -# desc: ~ -# contents: -# - '`estimate_itr`' -# - '`evaluate_itr`' -# - title: Checking results -# desc: ~ -# contents: -# - '`plot.itr`' -# - '`plot_estimate`' -# - '`summary.itr`' -# - '`summary.test_itr`' -# - title: Additional analyses -# desc: ~ -# contents: -# - '`test_itr`' -# - title: Built-in data -# desc: ~ -# contents: -# - '`star`' -# # - title: Misc. -# # desc: ~ -# # contents: -# # - '`keyATM-package`' - -# toc: -# depth: 2 diff --git a/cran-comments.md b/cran-comments.md deleted file mode 100644 index 51e6358..0000000 --- a/cran-comments.md +++ /dev/null @@ -1,12 +0,0 @@ -## Test environments -* local Windows 10 install, R 4.0.5 -* local Windows 10 install, R 3.6.5 -* win-builder (devel and release) -* Mac OS X 10.11 (on Rhub), R-release -* Ubuntu 16.04 (on travis-ci), R-release - -## R CMD check results -There were no ERRORs or WARNINGs. - - -## Downstream dependencies diff --git a/data/star.rda b/data/star.rda deleted file mode 100644 index 5baf7ba2c86e84790f9a28d633589bdbb5ac1d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15271 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 diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index 1700fe0..0000000 --- a/docs/404.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -Page not found (404) • evalITR - - - - - - - - - Skip to contents - - -
-
-
- -Content not found. Please use links in the navbar. - -
-
- - -
- - - -
-
- - - - - - - diff --git a/docs/articles/cv_multiple_alg.html b/docs/articles/cv_multiple_alg.html deleted file mode 100644 index 1aae00f..0000000 --- a/docs/articles/cv_multiple_alg.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - - - -Cross-validation with multiple ML algorithms • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -

We can estimate ITR with various machine learning algorithms and then -compare the performance of each model. The package includes all ML -algorithms in the caret package and 2 additional algorithms -(causal -forest and bartCause).

-

The package also allows estimate heterogeneous treatment effects on -the individual and group-level. On the individual-level, the summary -statistics and the AUPEC plot show whether assigning individualized -treatment rules may outperform complete random experiment. On the -group-level, we specify the number of groups through ngates -and estimating heterogeneous treatment effects across groups.

-
-library(evalITR)
-#> Loading required package: MASS
-#> 
-#> Attaching package: 'MASS'
-#> The following object is masked from 'package:dplyr':
-#> 
-#>     select
-#> Loading required package: Matrix
-#> Loading required package: quadprog
-
-# specify the trainControl method
-fitControl <- caret::trainControl(
-                           method = "repeatedcv",
-                           number = 3,
-                           repeats = 3)
-# estimate ITR
-set.seed(2021)
-fit_cv <- estimate_itr(
-               treatment = "treatment",
-               form = user_formula,
-               data = star_data,
-               trControl = fitControl,
-               algorithms = c(
-                  "causal_forest", 
-                  "bartc",
-                  # "rlasso", # from rlearner 
-                  # "ulasso", # from rlearner 
-                  "lasso", # from caret package
-                  "rf"
-                  ), # from caret package
-               budget = 0.2,
-               n_folds = 3)
-#> Evaluate ITR with cross-validation ...
-#> Loading required package: lattice
-#> Loading required package: ggplot2
-#> fitting treatment model via method 'bart'
-#> fitting response model via method 'bart'
-#> fitting treatment model via method 'bart'
-#> fitting response model via method 'bart'
-#> fitting treatment model via method 'bart'
-#> fitting response model via method 'bart'
-
-# evaluate ITR
-est_cv <- evaluate_itr(fit_cv)
-#> 
-#> Attaching package: 'purrr'
-#> The following object is masked from 'package:caret':
-#> 
-#>     lift
-
-# summarize estimates
-summary(est_cv)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     0.27          0.82 causal_forest      0.33    0.74
-#> 2    -0.09          0.66         bartc     -0.14    0.89
-#> 3     0.17          1.07         lasso      0.16    0.87
-#> 4     1.27          0.95            rf      1.33    0.18
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     2.32          0.68 causal_forest      3.39  0.0007
-#> 2     1.71          1.07         bartc      1.59  0.1123
-#> 3    -0.21          0.63         lasso     -0.33  0.7406
-#> 4     1.69          1.11            rf      1.52  0.1287
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#>   estimate std.deviation             algorithm statistic p.value
-#> 1    0.609          0.63 causal_forest x bartc     0.960  0.3371
-#> 2    2.524          0.80 causal_forest x lasso     3.145  0.0017
-#> 3    0.631          0.73    causal_forest x rf     0.859  0.3906
-#> 4    1.914          1.00         bartc x lasso     1.916  0.0554
-#> 5    0.022          1.35            bartc x rf     0.016  0.9873
-#> 6   -1.893          0.72            lasso x rf    -2.615  0.0089
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     1.23           1.6 causal_forest      0.79    0.43
-#> 2     0.86           1.4         bartc      0.60    0.55
-#> 3     0.18           1.4         lasso      0.13    0.90
-#> 4     1.37           1.6            rf      0.88    0.38
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>    estimate std.deviation     algorithm group statistic p.value upper lower
-#> 1    -110.1            59 causal_forest     1    -1.871   0.061   5.2  -225
-#> 2      45.8            59 causal_forest     2     0.771   0.441 162.2   -71
-#> 3     101.7            59 causal_forest     3     1.721   0.085 217.6   -14
-#> 4     -38.1            74 causal_forest     4    -0.519   0.604 106.0  -182
-#> 5      18.9            95 causal_forest     5     0.199   0.843 205.7  -168
-#> 6      21.2            62         bartc     1     0.343   0.732 142.6  -100
-#> 7    -127.1            59         bartc     2    -2.151   0.031 -11.3  -243
-#> 8      -1.1            97         bartc     3    -0.011   0.991 189.8  -192
-#> 9      82.0            59         bartc     4     1.390   0.165 197.6   -34
-#> 10     43.2            95         bartc     5     0.457   0.648 228.8  -142
-#> 11    -14.4            94         lasso     1    -0.154   0.878 169.2  -198
-#> 12    -94.5            90         lasso     2    -1.051   0.293  81.8  -271
-#> 13     87.9            99         lasso     3     0.886   0.376 282.4  -107
-#> 14     12.6            59         lasso     4     0.214   0.830 127.8  -103
-#> 15     26.6            59         lasso     5     0.451   0.652 142.4   -89
-#> 16    -37.4            59            rf     1    -0.638   0.523  77.5  -152
-#> 17     10.6            59            rf     2     0.180   0.857 126.5  -105
-#> 18    -17.6            59            rf     3    -0.299   0.765  97.7  -133
-#> 19     66.5            86            rf     4     0.770   0.441 235.9  -103
-#> 20     -3.9            60            rf     5    -0.066   0.948 113.0  -121
-

We plot the estimated Area Under the Prescriptive Effect Curve for -the writing score across different ML algorithms.

-
-# plot the AUPEC with different ML algorithms
-plot(est_cv)
-

-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/cv_single_alg.html b/docs/articles/cv_single_alg.html deleted file mode 100644 index 2233956..0000000 --- a/docs/articles/cv_single_alg.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - -Cross-validation with single algorithm • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -

When users choose to estimate and evaluate ITR under -cross-validation, the package implements Algorithm 1 from Imai and Li (2023) to -estimate and evaluate ITR. For more information about Algorithm 1, -please refer to the this -page.

-

Instead of specifying the split_ratio argument, we -choose the number of folds (n_folds). We present an example -of estimating ITR with 3 folds cross-validation. In practice, we -recommend using 10 folds to get a more stable model performance.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InputR package inputDescriptions
Data \(\mathbf{Z}=\left\{\mathbf{X}_i, T_i, -Y_i\right\}_{i=1}^n\) -treatment = treatment, form = user_formula, data -= star_data -treatment is a character string specifying -the treatment variable in the data; form is a -formula specifying the outcome and covariates; and a dataframe -data -
Machine learning algorithm \(F\) -algorithms = c("causal_forest")a character vector specifying the ML algorithms to be -used
Evaluation metric \(\tau_f\) -PAPE, PAPD, AUPEC, GATEBy default
Number of folds \(K\) -n_folds = 3 -n_folds is a numeric value indicating the -number of folds used for cross-validation
budget = 0.2 -budget is a numeric value specifying the -maximum percentage of population that can be treated under the budget -constraint
-
-library(evalITR)
-# estimate ITR 
-set.seed(2021)
-fit_cv <- estimate_itr(
-               treatment = treatment,
-               form = user_formula,
-               data = star_data,
-               algorithms = c("causal_forest"),
-               budget = 0.2,
-               n_folds = 3)
-#> Evaluate ITR with cross-validation ...
-

The output will be an object that includes estimated evaluation -metric \(\hat{\tau}_F\) and the -estimated variance of \(\hat{\tau}_F\) -for different metrics (PAPE, PAPD, AUPEC).

-
-# evaluate ITR 
-est_cv <- evaluate_itr(fit_cv)
-#> Cannot compute PAPDp
-
-# summarize estimates
-summary(est_cv)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     0.49          0.65 causal_forest      0.76    0.45
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1        3          0.77 causal_forest       3.9 8.8e-05
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#> Cannot compute PAPDp
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.3           1.6 causal_forest       0.8    0.42
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm group statistic p.value upper lower
-#> 1      -56            59 causal_forest     1     -0.95    0.34    59  -171
-#> 2       32            67 causal_forest     2      0.48    0.63   163   -99
-#> 3       16            59 causal_forest     3      0.27    0.79   131   -99
-#> 4       10            76 causal_forest     4      0.14    0.89   159  -138
-#> 5       16            98 causal_forest     5      0.16    0.87   209  -177
-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/index.html b/docs/articles/index.html deleted file mode 100644 index 791173b..0000000 --- a/docs/articles/index.html +++ /dev/null @@ -1,97 +0,0 @@ - -Articles • evalITR - Skip to contents - - -
- - - -
- - - -
- - - - - - - diff --git a/docs/articles/install.html b/docs/articles/install.html deleted file mode 100644 index 0febe8a..0000000 --- a/docs/articles/install.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - -Installation • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -
-

Installation -

-

You can install the released version of evalITR from CRAN with:

-
-# Install release version from CRAN (updating evalITR is the same command)
-install.packages("evalITR")
-

Or, you can install the development version of evalITR from GitHub with:

-
-# install.packages("devtools")
-devtools::install_github("MichaelLLi/evalITR", ref = "causal-ml")
-

If you want to use the latest version of the package, you can install -the development version of evalITR by specifying the branch name in -devtools::install_github.

-
-
-

Parallelization -

-

(Optional) if you have multiple cores, we recommendate using -multisession futures and processing in parallel. This would increase -computation efficiency and reduce the time to fit the model.

-
-library(furrr)
-library(future.apply)
-
-# check the number of cores
-parallel::detectCores()
-
-# set the number of cores
-nworkers <- 4
-plan(multisession, workers =nworkers)
-
-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/paper_alg1.html b/docs/articles/paper_alg1.html deleted file mode 100644 index 75de19e..0000000 --- a/docs/articles/paper_alg1.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - - -paper_alg1 • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -

Algorithm 1 Estimating and Evaluating an Individualized -Treatment Rule (ITR) using the Same Experimental Data via -Cross-Validation

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Steps in Algorithm 1Function/objectOutput
1. Split data into \(K\) random subsets of equal size \(\left(\mathbf{Z}_1, \cdots, -\mathbf{Z}_k\right)\) - -caret::createFolds() within -estimate_itr() -dataframe
2. k \(\leftarrow\) -1
3. while \(k \leq K\) -dofor loop in fit_itr() within -estimate_itr() -
4. \(\quad -\mathbf{Z}_{-k}=\left[\mathbf{Z}_1, \cdots, \mathbf{Z}_{k-1}, -\mathbf{Z}_{k+1}, \cdots, \mathbf{Z}_K\right]\) - -trainset objecttraining data
5. \(\hat{f}_{-k}=F\left(\mathbf{Z}_{-k}\right)\) -modulized functions for each ML algoritms (e.g., -run_causal_forest()) within -estimate_itr() -ITR (binary vector)
6. \(\hat{\tau}_k=\hat{\tau}_{\hat{f}_{-k}}\left(\mathbf{Z}_k\right)\) - -compute_qoi() function within -evaluate_itr() -metrics for fold \(k\) -
7. \(k \leftarrow -k+1\) -
8. end while
9.return \(\hat{\tau}_F=\frac{1}{K} \sum_{k=1}^K -\hat{\tau}_k\), \(\widehat{\mathbb{V}\left(\hat{\tau}_F\right)}=v\left(\hat{f}_{-1}, -\cdots, \hat{f}_{-k}, \mathbf{Z}_1, \cdots, -\mathbf{Z}_K\right)\) - -PAPEcv() PAPDcv() and -getAupecOutput() functions inside -compute_qoi() function within -evaluate_itr() -averaging the results across folds
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/sample_split.html b/docs/articles/sample_split.html deleted file mode 100644 index 984e442..0000000 --- a/docs/articles/sample_split.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - -Sample Splitting • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -

This is an example using the star dataset (for more -information about the dataset, please use ?star).

-

We start with a simple example with one outcome variable (writing -scores) and one machine learning algorithm (causal forest). Then we move -to incoporate multiple outcomes and compare model performances with -several machine learning algorithms.

-

To begin, we load the dataset and specify the outcome variable and -covariates to be used in the model. Next, we utilize a random forest -algorithm to develop an Individualized Treatment Rule (ITR) for -estimating the varied impacts of small class sizes on students’ writing -scores. Since the treatment is often costly for most policy programs, we -consider a case with 20% budget constraint (budget = 0.2). -The model will identify the top 20% of units who benefit from the -treatment most and assign them to with the treatment. We train the model -through sample splitting, with the split_ratio between the -train and test sets determined by the split_ratio argument. -Specifically, we allocate 70% of the data to train the model, while the -remaining 30% is used as testing data (split_ratio = -0.7).

-
-library(dplyr)
-library(evalITR)
-
-# specifying the outcome
-outcomes <- "g3tlangss"
-
-# specifying the treatment
-treatment <- "treatment"
-
-# specifying the data (remove other outcomes)
-star_data <- star %>% dplyr::select(-c(g3treadss,g3tmathss))
-
-# specifying the formula
-user_formula <- as.formula(
-  "g3tlangss ~ treatment + gender + race + birthmonth + 
-  birthyear + SCHLURBN + GRDRANGE + GKENRMNT + GKFRLNCH + 
-  GKBUSED + GKWHITE ")
-
-
-# estimate ITR 
-fit <- estimate_itr(
-  treatment = treatment,
-  form = user_formula,
-  data = star_data,
-  algorithms = c("causal_forest"),
-  budget = 0.2,
-  split_ratio = 0.7)
-#> Evaluate ITR under sample splitting ...
-
-
-# evaluate ITR 
-est <- evaluate_itr(fit)
-#> Cannot compute PAPDp
-

Thesummary() function displays the following summary -statistics:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -
StatisticsDescription
PAPEpopulation average prescriptive effect
PAPEppopulation average prescriptive effect with a budget -constraint
PAPDppopulation average prescriptive effect difference with -a budget constraint (this quantity will be computed with more than 2 -machine learning algorithms)
AUPECarea under the prescriptive effect curve
GATEgrouped average treatment effects
-

For more information about these evaluation metrics, please refer to -Imai and Li (2021) and Imai and Li (2022).

-
-# summarize estimates
-summary(est)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.6          0.95 causal_forest       1.7   0.097
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.9           1.1 causal_forest       1.7   0.088
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#> Cannot compute PAPDp
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      2.2          0.84 causal_forest       2.6  0.0093
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm group statistic p.value upper lower
-#> 1    135.7           108 causal_forest     1     1.257    0.21   -42   313
-#> 2   -127.7           107 causal_forest     2    -1.190    0.23  -304    49
-#> 3    -53.1           108 causal_forest     3    -0.491    0.62  -231   125
-#> 4      6.7           108 causal_forest     4     0.062    0.95  -171   185
-#> 5     56.5           106 causal_forest     5     0.531    0.60  -119   231
-

We can extract estimates from the est object. The -following code shows how to extract the GATE estimates for the writing -score with the causal forest algorithm. We can also plot the estimates -using the plot_estimate() function and specify the type of -estimates to be plotted (GATE, PAPE, -PAPEp, PAPDp).

-
-# plot GATE estimates
-library(ggplot2)
-gate_est <- summary(est)$GATE
-
-plot_estimate(gate_est, type = "GATE") +
-  scale_color_manual(values = c("#0072B2", "#D55E00"))
-

-

We plot the estimated Area Under the Prescriptive Effect Curve for -the writing score across a range of budget constraints for causal -forest.

-
-# plot the AUPEC 
-plot(est)
-

-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/sample_split_caret.html b/docs/articles/sample_split_caret.html deleted file mode 100644 index 527d54c..0000000 --- a/docs/articles/sample_split_caret.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - -Sample Splitting with Caret/SuperLearner • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -
-

Train the model with Caret -

-

We can train the model with the caret package (for -further information about caret, see the original -website). We use parallel computing to speed up the computation.

-
-# parallel computing
-library(doParallel)
-cl <- makePSOCKcluster(5)
-registerDoParallel(cl)
-
-# stop after finishing the computation
-stopCluster(cl)
-

The following example shows how to estimate the ITR with gradient -boosting machine (GBM) using the caret package. Note that -we have already loaded the data and specify the treatment, outcome, and -covariates as shown in the Sample -Splitting vignette. Since we are using the caret -package, we need to specify the trainControl and/or -tuneGrid arguments. The trainControl argument -specifies the cross-validation method and the tuneGrid -argument specifies the tuning grid. For more information about these -arguments, please refer to the caret -website.

-

We estimate the ITR with only one machine learning algorithm (GBM) -and evaluate the ITR with the evaluate_itr() function. To -compute PAPDp, we need to specify the -algorithms argument with more than 2 machine learning -algorithms.

-
-library(evalITR)
-library(caret)
-
-# specify the trainControl method
-fitControl <- caret::trainControl(
-  method = "repeatedcv", # 3-fold CV
-  number = 3, # repeated 3 times
-  repeats = 3,
-  search='grid',
-  allowParallel = TRUE) # grid search
-
-# specify the tuning grid
-gbmGrid <- expand.grid(
-  interaction.depth = c(1, 5, 9), 
-  n.trees = (1:30)*50, 
-  shrinkage = 0.1,
-  n.minobsinnode = 20)
-
-# estimate ITR
-fit_caret <- estimate_itr(
-  treatment = "treatment",
-  form = user_formula,
-  trControl = fitControl,
-  data = star_data,
-  algorithms = c("gbm"),
-  budget = 0.2,
-  split_ratio = 0.7,
-  tuneGrid = gbmGrid,
-  verbose = FALSE)
-#> Evaluate ITR under sample splitting ...
-
-# evaluate ITR
-est_caret <- evaluate_itr(fit_caret)
-#> Cannot compute PAPDp
-

We can extract the training model from caret and check -the model performance. Other functions from caret can be -applied to the training model.

-
-# extract the final model
-caret_model <- fit_caret$estimates$models$gbm
-print(caret_model$finalModel)
-#> A gradient boosted model with gaussian loss function.
-#> 100 iterations were performed.
-#> There were 53 predictors of which 24 had non-zero influence.
-
-# check model performance
-trellis.par.set(caretTheme()) # theme
-plot(caret_model) 
-

-
-# heatmap 
-plot(
-  caret_model, 
-  plotType = "level",
-  scales = list(x = list(rot = 90)))
-

-
-
-

Train the model with SuperLearner -

-

Alternatively, we can train the model with the -SuperLearner package (for further information about -SuperLearner, see the -original website). SuperLearner utilizes ensemble method by taking -optimal weighted average of multiple machine learning algorithms to -improve model performance.

-

We will compare the performance of the ITR estimated with -causal_forest and SuperLearner.

-
-library(SuperLearner)
-
-fit_sl <- estimate_itr(
-  treatment = "treatment",
-  form = user_formula,
-  data = star_data,
-  algorithms = c("causal_forest","SuperLearner"),
-  budget = 0.2,
-  split_ratio = 0.7,
-  SL_library = c("SL.ranger", "SL.glmnet"))
-#> Evaluate ITR under sample splitting ...
-
-est_sl <- evaluate_itr(fit_sl)
-
-# summarize estimates
-summary(est_sl)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.9           1.4 causal_forest       1.4    0.17
-#> 2      2.3           1.4  SuperLearner       1.6    0.11
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.8           1.1 causal_forest       1.6   0.112
-#> 2      2.1           1.2  SuperLearner       1.8   0.071
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#>   estimate std.deviation                    algorithm statistic p.value
-#> 1     -0.3          0.97 causal_forest x SuperLearner     -0.31    0.76
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.5           1.0 causal_forest       1.5    0.14
-#> 2      1.6           1.1  SuperLearner       1.5    0.14
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>    estimate std.deviation     algorithm group statistic p.value upper lower
-#> 1      -172           107 causal_forest     1     -1.61    0.11  -347     4
-#> 2      -145           108 causal_forest     2     -1.35    0.18  -323    32
-#> 3       102           109 causal_forest     3      0.94    0.35   -76   281
-#> 4       142           109 causal_forest     4      1.31    0.19   -37   321
-#> 5       103           108 causal_forest     5      0.95    0.34   -76   281
-#> 6       -59           108  SuperLearner     1     -0.55    0.58  -237   118
-#> 7       -79           107  SuperLearner     2     -0.73    0.46  -255    98
-#> 8        36           109  SuperLearner     3      0.33    0.74  -143   214
-#> 9        28           108  SuperLearner     4      0.26    0.79  -150   207
-#> 10      104           109  SuperLearner     5      0.95    0.34   -75   283
-

We plot the estimated Area Under the Prescriptive Effect Curve for -the writing score across a range of budget constraints, seperately for -the two ITRs, estimated with causal_forest and -SuperLearner.

-
-# plot the AUPEC 
-plot(est_sl)
-

-
-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/user_itr.html b/docs/articles/user_itr.html deleted file mode 100644 index f20837e..0000000 --- a/docs/articles/user_itr.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - -User Defined ITR • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -

Instead of using the ITRs estimated by evalITR models, -we can define our own ITR and evaluate its performance using the -evaluate_itr function. The function takes the following -arguments:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -
ArgumentDescription
user_itra function defined by users that returns a unit-level -continuous score for treatment assignment (we assume those that have -score less than 0 should not have treatment)
dataa data frame
treatmenta character string specifying the treatment variable in -the data -
outcomea character string specifying the outcome variable in -the data -
budgeta numeric value specifying the maximum percentage of -population that can be treated under the budget constraint
-

The function returns an object that contains the estimated GATE, ATE, -and AUPEC for the user defined ITR.

-
-# user's own ITR
-score_function <- function(data){
-
-  data %>% 
-    mutate(score = case_when(
-      school_urban == 1 ~ 0.1, # inner-city
-      school_urban == 2 ~ 0.2, # suburban
-      school_urban == 3 ~ 0.4, # rural
-      school_urban == 4 ~ 0.3, # urban
-    )) %>%
-    pull(score) -> score
-    
-  return(score)
-}
-
-# evalutate ITR
-user_itr <- evaluate_itr(
-  user_itr = score_function,
-  data = star_data,
-  treatment = treatment,
-  outcome = outcomes,
-  budget = 0.2)
-
-# summarize estimates
-summary(user_itr)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation algorithm statistic p.value
-#> 1        0             0  user_itr       NaN     NaN
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation algorithm statistic p.value
-#> 1      1.1          0.67  user_itr       1.6    0.11
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#> Cannot compute PAPDp
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation statistic p.value
-#> 1    -0.91          0.42      -2.2   0.028
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>   estimate std.deviation algorithm group statistic p.value  upper lower
-#> 1      126            58  user_itr     1      2.16   0.031   30.2   222
-#> 2       96            59  user_itr     2      1.62   0.105   -1.4   194
-#> 3      -33            59  user_itr     3     -0.56   0.579 -129.7    64
-#> 4     -139            59  user_itr     4     -2.36   0.018 -236.5   -42
-#> 5      -32            59  user_itr     5     -0.54   0.589 -129.4    65
-

We can extract estimates from the est object. The -following code shows how to extract the GATE estimates for the writing -score with the causal forest algorithm. We can also plot the estimates -using the plot_estimate() function and specify the type of -estimates to be plotted (GATE, PAPE, -PAPEp, PAPDp).

-
-# plot GATE estimates
-library(ggplot2)
-gate_est <- summary(user_itr)$GATE
-
-plot_estimate(gate_est, type = "GATE") +
-  scale_color_manual(values = c("#0072B2", "#D55E00"))
-

-

We plot the estimated Area Under the Prescriptive Effect Curve -(AUPEC) for the writing score across a range of budget constraints for -user defined ITR.

-
-# plot the AUPEC 
-plot(user_itr)
-

-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/articles/user_itr_algs.html b/docs/articles/user_itr_algs.html deleted file mode 100644 index bc1774a..0000000 --- a/docs/articles/user_itr_algs.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - - -Compare Estimated and User Defined ITR • evalITR - - - - - - - - - - Skip to contents - - -
- - - - -
-
- - - -
-

Estimated vs. User Defined ITR -

-

The package allows to compare the performance of estimated ITRs with -user defined ITRs. The estimate_itr function takes the -following arguments:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ArgumentDescription
fita fitted object from the estimate_itr -function
user_itra function defined by users that returns a unit-level -continuous score for treatment assignment (we assume those that have -score less than 0 should not have treatment)
dataa data frame
treatmenta character string specifying the treatment variable in -the data -
outcomea character string specifying the outcome variable in -the data -
budgeta numeric value specifying the maximum percentage of -population that can be treated under the budget constraint
-

The function returns an object that contains the estimated GATE, ATE, -and AUPEC for the user defined ITR.

-
-
-# estimate ITR 
-fit <- estimate_itr(
-  treatment = "T",
-  form = user_formula,
-  data = star_data,
-  algorithms = c("causal_forest"),
-  budget = 0.2,
-  split_ratio = 0.7)
-#> Evaluate ITR under sample splitting ...
-
-# user's own ITR
-score_function <- function(data){
-  data %>% 
-    mutate(score = case_when(
-      school_urban == 1 ~ 0.1, # inner-city
-      school_urban == 2 ~ 0.2, # suburban
-      school_urban == 3 ~ 0.4, # rural
-      school_urban == 4 ~ 0.3, # urban
-    )) %>%
-    pull(score) -> score
-    
-  return(score)
-}
-
-# evalutate ITR
-compare_itr <- evaluate_itr(
-  fit = fit,
-  user_itr = score_function,
-  data = star_data,
-  treatment = "T",
-  outcome = outcomes,
-  budget = 0.2)
-#> Cannot compute PAPDp
-
-# summarize estimates
-summary(compare_itr)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.5          0.99 causal_forest       1.5    0.13
-#> 2      0.0          0.00      user_itr       NaN     NaN
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     0.83          1.20 causal_forest      0.69    0.49
-#> 2     1.06          0.67      user_itr      1.58    0.11
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#> Cannot compute PAPDp
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     2.13          0.89 causal_forest       2.4   0.017
-#> 2    -0.91          0.42          <NA>      -2.2   0.028
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>    estimate std.deviation     algorithm group statistic p.value  upper lower
-#> 1       -47           108 causal_forest     1     -0.43   0.665 -224.8   131
-#> 2      -216           107 causal_forest     2     -2.02   0.044 -392.1   -40
-#> 3       -32           108 causal_forest     3     -0.30   0.765 -210.5   146
-#> 4        74           108 causal_forest     4      0.68   0.494 -104.0   252
-#> 5       228           108 causal_forest     5      2.12   0.034   51.4   405
-#> 6       126            58      user_itr     1      2.16   0.031   30.2   222
-#> 7        96            59      user_itr     2      1.62   0.105   -1.4   194
-#> 8       -33            59      user_itr     3     -0.56   0.579 -129.7    64
-#> 9      -139            59      user_itr     4     -2.36   0.018 -236.5   -42
-#> 10      -32            59      user_itr     5     -0.54   0.589 -129.4    65
-

We plot the estimated Area Under the Prescriptive Effect Curve -(AUPEC) for the writing score across a range of budget constraints for -user defined ITR and estimated ITRs. The plot shows that the estimated -ITRs have better performance than the user defined ITR.

-
-# plot the AUPEC 
-plot(compare_itr)
-

-
-
-

Existing Model vs. User-Defined Model -

-

The package also allows to compare the performance of estimated ITRs -of existing ML packages with user defined models. The following code -shows an example using causal forest from the grf package -with sample splitting. The estimate_itr function takes the -following arguments:

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ArgumentDescription
treatmenta character string specifying the treatment variable in -the data -
forma formula specifying the outcome and covariates
dataa data frame
algorithmsa character vector specifying the ML algorithms to be -used
budgeta numeric value specifying the maximum percentage of -population that can be treated under the budget constraint
split_ratioa character string specifying the outcome variable in -the data -
user_modela character string specifying the user defined -model
-

The user_model input should be a function that takes two -arguments: training_data and test_data. The -function will make use of the training_data to fit a model -and then use the test_data to estimate CATE or other -metrics of interest. It should also specify the way to get the ITR, -based on the estimated effects.

-

In the following example, we fit a linear model with sample splitting -and use the estimated CATE. We compute the ITR by assigning treatment to -those with positive CATE and no treatment to those with negative CATE. -The function user_model takes in the training data and test -data and return a list that contains (1) an ITR; (2) a fitted model; and -(3) a continuous score with the same length as the input data.

-
-# user-defined model
-user_model <- function(training_data, test_data){
-
-  # model fit on training data
-  fit <- train_model(training_data)
-  
-  # estimate CATE on test data
-  compute_hatf <- function(fit, test_data){
-
-    score <- fit_predict(fit, test_data)  
-    itr   <- score_function(score)
-    
-    return(list(itr = itr, score = score))
-  }
-
-  hatf <- compute_hatf(fit, test_data)
-  
-  return(list(
-    itr = hatf$itr, 
-    fit = fit, 
-    score = hatf$score))
-}
-

Note that the user defined model can be any model that returns a -unit-level continuous score for treatment assignment. It does not have -to be a linear model or model that estimate CATE. We can specify custom -functions in the train_model function and the -fit_predict function to compute the score. If the model -does not have a default predict function, we need to write -up a custom function with fit_predict.

-
-# train model
-train_model <- function(data){
-  fit <- lm(
-    Y ~ T*(cov1 + cov1 + cov3), 
-    data = data)
-  return(fit)
-}
-
-# predict function
-fit_predict <- function(fit, data){
-  # need to change this function if 
-  # the model does not have a default predict function
-  score <- predict(fit, data) 
-  return(score)
-}
-

In addition, we can also choose any scoring rule that maps the score -to a binary indicator of treatment assignment.

-
-# score function
-score_function <- function(score){
-  itr <- (score >= 0) * 1
-  return(itr)
-}
-

If split_ratio is specified, the function will split the -data into training and test data. The split_ratio should be -a numeric value between 0 and 1. Alternatively, if n_folds -is specified, the function will use the entire data to fit the user -defined model via cross-validation.

-
-# estimate ITR
-compare_fit <- estimate_itr(
-  treatment = "T",
-  form = user_formula,
-  data = star_data,
-  algorithms = c("causal_forest"),
-  budget = 0.2,
-  split_ratio = 0.7,
-  user_model = "user_model")
-#> Evaluate ITR under sample splitting ...
-
-
-# evaluate ITR 
-compare_est <- evaluate_itr(compare_fit)
-
-# summarize estimates
-summary(compare_est)
-#> -- PAPE ------------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1      1.6           1.2 causal_forest       1.3     0.2
-#> 2      0.0           0.0    user_model       NaN     NaN
-#> 
-#> -- PAPEp -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     2.60           1.2 causal_forest      2.14   0.032
-#> 2     0.97           1.2    user_model      0.79   0.427
-#> 
-#> -- PAPDp -----------------------------------------------------------------------
-#>   estimate std.deviation                  algorithm statistic p.value
-#> 1      1.6           1.7 causal_forest x user_model      0.95    0.34
-#> 
-#> -- AUPEC -----------------------------------------------------------------------
-#>   estimate std.deviation     algorithm statistic p.value
-#> 1     2.35          0.98 causal_forest      2.40   0.016
-#> 2    -0.57          0.88    user_model     -0.65   0.515
-#> 
-#> -- GATE ------------------------------------------------------------------------
-#>    estimate std.deviation     algorithm group statistic p.value upper lower
-#> 1        35           109 causal_forest     1      0.33 7.5e-01  -143   214
-#> 2       145           109 causal_forest     2      1.34 1.8e-01   -34   324
-#> 3        56           109 causal_forest     3      0.52 6.1e-01  -123   235
-#> 4      -146           108 causal_forest     4     -1.35 1.8e-01  -322    31
-#> 5       -72           107 causal_forest     5     -0.67 5.0e-01  -247   104
-#> 6      -249           104    user_model     1     -2.39 1.7e-02  -421   -77
-#> 7      -455           104    user_model     2     -4.39 1.1e-05  -625  -284
-#> 8      -303           105    user_model     3     -2.88 4.0e-03  -477  -130
-#> 9       316           110    user_model     4      2.88 4.0e-03   135   496
-#> 10      711           109    user_model     5      6.51 7.4e-11   531   890
-plot(compare_est)
-

-
-
-
- - - -
- - - -
-
- - - - - - - diff --git a/docs/authors.html b/docs/authors.html deleted file mode 100644 index 59cfd08..0000000 --- a/docs/authors.html +++ /dev/null @@ -1,117 +0,0 @@ - -Authors and Citation • evalITR - Skip to contents - - -
-
-
- -
-

Authors

- -
  • -

    Michael Lingzhi Li. Author, maintainer. -

    -
  • -
  • -

    Kosuke Imai. Author. -

    -
  • -
  • -

    Jialu Li. Author. -

    -
  • -
  • -

    Xiaolong Yang. Author. -

    -
  • -
- -
-

Citation

-

Source: DESCRIPTION

- -

Li M, Imai K, Li J, Yang X (2023). -evalITR: Evaluating Individualized Treatment Rules. -https://github.com/MichaelLLi/evalITR, -https://michaellli.github.io/evalITR/, -https://jialul.github.io/causal-ml/. -

-
@Manual{,
-  title = {evalITR: Evaluating Individualized Treatment Rules},
-  author = {Michael Lingzhi Li and Kosuke Imai and Jialu Li and Xiaolong Yang},
-  year = {2023},
-  note = {https://github.com/MichaelLLi/evalITR,
-https://michaellli.github.io/evalITR/,
-https://jialul.github.io/causal-ml/},
-}
-
-
- - -
- - - -
- - - - - - - diff --git a/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js deleted file mode 100644 index cc0a255..0000000 --- a/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,k=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;et===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;ij.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;ie+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js.map deleted file mode 100644 index 7d78e32..0000000 --- a/docs/deps/bootstrap-5.1.3/bootstrap.bundle.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","bottom","right","auto","basePlacements","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","includeScale","width","height","x","y","getLayoutRect","clientRect","offsetWidth","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","round","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","isDisplayStatic","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","_handlePopperPlacementChange","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","// import { isHTMLElement } from './instanceOf';\nexport default function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\nincludeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1; // FIXME:\n // `offsetWidth` returns an integer while `getBoundingClientRect`\n // returns a float. This results in `scaleX` or `scaleY` being\n // non-1 when it should be for elements that aren't a full pixel in\n // width or height.\n // if (isHTMLElement(element) && includeScale) {\n // const offsetHeight = element.offsetHeight;\n // const offsetWidth = element.offsetWidth;\n // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // // Fallback to 1 in case both values are `0`\n // if (offsetWidth > 0) {\n // scaleX = rect.width / offsetWidth || 1;\n // }\n // if (offsetHeight > 0) {\n // scaleY = rect.height / offsetHeight || 1;\n // }\n // }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = rect.width / element.offsetWidth || 1;\n var scaleY = rect.height / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '
' +\n '
' +\n '
' +\n '
',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both