---
title: "Nested resolvable designs and associated uniform designs: the 2013 paper, reproduced and generalised"
author: "Mohamed Laib, Abla Boudraa and Zebida Gheribi-Aoulmi"
output: rmarkdown::html_vignette
bibliography: PGM2.bib
vignette: >
  %\VignetteIndexEntry{Nested resolvable designs and associated uniform designs: the 2013 paper, reproduced and generalised}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(PGM2)
```

This vignette reproduces, with the current version of **PGM2**, all the
worked examples, and the first-generation rows of both parameter tables,
of the paper that the package implements [@boudraa2013]:

> A. Boudraa, Z. Gheribi-Aoulmi and M. Laib (2013). *Recursive method for
> construction of resolvable nested designs and uniform designs associated.*
> International Journal of Research and Reviews in Applied Sciences, 17(2),
> 167--176.

The paper states its theory for a projective geometry $PG(m, p)$ over a
Galois field $GF(p)$ of **any prime order** $p$, but versions $\le$ 1.2 of
the package implemented only $p = 2$. Version 2.0 implements the general
prime case, so rows of both Table 1 ($p = 2$) and Table 2 ($p = 3$) of
the paper can be regenerated by the package; the first-generation rows of
each are reproduced at the end of this vignette.

## The construction in brief

A balanced incomplete block design ($BIB$) with parameters
$(v, b, r, k, \lambda)$ arranges $v$ treatments into $b$ blocks of size
$k < v$ so that every treatment occurs in $r$ blocks and every pair of
treatments concurs in $\lambda$ blocks. The method of the paper identifies
treatments with the points of $PG(m, p)$ and blocks with its hyperplanes
[@dugue1958], and then recurses:

1. **Stage 1** — the hyperplanes of $PG(m,p)$ form a symmetric $BIB$ of the
   *first generation* (`BIB`).
2. **Next generations** — deleting a block (a sub-variety $V(i_1)$) and
   intersecting it with the remaining blocks yields the $BIB$ of
   $PG(m-1, p)$, the *second generation* (`Gen`), and so on recursively.
3. **Resolvable designs** — deleting a block together with its treatments
   leaves a resolvable $BIB$ (`Resolvable`): its blocks partition into $r$
   parallel classes of $p$ blocks each (this is the design of the affine
   geometry $AG(m,p)$ [@bose1942]).
4. **Uniform designs** — each resolvable design is converted into a
   symmetric uniform design $U(p^m, p^{r})$ by the correspondence of
   @fang2003 [see also @fang2004]: parallel classes become factors and
   block membership within a class gives the level (`Uniform`).

The driver `Steps` runs the whole recursion and returns the designs of all
stages.

## Example 1 of the paper: $PG(3,2)$

Step 1 gives the first-generation $BIB$ with parameters
$v_1 = b_1 = 15$, $r_1 = k_1 = 7$, $\lambda_1 = 3$; step 2 gives
second-generation designs with parameters $(7, 3, 1)$:

```{r}
X <- BIB(3)
c(V = X$V, B = X$B, R = X$R, K = X$K, Lambda = X$Lambda)

X2 <- Gen(1, X$BIB)
c(V = X2$V, B = X2$B, R = X2$R, K = X2$K)
```

## Example 2 of the paper: the chain $BIB \to RBIB \to UD$

The paper's Example 2 (its pages 174--175) builds, from $PG(3,2)$, the
$BIB(15, 7, 3)$, extracts the $RBIB(8, 14, 7, 4, 3)$ and converts it into
the uniform design $U(8, 2^7)$:

```{r}
bib <- BIB(3)$BIB
bib

resolvable <- Resolvable(1, bib)
resolvable$RBIB

