| Type: | Package | 
| Title: | Mixed Variable Optimization | 
| Version: | 0.1.3 | 
| Maintainer: | Collin Erickson <collinberickson@gmail.com> | 
| Description: | Mixed variable optimization for non-linear functions. Can optimize function whose inputs are a combination of continuous, ordered, and unordered variables. | 
| Depends: | dplyr, ggplot2, splitfngr | 
| Suggests: | ContourFunctions, gridExtra, lhs, testthat (≥ 3.0.0) | 
| License: | LGPL (≥ 3) | 
| Encoding: | UTF-8 | 
| URL: | https://github.com/CollinErickson/mixopt | 
| BugReports: | https://github.com/CollinErickson/mixopt/issues | 
| RoxygenNote: | 7.3.1 | 
| Config/testthat/edition: | 3 | 
| NeedsCompilation: | no | 
| Packaged: | 2024-09-14 00:32:50 UTC; colli | 
| Author: | Collin Erickson [aut, cre] | 
| Repository: | CRAN | 
| Date/Publication: | 2024-09-15 00:20:02 UTC | 
Index mixopt_list
Description
Avoid standard list indexing which returns list for single index.
Usage
## S3 method for class 'mixopt_list'
x[i, value]
Arguments
| x | x | 
| i | i | 
| value | value | 
Value
value at index
Examples
a <- list(1,4,'c', 'g')
class(a) <- "mixopt_list"
a
a[3]
a[2:3]
a[-(2:3)]
as.data.frame(a)
b <- as.mixopt_list(c(1,2,3,4,5))
sum(b)
b^2
b+b
b-b
b*b
b/b
c(b)
c(b, b)
c(b, 1)
c(1, b)
c(a, b, a)
c_mixopt_list(0, 1, 2, 3, 4, a, 5, 6, 7, 8, b, 9)
c_mixopt_list(NULL, 3, NULL, a, NULL, 66666, NULL, b)
Coerce to a mixopt_list
Description
Coerce to a mixopt_list
Usage
as.mixopt_list(x, simplifyifpossible = FALSE)
Arguments
| x | Object | 
| simplifyifpossible | If possible, should the class be simplified to numeric or character? | 
Value
Object of class mixopt_list
Combines mixopt_list objects
Description
Combines mixopt_list objects
Usage
c_mixopt_list(x, ...)
Arguments
| x | Object | 
| ... | Additional objects | 
Value
A combined mixopt_list
Examples
c_mixopt_list(NULL, as.mixopt_list(1:5), NULL, as.mixopt_list(letters[1:5]))
c_mixopt_list(as.mixopt_list(1:3), NULL)
Optimize over array using line search
Description
Optimize over array using line search
Usage
full_index_line_search(
  f,
  xarray,
  startind,
  plot = "none",
  ystart = NULL,
  verbose = 0
)
Arguments
| f | Function | 
| xarray | Array of values | 
| startind | Starting index | 
| plot | Should plots be made? | 
| ystart | Value of f when evaluated on element of xarray at index startind, aka f(xarray[startind]) | 
| verbose | Level of info to print | 
Value
List
Examples
full_index_line_search(function(x) {(x-50)^2}, 3:12, 5)
full_index_line_search(function(x) {(x-50)^2}, 3, 1)
full_index_line_search(function(x) {(x-50)^2}, 3:4, 1)
full_index_line_search(function(x) {(x-50)^2}, 3:5, 1)
full_index_line_search(function(x) {(x+50)^2}, 3, 1)
full_index_line_search(function(x) {(x+50)^2}, 3:4, 1)
full_index_line_search(function(x) {(x+50)^2}, 3:5, 1)
full_index_line_search(function(x) {(x-50)^2}, 12:3, 8)
full_index_line_search(function(x) {(x-50)^2}, 0:1000, 8)
full_index_line_search(function(x) {(x-50)^2}, 0:1000, 999)
full_index_line_search(function(x) {sin(x/30)}, 0:1000, 999)
Line search over indexed array in one direction
Description
Line search over indexed array in one direction
Usage
index_line_search(f, xarray, y1 = NULL, plot = "none", verbose = 0)
Arguments
| f | f | 
| xarray | xarray | 
| y1 | y1 | 
| plot | plot | 
| verbose | Level to print | 
Value
List
Examples
index_line_search(function(x) {(x-100)^2}, 1:290)
index_line_search(function(x) {(-x-100)^2}, -(1:290)^.92, plot="ind")
index_line_search(function(x) {(-x-100)^2}, -(1:290)^.92, plot="x")
xx <- sort(runif(1e2, -250, -30))
index_line_search(function(x) {(-x-100)^2}, xx, plot="ind")
index_line_search(function(x) {(-x-100)^2}, xx, plot="x")
Checks if object is mixopt_list
Description
Checks if object is mixopt_list
Usage
is.mixopt_list(x)
Arguments
| x | Object | 
Value
TRUE if x has class "mixopt_list"
Mixed variable optimization using coordinate descent
Description
Mixed variable optimization using coordinate descent
Usage
mixopt(
  par,
  fn,
  gr = NULL,
  global = "multistart",
  local = "coorddesc",
  ...,
  method,
  verbose = 0,
  track
)
mixopt_blockcd(
  par,
  fn,
  gr = NULL,
  ...,
  control = list(),
  maxblocksize = NULL,
  method,
  fngr = NULL,
  maxiter = 100,
  maxeval = NULL,
  maxtime = NULL,
  verbose = 0,
  track = FALSE
)
mixopt_coorddesc(
  par,
  fn,
  gr = NULL,
  ...,
  method,
  maxiter = 100,
  maxeval = NULL,
  maxtime = NULL,
  verbose = 0,
  track = FALSE
)
mixopt_multistart(
  par,
  fn,
  gr = NULL,
  ...,
  method,
  fngr = NULL,
  n0 = 20,
  n1 = 2,
  maxiter = 100,
  maxeval = NULL,
  verbose = 0,
  groupeval = FALSE,
  track = FALSE
)
Arguments
| par | List of parameters | 
| fn | Function to evaluate | 
| gr | Gradient of fn | 
| global | Global optimization algorithm to use. 'FALSE' if you only want local optimization. | 
| local | Local optimization algorithm to use. | 
| ... | Additional args | 
| method | Optimization method | 
| verbose | How much to print. 0 is none, 1 is standard, 2 is some, 3 is a lot, etc. | 
| track | Should it track the parameters evaluated and value? | 
| control | Parameters for optimizing. | 
| maxblocksize | The maximum number of continuous dimensions that should be placed into a single block. | 
| fngr | Function that returns the function and gradient value for the given input as a list with names "fn" and "gr". | 
| maxiter | Maximum number of outer iterations. For coordinate descent, one iteration is a loop over each parameter. | 
| maxeval | Maximum number of function evaluations. It may go over this number while in an inner optimization loop, but will exit after that. | 
| maxtime | Maximum time to run in seconds. Not an exact limit, only checks occasionally. | 
| n0 | For multistart, number of random initial points to evaluate. | 
| n1 | For multistart, number of best starts to optimize with. You should have 'n0' less than 'n1', potentially by a large factor. gradient descent. | 
| groupeval | Can multiple inputs be evaluated at once? This can speed up greatly for certain circumstances. Use "matrix" to have it give a set of points as rows of a matrix to all be evaluated at once. | 
Value
List
References
https://en.wikipedia.org/wiki/Coordinate_descent
https://en.wikipedia.org/wiki/Coordinate_descent
https://www.uv.es/rmarti/paper/docs/multi2.pdf
Examples
# Simple 1D example
mixopt_blockcd(par=list(mopar_cts(2,8)), fn=function(x) {(4.5-x[1])^2})
# With gradient (isn't faster)
mixopt_blockcd(par=list(mopar_cts(2,8)), fn=function(x) {(4.5-x[1])^2},
               gr=function(x) {-2*(4.5-x[1])})
