Skip to content

Instantly share code, notes, and snippets.

View dirkschumacher's full-sized avatar
👶
I may be slow to respond.

Dirk Schumacher dirkschumacher

👶
I may be slow to respond.
View GitHub Profile
# if this produced a valid tree
quote(a <= b <= c)
# then we could do
add_constraint(lower[i] <= X[i] <= upper[i], i = 1:n)
# instead of
add_constraint(X[i] <= upper[i], i = 1:n)
add_constraint(lower[i] <= X[i], i = 1:n)

Draft: Applied Mixed Integer Linear Programming for Beginners

Format preferences

  • virtual, morning hours Nashville, Tennessee time, as I am based in Berlin, 2 - 3 hours

Language in which the tutorial can be taught

  • English

The title of the tutorial

  • Applied Mixed Integer Linear Programming for Beginners

The broad topic it covers

  • Discrete optimization, operations research
# let's construct some byte code
# x <- 42
# y <- x + 42
bcode <- .Internal(mkCode(
c(
12L, # this is an identifier which byte-code version you use (I think)
# each line is an operator, the first item is the operator, followed by operands (aka. arguments)
16L, 0L, # Operator "LDCONST" (load constant) from the index 1 in the constant pool
# now value 1 is on the stack
22L, 1L, # Operator "SETVAR" (set variable) assign the last value on the stack to the name at index 2
# License GPL 2
library(armacmp)
# from the R docs of optim
fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
return(100 * (x2 - x1 * x1)^2 + (1 - x1)^2)
}
grr <- function(x = type_colvec()) { ## Gradient of 'fr'
# Let's build this expression by hand
# val <- 0
# if (this) {
# val <- 1
# }
constant_pool <- list(
NULL,
as.symbol("val"), # we need a symbol val
as.symbol("this"), # we also need a symbol this,
0, 1 # next we need the two values 0 and 1
input <- readLines("path/to/input")
input <- as.integer(input)
library(ompr)
library(ompr.roi)
library(ROI.plugin.glpk)
library(tidyverse)
n <- length(input)
MIPModel() %>%
# a variable for each input number
library(torch)
optim_torch <- function(params, fn, method, iterations = 1000, ...) {
  optimizer <- do.call(paste0("optim_", method), list(params, ...))
  for (i in seq_len(iterations)) {
    obj_val <- fn(params)
    if (i %% 100 == 0) message(as.numeric(obj_val))
    optimizer$zero_grad()
    obj_val$backward()
    optimizer$step()
# investigate your project or package dependencies
# using the {tidyverse}, {renv} and {tools}.
# since this code is wrapped in {reprex}, the below library calls
# will be identified as dependent packages although only {tidyverse}, {renv}
# and {tools} are actually used.
library(tidyverse, warn.conflicts = FALSE) # ironically the most deps :)
# add some more dependencies as an example
suppressPackageStartupMessages(library(caret, warn.conflicts = FALSE))
suppressPackageStartupMessages(library(tidymodels, warn.conflicts = FALSE))

Role based access control as a logic program

Inspired by this article

# remotes::install_github("dirkschumacher/logician")
# a role based access control
library(logician)
role_database <- logician_database(
  role(user),
library(logician)
# Towers of Hanoi
# https://en.wikipedia.org/wiki/Tower_of_Hanoi
# Original Prolog Implementation:
# https://www.cs.toronto.edu/~sheila/384/w11/simple-prolog-examples.html
database <- logician_database(
# no `is` operator yet, so we have to define all valid numbers
num(1),num(2),num(3),num(4),num(5),
num(6),num(7),num(8),num(9),