Uniform(resolvable$RBIB)$UD
```

The matrices above coincide (up to the point numbering, which version 2.0
keeps identical to versions $\le$ 1.2 for $p = 2$) with the listings printed
in the paper.

## Example 3 of the paper: a more economic resolvable design

The paper's Example 3 unites the second-generation designs of $PG(3,2)$
obtained by deleting each block in turn, removes the treatments of a chosen
first-generation block, and converts the result — an $RBIB(8, 28, 7, 2, 1)$
— into the uniform design $U(8, (2^2)^7)$ with four-level factors:

```{r}
bib <- BIB(3)$BIB
mat <- NULL
for (i in 1:15) mat[[i]] <- Gen(i, bib)$BIB2
x <- Reduce("rbind", mat)
e <- dim(x)[1]; b <- dim(x)[2]
v <- bib[1, ]
for (i in 1:e) for (j in 1:b) if (any(x[i, j] == v)) x[i, j] <- 0
for (i in e:1) if (all(x[i, ] == 0)) x <- x[-i, ]
s <- x[1, ]; s <- s[s > 0]
x1 <- matrix(nrow = dim(x)[1], ncol = length(s))
for (i in 1:dim(x)[1]) x1[i, ] <- x[i, ][x[i, ] > 0]
A <- unique(x1)
A

ud <- Uniform(A)
ud$UD
```

## All stages at once: `Steps`

```{r}
s <- Steps(4, 1)
names(s)
sapply(s$UDs, function(u) c(runs = u$n, factors = u$F))
```

## Reproducing Table 1 ($p = 2$) and Table 2 ($p = 3$) of the paper

The helper below extracts, for each geometry $PG(m,p)$, the parameters of
the first-generation $BIB$, of the $RBIB$ and of the associated uniform
design — the first three rows of each table of the paper:

```{r}
table_rows <- function(p, ms) {
  out <- NULL
  for (m in ms) {
    X <- BIB(m, p)
    Y <- Resolvable(1, X$BIB)
    U <- Uniform(Y$RBIB)
    out <- rbind(out, data.frame(
      geometry = sprintf("PG(%d,%d)", m, p),
      BIB = sprintf("(%d, %d, %d)", X$V, X$K, X$Lambda),
      RBIB = sprintf("(%d, %d, %d, %d, %d)", Y$V, Y$B, Y$R, Y$K, X$Lambda),
      UD = sprintf("U(%d, %d^%d)", U$n, p, U$F)))
  }
  out
}

knitr::kable(table_rows(2, 2:4), caption = "Paper, Table 1 (p = 2)")
knitr::kable(table_rows(3, 2:4), caption = "Paper, Table 2 (p = 3)")
```

Both agree with the published tables: for $p=2$ the designs
$BIB(7,3,1)$, $BIB(15,7,3)$, $BIB(31,15,7)$ with resolvable designs
$(4,6,3,2,1)$, $(8,14,7,4,3)$, $(16,30,15,8,7)$; for $p=3$ the designs
$BIB(13,4,1)$, $BIB(40,13,4)$, $BIB(121,40,13)$ with resolvable designs
$(9,12,4,3,1)$, $(27,39,13,9,4)$, $(81,120,40,27,13)$.

## The reduced designs $Q^*_n$ directly: `Qn`

The manual juxtaposition of Example 3 is automated by `Qn(m, n, p)`,
which builds the reduced resolvable design $Q^*_n$ and its uniform
design $U(p^m, (p^n)^{r})$ for any stage. Its parameters match the
paper's tables, e.g. $Q^*_2(16, 140, 35, 4, 7)$ for $PG(4,2)$:

```{r}
Q <- Qn(4, 2)
c(V = Q$V, B = Q$B, R = Q$R, K = Q$K, Lambda = Q$Lambda)

identical(dim(Qn(3, 2)$UD), dim(ud$UD))  # the design of Example 3
```

Any two distinct runs of a `Qn` design coincide in exactly `Lambda`
factors (the designs are *equidistant*), so every stage attains the
discrete-discrepancy lower bound of Fang et al. (2004). Successive
stages are linked by a many-to-many subspace-incidence refinement
relation: whenever $W' \subset W$, the level partition of $W'$ refines
that of $W$. This does not make the full arrays nested designs in the
usual run-subset or columnwise sense.

## Beyond the paper: any prime order

Nothing restricts the recursion to the orders tabulated in the paper — any
prime works:

```{r}
Z <- BIB(2, p = 5)          # BIB(31, 6, 1): the projective plane of order 5
W <- Resolvable(1, Z$BIB)   # RBIB(25, 30, 6, 5, 1): AG(2, 5)
Uniform(W$RBIB)$UD          # U(25, 5^6)
```

## References