# 1D discrete ordered
mixopt_blockcd(par=list(mopar_ordered(100:10000)),
                 fn=function(x) {(x[1] - 500.3)^2})
# 2D: one continuous, one factor
mixopt_blockcd(par=list(mopar_cts(2,8), mopar_unordered(letters[1:6])),
                 fn=function(x) {ifelse(x[2] == 'b', -1, 0) +
                                 (4.5-x[1])^2})
# Simple 1D example
mixopt_coorddesc(par=list(mopar_cts(2,8)), fn=function(x) {(4.5-x[1])^2})
# 1D discrete ordered
mixopt_coorddesc(par=list(mopar_ordered(100:10000)),
                 fn=function(x) {(x[1] - 500.3)^2})
# 2D: one continuous, one factor
mixopt_coorddesc(par=list(mopar_cts(2,8), mopar_unordered(letters[1:6])),
                 fn=function(x) {ifelse(x[2] == 'b', -1, 0) +
                                 (4.5-x[1])^2})
# 2D
library(ggplot2)
library(dplyr)
f6 <- function(x) {-(-x[1]*.5*sin(.5*x[1])*1 - 1e-2*x[2]^2 +
                       .2*x[1] - .3*x[2])}
if (requireNamespace("ContourFunctions", quietly = TRUE)) {
  ContourFunctions::cf_func(f6, xlim=c(0,100), ylim=c(-100,100))
}
m6 <- mixopt_coorddesc(par=list(mopar_cts(0,100), mopar_cts(-100,100)),
                       fn=f6, track = TRUE)
