Random latin squares
Various functionality for generating random latin squares
incidence(a) is.incidence(a, include.improper) is.incidence.improper(a) unincidence(a) inc_to_inc(a) another_latin(a) another_incidence(i) rlatin(n,size=NULL,start=NULL,burnin=NULL)
a |
A latin square |
i |
An incidence array |
n,include.improper,size,start,burnin |
Various control arguments; see details section |
Function incidence()
takes an integer array
(specifically, a latin square) and returns the incidence array as
per Jacobson and Matthew 1996
Function is.incidence()
tests for an array being an
incidence array; if argument include.improper
is TRUE
,
admit an improper array
Function is.incidence.improper()
tests for an array
being an improper array
Function unincidence()
converts an incidence array to a
latin square
Function another_latin()
takes a latin square and
returns a different latin square
Function another_incidence()
takes an incidence array
and returns a different incidence array
Function rlatin()
generates a (Markov) sequence of
random latin squres, arranged in a 3D array. Argument n
specifies how many to generate; argument size
gives the size
of latin squares generated; argument start
gives the start
latin square (it must be latin and is checked with
is.latin()
); argument burnin
gives the burn-in value
(number of Markov steps to discard).
Default value of NULL
for argument size
means to take
the size of argument start
; default value of NULL
for
argument start
means to use circulant(size)
As a special case, if argument size
and start
both
take the default value of NULL
, then argument n
is
interpreted as the size of a single random latin square to be
returned; the other arguments take their default values. This
ensures that “rlatin(n)
” returns a single random
n-by-n latin square.
From Jacobson and Matthew 1996, an n-by-n latin square LS is equivalent to an n-by-n-by-n array A with entries 0 or 1; the dimensions of A are identified with the rows, columns and symbols of LS; a 1 appears in cell (r,c,s) of A iffi the symbol s appears in row r, column s of LS. Jacobson and Matthew call this an incidence cube.
The notation is readily generalized to latin hypercubes and
incidence()
is dimensionally vectorized.
An improper incidence cube is an incidence cube that includes a single -1 entry; all other entries must be 0 or 1; and all line sums must equal 1.
Robin K. S. Hankin
M. T. Jacobson and P. Matthews 1996. “Generating uniformly distributed random latin squares”. Journal of Combinatorial Designs, volume 4, No. 6, pp405–437
rlatin(5) rlatin(n=2, size=4, burnin=10) # An example that allows one to optimize an objective function # [here f()] over latin squares: gr <- function(x){ another_latin(matrix(x,7,7)) } set.seed(0) index <- sample(49,20) f <- function(x){ sum(x[index])} jj <- optim(par=as.vector(latin(7)), fn=f, gr=gr, method="SANN", control=list(maxit=10)) best_latin <- matrix(jj$par,7,7) print(best_latin) print(f(best_latin)) #compare starting value: f(circulant(7))
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.