From 5355f68f5f205e5488eb888fc1e5a9e0f11fcbac Mon Sep 17 00:00:00 2001 From: Robin van Emden Date: Sun, 17 Mar 2019 15:04:07 +0100 Subject: [PATCH] Version 0.9.8.1 Specified previous version of set.seed sampler with RNGversion() calls, to ensure CRAN devel check compatibility --- .Rbuildignore | 2 + DESCRIPTION | 2 +- NEWS.md | 5 + R/functions_utility.R | 2 +- cran-comments.md | 2 +- docs/articles/cmabs.html | 44 +-- docs/articles/cmabsoffline.html | 88 ++--- docs/articles/eckles_kaptein.html | 62 +-- docs/articles/epsilongreedy.html | 80 ++-- docs/articles/index.html | 4 +- docs/articles/introduction.html | 60 +-- docs/articles/mabs.html | 46 +-- docs/articles/ml10m.html | 244 ++++++------ docs/articles/offline_depaul_movies.html | 106 +++--- docs/articles/only_pkgdown/faq.html | 150 ++++---- docs/articles/replication.html | 156 ++++---- docs/articles/simpsons.html | 358 +++++++++--------- docs/articles/sutton_barto.html | 148 ++++---- docs/articles/website_optimization.html | 98 ++--- docs/authors.html | 4 +- docs/index.html | 18 +- docs/news/index.html | 31 +- docs/pkgdown.yml | 6 +- docs/reference/Agent.html | 4 +- docs/reference/Bandit.html | 4 +- docs/reference/BasicBernoulliBandit.html | 4 +- docs/reference/BasicGaussianBandit.html | 4 +- docs/reference/BootstrapTSPolicy.html | 4 +- docs/reference/ContextualBernoulliBandit.html | 4 +- docs/reference/ContextualBinaryBandit.html | 4 +- .../ContextualEpochGreedyPolicy.html | 4 +- .../ContextualEpsilonGreedyPolicy.html | 4 +- docs/reference/ContextualHybridBandit.html | 4 +- docs/reference/ContextualLinTSPolicy.html | 4 +- docs/reference/ContextualLinearBandit.html | 4 +- docs/reference/ContextualLogitBTSPolicy.html | 4 +- docs/reference/ContextualLogitBandit.html | 4 +- .../reference/ContextualPrecachingBandit.html | 4 +- docs/reference/ContextualTSProbitPolicy.html | 4 +- docs/reference/ContextualWheelBandit.html | 4 +- docs/reference/ContinuumBandit.html | 4 +- docs/reference/EpsilonFirstPolicy-1.png | Bin 12066 -> 12066 bytes docs/reference/EpsilonFirstPolicy-2.png | Bin 17887 -> 17887 bytes docs/reference/EpsilonFirstPolicy.html | 6 +- docs/reference/EpsilonGreedyPolicy-1.png | Bin 11833 -> 11833 bytes docs/reference/EpsilonGreedyPolicy-2.png | Bin 17565 -> 17565 bytes docs/reference/EpsilonGreedyPolicy.html | 6 +- docs/reference/Exp3Policy-1.png | Bin 12677 -> 12677 bytes docs/reference/Exp3Policy-2.png | Bin 19447 -> 19377 bytes docs/reference/Exp3Policy.html | 6 +- docs/reference/FixedPolicy.html | 4 +- docs/reference/GittinsBrezziLaiPolicy.html | 4 +- docs/reference/GradientPolicy-1.png | Bin 12617 -> 12617 bytes docs/reference/GradientPolicy-2.png | Bin 20824 -> 20761 bytes docs/reference/GradientPolicy.html | 6 +- docs/reference/History.html | 4 +- docs/reference/LifPolicy.html | 4 +- .../LinUCBDisjointOptimizedPolicy.html | 4 +- docs/reference/LinUCBDisjointPolicy.html | 4 +- docs/reference/LinUCBGeneralPolicy.html | 4 +- .../LinUCBHybridOptimizedPolicy.html | 4 +- docs/reference/LinUCBHybridPolicy.html | 4 +- .../OfflineBootstrappedReplayBandit.html | 4 +- docs/reference/OfflineDirectMethodBandit.html | 4 +- docs/reference/OfflineDoublyRobustBandit.html | 4 +- .../OfflineLookupReplayEvaluatorBandit.html | 4 +- .../OfflinePropensityWeightingBandit.html | 4 +- .../OfflineReplayEvaluatorBandit.html | 4 +- docs/reference/OraclePolicy.html | 4 +- docs/reference/Plot.html | 4 +- docs/reference/Policy.html | 4 +- docs/reference/RandomPolicy-1.png | Bin 20536 -> 20345 bytes docs/reference/RandomPolicy.html | 6 +- docs/reference/Simulator.html | 4 +- docs/reference/SoftmaxPolicy-1.png | Bin 12625 -> 12625 bytes docs/reference/SoftmaxPolicy-2.png | Bin 13942 -> 13942 bytes docs/reference/SoftmaxPolicy.html | 6 +- docs/reference/ThompsonSamplingPolicy-1.png | Bin 13927 -> 13927 bytes docs/reference/ThompsonSamplingPolicy.html | 6 +- docs/reference/UCB1Policy.html | 4 +- docs/reference/UCB2Policy-1.png | Bin 11003 -> 11003 bytes docs/reference/UCB2Policy-2.png | Bin 13442 -> 13442 bytes docs/reference/UCB2Policy.html | 6 +- docs/reference/clipr.html | 4 +- .../data_table_factors_to_numeric.html | 4 +- docs/reference/dec-set.html | 4 +- docs/reference/formatted_difftime.html | 4 +- docs/reference/get_arm_context.html | 4 +- docs/reference/get_full_context.html | 4 +- docs/reference/inc-set.html | 4 +- docs/reference/ind.html | 4 +- docs/reference/index.html | 4 +- docs/reference/inv.html | 4 +- docs/reference/invgamma-1.png | Bin 12068 -> 12068 bytes docs/reference/invgamma.html | 4 +- docs/reference/invlogit.html | 4 +- docs/reference/is_rstudio.html | 4 +- docs/reference/mvrnorm.html | 4 +- docs/reference/one_hot.html | 4 +- docs/reference/ones_in_zeroes.html | 4 +- docs/reference/plot.history.html | 4 +- docs/reference/print.history.html | 4 +- docs/reference/prob_winner.html | 4 +- docs/reference/sample_one_of.html | 4 +- docs/reference/set_external.html | 4 +- docs/reference/sherman_morrisson.html | 4 +- docs/reference/sim_post.html | 4 +- docs/reference/sum_of.html | 4 +- docs/reference/summary.history.html | 4 +- docs/reference/value_remaining-1.png | Bin 10381 -> 10381 bytes docs/reference/value_remaining.html | 4 +- docs/reference/var_welford.html | 4 +- docs/reference/which_max_list.html | 4 +- docs/reference/which_max_tied.html | 4 +- vignettes/only_pkgdown/faq.Rmd | 4 - 115 files changed, 1024 insertions(+), 1012 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index b9bf1bc..0493889 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,5 +1,7 @@ ^Meta$ ^doc$ +^vignettes/only_pkgdown$ +^vignettes/only_pkgdown.* ^demo/working_directory$ ^demo/working_directory.* contextual.Rproj diff --git a/DESCRIPTION b/DESCRIPTION index b7dfe85..d873958 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: contextual Type: Package Title: Simulation and Analysis of Contextual Multi-Armed Bandit Policies -Version: 0.9.8 +Version: 0.9.8.1 Authors@R: c(person("Robin", "van Emden", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-5820-8638"), email = "robinvanemden@gmail.com"), person("Maurits", "Kaptein", role = "ctb", email = "m.c.kaptein@tilburguniversity.edu", diff --git a/NEWS.md b/NEWS.md index 90c3a58..476e3c2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +contextual 0.9.8.1 +================== + +* Specified previous version of set.seed sampler with RNGversion() calls + contextual 0.9.8 ================ diff --git a/R/functions_utility.R b/R/functions_utility.R index 1c9df86..2a30490 100644 --- a/R/functions_utility.R +++ b/R/functions_utility.R @@ -421,7 +421,7 @@ get_full_context <- function(context, select_features = NULL, prepend_arm_matrix if(is.vector(X)) Xm <- X[select_features] else Xm <- X[select_features,] } - if(isTRUE(prepend_arm_vector)) Xv <- rbind(diag(k),Xv) + if(isTRUE(prepend_arm_matrix)) Xv <- rbind(diag(k),Xv) return(Xm) } diff --git a/cran-comments.md b/cran-comments.md index 5423d5e..1a97c25 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,4 +1,4 @@ -New submission. +Minor update adding "suppressWarnings(RNGversion("3.5.0"))" to ensure CRAN devel compatibility ## Test environments diff --git a/docs/articles/cmabs.html b/docs/articles/cmabs.html index 01052a6..e80c4b6 100644 --- a/docs/articles/cmabs.html +++ b/docs/articles/cmabs.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

Demo: Basic Synthetic cMAB Policies

Robin van Emden

-

2019-03-06

+

2019-03-17

Source: vignettes/cmabs.Rmd @@ -139,25 +139,25 @@

2019-03-06

-
library(contextual)
-
-horizon       <- 100L
-simulations   <- 100L
-
-bandit        <- ContextualLinearBandit$new(k = 4, d = 3, sigma = 0.3)
-
-# Linear CMAB policies comparison
-
-agents <- list(Agent$new(EpsilonGreedyPolicy$new(0.1), bandit, "EGreedy"),
-               Agent$new(ContextualEpsilonGreedyPolicy$new(0.1), bandit, "cEGreedy"),
-               Agent$new(ContextualLinTSPolicy$new(0.1), bandit, "LinTS"),
-               Agent$new(LinUCBDisjointOptimizedPolicy$new(0.6), bandit, "LinUCB"))
-
-simulation     <- Simulator$new(agents, horizon, simulations, do_parallel = TRUE)
-
-history        <- simulation$run()
-
-plot(history, type = "cumulative", rate = FALSE, legend_position = "topleft")
+
library(contextual)
+
+horizon       <- 100L
+simulations   <- 100L
+
+bandit        <- ContextualLinearBandit$new(k = 4, d = 3, sigma = 0.3)
+
+# Linear CMAB policies comparison
+
+agents <- list(Agent$new(EpsilonGreedyPolicy$new(0.1), bandit, "EGreedy"),
+               Agent$new(ContextualEpsilonGreedyPolicy$new(0.1), bandit, "cEGreedy"),
+               Agent$new(ContextualLinTSPolicy$new(0.1), bandit, "LinTS"),
+               Agent$new(LinUCBDisjointOptimizedPolicy$new(0.6), bandit, "LinUCB"))
+
+simulation     <- Simulator$new(agents, horizon, simulations, do_parallel = TRUE)
+
+history        <- simulation$run()
+
+plot(history, type = "cumulative", rate = FALSE, legend_position = "topleft")

@@ -172,7 +172,7 @@

2019-03-06

-

Site built with pkgdown 1.3.0.9000.

+

Site built with pkgdown 1.3.0.

diff --git a/docs/articles/cmabsoffline.html b/docs/articles/cmabsoffline.html index 3443825..050f34b 100644 --- a/docs/articles/cmabsoffline.html +++ b/docs/articles/cmabsoffline.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

Demo: Offline cMAB LinUCB evaluation

Robin van Emden

-

2019-03-06

+

2019-03-17

Source: vignettes/cmabsoffline.Rmd @@ -139,47 +139,47 @@

2019-03-06

-
library(contextual)
-library(data.table)
-
-# Import personalization data-set
-
-library(contextual); library(data.table)
-
-dt      <- fread("http://pwy.nl/d") # 0/1 reward, 10 arms, 100 features
-                                    # arms always start from 1
-
-#      z y x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15  .. x100
-#   1: 2 0  5  0  0 37  6  0  0  0  0  25   0   0   7   1   0  ..    0
-#   2: 8 0  1  3 36  0  0  0  0  0  0   0   0   1   0   0   0  ..   10
-#   3: . .  .  .  .  .  .  .  .  .  .   .   .   .   .   .   .  ..    .
-
-horizon     <- nrow(dt)
-simulations <- 1
-
-# Set up formula:       y      ~ z    | x1 + x2 + ..
-# In bandit parlance:   reward ~ arms | covariates or contextual features
-
-f       <- y ~ z | . - z
-
-# Instantiate Replay Bandit (Li, 2010)
-bandit  <- OfflineReplayEvaluatorBandit$new(formula = f, data = dt)
-
-# Bind Policies withs Bandits through Agents, add Agents to list
-agents  <- list(Agent$new(LinUCBDisjointOptimizedPolicy$new(0.01), bandit, "alpha = 0.01"),
-                Agent$new(LinUCBDisjointOptimizedPolicy$new(0.05), bandit, "alpha = 0.05"),
-                Agent$new(LinUCBDisjointOptimizedPolicy$new(0.1),  bandit, "alpha = 0.1"),
-                Agent$new(LinUCBDisjointOptimizedPolicy$new(1.0),  bandit, "alpha = 1.0"))
-
-# Instantiate a Simulator
-simulation <- Simulator$new(agents, horizon = nrow(dt), simulations = 1)
-
-# Run the simulation.
-history    <- simulation$run()
-
-# plot the results
-plot(history, type = "cumulative", regret = FALSE, rate = TRUE, 
-     legend_position = "bottomright", ylim = c(0,1))
+
library(contextual)
+library(data.table)
+
+# Import personalization data-set
+
+library(contextual); library(data.table)
+
+dt      <- fread("http://pwy.nl/d") # 0/1 reward, 10 arms, 100 features
+                                    # arms always start from 1
+
+#      z y x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15  .. x100
+#   1: 2 0  5  0  0 37  6  0  0  0  0  25   0   0   7   1   0  ..    0
+#   2: 8 0  1  3 36  0  0  0  0  0  0   0   0   1   0   0   0  ..   10
+#   3: . .  .  .  .  .  .  .  .  .  .   .   .   .   .   .   .  ..    .
+
+horizon     <- nrow(dt)
+simulations <- 1
+
+# Set up formula:       y      ~ z    | x1 + x2 + ..
+# In bandit parlance:   reward ~ arms | covariates or contextual features
+
+f       <- y ~ z | . - z
+
+# Instantiate Replay Bandit (Li, 2010)
+bandit  <- OfflineReplayEvaluatorBandit$new(formula = f, data = dt)
+
+# Bind Policies withs Bandits through Agents, add Agents to list
+agents  <- list(Agent$new(LinUCBDisjointOptimizedPolicy$new(0.01), bandit, "alpha = 0.01"),
+                Agent$new(LinUCBDisjointOptimizedPolicy$new(0.05), bandit, "alpha = 0.05"),
+                Agent$new(LinUCBDisjointOptimizedPolicy$new(0.1),  bandit, "alpha = 0.1"),
+                Agent$new(LinUCBDisjointOptimizedPolicy$new(1.0),  bandit, "alpha = 1.0"))
+
+# Instantiate a Simulator
+simulation <- Simulator$new(agents, horizon = nrow(dt), simulations = 1)
+
+# Run the simulation.
+history    <- simulation$run()
+
+# plot the results
+plot(history, type = "cumulative", regret = FALSE, rate = TRUE, 
+     legend_position = "bottomright", ylim = c(0,1))

@@ -194,7 +194,7 @@

2019-03-06

-

Site built with pkgdown 1.3.0.9000.

+

Site built with pkgdown 1.3.0.

diff --git a/docs/articles/eckles_kaptein.html b/docs/articles/eckles_kaptein.html index f9114ea..7501a47 100644 --- a/docs/articles/eckles_kaptein.html +++ b/docs/articles/eckles_kaptein.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

Demo: MAB Replication Eckles & Kaptein (Bootstrap Thompson Sampling)

Robin van Emden

-

2019-03-06

+

2019-03-17

Source: vignettes/eckles_kaptein.Rmd @@ -139,34 +139,34 @@

2019-03-06

-
library(contextual)
-
-# Replication of THOMPSON SAMPLING WITH THE ONLINE BOOTSTRAP By Dean Eckles and Maurits Kaptein
-
-# This evaluations takes time - up to a few hours when run single core.
-
-# Running the script in parallel (for example, on 8 cores) 
-# shortens the evaluation time substantially.
-
-# https://arxiv.org/abs/1410.4009
-
-# Fig 2. Empirical regret for Thompson sampling and BTS in a K-armed binomial bandit problem.
-
-bandit             <- BasicBernoulliBandit$new(weights = c(0.5, rep(0.4,9)))
-
-agents             <- list(Agent$new(BootstrapTSPolicy$new(1000), bandit, "BTS 1000"),
-                           Agent$new(ThompsonSamplingPolicy$new(), bandit, "TS"))
-
-simulator          <- Simulator$new(agents        = agents,
-                                    do_parallel   = TRUE,
-                                    save_interval = 50,
-                                    set_seed      = 999,
-                                    horizon       = 1e+05,
-                                    simulations   = 1000)
-
-simulator$run()
-
-plot(simulator$history, log = "x")
+
library(contextual)
+
+# Replication of THOMPSON SAMPLING WITH THE ONLINE BOOTSTRAP By Dean Eckles and Maurits Kaptein
+
+# This evaluations takes time - up to a few hours when run single core.
+
+# Running the script in parallel (for example, on 8 cores) 
+# shortens the evaluation time substantially.
+
+# https://arxiv.org/abs/1410.4009
+
+# Fig 2. Empirical regret for Thompson sampling and BTS in a K-armed binomial bandit problem.
+
+bandit             <- BasicBernoulliBandit$new(weights = c(0.5, rep(0.4,9)))
+
+agents             <- list(Agent$new(BootstrapTSPolicy$new(1000), bandit, "BTS 1000"),
+                           Agent$new(ThompsonSamplingPolicy$new(), bandit, "TS"))
+
+simulator          <- Simulator$new(agents        = agents,
+                                    do_parallel   = TRUE,
+                                    save_interval = 50,
+                                    set_seed      = 999,
+                                    horizon       = 1e+05,
+                                    simulations   = 1000)
+
+simulator$run()
+
+plot(simulator$history, log = "x")

@@ -181,7 +181,7 @@

2019-03-06

-

Site built with pkgdown 1.3.0.9000.

+

Site built with pkgdown 1.3.0.

diff --git a/docs/articles/epsilongreedy.html b/docs/articles/epsilongreedy.html index faf8666..673ea2d 100644 --- a/docs/articles/epsilongreedy.html +++ b/docs/articles/epsilongreedy.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

Demo: Basic Epsilon Greedy

Robin van Emden

-

2019-03-06

+

2019-03-17

Source: vignettes/epsilongreedy.Rmd @@ -139,44 +139,44 @@

2019-03-06

-
library(contextual)
-
-policy             <- EpsilonGreedyPolicy$new(epsilon = 0.1)
-
-bandit             <- BasicBernoulliBandit$new(weights = c(0.6, 0.1, 0.1))
-agent              <- Agent$new(policy,bandit)
-
-simulator          <- Simulator$new(agents      = agent,
-                                    horizon     = 100,
-                                    simulations = 1000)
-                                    
-history            <- simulator$run()
-
-plot(history, type = "cumulative", regret = TRUE, disp = "ci",
-              traces_max = 100, traces_alpha = 0.1, traces = TRUE)
+
library(contextual)
+
+policy             <- EpsilonGreedyPolicy$new(epsilon = 0.1)
+
+bandit             <- BasicBernoulliBandit$new(weights = c(0.6, 0.1, 0.1))
+agent              <- Agent$new(policy,bandit)
+
+simulator          <- Simulator$new(agents      = agent,
+                                    horizon     = 100,
+                                    simulations = 1000)
+                                    
+history            <- simulator$run()
+
+plot(history, type = "cumulative", regret = TRUE, disp = "ci",
+              traces_max = 100, traces_alpha = 0.1, traces = TRUE)

-
summary(history)
-                                  
-
Agents:
-
-  EpsilonGreedy
-
-Cumulative regret:
-
-         agent   t sims cum_regret cum_regret_var cum_regret_sd
- EpsilonGreedy 100 1000      8.951       116.7133      10.80339
-
-
-Cumulative reward:
-
-         agent   t sims cum_reward cum_reward_var cum_reward_sd
- EpsilonGreedy 100 1000      51.09       141.6215      11.90048
-
-
-Cumulative reward rate:
-
-         agent   t sims cur_reward cur_reward_var cur_reward_sd
- EpsilonGreedy 100 1000     0.5109       1.416215     0.1190048
+
summary(history)
+                                  
+
Agents:
+
+  EpsilonGreedy
+
+Cumulative regret:
+
+         agent   t sims cum_regret cum_regret_var cum_regret_sd
+ EpsilonGreedy 100 1000      8.951       116.7133      10.80339
+
+
+Cumulative reward:
+
+         agent   t sims cum_reward cum_reward_var cum_reward_sd
+ EpsilonGreedy 100 1000      51.09       141.6215      11.90048
+
+
+Cumulative reward rate:
+
+         agent   t sims cur_reward cur_reward_var cur_reward_sd
+ EpsilonGreedy 100 1000     0.5109       1.416215     0.1190048
-

Site built with pkgdown 1.3.0.9000.

+

Site built with pkgdown 1.3.0.

diff --git a/docs/articles/index.html b/docs/articles/index.html index 6db3e95..639e0aa 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -66,7 +66,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -194,7 +194,7 @@

All vignettes

-

Site built with pkgdown 1.3.0.9000.

+

Site built with pkgdown 1.3.0.

diff --git a/docs/articles/introduction.html b/docs/articles/introduction.html index ddd7e3c..4157464 100644 --- a/docs/articles/introduction.html +++ b/docs/articles/introduction.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

Getting started: running simulations

Robin van Emden

-

2019-03-06

+

2019-03-17

Source: vignettes/introduction.Rmd @@ -157,33 +157,33 @@

  • EpsilonGreedyPolicy: explores one of the ads uniformly at random \(\epsilon\) of the time and exploits the ad with the best current click-through rate \(1 - \epsilon\) of the time. Here, we will set \(\epsilon = 0.4\).

  • Next, we assign the bandit and the two policy instances to two agents. Finally, we assign a list holding both agents to a Simulator instance, set the simulator’s horizon to four hundred and the number of repeats to ten thousand, run the simulation, and plot() its results:

    - +

    As can be observed in the figure above, within our horizon of \(T = 400\), EpsilonFirstPolicy has accumulated more rewards than EpsilonGreedytPolicy. It is easy to see why: The winning arm is better than the other two—by a margin. That means that EpsilonFirstPolicy has no difficulty in finding the optimal arm within its exploration period of one hundred impressions. Up to that point, EpsilonGreedyPolicy still had the advantage of a headstart, as it was already able to exploit for \(1- \epsilon\) or sixty percent of the time. But from one hundred impressions on, EpsilonFirstPolicy switches from full exploration to full exploitation mode. In contrast to EpsilonGreedyPolicy, it is now able to exploit the arm that proved best during exploration all of the time. As a result, it is able catch up with (and then surpass) the rewards accumulated by EpsilonGreedyPolicy within less than one hundred and fifty impressions.

    @@ -234,7 +234,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/mabs.html b/docs/articles/mabs.html index cb208fa..59320e3 100644 --- a/docs/articles/mabs.html +++ b/docs/articles/mabs.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: MAB Policies Comparison

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/mabs.Rmd @@ -139,26 +139,26 @@

    2019-03-06

    -
    library(contextual)
    -
    -prob_per_arm       <- c(0.9, 0.1, 0.1)
    -horizon            <- 100
    -simulations        <- 1000
    -
    -bandit             <- BasicBernoulliBandit$new(prob_per_arm)
    -
    -agents             <- list(Agent$new(OraclePolicy$new(), bandit),
    -                           Agent$new(EpsilonGreedyPolicy$new(0.1), bandit),
    -                           Agent$new(ThompsonSamplingPolicy$new(1.0, 1.0), bandit),
    -                           Agent$new(Exp3Policy$new(0.1), bandit),
    -                           Agent$new(GittinsBrezziLaiPolicy$new(), bandit),
    -                           Agent$new(UCB1Policy$new(), bandit),
    -                           Agent$new(UCB2Policy$new(0.1), bandit))
    -
    -simulation         <- Simulator$new(agents, horizon, simulations)
    -history            <- simulation$run()
    -
    -plot(history, type = "cumulative")
    +
    library(contextual)
    +
    +prob_per_arm       <- c(0.9, 0.1, 0.1)
    +horizon            <- 100
    +simulations        <- 1000
    +
    +bandit             <- BasicBernoulliBandit$new(prob_per_arm)
    +
    +agents             <- list(Agent$new(OraclePolicy$new(), bandit),
    +                           Agent$new(EpsilonGreedyPolicy$new(0.1), bandit),
    +                           Agent$new(ThompsonSamplingPolicy$new(1.0, 1.0), bandit),
    +                           Agent$new(Exp3Policy$new(0.1), bandit),
    +                           Agent$new(GittinsBrezziLaiPolicy$new(), bandit),
    +                           Agent$new(UCB1Policy$new(), bandit),
    +                           Agent$new(UCB2Policy$new(0.1), bandit))
    +
    +simulation         <- Simulator$new(agents, horizon, simulations)
    +history            <- simulation$run()
    +
    +plot(history, type = "cumulative")

    @@ -173,7 +173,7 @@

    2019-03-06

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/ml10m.html b/docs/articles/ml10m.html index 3d8d9e3..292ea83 100644 --- a/docs/articles/ml10m.html +++ b/docs/articles/ml10m.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: MovieLens 10M Dataset

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/ml10m.Rmd @@ -139,125 +139,125 @@

    2019-03-06

    -
    library(contextual)
    -library(data.table)
    -library(splitstackshape)
    -library(RCurl)
    -
    -# Import MovieLens ml-10M ------------------------------------------------------------------------
    -
    -# Info: https://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/README.html
    -
    -movies_dat      <- "http://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/movies.dat"
    -ratings_dat     <- "http://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/ratings.dat"
    -
    -movies_dat      <- readLines(movies_dat)
    -movies_dat      <- gsub( "::", "~", movies_dat )
    -movies_dat      <- paste0(movies_dat, collapse = "\n")
    -movies_dat      <- fread(movies_dat, sep = "~", quote="")
    -setnames(movies_dat, c("V1", "V2", "V3"), c("MovieID", "Name", "Type"))
    -movies_dat      <- splitstackshape::cSplit_e(movies_dat, "Type", sep = "|", type = "character",
    -                                             fill = 0, drop = TRUE)
    -movies_dat[[3]] <- NULL
    -
    -ratings_dat     <- RCurl::getURL(ratings_dat)
    -ratings_dat     <- readLines(textConnection(ratings_dat))
    -ratings_dat     <- gsub( "::", "~", ratings_dat )
    -ratings_dat     <- paste0(ratings_dat, collapse = "\n")
    -ratings_dat     <- fread(ratings_dat, sep = "~", quote="")
    -setnames(ratings_dat, c("V1", "V2", "V3", "V4"), c("UserID", "MovieID", "Rating", "Timestamp"))
    -
    -all_movies      <- ratings_dat[movies_dat, on=c(MovieID = "MovieID")]
    -
    -all_movies      <- na.omit(all_movies,cols=c("MovieID", "UserID"))
    -
    -rm(movies_dat,ratings_dat)
    -
    -# Data wrangling --------------------------------------------------------------------------------
    -
    -all_movies[, UserID   := as.numeric(as.factor(UserID))]
    -
    -count_movies    <- all_movies[,.(MovieCount = .N), by = MovieID]
    -top_50          <- as.vector(count_movies[order(-MovieCount)][1:50]$MovieID)
    -not_50          <- as.vector(count_movies[order(-MovieCount)][51:nrow(count_movies)]$MovieID)
    -
    -top_50_movies   <- all_movies[MovieID %in% top_50]
    -
    -# -----------------------------------------------------------------------------------------------
    -
    -# Create feature lookup tables - to speed up, MovieID and UserID are
    -# ordered and lined up with the (dt/matrix) default index.
    -
    -# Arm features
    -
    -# MovieID of top 50 ordered from 1 to N as arms (Arms always start from 1)
    -top_50_movies[, MovieID   := as.numeric(as.factor(MovieID))]
    -arm_features    <- top_50_movies[,head(.SD, 1),by = MovieID][,c(1,6:24)]
    -setorder(arm_features,MovieID)
    -
    -# User features
    -
    -# Count of categories for non-top-50 movies normalized per user
    -user_features   <- all_movies[MovieID %in% not_50]
    -user_features[, c("MovieID", "Rating", "Timestamp", "Name"):=NULL]
    -user_features   <- user_features[, lapply(.SD, sum, na.rm=TRUE), by=UserID ]
    -user_features[, total  := rowSums(.SD, na.rm = TRUE), .SDcols = 2:20]
    -user_features[, 2:20 := lapply(.SD, function(x) x/total), .SDcols = 2:20]
    -user_features$total <- NULL
    -
    -# Add users that were not in the set of non-top-50 movies (4 in 10m dataset)
    -all_users <- as.data.table(unique(all_movies$UserID))
    -user_features <- user_features[all_users, on=c(UserID = "V1")]
    -user_features[is.na(user_features)] <- 0
    -
    -setorder(user_features,UserID)
    -
    -# ----------------------------------------------------------------------------------------------
    -
    -rm(all_movies, not_50, top_50, count_movies)
    -
    -# ----------------------------------------------------------------------------------------------
    -
    -# Contextual format
    -
    -top_50_movies[, t := .I]
    -top_50_movies[, sim := 1]
    -top_50_movies[, agent := "Offline"]
    -top_50_movies[, choice := MovieID]
    -top_50_movies[, reward := ifelse(Rating <= 4, 0, 1)]
    -
    -setorder(top_50_movies,Timestamp,Name)
    -
    -
    -# Run simulation --------------------------------------------------------------------------------
    -
    -simulations <- 1
    -horizon     <- 1000 #nrow(top_50_movies)
    -
    -bandit      <- OfflineLookupReplayEvaluatorBandit$new(top_50_movies,
    -                                                      k             = 50,
    -                                                      unique_col    = "UserID",
    -                                                      shared_lookup = arm_features,
    -                                                      unique_lookup = user_features)
    -agents      <-
    -  list(Agent$new(ThompsonSamplingPolicy$new(), bandit, "Thompson"),
    -       Agent$new(UCB1Policy$new(), bandit, "UCB1"),
    -       Agent$new(RandomPolicy$new(), bandit, "Random"),
    -       Agent$new(LinUCBHybridOptimizedPolicy$new(0.9), bandit, "LinUCB Hyb 0.9"),
    -       Agent$new(LinUCBDisjointOptimizedPolicy$new(2.1), bandit, "LinUCB Dis 2.1"))
    -
    -simulation  <-
    -  Simulator$new(
    -    agents           = agents,
    -    simulations      = simulations,
    -    horizon          = horizon,
    -    reindex          = TRUE
    -  )
    -
    -results  <- simulation$run()
    -
    -plot(results, type = "cumulative", regret = FALSE,
    -     rate = TRUE, legend_position = "topleft")
    +
    library(contextual)
    +library(data.table)
    +library(splitstackshape)
    +library(RCurl)
    +
    +# Import MovieLens ml-10M ------------------------------------------------------------------------
    +
    +# Info: https://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/README.html
    +
    +movies_dat      <- "http://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/movies.dat"
    +ratings_dat     <- "http://d1ie9wlkzugsxr.cloudfront.net/data_movielens/ml-10M/ratings.dat"
    +
    +movies_dat      <- readLines(movies_dat)
    +movies_dat      <- gsub( "::", "~", movies_dat )
    +movies_dat      <- paste0(movies_dat, collapse = "\n")
    +movies_dat      <- fread(movies_dat, sep = "~", quote="")
    +setnames(movies_dat, c("V1", "V2", "V3"), c("MovieID", "Name", "Type"))
    +movies_dat      <- splitstackshape::cSplit_e(movies_dat, "Type", sep = "|", type = "character",
    +                                             fill = 0, drop = TRUE)
    +movies_dat[[3]] <- NULL
    +
    +ratings_dat     <- RCurl::getURL(ratings_dat)
    +ratings_dat     <- readLines(textConnection(ratings_dat))
    +ratings_dat     <- gsub( "::", "~", ratings_dat )
    +ratings_dat     <- paste0(ratings_dat, collapse = "\n")
    +ratings_dat     <- fread(ratings_dat, sep = "~", quote="")
    +setnames(ratings_dat, c("V1", "V2", "V3", "V4"), c("UserID", "MovieID", "Rating", "Timestamp"))
    +
    +all_movies      <- ratings_dat[movies_dat, on=c(MovieID = "MovieID")]
    +
    +all_movies      <- na.omit(all_movies,cols=c("MovieID", "UserID"))
    +
    +rm(movies_dat,ratings_dat)
    +
    +# Data wrangling --------------------------------------------------------------------------------
    +
    +all_movies[, UserID   := as.numeric(as.factor(UserID))]
    +
    +count_movies    <- all_movies[,.(MovieCount = .N), by = MovieID]
    +top_50          <- as.vector(count_movies[order(-MovieCount)][1:50]$MovieID)
    +not_50          <- as.vector(count_movies[order(-MovieCount)][51:nrow(count_movies)]$MovieID)
    +
    +top_50_movies   <- all_movies[MovieID %in% top_50]
    +
    +# -----------------------------------------------------------------------------------------------
    +
    +# Create feature lookup tables - to speed up, MovieID and UserID are
    +# ordered and lined up with the (dt/matrix) default index.
    +
    +# Arm features
    +
    +# MovieID of top 50 ordered from 1 to N as arms (Arms always start from 1)
    +top_50_movies[, MovieID   := as.numeric(as.factor(MovieID))]
    +arm_features    <- top_50_movies[,head(.SD, 1),by = MovieID][,c(1,6:24)]
    +setorder(arm_features,MovieID)
    +
    +# User features
    +
    +# Count of categories for non-top-50 movies normalized per user
    +user_features   <- all_movies[MovieID %in% not_50]
    +user_features[, c("MovieID", "Rating", "Timestamp", "Name"):=NULL]
    +user_features   <- user_features[, lapply(.SD, sum, na.rm=TRUE), by=UserID ]
    +user_features[, total  := rowSums(.SD, na.rm = TRUE), .SDcols = 2:20]
    +user_features[, 2:20 := lapply(.SD, function(x) x/total), .SDcols = 2:20]
    +user_features$total <- NULL
    +
    +# Add users that were not in the set of non-top-50 movies (4 in 10m dataset)
    +all_users <- as.data.table(unique(all_movies$UserID))
    +user_features <- user_features[all_users, on=c(UserID = "V1")]
    +user_features[is.na(user_features)] <- 0
    +
    +setorder(user_features,UserID)
    +
    +# ----------------------------------------------------------------------------------------------
    +
    +rm(all_movies, not_50, top_50, count_movies)
    +
    +# ----------------------------------------------------------------------------------------------
    +
    +# Contextual format
    +
    +top_50_movies[, t := .I]
    +top_50_movies[, sim := 1]
    +top_50_movies[, agent := "Offline"]
    +top_50_movies[, choice := MovieID]
    +top_50_movies[, reward := ifelse(Rating <= 4, 0, 1)]
    +
    +setorder(top_50_movies,Timestamp,Name)
    +
    +
    +# Run simulation --------------------------------------------------------------------------------
    +
    +simulations <- 1
    +horizon     <- 1000 #nrow(top_50_movies)
    +
    +bandit      <- OfflineLookupReplayEvaluatorBandit$new(top_50_movies,
    +                                                      k             = 50,
    +                                                      unique_col    = "UserID",
    +                                                      shared_lookup = arm_features,
    +                                                      unique_lookup = user_features)
    +agents      <-
    +  list(Agent$new(ThompsonSamplingPolicy$new(), bandit, "Thompson"),
    +       Agent$new(UCB1Policy$new(), bandit, "UCB1"),
    +       Agent$new(RandomPolicy$new(), bandit, "Random"),
    +       Agent$new(LinUCBHybridOptimizedPolicy$new(0.9), bandit, "LinUCB Hyb 0.9"),
    +       Agent$new(LinUCBDisjointOptimizedPolicy$new(2.1), bandit, "LinUCB Dis 2.1"))
    +
    +simulation  <-
    +  Simulator$new(
    +    agents           = agents,
    +    simulations      = simulations,
    +    horizon          = horizon,
    +    reindex          = TRUE
    +  )
    +
    +results  <- simulation$run()
    +
    +plot(results, type = "cumulative", regret = FALSE,
    +     rate = TRUE, legend_position = "topleft")

    @@ -272,7 +272,7 @@

    2019-03-06

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/offline_depaul_movies.html b/docs/articles/offline_depaul_movies.html index 51b1aad..8a5a1a2 100644 --- a/docs/articles/offline_depaul_movies.html +++ b/docs/articles/offline_depaul_movies.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: Offline cMAB: CarsKit DePaul Movie Dataset

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/offline_depaul_movies.Rmd @@ -139,56 +139,56 @@

    2019-03-06

    -
    library(contextual)
    -library(data.table)
    -
    -# Import personalization data-set
    -
    -# Info: https://d1ie9wlkzugsxr.cloudfront.net/data_irecsys_CARSKit/Movie_DePaulMovie/README.txt
    -
    -url         <- "http://d1ie9wlkzugsxr.cloudfront.net/data_irecsys_CARSKit/Movie_DePaulMovie/ratings.csv"
    -data        <- fread(url, stringsAsFactors=TRUE)
    -
    -# Convert data
    -
    -data        <- contextual::one_hot(data, cols = c("Time","Location","Companion"), sparsifyNAs = TRUE)
    -data[, itemid := as.numeric(itemid)]
    -data[, rating := ifelse(rating <= 3, 0, 1)]
    -
    -# Set simulation parameters.
    -simulations <- 10  # here, "simulations" represents the number of boostrap samples
    -horizon     <- nrow(data)
    -
    -# Initiate Replay bandit with 10 arms and 100 context dimensions
    -# Arms always start with 1 for the first arm
    -log_S       <- data
    -formula     <- formula("rating ~ itemid | Time_Weekday + Time_Weekend + Location_Cinema + 
    -                                          Location_Home + Companion_Alone + Companion_Family + 
    -                                          Companion_Partner")
    -bandit      <- OfflineBootstrappedReplayBandit$new(formula = formula, data = data)
    -
    -# Define agents.
    -agents      <-
    -  list(Agent$new(RandomPolicy$new(), bandit, "Random"),
    -       Agent$new(EpsilonGreedyPolicy$new(0.03), bandit, "EGreedy 0.05"),
    -       Agent$new(ThompsonSamplingPolicy$new(), bandit, "ThompsonSampling"),
    -       Agent$new(LinUCBDisjointOptimizedPolicy$new(0.37), bandit, "LinUCB 0.37"))
    -
    -# Initialize the simulation.
    -simulation  <-
    -  Simulator$new(
    -    agents           = agents,
    -    simulations      = simulations,
    -    horizon          = horizon
    -  )
    -
    -# Run the simulation.
    -# Takes +- 5 minutes: bootstrapbandit loops through arms x horizon x simulations (times nr of agents).
    -sim  <- simulation$run()
    -
    -# plot the results
    -plot(sim, type = "cumulative", regret = FALSE, rate = TRUE,
    -         legend_position = "topleft", ylim=c(0.48,0.87))
    +
    library(contextual)
    +library(data.table)
    +
    +# Import personalization data-set
    +
    +# Info: https://d1ie9wlkzugsxr.cloudfront.net/data_irecsys_CARSKit/Movie_DePaulMovie/README.txt
    +
    +url         <- "http://d1ie9wlkzugsxr.cloudfront.net/data_irecsys_CARSKit/Movie_DePaulMovie/ratings.csv"
    +data        <- fread(url, stringsAsFactors=TRUE)
    +
    +# Convert data
    +
    +data        <- contextual::one_hot(data, cols = c("Time","Location","Companion"), sparsifyNAs = TRUE)
    +data[, itemid := as.numeric(itemid)]
    +data[, rating := ifelse(rating <= 3, 0, 1)]
    +
    +# Set simulation parameters.
    +simulations <- 10  # here, "simulations" represents the number of boostrap samples
    +horizon     <- nrow(data)
    +
    +# Initiate Replay bandit with 10 arms and 100 context dimensions
    +# Arms always start with 1 for the first arm
    +log_S       <- data
    +formula     <- formula("rating ~ itemid | Time_Weekday + Time_Weekend + Location_Cinema + 
    +                                          Location_Home + Companion_Alone + Companion_Family + 
    +                                          Companion_Partner")
    +bandit      <- OfflineBootstrappedReplayBandit$new(formula = formula, data = data)
    +
    +# Define agents.
    +agents      <-
    +  list(Agent$new(RandomPolicy$new(), bandit, "Random"),
    +       Agent$new(EpsilonGreedyPolicy$new(0.03), bandit, "EGreedy 0.05"),
    +       Agent$new(ThompsonSamplingPolicy$new(), bandit, "ThompsonSampling"),
    +       Agent$new(LinUCBDisjointOptimizedPolicy$new(0.37), bandit, "LinUCB 0.37"))
    +
    +# Initialize the simulation.
    +simulation  <-
    +  Simulator$new(
    +    agents           = agents,
    +    simulations      = simulations,
    +    horizon          = horizon
    +  )
    +
    +# Run the simulation.
    +# Takes +- 5 minutes: bootstrapbandit loops through arms x horizon x simulations (times nr of agents).
    +sim  <- simulation$run()
    +
    +# plot the results
    +plot(sim, type = "cumulative", regret = FALSE, rate = TRUE,
    +         legend_position = "topleft", ylim=c(0.48,0.87))

    @@ -203,7 +203,7 @@

    2019-03-06

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/only_pkgdown/faq.html b/docs/articles/only_pkgdown/faq.html index f0b41d0..61067a2 100644 --- a/docs/articles/only_pkgdown/faq.html +++ b/docs/articles/only_pkgdown/faq.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Development FAQ

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/only_pkgdown/faq.Rmd @@ -164,50 +164,50 @@

    What is this “self$theta_to_arms” list I see in some Policies?

    In many of contextual’s Policy’s set_parameters() initialisation function, a parameter list is being assigned to a “self$theta_to_arms”. But the parameters themselves are later only available through self$theta.

    The following source code comments how this little helper variable is used:

    -
    EpsilonFirstPolicy              <- R6::R6Class(
    -  inherit = Policy,
    -  public = list(
    -    first = NULL,
    -    class_name = "EpsilonFirstPolicy",
    -    initialize = function(epsilon = 0.1, N = 1000) {
    -      super$initialize()
    -      self$first                <- ceiling(epsilon*N)
    -    },
    -    set_parameters = function(context_params) {
    -
    -      self$theta_to_arms        <- list('n' = 0, 'mean' = 0)
    -
    -      # Here we define a list with 'n' and 'mean' theta parameters to each
    -      # arm through helper variable self$theta_to_arms. That is, when the
    -      # number of arms is 'k', the above would equal:
    -
    -      # self$theta <- list(n = rep(list(0,k)), 'mean' = rep(list(0,k)))
    -
    -      # ... which would also work just fine, but is much less concise.
    -
    -      # When assigning both to self$theta directly & via self$theta_to_arms,
    -      # make sure to do it in that particular order.
    -    },
    -    get_action = function(t, context) {
    -      if (sum_of(self$theta$n) < self$first) {
    -        action$choice           <- sample.int(context$k, 1, replace = TRUE)
    -      } else {
    -        action$choice           <- max_in(self$theta$mean)
    -      }
    -      action
    -    },
    -    set_reward = function(t, context, action, reward) {
    -      arm                       <- action$choice
    -      reward                    <- reward$reward
    -      inc(self$theta$n[[arm]])  <- 1
    -      if (sum_of(self$theta$n) < self$first - 1) {
    -        inc(self$theta$mean[[arm]]) <-
    -           (reward - self$theta$mean[[arm]]) / self$theta$n[[arm]]
    -      }
    -      self$theta
    -    }
    -  )
    -)
    +
    EpsilonFirstPolicy              <- R6::R6Class(
    +  inherit = Policy,
    +  public = list(
    +    first = NULL,
    +    class_name = "EpsilonFirstPolicy",
    +    initialize = function(epsilon = 0.1, N = 1000) {
    +      super$initialize()
    +      self$first                <- ceiling(epsilon*N)
    +    },
    +    set_parameters = function(context_params) {
    +
    +      self$theta_to_arms        <- list('n' = 0, 'mean' = 0)
    +
    +      # Here we define a list with 'n' and 'mean' theta parameters to each
    +      # arm through helper variable self$theta_to_arms. That is, when the
    +      # number of arms is 'k', the above would equal:
    +
    +      # self$theta <- list(n = rep(list(0,k)), 'mean' = rep(list(0,k)))
    +
    +      # ... which would also work just fine, but is much less concise.
    +
    +      # When assigning both to self$theta directly & via self$theta_to_arms,
    +      # make sure to do it in that particular order.
    +    },
    +    get_action = function(t, context) {
    +      if (sum_of(self$theta$n) < self$first) {
    +        action$choice           <- sample.int(context$k, 1, replace = TRUE)
    +      } else {
    +        action$choice           <- max_in(self$theta$mean)
    +      }
    +      action
    +    },
    +    set_reward = function(t, context, action, reward) {
    +      arm                       <- action$choice
    +      reward                    <- reward$reward
    +      inc(self$theta$n[[arm]])  <- 1
    +      if (sum_of(self$theta$n) < self$first - 1) {
    +        inc(self$theta$mean[[arm]]) <-
    +           (reward - self$theta$mean[[arm]]) / self$theta$n[[arm]]
    +      }
    +      self$theta
    +    }
    +  )
    +)

    @@ -223,22 +223,22 @@

    How do I use R packages within custom Bandits and Policies?

    If one of your custom Bandits or Policies requires a specific R package, use Simulator’s include_packages option to distribute the package(s) to each of a Simulator intance’s workers:

    - +

    It is then good practice to use a double colon operator to access some function from any included packages:

    - +

    @@ -256,19 +256,19 @@

    What is this public “class_name” member in every Bandit and Policy?

    Contextual uses the public “class_name” member internally to keep track of Policy’s and Bandit’s, and to, among others, generate names for Agents’ that have not been named explicitly. So don’t forget to include it in your own custom Bandit’s and Policies!

    - +

    @@ -307,7 +307,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/replication.html b/docs/articles/replication.html index cf6f2c3..aa9adae 100644 --- a/docs/articles/replication.html +++ b/docs/articles/replication.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Offline evaluation: Replication of Li et al 2010

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/replication.Rmd @@ -165,83 +165,83 @@

    Custom bandit and policies

    With the Yahoo! data imported into the MonetDB server, the next step was to create a custom offline YahooBandit plus seven Policy subclasses implementing the policies described in the Li et al 2010 paper. Though most of these policies were already implemented in contextual, the fact that only a subset of all 271 articles or arms are shown to a visitor at a time meant we needed to make some minor changes to contextual’s exisiting classes to make the policies run smoothly on a continually shifting pool of active arms.

    To facilitate these shifting arms, YahooBandit makes use of an self$arm_lookup table listing all 271 arms. This table enables the bandit to look up the currently active arms’ indexes from the shifting set of article ID’s as specified in the dataset for each time step \(t\), and return these indexes to the policies under evaluation:

    -
        get_context = function(index) {
    -      ...
    -      # Retrieve the index of all arms this row/event.
    -      arm_indices_this_event  <- seq(10, 184, by = 7)
    -      article_ids             <- row[arm_indices_this_event]
    -      article_ids             <- article_ids[!is.na(article_ids)]
    -      article_ids             <- match(article_ids,self$arm_lookup)
    -      ...
    -      context <- list(
    -        k = self$k,
    -        d = self$d,
    -        unique = self$unique, # Indexes of disjoint arms (user features)
    -        shared = self$shared, # Indexes of shared arms (article features)
    -        arms = article_ids,   # Indexes of arms this event.
    -        X = X
    -      )
    -    }
    +
        get_context = function(index) {
    +      ...
    +      # Retrieve the index of all arms this row/event.
    +      arm_indices_this_event  <- seq(10, 184, by = 7)
    +      article_ids             <- row[arm_indices_this_event]
    +      article_ids             <- article_ids[!is.na(article_ids)]
    +      article_ids             <- match(article_ids,self$arm_lookup)
    +      ...
    +      context <- list(
    +        k = self$k,
    +        d = self$d,
    +        unique = self$unique, # Indexes of disjoint arms (user features)
    +        shared = self$shared, # Indexes of shared arms (article features)
    +        arms = article_ids,   # Indexes of arms this event.
    +        X = X
    +      )
    +    }

    The policy classes then use this information to select and update only the currently active subset of arms. For instance, in YahooEpsilonGreedyPolicy’s get_action():

    -
        get_action = function(t, context) {
    -      if (runif(1) > self$epsilon) {
    -        # get the max of context$arms *currently in play*
    -        max_index          <- context$arms[max_in(theta$mean[context$arms])]
    -        self$action$choice <- max_index
    -      } else {
    -        # sample from the arms *currently in play*
    -        self$action$choice <- sample(context$arms, 1)
    -      }
    -      self$action
    -    }
    +
        get_action = function(t, context) {
    +      if (runif(1) > self$epsilon) {
    +        # get the max of context$arms *currently in play*
    +        max_index          <- context$arms[max_in(theta$mean[context$arms])]
    +        self$action$choice <- max_index
    +      } else {
    +        # sample from the arms *currently in play*
    +        self$action$choice <- sample(context$arms, 1)
    +      }
    +      self$action
    +    }

    On completing the implementation of the aforementioned seven custom policy subclasses (Random, EGreedy, EGreedySeg, LinUCBDis, LinUCBHyb, UCB1 and UCB1Seg) we then assigned them to six simulations—one for each of the six (0, 30, 20, 10, 5 and 1 percent) levels of sparsity defined in the original paper. This resulted in \(7\times6=42\) Agents, which were then run on the offline dataset as follows:

    -
    simulations             <- 1
    -horizon                 <- 37.45e6
    -...
    -con <- DBI::dbConnect(MonetDB.R(), host=monetdb_host, dbname=monetdb_dbname,
    -                                   user=monetdb_user, password=monetdb_pass)
    -
    -message(paste0("MonetDB: connection to '",dbListTables(con),"' succesful!"))
    -
    -arm_lookup_table <-
    -  as.matrix(DBI::dbGetQuery(con, "SELECT DISTINCT article_id FROM yahoo"))
    -
    -arm_lookup_table <- rev(as.vector(arm_lookup_table))
    -
    -bandit <- YahooBandit$new(k = 217L, unique = c(1:6), shared = c(7:12),
    -                          arm_lookup = arm_lookup_table, host = monetdb_host,
    -                          dbname = monetdb_dbname, user = monetdb_user,
    -                          password = monetdb_pass, buffer_size = buffer_size)
    -
    -agents <-
    -  list (Agent$new(YahooLinUCBDisjointPolicy$new(0.2),
    -                  bandit, name = "LinUCB Dis",  sparse = 0.99),
    -        Agent$new(YahooLinUCBHybridPolicy$new(0.2),
    -                  bandit, name = "LinUCB Hyb",  sparse = 0.99),
    -        Agent$new(YahooEpsilonGreedyPolicy$new(0.3),
    -                  bandit, name = "EGreedy",     sparse = 0.99),
    -        Agent$new(YahooEpsilonGreedySegPolicy$new(0.3),
    -                  bandit, name = "EGreedySeg",  sparse = 0.99),
    -        Agent$new(YahooUCB1AlphaPolicy$new(0.4),
    -                  bandit, name = "UCB1",        sparse = 0.99),
    -        Agent$new(YahooUCB1AlphaSegPolicy$new(0.4),
    -                  bandit, name = "UCB1Seg",     sparse = 0.99),
    -        ...
    -        Agent$new(YahooRandomPolicy$new(),
    -                  bandit, name = "Random"))
    -
    -simulation <- Simulator$new(
    -    agents,
    -    simulations = simulations,
    -    horizon = horizon,
    -    do_parallel = TRUE,
    -    worker_max = worker_max,
    -    reindex = TRUE,
    -    progress_file = TRUE,
    -    include_packages = c("MonetDB.R"))
    -
    -history  <- simulation$run()
    -...
    +
    simulations             <- 1
    +horizon                 <- 37.45e6
    +...
    +con <- DBI::dbConnect(MonetDB.R(), host=monetdb_host, dbname=monetdb_dbname,
    +                                   user=monetdb_user, password=monetdb_pass)
    +
    +message(paste0("MonetDB: connection to '",dbListTables(con),"' succesful!"))
    +
    +arm_lookup_table <-
    +  as.matrix(DBI::dbGetQuery(con, "SELECT DISTINCT article_id FROM yahoo"))
    +
    +arm_lookup_table <- rev(as.vector(arm_lookup_table))
    +
    +bandit <- YahooBandit$new(k = 217L, unique = c(1:6), shared = c(7:12),
    +                          arm_lookup = arm_lookup_table, host = monetdb_host,
    +                          dbname = monetdb_dbname, user = monetdb_user,
    +                          password = monetdb_pass, buffer_size = buffer_size)
    +
    +agents <-
    +  list (Agent$new(YahooLinUCBDisjointPolicy$new(0.2),
    +                  bandit, name = "LinUCB Dis",  sparse = 0.99),
    +        Agent$new(YahooLinUCBHybridPolicy$new(0.2),
    +                  bandit, name = "LinUCB Hyb",  sparse = 0.99),
    +        Agent$new(YahooEpsilonGreedyPolicy$new(0.3),
    +                  bandit, name = "EGreedy",     sparse = 0.99),
    +        Agent$new(YahooEpsilonGreedySegPolicy$new(0.3),
    +                  bandit, name = "EGreedySeg",  sparse = 0.99),
    +        Agent$new(YahooUCB1AlphaPolicy$new(0.4),
    +                  bandit, name = "UCB1",        sparse = 0.99),
    +        Agent$new(YahooUCB1AlphaSegPolicy$new(0.4),
    +                  bandit, name = "UCB1Seg",     sparse = 0.99),
    +        ...
    +        Agent$new(YahooRandomPolicy$new(),
    +                  bandit, name = "Random"))
    +
    +simulation <- Simulator$new(
    +    agents,
    +    simulations = simulations,
    +    horizon = horizon,
    +    do_parallel = TRUE,
    +    worker_max = worker_max,
    +    reindex = TRUE,
    +    progress_file = TRUE,
    +    include_packages = c("MonetDB.R"))
    +
    +history  <- simulation$run()
    +...

    @@ -267,7 +267,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/simpsons.html b/docs/articles/simpsons.html index 4cf077a..e0f467e 100644 --- a/docs/articles/simpsons.html +++ b/docs/articles/simpsons.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: Bandits, Propensity Weighting & Simpson’s Paradox in R

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/simpsons.Rmd @@ -140,24 +140,24 @@

    2019-03-06

    Imagine a website with Sport and Movie related articles where the “actual” preference of men and women for Sport and Movie articles is the following:

    -
    Contexts   | Sport (arm) |  Movie (arm)
    ------------------------------------------
    -Male       | 0.4         |  0.3
    -Female     | 0.8         |  0.7
    +
    Contexts   | Sport (arm) |  Movie (arm)
    +-----------------------------------------
    +Male       | 0.4         |  0.3
    +Female     | 0.8         |  0.7

    In other words, both Male and Female visitors actually prefer Sports articles over Movie articles. When visitors are randomly assigned to types of articles, the overall CTR rate per category reflects this:

    -
    Contexts   | Sport (arm) |  Movie (arm)
    ------------------------------------------
    -Male       | 0.4 x 0.5   |  0.3 x 0.5
    -Female     | 0.8 x 0.5   |  0.7 x 0.5
    ------------------------------------------
    -CTR total  | 0.6         |  0.5
    +
    Contexts   | Sport (arm) |  Movie (arm)
    +-----------------------------------------
    +Male       | 0.4 x 0.5   |  0.3 x 0.5
    +Female     | 0.8 x 0.5   |  0.7 x 0.5
    +-----------------------------------------
    +CTR total  | 0.6         |  0.5

    Now suggest the site’s editor just “knows” that men like sports, and women like movie related articles. So the editor has some business logic implemented, assigning Movie related articles, on average, to 75% of Female visitors, and Sports articles, on average, to 75% of Male visitors:

    -
    Contexts   | Sport (arm) |  Movie (arm)
    ------------------------------------------
    -Male       | 0.4 x 0.75  |  0.3 x 0.25
    -Female     | 0.8 x 0.25  |  0.7 x 0.75
    ------------------------------------------
    -CTR total  | 0.5         |  0.6
    +
    Contexts   | Sport (arm) |  Movie (arm)
    +-----------------------------------------
    +Male       | 0.4 x 0.75  |  0.3 x 0.25
    +Female     | 0.8 x 0.25  |  0.7 x 0.75
    +-----------------------------------------
    +CTR total  | 0.5         |  0.6

    This results in a higher CTR for movies than for Sports related articles - even though these CTR’s do not actually reflect the overall preferences of website visitors, but rather the editor’s prejudice.

    A clear example of Simpson’s Paradox!

    Below an R code based illustration (making use of our “contextual” bandit package) of how Simpson’s Paradox could give rise to biased logged data, resulting in biased offline evaluations of bandit policies. Next, we demonstrate how inverse propensity weighting can help make such data usable for offline evaluation after all.

    @@ -165,197 +165,197 @@

    2019-03-06

    Original bandit weights

    Set up simulation bandit weights representing Male and Female actual preferences for Sports and Movies:

    -
     
    -horizon                           <- 10000L
    -simulations                       <- 1L
    -
    -#                    S----M------------> Arm 1:   Sport
    -#                    |    |              Arm 2:   Movie
    -#                    |    |
    -weights <- matrix( c(0.4, 0.3,    #-----> Context: Male
    -                     0.8, 0.7),   #-----> Context: Female
    - 
    -                     nrow = 2, ncol = 2, byrow = TRUE)
    +
     
    +horizon                           <- 10000L
    +simulations                       <- 1L
    +
    +#                    S----M------------> Arm 1:   Sport
    +#                    |    |              Arm 2:   Movie
    +#                    |    |
    +weights <- matrix( c(0.4, 0.3,    #-----> Context: Male
    +                     0.8, 0.7),   #-----> Context: Female
    + 
    +                     nrow = 2, ncol = 2, byrow = TRUE)

    These weights will be fed to contextual’s ContextualBernoulliBandit so it can simulate clicks by Male and Female according to their preferences per category.

    Generate data by running a fully random online policy

    Let’s first run contextual’s basic random policy against the bandit that models actual visitor’s preferences. This random policy assigns Males and Females fully at random to either Sport or Movie articles:

    - +

    The results are clear: when running the random policy, the logged data accurately represents visitor’s preferences.

    Using the random policy’s offline logged data to evaluate another policy

    The previous simulation produced a data.table with fully randomised historical data. Let’s use this data to evaluate some other policy:

    - +

    Accurate numbers again: clearly, the logged data from a randomizing policy can be used to test other ‘off-policy’ algorithms.

    Generate data by running a biased online policy

    -

    Now suggest some editor just “knows’ that men like Sport, and women like Movie. So some business logic was added to the site assigning Movie related articles, on average, to 75% of Female visitors, and Sport articles, on average, to 75% of Male visitors.

    +

    Now suggest some editor just "knows’ that men like Sport, and women like Movie. So some business logic was added to the site assigning Movie related articles, on average, to 75% of Female visitors, and Sport articles, on average, to 75% of Male visitors.

    This business logic might be implemented through the following policy:

    - +

    Now run this policy against the Bandit modeling actual visitor preferences:

    - +

    Clearly, the BiasedPolicy gives rise to, well, biased results! If you’d only be able to look at the data, without knowing of the biased business logic, you’d falsely conclude Sports is more popular then Movies, overall.

    Using the biased policy’s offline logged data to evaluate another policy

    This time, the simulation generated a data.table with biased data. Let’s see what happens if we use this data to evaluate some other policy:

    - +

    The bias has propagated itself! So, does that mean it is not possible to use the “biased” data to evaluate other, off-line policies? That would severely limit the number of data sets for use in offline evaluation.

    Repairing the biased policy’s logged data with inverse probability weights

    Luckily, inverse propensity score weighting enables us to use propensity scores to obtain unbiased estimates of the original preferences of Male and Female visitors. That is, since our biased policy actually saved the propensity (“the probability of a unit being assigned to a particular treatment or category”) with which a certain category was chosen, we can correct for this bias while “replaying” the data. In “contextual”, there are several types of offline bandits that are able to use either such presaved propensities, or estimate propensities based on certain properties of the dataset. Here, we use its basic “OfflinePropensityWeightingBandit”:

    - +

    Hurray - inverse propensity score weighting has removed the bias! In other words: if and where possible, save propensity scores to your log files when experimenting with online policies. You will thank yourself at a later time!

    @@ -383,7 +383,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/sutton_barto.html b/docs/articles/sutton_barto.html index d22d471..99cf1d7 100644 --- a/docs/articles/sutton_barto.html +++ b/docs/articles/sutton_barto.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: Replication Sutton & Barto, Reinforcement Learning: An Introduction, Chapter 2

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/sutton_barto.Rmd @@ -139,107 +139,107 @@

    2019-03-06

    -

    Simulation of the multi-armed Bandit examples in chapter 2 of “Reinforcement Learning: An Introduction” by Sutton and Barto, 2nd ed. (Version: 2018)

    +

    Simulation of the multi-armed Bandit examples in chapter 2 of “Reinforcement Learning: An Introduction” by Sutton and Barto, 2nd ed. (Version: 2018)

    This book is available here: Sutton&Barto

    2.3 The 10-armed Testbed

    Generate the 10 arms.

    - +

    The violin plot

    Install ggplot2 and ggnormalviolin libraries to be able to generate Figure 2.1.

    -
    
    -if(!require(ggplot2)) install.packages("ggplot2")
    -if(!require(ggnormalviolin)) devtools::install_github("wjschne/ggnormalviolin")
    -
    -library(ggplot2)
    -library(ggnormalviolin)
    -
    -print(ggplot(data = data.frame(dist_mean = mus, dist_sd = sigmas, dist = factor((1:10))), 
    -             aes(x = dist, mu = dist_mean, sigma = dist_sd)) + ylab("Reward distribution") +
    -             geom_normalviolin() + theme(legend.position = "none") + 
    -             xlab("Action") + geom_hline(aes(yintercept = 0)))
    +
    
    +if(!require(ggplot2)) install.packages("ggplot2")
    +if(!require(ggnormalviolin)) devtools::install_github("wjschne/ggnormalviolin")
    +
    +library(ggplot2)
    +library(ggnormalviolin)
    +
    +print(ggplot(data = data.frame(dist_mean = mus, dist_sd = sigmas, dist = factor((1:10))), 
    +             aes(x = dist, mu = dist_mean, sigma = dist_sd)) + ylab("Reward distribution") +
    +             geom_normalviolin() + theme(legend.position = "none") + 
    +             xlab("Action") + geom_hline(aes(yintercept = 0)))

    The epsilon greedy plot

    -
    
    -agents          <- list(Agent$new(EpsilonGreedyPolicy$new(0),    bandit, "e = 0, greedy"),
    -                        Agent$new(EpsilonGreedyPolicy$new(0.1),  bandit, "e = 0.1"),
    -                        Agent$new(EpsilonGreedyPolicy$new(0.01), bandit, "e = 0.01"))
    -
    -simulator       <- Simulator$new(agents = agents, horizon = 1000, simulations = 2000)
    -history         <- simulator$run()
    -
    -plot(history, type = "average", regret = FALSE, lwd = 1, legend_position = "bottomright")
    -plot(history, type = "optimal", lwd = 1, legend_position = "bottomright")
    +
    
    +agents          <- list(Agent$new(EpsilonGreedyPolicy$new(0),    bandit, "e = 0, greedy"),
    +                        Agent$new(EpsilonGreedyPolicy$new(0.1),  bandit, "e = 0.1"),
    +                        Agent$new(EpsilonGreedyPolicy$new(0.01), bandit, "e = 0.01"))
    +
    +simulator       <- Simulator$new(agents = agents, horizon = 1000, simulations = 2000)
    +history         <- simulator$run()
    +
    +plot(history, type = "average", regret = FALSE, lwd = 1, legend_position = "bottomright")
    +plot(history, type = "optimal", lwd = 1, legend_position = "bottomright")

    2.6 - Optimistic values

    - +

    2.7 - Upper-Confidence-Bound Action Selection

    -
    
    -agents          <- list(Agent$new(EpsilonGreedyPolicy$new(0.1),  bandit, "EGreedy"),
    -                        Agent$new(UCB1Policy$new(),   bandit,            "UCB1"))
    -
    -simulator       <- Simulator$new(agents = agents, horizon = 1000, simulations = 2000)
    -history         <- simulator$run()
    -
    -plot(history, type = "average", regret = FALSE, lwd = 1, legend_position = "bottomright")
    +
    
    +agents          <- list(Agent$new(EpsilonGreedyPolicy$new(0.1),  bandit, "EGreedy"),
    +                        Agent$new(UCB1Policy$new(),   bandit,            "UCB1"))
    +
    +simulator       <- Simulator$new(agents = agents, horizon = 1000, simulations = 2000)
    +history         <- simulator$run()
    +
    +plot(history, type = "average", regret = FALSE, lwd = 1, legend_position = "bottomright")

    2.8 - Gradient Bandit Algorithms

    - +

    @@ -270,7 +270,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/articles/website_optimization.html b/docs/articles/website_optimization.html index a7ae5f9..6eedc52 100644 --- a/docs/articles/website_optimization.html +++ b/docs/articles/website_optimization.html @@ -32,7 +32,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -130,7 +130,7 @@

    Demo: Replication of John Myles White, Bandit Algorithms for Website Optimization

    Robin van Emden

    -

    2019-03-06

    +

    2019-03-17

    Source: vignettes/website_optimization.Rmd @@ -149,115 +149,115 @@

    m = max(x) return x.index(m)

    This introduces a bias that adds up over time, changing simulations’ results and plots. In R, (which uses 1 based indexing) this corresponds to always doing:

    - +

    Contextual correctly returns the index of one of the tied maxima random, fixing the bias, resulting in slightly different plots. In Python, a patch along the following lines ought to resolve this issue:

    def ind_max(x):
       max_value = max(x)
       max_keys = [k for k, v in enumerate(x) if v == max_value]
       return random.choice(max_keys)

    In R, this corresponds to:

    - +

    To illustrate, a replication of the original Figure 4-3 when running a simulation with the biased arm selection, (as used in the book) on the left, contextual’s unbiased simulation to the right:

    Chapter 4 - Debugging and epsilon greedy

    - +

    Figure 4-2. How often does the epsilon greedy algorithm select the best arm?

    -
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))

    Figure 4-3. How much reward does the epsilon greedy algorithm earn on average?

    -
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))

    Figure 4-4. How much reward has the epsilon greedy algorithm earned by trial t?

    -
    plot(history, type = "cumulative", regret = FALSE)
    +
    plot(history, type = "cumulative", regret = FALSE)

    Chapter 5 - Softmax

    - +

    Figure 5-2. How often does the softmax algorithm select the best arm?

    -
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))

    Figure 5-3. How much reward does the softmax algorithm earn on average?

    -
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))

    Figure 5-4. How much reward has the softmax algorithm earned by trial t?

    -
    plot(history, type = "cumulative", regret = FALSE)
    +
    plot(history, type = "cumulative", regret = FALSE)

    Chapter 6 - UCB

    - +

    Figure 6-3. How often does the UCB algorithm select the best arm?

    -
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "optimal", legend_position = "bottomright", ylim = c(0,1))

    Figure 6-4. How much reward does the UCB algorithm earn on average?

    -
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))
    +
    plot(history, type = "average", regret = FALSE, legend_position = "bottomright", ylim = c(0,1))

    Figure 6-5. How much reward has the UCB algorithm earned by trial t?

    -
    plot(history, type = "cumulative", regret = FALSE)
    +
    plot(history, type = "cumulative", regret = FALSE)

    @@ -284,7 +284,7 @@

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/authors.html b/docs/authors.html index 74a41b9..037a3ef 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -66,7 +66,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -187,7 +187,7 @@

    Authors

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/index.html b/docs/index.html index d0aa20f..2cb1ad7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -35,7 +35,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -152,15 +152,15 @@

    Installation

    To install contextual from CRAN:

    -
    install.packages('contextual')
    +
    install.packages('contextual')

    To install the development version (requires the devtools package):

    -
    install.packages("devtools")
    -devtools::install_github('Nth-iteration-labs/contextual')
    +
    install.packages("devtools")
    +devtools::install_github('Nth-iteration-labs/contextual')

    When working on or extending the package, clone its GitHub repository, then do:

    -
    install.packages("devtools")
    -devtools::install_deps(dependencies = TRUE)
    -devtools::build()
    -devtools::reload()
    +
    install.packages("devtools")
    +devtools::install_deps(dependencies = TRUE)
    +devtools::build()
    +devtools::reload()

    clean and rebuild…

    @@ -330,7 +330,7 @@

    Dev status

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/news/index.html b/docs/news/index.html index 1d5b146..3d5bf63 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -66,7 +66,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -166,9 +166,17 @@

    Changelog

    Source: NEWS.md -
    +

    -contextual 0.9.8 2019-02-10 +contextual 0.9.8.1 Unreleased +

    +
      +
    • Specified previous version of set.seed sampler with RNGversion() calls
    • +
    +
    +
    +

    +contextual 0.9.8 2019-02-10

    • Major update
    • @@ -178,17 +186,17 @@

    • Additional demo scripts
    -
    +

    -contextual 0.9.1 2018-10-30 +contextual 0.9.1 2018-10-30

    • First CRAN release
    -
    +

    -contextual 0.9.0 Unreleased +contextual 0.9.0 Unreleased

    @@ -215,7 +224,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index c515aee..c5f4bc3 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,6 +1,6 @@ -pandoc: 2.1.3 -pkgdown: 1.3.0.9000 -pkgdown_sha: 4041eef8077af72e860a0144b945e463c55df118 +pandoc: '2.6' +pkgdown: 1.3.0 +pkgdown_sha: ~ articles: cmabs: cmabs.html cmabsoffline: cmabsoffline.html diff --git a/docs/reference/Agent.html b/docs/reference/Agent.html index 503eb9e..e916e18 100644 --- a/docs/reference/Agent.html +++ b/docs/reference/Agent.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1
    @@ -272,7 +272,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/Bandit.html b/docs/reference/Bandit.html index 3709f46..ed39c79 100644 --- a/docs/reference/Bandit.html +++ b/docs/reference/Bandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -260,7 +260,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/BasicBernoulliBandit.html b/docs/reference/BasicBernoulliBandit.html index 3f318a5..b5c998e 100644 --- a/docs/reference/BasicBernoulliBandit.html +++ b/docs/reference/BasicBernoulliBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -274,7 +274,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/BasicGaussianBandit.html b/docs/reference/BasicGaussianBandit.html index a2a551f..fafc874 100644 --- a/docs/reference/BasicGaussianBandit.html +++ b/docs/reference/BasicGaussianBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -274,7 +274,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/BootstrapTSPolicy.html b/docs/reference/BootstrapTSPolicy.html index 2e96b28..f908a1b 100644 --- a/docs/reference/BootstrapTSPolicy.html +++ b/docs/reference/BootstrapTSPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -257,7 +257,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualBernoulliBandit.html b/docs/reference/ContextualBernoulliBandit.html index 256aee9..3a11e1c 100644 --- a/docs/reference/ContextualBernoulliBandit.html +++ b/docs/reference/ContextualBernoulliBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -266,7 +266,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualBinaryBandit.html b/docs/reference/ContextualBinaryBandit.html index 940ebe1..f838e41 100644 --- a/docs/reference/ContextualBinaryBandit.html +++ b/docs/reference/ContextualBinaryBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -266,7 +266,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualEpochGreedyPolicy.html b/docs/reference/ContextualEpochGreedyPolicy.html index 10f5447..a6093ae 100644 --- a/docs/reference/ContextualEpochGreedyPolicy.html +++ b/docs/reference/ContextualEpochGreedyPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -212,7 +212,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualEpsilonGreedyPolicy.html b/docs/reference/ContextualEpsilonGreedyPolicy.html index ca34884..851bf9f 100644 --- a/docs/reference/ContextualEpsilonGreedyPolicy.html +++ b/docs/reference/ContextualEpsilonGreedyPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -255,7 +255,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualHybridBandit.html b/docs/reference/ContextualHybridBandit.html index f4b7700..2554f50 100644 --- a/docs/reference/ContextualHybridBandit.html +++ b/docs/reference/ContextualHybridBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -281,7 +281,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualLinTSPolicy.html b/docs/reference/ContextualLinTSPolicy.html index f7b3383..0f64e3e 100644 --- a/docs/reference/ContextualLinTSPolicy.html +++ b/docs/reference/ContextualLinTSPolicy.html @@ -73,7 +73,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -281,7 +281,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualLinearBandit.html b/docs/reference/ContextualLinearBandit.html index 4ec4e7c..118b72f 100644 --- a/docs/reference/ContextualLinearBandit.html +++ b/docs/reference/ContextualLinearBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -287,7 +287,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualLogitBTSPolicy.html b/docs/reference/ContextualLogitBTSPolicy.html index 63bd925..54455c9 100644 --- a/docs/reference/ContextualLogitBTSPolicy.html +++ b/docs/reference/ContextualLogitBTSPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -212,7 +212,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualLogitBandit.html b/docs/reference/ContextualLogitBandit.html index 3734f7f..7714e08 100644 --- a/docs/reference/ContextualLogitBandit.html +++ b/docs/reference/ContextualLogitBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -282,7 +282,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualPrecachingBandit.html b/docs/reference/ContextualPrecachingBandit.html index 3a8ac84..c800471 100644 --- a/docs/reference/ContextualPrecachingBandit.html +++ b/docs/reference/ContextualPrecachingBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -289,7 +289,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualTSProbitPolicy.html b/docs/reference/ContextualTSProbitPolicy.html index b8b9688..f2af37c 100644 --- a/docs/reference/ContextualTSProbitPolicy.html +++ b/docs/reference/ContextualTSProbitPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -212,7 +212,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContextualWheelBandit.html b/docs/reference/ContextualWheelBandit.html index 523e496..0845859 100644 --- a/docs/reference/ContextualWheelBandit.html +++ b/docs/reference/ContextualWheelBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -297,7 +297,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ContinuumBandit.html b/docs/reference/ContinuumBandit.html index e63ae2f..200a764 100644 --- a/docs/reference/ContinuumBandit.html +++ b/docs/reference/ContinuumBandit.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -281,7 +281,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/EpsilonFirstPolicy-1.png b/docs/reference/EpsilonFirstPolicy-1.png index 50ac3c53d7372648c20fe0be52336733be3809fe..36e2d3a07395a1bf874602f298b83162a09c7d5c 100644 GIT binary patch delta 399 zcmYk0u}y?A422C7AjWV+aSd!i0d_%i#r1Ru2~pS*3m~zwZ1s33T1NP3X`z1nd1ldrU=>BRf@!&=W`_Sy6 zgbflmL@XqYkp!8MwNK%Gc{JT}_GGXAQlAQ=aOY8$Osom%LWbnj0m?(w)l;*K!5B>% zTG8_|3rn+XpSDeBa2~Gg=aOf7mP=I#hEP}|(WR8g_K2LZMQk&5q;tBiN>)~#UY}1N x@6%|e%(R&?H=A4gEaytC^y+ANt$5vjKivVq+sniKV{iZI>*wO|dv$qz^9K|R&U^p> delta 399 zcmYj~u}uU)3`GqUAS6TwWCVnsA_ySA0LjkC5E3G|fC6lZ4z2-$lidXk*o|B=Ydjb6 z_2x^f`ET~HJM8pfj{pOJ02mMf2~c1R7z{&!1-RRQy?5(=g^(LTHk2mXU&aa#Zgj8@ z&3=@yLE?spg`_c(ATzS=x##}#Xxei2WG_JwZcw=QC@Ut`gxHh}$*BXBhpMZmW*LJq znl!Yg=VKO@X4yS$o6g`oT-nc(XL^?Jt3oh@!WxN|QX;z}a>f?1&D4?3>AIAxtUA5F zp1wY((M*|XGh=Qxx9(Zam0Ic5)ACyLy1Bjk1%QvYr^o01{Fm>aiXlVkhNi+*-))~hufT*m_p6uh@)!zH- z{SP_tLSayZA(q*lV`3o0x@1Upt)#UolQNoBT^*z*7@xmQU%n4xGA<^d%{GD+mS&0W zHg#umuCDyxdZy>_F+vKS8U`c`PDDziMdGK&WHCidJ+-EDx~4UMh z;sQfEK*C*U&UfgCZ=Ss841L<$lf~`HLSHQrpaBp710o;+3bY1|p((HcR~xX`90JWF za|pQ*WJ4*UR?N~IZd_<%Z<@829yLNDM&fEADU2k@VoBEN`V-gvR+Ou(&YtXpZ;s#R z5Cq`@g-gWQonvA}h;_-3?AkzEQwHT~R(16vHH-1}*Yxf8Fa~2ZDQLDUOAAZ0tnM~- zXK-$={NMFV&*5W)U`$`N~A^Br^jS5MNB=lrE|Kbms+Q*M=hwzG5(&P{ku5p zMm?pc^^86}w?5U=hx14s>5r3jvF69;Cx=^Kt`>h*H}Ul7^83o&v(^2V@7`Q~+}M4w X{`CIh=74{!LFM)C-p contextual - 0.9.8 + 0.9.8.1 @@ -255,7 +255,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.450
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.554
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/EpsilonGreedyPolicy-1.png b/docs/reference/EpsilonGreedyPolicy-1.png index dbf66f81747a905057472e8cc897599a65e34eba..455ed3e4e8578635e4a61900ff312ef4627f14e3 100644 GIT binary patch delta 395 zcmW-bAyPy^3`D~jxWxhgma!=ug+1t`XfyZkOBT z`^ARH6j2e#7&26b$(%AF(*+QifS(W~qi5ul4iFoNVWc?XESDJA z`if&EBr(&GY_e+EtY_1A?p-!`QU$SMwXK?7)vJ!GW3|tAbP_IQkJ_yE-uI99`{#9q iuC~>&y4Dfvps$_S?Yna`eeR*}$LF_K`TcqLdin#1-^wKb delta 395 zcmW-aAyPy^3`D~bxCaKAIRK|vn>Y*tgIIw?B&R@PsHAGIl3Zj>{?MP)o30W4lH28W z@#iZOEg~UOVkQ=1qqS%$Ehkk{BgH336VF{zZg(lud1y=FttM(*6ZjLW0~SV3*8MppIIQFToFYS&JHqwp{rYVUo2f4zTx jOvtoN$8^mRb0BA@?)Kfe(LV1W_sjR=8~y$~d_DaEyvEt& diff --git a/docs/reference/EpsilonGreedyPolicy-2.png b/docs/reference/EpsilonGreedyPolicy-2.png index 0ad589283e4669dc3ace58b23f998c7f81b15218..1a09347a9b897b04074382e11c81d59f48ede342 100644 GIT binary patch delta 488 zcmW-bp-eyW69X>RBwV6tCe2xyl;NyewSv$9{p81V`m-C8aWVk~VKhK)VHWUa zQ>#psb5*V=7!84j8t`6wcS$bA4Tz7Vdx(d5U}!#>PwrC-&7m9>XrN-;0EaqiVA1>I z`O4Yg|x61-X?1ky!FaGv`2m3#J||@%Ws#ikM3r-^V{qH7O!sR{=S;O|N8R9 d)%Q0KuNO8qe%*ZB+4)4!`?U|Nm+wCBJ^^~p_yYg{ delta 488 zcmW-bJx|s_5XAQ})K>NedkZW`?iv!r!p2WPL38^x9-!c*+D)t=LlIwNZ2bV~)u$lPzZEZgDtU9L{uQo`^D0A!162QlTW2Gi9c%#7r#2IE=U=ny8G_ zP)Q6Vu_XbHmC+mG%s?~OteQ2jUY?pImBOhoT#5jj7x7}Cm79IWFET(~Su5Az+WE)9 zPIO5m43aR4X>^B747ga6aEYdwG-qW}hO=tb3PJ<)PnXl@t8Prj$pjRej|Ipr%mUtQ zYL%&SuF4eyV5$$e^}Ih3OU4NQzbz@d&ASoHqy z%bU~xXQ$0d3u$33yiL|7cUe{VPU dE{ contextual - 0.9.8 + 0.9.8.1 @@ -254,7 +254,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.352
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.532
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    @@ -284,7 +284,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/Exp3Policy-1.png b/docs/reference/Exp3Policy-1.png index e3b489ba3afc16b59ad664ca9c2b84e7da29ff05..8886e965437538d29c8095fbbd62fd8aa393b75b 100644 GIT binary patch delta 368 zcmW-bF-}A=3`G4K4&xMvd#otH?&wyOG%G|y;Yes38bEsiT1TSdD0a&=&^G>IKGw?= z$#^Em{c-<(WlYqFgh+{*Scr{Uqo&k4sgXjRbilX0ZzIgcDy&dv1A&N!(cW~lo`@3$ zEDA)_#DI&1xQjzeQQ63J+ZsAj$HZq0*@{~zR@k<2a}efb8J5)>_13zgXu6Usy8+pJ z|HnN%-4j~A)=(N94Rg#H#$gf;Ea1CKi}c8dtXLz~%HDElj-Cl-&Ut=%IKMoXOQltM pWz_1mLTe74*=Hgdz&pQQcRxgQc)Yp3J$)?qr_bf$`*(S}`~$EkwuJxy delta 368 zcmW-aAx?!s421g(cL76??I93gainz^LNEvfdAdv91vmhXbPvA|*0nCRSo65fURAWKISTvWeXOze|~&P1)eV4iXgt*$|sD3U$hW)qtwG zItcaD2n~1}CWYQ@znV77=5i)Sw~-qhC+xez1EfcLrB@H3Au$fm-l diff --git a/docs/reference/Exp3Policy-2.png b/docs/reference/Exp3Policy-2.png index 13fba6a829262500e73537b40f21fe77e015b7a9..df2145b402e4a45a4b8eabbc93382430e57d5fc2 100644 GIT binary patch literal 19377 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 W3){H}`OvR-8S0u`s=9dV?*9Ufpgw~D diff --git a/docs/reference/Exp3Policy.html b/docs/reference/Exp3Policy.html index a2cf555..f1dd760 100644 --- a/docs/reference/Exp3Policy.html +++ b/docs/reference/Exp3Policy.html @@ -72,7 +72,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -247,7 +247,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.326
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.451
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    @@ -277,7 +277,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/FixedPolicy.html b/docs/reference/FixedPolicy.html index ee2f005..685ba57 100644 --- a/docs/reference/FixedPolicy.html +++ b/docs/reference/FixedPolicy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -245,7 +245,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/GittinsBrezziLaiPolicy.html b/docs/reference/GittinsBrezziLaiPolicy.html index a6a904f..92c3e81 100644 --- a/docs/reference/GittinsBrezziLaiPolicy.html +++ b/docs/reference/GittinsBrezziLaiPolicy.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -276,7 +276,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/GradientPolicy-1.png b/docs/reference/GradientPolicy-1.png index 1e2abc233abeff9fc58c8922637f5d4efaa906f0..396212b3cc73b404a87962513906b556978a10eb 100644 GIT binary patch delta 407 zcmW-bu~CLG2!^qC6H<7V?g0zf+uB&boeTVHz}ZJ#8>58*ivkff zF%V)U5hj7Q75f)}>*}f5nuEU?RwVGgBE46t;>4*BG=_GkD8wCJ)soJVL*=X zeGSLE_V5RvAkdcp delta 407 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 contextual - 0.9.8 + 0.9.8.1 @@ -241,7 +241,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.275
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.358
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    @@ -271,7 +271,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/History.html b/docs/reference/History.html index e46d4a6..57f025a 100644 --- a/docs/reference/History.html +++ b/docs/reference/History.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -309,7 +309,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LifPolicy.html b/docs/reference/LifPolicy.html index cf5ad65..c2c02d9 100644 --- a/docs/reference/LifPolicy.html +++ b/docs/reference/LifPolicy.html @@ -79,7 +79,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -255,7 +255,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LinUCBDisjointOptimizedPolicy.html b/docs/reference/LinUCBDisjointOptimizedPolicy.html index c5e56fa..8e8b6ef 100644 --- a/docs/reference/LinUCBDisjointOptimizedPolicy.html +++ b/docs/reference/LinUCBDisjointOptimizedPolicy.html @@ -73,7 +73,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -274,7 +274,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LinUCBDisjointPolicy.html b/docs/reference/LinUCBDisjointPolicy.html index 21b82d5..a5da38d 100644 --- a/docs/reference/LinUCBDisjointPolicy.html +++ b/docs/reference/LinUCBDisjointPolicy.html @@ -73,7 +73,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -274,7 +274,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LinUCBGeneralPolicy.html b/docs/reference/LinUCBGeneralPolicy.html index 956f2e6..e076b8a 100644 --- a/docs/reference/LinUCBGeneralPolicy.html +++ b/docs/reference/LinUCBGeneralPolicy.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -275,7 +275,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LinUCBHybridOptimizedPolicy.html b/docs/reference/LinUCBHybridOptimizedPolicy.html index 0d7451b..caee5f1 100644 --- a/docs/reference/LinUCBHybridOptimizedPolicy.html +++ b/docs/reference/LinUCBHybridOptimizedPolicy.html @@ -72,7 +72,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -272,7 +272,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/LinUCBHybridPolicy.html b/docs/reference/LinUCBHybridPolicy.html index 1044b3b..98b2fbf 100644 --- a/docs/reference/LinUCBHybridPolicy.html +++ b/docs/reference/LinUCBHybridPolicy.html @@ -72,7 +72,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -269,7 +269,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflineBootstrappedReplayBandit.html b/docs/reference/OfflineBootstrappedReplayBandit.html index f67bd4b..154eb66 100644 --- a/docs/reference/OfflineBootstrappedReplayBandit.html +++ b/docs/reference/OfflineBootstrappedReplayBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -324,7 +324,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflineDirectMethodBandit.html b/docs/reference/OfflineDirectMethodBandit.html index 88a39ca..4ebf599 100644 --- a/docs/reference/OfflineDirectMethodBandit.html +++ b/docs/reference/OfflineDirectMethodBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -339,7 +339,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflineDoublyRobustBandit.html b/docs/reference/OfflineDoublyRobustBandit.html index f21da36..1b13f57 100644 --- a/docs/reference/OfflineDoublyRobustBandit.html +++ b/docs/reference/OfflineDoublyRobustBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -350,7 +350,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflineLookupReplayEvaluatorBandit.html b/docs/reference/OfflineLookupReplayEvaluatorBandit.html index 17daa91..86ff4fe 100644 --- a/docs/reference/OfflineLookupReplayEvaluatorBandit.html +++ b/docs/reference/OfflineLookupReplayEvaluatorBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -386,7 +386,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflinePropensityWeightingBandit.html b/docs/reference/OfflinePropensityWeightingBandit.html index 1e8c1d2..f6b1602 100644 --- a/docs/reference/OfflinePropensityWeightingBandit.html +++ b/docs/reference/OfflinePropensityWeightingBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -332,7 +332,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OfflineReplayEvaluatorBandit.html b/docs/reference/OfflineReplayEvaluatorBandit.html index 3c0cab8..925efce 100644 --- a/docs/reference/OfflineReplayEvaluatorBandit.html +++ b/docs/reference/OfflineReplayEvaluatorBandit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -337,7 +337,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/OraclePolicy.html b/docs/reference/OraclePolicy.html index 25f6376..5117239 100644 --- a/docs/reference/OraclePolicy.html +++ b/docs/reference/OraclePolicy.html @@ -72,7 +72,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -259,7 +259,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/Plot.html b/docs/reference/Plot.html index 01f5091..9c24afb 100644 --- a/docs/reference/Plot.html +++ b/docs/reference/Plot.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -315,7 +315,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/Policy.html b/docs/reference/Policy.html index 062a77c..9459a1f 100644 --- a/docs/reference/Policy.html +++ b/docs/reference/Policy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -268,7 +268,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/RandomPolicy-1.png b/docs/reference/RandomPolicy-1.png index 859af35dcd3ad7ee7fd8b7b017f587f3cdbe7925..3c24b7f07fd5cf8bb02cb4c7fef827a3cb133e68 100644 GIT binary patch literal 20345 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 Mp00i_>zopr0JjRmga7~l diff --git a/docs/reference/RandomPolicy.html b/docs/reference/RandomPolicy.html index 6965387..cbd3dd0 100644 --- a/docs/reference/RandomPolicy.html +++ b/docs/reference/RandomPolicy.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -242,7 +242,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:01.856
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.325
    #> Computing statistics.
    plot(history, type = "arms")
    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/Simulator.html b/docs/reference/Simulator.html index 8ae61d7..2932eb3 100644 --- a/docs/reference/Simulator.html +++ b/docs/reference/Simulator.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -311,7 +311,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/SoftmaxPolicy-1.png b/docs/reference/SoftmaxPolicy-1.png index 374687eb725aff5827f85061d3828df2cdd216d0..9f7d3b04e04c2e8a478aa059be995a9b2ce993da 100644 GIT binary patch delta 417 zcmW-bAyP##3`GM1#|~IQDi{QgH6S2SI6RKQAd&%zVTM&CmKCrA{v?aR^p*R5=JcB8 z^!D(0c>KIFCK^OSq{K`t#71M#P#R8Zq(Pck+AsGJW@8mrWUzsPzZ?7LP~byzc;iuF zz@k7zO$>xsNrVJ)nxc6Ch_0UMtqB%BW~fp!MM7lTCoDi2%r5KcgIvLI_@17iy}=5l zP!0pKYsV8&(GiWDvCTw5>PSavXRlnVjLW0~SYf@b8d=q|wyJHmk529M&ZE?r1r^b2 z{k=T>y}!*3~O5z*W8-R=F?&&l)G@5$Ns_36ds EKiU=34gdfE delta 417 zcmW-aF-`+P3`HFZI&Q!nA_@x6At<1vi!|<_ifAYz!2xV3M?rR<8<2*=zDSzc;cu+B zzuEuhpLge-Jsg;*5p^OVX5vn))EYIRW+Y1DB!SZUbG^>2ES&}EtRUg9#(L5OSd(a0 zc(gO%E}(bOuE4uyckhlI2f=a!5KSz^N&-w}QcMY{AR)4@=jtHUhgND0Yh(hN!MCsg zWd)`Sxv(qft9Jd|)62b(!& Iyt&{01Br{`Q~&?~ diff --git a/docs/reference/SoftmaxPolicy-2.png b/docs/reference/SoftmaxPolicy-2.png index a8282d6e85a826e751892bd7e0aa64e9924c389a..58fd11455bdf2b900d130009e99a4d3f113d7451 100644 GIT binary patch delta 465 zcmW-bF>BO85XC3qS}RitLAb(Vw+iA1NQi}vSnO0<*d*08Hiz8|*Cgo_K?DQZ9kWE6 z`v}^EkZMNj5b!Hp5!wId{qOPP?ZUn{v+LP<_F+#FQ6?%xOes++l!S7o%#@W_h>f@+ zl&FmFqe@~Ri7g3m^vA|1&I~kj%^Db5HnoyU;ZztdMSvCYVxS3Qa|S3XYh?|tpdbA? zIsSY4E;@dQkZ=-4H;wgCCI(zEB3zoVfu?=B_ zg;~Ix4XrX&&QLHz5X2YqLV^a{kPtKp0Gm|OKs74oI6Xi>WfmZYt!X)(>7Z@{&X zAVBPzQh}>|g66(szD|CbyX0neZ@pYE?bV8j3Q;8zVkWM{N~KT{Dn_CtPSOx!s`LA- z$^w+dSwWybH)cr@U`1N7#L#+Qt6Zya6}VOfUNx$NzN)|W1ts(j=l{Sa$#3c=QgzR@N`dj_o+9b zCZ!oZkS#|WBa}mHIM8sUBT^$h5|GfzCHi^@aEa#_~YKs^WEpyPoDmG Uah0$C>K}sMZoS+5^5*^Se-nZL-~a#s diff --git a/docs/reference/SoftmaxPolicy.html b/docs/reference/SoftmaxPolicy.html index 346cebc..afd8a3a 100644 --- a/docs/reference/SoftmaxPolicy.html +++ b/docs/reference/SoftmaxPolicy.html @@ -72,7 +72,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -247,7 +247,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.167
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.440
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    @@ -277,7 +277,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ThompsonSamplingPolicy-1.png b/docs/reference/ThompsonSamplingPolicy-1.png index 090d24bc3fa2090da023314c4665c91e81029282..4246c37632308b16e383855460e1289f4ce0929d 100644 GIT binary patch delta 432 zcmXAjF;0Uq3`SiRE`c~eGF4*a0xU>Sd*%XVLkNk%mKa!(dJ22xB*;DhTd&Y1fB61l zy?hzsXXm&-?!UI$h&mAy3AILzsVVhNU8oz0k|3QV(6_#?#jR-*Zi4itATeT<){-v3 zxKy8rI1K zbc1hU0m=$Y7jkK?fLHB&+|$dw(jogYLMWt%0r_{MDr&}@sV$Y$fhN4tEM#VlTr!tY z)+?mKD$Y`&CR9Ytd3t?5eY_9nQ98;;QScVZX%=l1FLfrvg|9`ARD QpUvChcXRoDcX5652Pm`I#Q*>R delta 432 zcmXAiF;0Uq424}5E`hiM5{q*Kgv0<#FAz^AHK|3o*e6dPvqzSMl z(af3^zU~aT3+P?6EAXz_-S^#b4Z;2f;F?&7l?0f|q}V2;f`-Vt#??Wp53ST1*2n}j zgKuF0$_h*ua$#4{SM7Y<)62cm_ceSOAr#WWfc(2r6*XhdR8H;bKoeeR7CN&=E}6?H zYZX#q6=$iC2^Cdyo?f3%AMeBaC>`aaax6X;^q3*Du54DEC$S6j^L~5$A)?Qh$A_oG Q_vY>JySe contextual - 0.9.8 + 0.9.8.1 @@ -250,7 +250,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.565
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.754
    #> Computing statistics.
    plot(history, type = "cumulative")
    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/UCB1Policy.html b/docs/reference/UCB1Policy.html index 366347f..2c084e7 100644 --- a/docs/reference/UCB1Policy.html +++ b/docs/reference/UCB1Policy.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -270,7 +270,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/UCB2Policy-1.png b/docs/reference/UCB2Policy-1.png index f5302b0eba79d82f2a11677a3c866751d05bee64..8423206a6fdc658c1d353e910088db05f003ca74 100644 GIT binary patch delta 358 zcmW-bu~9%l2t=_5n-C($R@lTIObkp6xEUie+kn(kpb`_Earh_a&SMjn+xx{YKJJZ) zgh+`%%*0A;Btim`MKFRBVnSzmq>RBB&Nk#6%Mk=i5VC6CQXW__sKV3+S4(wQA8$;b z3}RS;D8!zh7zQ>>p6$rZhcs`iwCW|aAS-Isc94VJ20gj|aZfMz8gIWkKmmz04HdOx z?=()+^ucn{k7Ze&m06uv=GC>N0u}3=9PQfs=jG|=?X_LItjoKyFYjx-cVO4r6?>wm QVthZ`et&(w-#p*_0SKD97XSbN delta 358 zcmW-aF-`M7zbn-m_=C!XH9lzA8(mH z8t5t(5+$(}L1jRd$)g^*`jG0am0E2CCS*}o+XYNfxANTZfukrTPArL}g(@;@6 z_D;oAP9HQU{Z^XgS((+jGFO*Tg;dx%Ioh@N?eqQi{ngH0+T~r@%X^LY4%ub9Vo&r` PjBk2;efs@*_;~&UsRPC_ diff --git a/docs/reference/UCB2Policy-2.png b/docs/reference/UCB2Policy-2.png index b4e2f4fc22835d45e092c17bf2d9186228b37da2..41eaab7e1ad79397d86c1e5cf5ce24b98bbde3d0 100644 GIT binary patch delta 471 zcmW-bF-zP*5XI*-#9AVuXkgGavynpm-=i zYX40sphE#UkfYvjjV6qkBTCHX6VtqtLP{7Cx>F*D6KP_nAOK+m^d4r+f?_Cj|6y|Q z=k(C3-$v*JLNA8aZDL|ai3^#Ml^h|*m=Q9%`xwb$*_?WD)BU`yjKCO}oYbmK%EoNU z-si3ef?$;F2bfruT9txQQg%pNT-8X8)%;PkW9?MCVmX?iNjCASFLifSpW$Y;zWuuV z|NF9VDn`Y)n3j%9=U%E{wY6ML=1E`b`Fg$a@(%zeN84N9ruV&*>EGVcbht2B9DeQ3 m&K90Ne^~wWd^bDpzb>zQeBS;3<9z4Q^Dz9fHMrW`8@~ewukJ1Y delta 471 zcmW-aF>BO85XI-tfSnMLRARtyV7W`G;}STFEA$K4>_94;5YipFCU!G$RVwYSi8kj9 zSZk+^g%&e}h>c$%81}!Jy~mHo!oD|edAvO47mEat0SW*@N{|X9f}9~EWCkQa0n`X3 zDE+^yBn&8_BnmA0z0rjkIiqIwxLCHGl1jl;Fq{enQpkz~wfwqRU@Ye#BQmn0I%>n; z@6NqZ0>U5>MltnnmyiTTQpt_Hat6+s5g5bchO#<)(B6L?K74C}Aee-L(yLu2F5)H& zuQF6cP|V7)?&?ijGfGCqBp~Z?GbeK~k4LpZY%m+Db9O~nc8zL`hKE|*2=mtdU#;&x zuB(*lR9&iD9i$H7wJA1#%FT6~jM2!qgQM#;09>5Bn!jHC9G$KHj2^CL contextual - 0.9.8 + 0.9.8.1 @@ -243,7 +243,7 @@

    Examp bandit <- BasicBernoulliBandit$new(weights = weights) agent <- Agent$new(policy, bandit) -history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:02.248
    #> Computing statistics.
    +history <- Simulator$new(agent, horizon, simulations, do_parallel = FALSE)$run()
    #> Simulation horizon: 100
    #> Number of simulations: 100
    #> Number of batches: 1
    #> Starting main loop.
    #> Finished main loop.
    #> Completed simulation in 0:00:01.968
    #> Computing statistics.
    plot(history, type = "cumulative")
    plot(history, type = "arms")
    @@ -275,7 +275,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/clipr.html b/docs/reference/clipr.html index 8636fb8..4c95148 100644 --- a/docs/reference/clipr.html +++ b/docs/reference/clipr.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -214,7 +214,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/data_table_factors_to_numeric.html b/docs/reference/data_table_factors_to_numeric.html index 1d5e187..c5a5f53 100644 --- a/docs/reference/data_table_factors_to_numeric.html +++ b/docs/reference/data_table_factors_to_numeric.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -210,7 +210,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/dec-set.html b/docs/reference/dec-set.html index 86e9446..8af2cce 100644 --- a/docs/reference/dec-set.html +++ b/docs/reference/dec-set.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -215,7 +215,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/formatted_difftime.html b/docs/reference/formatted_difftime.html index 5e3cfc7..26b06e0 100644 --- a/docs/reference/formatted_difftime.html +++ b/docs/reference/formatted_difftime.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -210,7 +210,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/get_arm_context.html b/docs/reference/get_arm_context.html index 06e1b4f..9f37dd5 100644 --- a/docs/reference/get_arm_context.html +++ b/docs/reference/get_arm_context.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -228,7 +228,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/get_full_context.html b/docs/reference/get_full_context.html index 3c4ae3f..c0c031c 100644 --- a/docs/reference/get_full_context.html +++ b/docs/reference/get_full_context.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -226,7 +226,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/inc-set.html b/docs/reference/inc-set.html index 76d41f7..cbe589f 100644 --- a/docs/reference/inc-set.html +++ b/docs/reference/inc-set.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -215,7 +215,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ind.html b/docs/reference/ind.html index 9d9c182..9e92981 100644 --- a/docs/reference/ind.html +++ b/docs/reference/ind.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -210,7 +210,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/index.html b/docs/reference/index.html index 7d2efe3..87d786f 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -66,7 +66,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -679,7 +679,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/inv.html b/docs/reference/inv.html index ed6e8c1..b03a7c2 100644 --- a/docs/reference/inv.html +++ b/docs/reference/inv.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -212,7 +212,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/invgamma-1.png b/docs/reference/invgamma-1.png index 94cde492551f92d3b07515af893cb0d05feac13a..43373c41646837413be2f09f57b094a6afd58c82 100644 GIT binary patch delta 241 zcmXAhv1vmA3`F(810)-`7P!a^X+jDYu~gbqq`wscUct?Efh-b`*3rlJ?c;cGxb&YDVs;AZ&#x$lmU9)mlaXw#u)671;zmBKt>+*ix KFT1~3{ttH%Vsjb* delta 241 zcmXAfv28+O421n87GMJwNI~g3O)83n7CQeEq^C}GNQ?j*M7IYOg*}U(xChqhlg{7W zj<@4^dvdcdcXJUosJ^u2!iNIa6H3Nw8g8+;h~Y6r1Q@bpP;9ut9m6oh034ctppwv_ zn!`Ap@B contextual - 0.9.8 + 0.9.8.1 @@ -265,7 +265,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/invlogit.html b/docs/reference/invlogit.html index fbd7caa..25ce564 100644 --- a/docs/reference/invlogit.html +++ b/docs/reference/invlogit.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -210,7 +210,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/is_rstudio.html b/docs/reference/is_rstudio.html index 5dd6f7f..52f3222 100644 --- a/docs/reference/is_rstudio.html +++ b/docs/reference/is_rstudio.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -205,7 +205,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/mvrnorm.html b/docs/reference/mvrnorm.html index f4b140b..b4fc802 100644 --- a/docs/reference/mvrnorm.html +++ b/docs/reference/mvrnorm.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -221,7 +221,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/one_hot.html b/docs/reference/one_hot.html index 52091c4..b7b4c23 100644 --- a/docs/reference/one_hot.html +++ b/docs/reference/one_hot.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -267,7 +267,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/ones_in_zeroes.html b/docs/reference/ones_in_zeroes.html index 60b80a6..bc2dc5a 100644 --- a/docs/reference/ones_in_zeroes.html +++ b/docs/reference/ones_in_zeroes.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -214,7 +214,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/plot.history.html b/docs/reference/plot.history.html index af93968..1ef8d45 100644 --- a/docs/reference/plot.history.html +++ b/docs/reference/plot.history.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -218,7 +218,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/print.history.html b/docs/reference/print.history.html index a8c2ab0..cc6b633 100644 --- a/docs/reference/print.history.html +++ b/docs/reference/print.history.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -218,7 +218,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/prob_winner.html b/docs/reference/prob_winner.html index 802b910..dfb2575 100644 --- a/docs/reference/prob_winner.html +++ b/docs/reference/prob_winner.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -222,7 +222,7 @@

    Author

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/sample_one_of.html b/docs/reference/sample_one_of.html index 206ab38..d83ccc7 100644 --- a/docs/reference/sample_one_of.html +++ b/docs/reference/sample_one_of.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -210,7 +210,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/set_external.html b/docs/reference/set_external.html index 1f09570..609cc02 100644 --- a/docs/reference/set_external.html +++ b/docs/reference/set_external.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -236,7 +236,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/sherman_morrisson.html b/docs/reference/sherman_morrisson.html index 4fef75d..9a2f91b 100644 --- a/docs/reference/sherman_morrisson.html +++ b/docs/reference/sherman_morrisson.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -208,7 +208,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/sim_post.html b/docs/reference/sim_post.html index 322406b..a0fe63f 100644 --- a/docs/reference/sim_post.html +++ b/docs/reference/sim_post.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -239,7 +239,7 @@

    Author

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/sum_of.html b/docs/reference/sum_of.html index 0de54b6..ec5bd9e 100644 --- a/docs/reference/sum_of.html +++ b/docs/reference/sum_of.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -219,7 +219,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/summary.history.html b/docs/reference/summary.history.html index d9a3457..d04b5d1 100644 --- a/docs/reference/summary.history.html +++ b/docs/reference/summary.history.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -219,7 +219,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/value_remaining-1.png b/docs/reference/value_remaining-1.png index 3ab3d380608a01cbaccb437a9a5954a8f94809af..900c702487426a9299eb74bb5843e572d135839b 100644 GIT binary patch delta 234 zcmW-Z!3jb^3`AoC-mF2$%{IJ!NUpz?sX(xeIopE`B<*Bz*5NTEdCR_z*YSS9&BENx z)v%;?E&H$&o&v5rM1@|vkcdc&^hgZ|Fk~r4U&0+J0x~-UY8MF>S`5>eeiBZ^U&XdN q#U@)lTvPBu6a{L#szx=dHB2qmnqf?1n$tClv($4wZ{N@Lg8L7MKy`co delta 234 zcmW-X!3_dX2t#oJ*YNC-DU1tvgAF`8fvLNgj^NP+U>1Jtw|QxR$MgEUzRnLf3v)MD z!;;#y?88oY3b^hN75a7|5s?<@ks1(S$Wjd4;EoglnH>VPiv$ZThG|T{5l+Nk#kM=e qCR;sRQ}99*1!}vhMm4K7OfA-$VN7G1(>05;)bqW3?(gH_aryyQ5P!e` diff --git a/docs/reference/value_remaining.html b/docs/reference/value_remaining.html index d0140dc..9bef1f1 100644 --- a/docs/reference/value_remaining.html +++ b/docs/reference/value_remaining.html @@ -70,7 +70,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -241,7 +241,7 @@

    Author

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/var_welford.html b/docs/reference/var_welford.html index f62af31..3911c1f 100644 --- a/docs/reference/var_welford.html +++ b/docs/reference/var_welford.html @@ -71,7 +71,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -214,7 +214,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/which_max_list.html b/docs/reference/which_max_list.html index a51af2f..5e5725d 100644 --- a/docs/reference/which_max_list.html +++ b/docs/reference/which_max_list.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -224,7 +224,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/docs/reference/which_max_tied.html b/docs/reference/which_max_tied.html index abb98e4..d106770 100644 --- a/docs/reference/which_max_tied.html +++ b/docs/reference/which_max_tied.html @@ -69,7 +69,7 @@ contextual - 0.9.8 + 0.9.8.1 @@ -216,7 +216,7 @@

    Contents

    -

    Site built with pkgdown 1.3.0.9000.

    +

    Site built with pkgdown 1.3.0.

    diff --git a/vignettes/only_pkgdown/faq.Rmd b/vignettes/only_pkgdown/faq.Rmd index 7fb25ba..e1a9940 100644 --- a/vignettes/only_pkgdown/faq.Rmd +++ b/vignettes/only_pkgdown/faq.Rmd @@ -3,10 +3,6 @@ title: "Development FAQ" author: "Robin van Emden" date: "`r Sys.Date()`" output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Frequently Asked Questions} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE, cache = TRUE}