plot_track(m6)
ms6 <- mixopt_multistart(par=list(mopar_cts(0,100), mopar_cts(-100,100)),
                         fn=f6, track = TRUE)
plot_track(ms6)
if (requireNamespace("ContourFunctions", quietly = TRUE)) {
  ContourFunctions::cf_func(f6, xlim=c(0,100), ylim=c(-100,100),
                            gg = TRUE) +
    geom_point(data=as.data.frame(matrix(unlist(ms6$track$par),
                                         ncol=2, byrow=TRUE)) %>%
                 bind_cols(newbest=ms6$track$newbest),
               aes(V1, V2, color=newbest), alpha=.5)
}
Continuous variable
Description
Continuous variable
Usage
mopar_cts(lower, upper, start = NULL)
Arguments
| lower | Lower | 
| upper | Upper | 
| start | Start. Defaults to midpoint if not given. | 
Value
mixopt_par list
Examples
mopar_cts(2,8)
mopar_cts(2,8,7)
Ordered variable parameter
Description
Ordered variable parameter
Usage
mopar_ordered(values, start = NULL)
Arguments
| values | Values the parameter can take, in order | 
| start | Start parameter for optimization | 
Value
mixopt_par list
Examples
mopar_ordered(c(1,3,5))
mopar_ordered(c('a','c'))
mopar_ordered(1:4)
mopar_ordered(4:1)
mopar_ordered(list('a', 2, 'c', sin))
Unordered factor parameter
Description
Unordered factor parameter
Usage
mopar_unordered(values, start = NULL)
Arguments
| values | Values the variable can take | 
| start | Start value. Chosen randomly if not given. | 
Value
mixopt_par list
Examples
mopar_unordered(c(1,3,9))
mopar_unordered(letters)
Plot the tracked parameters from an optimization
Description
Plot the tracked parameters from an optimization
Usage
plot_track(out)
Arguments
| out | Output from mixopt | 
Value
Plot
Examples
f8 <- function(x) {-(x[[1]]+x[[2]]) + .1*(x[[1]] - x[[2]])^2}
if (requireNamespace("ContourFunctions", quietly = TRUE)) {
  ContourFunctions::cf_func(f8, xlim=c(0,100), ylim=c(0,100))
}
m8 <- mixopt_coorddesc(par=list(mopar_ordered(0:100), mopar_ordered(0:100)),
                       fn=f8, track = TRUE)
plot_track(m8)
library(ggplot2)
library(dplyr)
if (requireNamespace("ContourFunctions", quietly = TRUE)) {
  ContourFunctions::cf_func(f8, xlim=c(0,100), ylim=c(0,100),
                            gg = TRUE) +
    geom_point(data=as.data.frame(matrix(unlist(m8$track$par),
                                  ncol=2, byrow=TRUE)) %>%
                      bind_cols(newbest=m8$track$newbest),
               aes(V1, V2, color=newbest))
}
Verify parameters
Description
Verify parameters
Usage
verify_par(par)
Arguments
| par | List of parameters | 
Value
Nothing, raises error if not valid
Examples
verify_par(
  list(
    mopar_cts(2, 8, 6)
  )
)