The construction is by He, Cheng and Tang (2018), Prop.1 (C2) / Theorem 2
for s=2 and Theorem 4 for s>2.
B is chosen as an OA of strength 2, if possible, which yields orthogonal
columns according to Zhou and Tang (2019). This is implemented using a matching
algorithm for bipartite graphs from package igraph; the smaller m, the
more likely that orthogonality can be achieved. However, strength 2+ SOAs are
not usually advisable for m small enough that a strength 3 OA exists.
Optimization according to Weng has been added (separate level permutations
in columns of A and B, noptim.rounds
times). Limited tests suggest
that a single round (noptim.rounds=1
) often does a very good job
(e.g. for s=2 and k=4), and
further rounds do not yield too much improvement; there are also cases
(e.g. s=5 with k=3), for which the unoptimized array has a better phi_p than
what can be achieved by most optimization attempts from a random start.
The search for orthogonal columns can take a long time for larger arrays,
even without optimization. If this is prohibitive (or not considered valuable),
orth=FALSE
causes the function to create the matrix B for equation D=2A+B
with less computational effort.
The subsequent optimization, if not switched off,
is of the same complexity, regardless of the value for orth
. Its
duration heavily depends on the number of optimization steps that are needed
before the algorithm stops. This has not been systematically investigated;
cases for which the total run time with optimization
is shorter for orth=TRUE
than for orth=FALSE
have been observed.
With package version 1.2, the creation of SOAs has changed: Up to version 1.1,
the columns of B were chosen only from those columns that were not eligible for A,
whereas the new version chooses them from those columns that are not used for A.
This increases the chance to achieve geometrically orthogonal columns.
Users who want to reproduce a design from an earlier version
can use argument old
.