Analyse isomorphisms of a set of orthogonal arrays with N=56
In this example, we show how to identify isomorphic arrays from a list of two-level strength-2 orthogonal arrays with 56 runs and 28 factors.
[1]:
import numpy as np
import oapackage
import oapackage.graphtools
from oapackage.graphtools import selectIsomorphismClasses
Read the arrays from a file and determine their class.
[2]:
sols = oapackage.readarrayfile("OAN56K28.oa")
arrayclass = oapackage.arraylink2arraydata(sols[0])
print(arrayclass)
print("loaded %d arrays" % len(sols))
arrayclass: N 56, k 28, strength 2, s {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, order 0
loaded 9 arrays
Determine the unique isomorphism classes using Nauty.
[3]:
b, mm = selectIsomorphismClasses(sols, verbose=0)
print("from %d arrays selected %d unique isomorphism classes" % (len(mm), np.unique(b).size))
print(f"indices: {str(b)}")
from 9 arrays selected 6 unique isomorphism classes
indices: [0 4 5 3 1 5 3 2 4]
Verify that the first two arrays are indeed non-isomorphic:
[4]:
jj = np.abs(sols[0].Jcharacteristics(4))
n0, _ = np.histogram(jj, [0, 8, 16, 24])
print(n0)
jj = np.abs(sols[1].Jcharacteristics(4))
n1, _ = np.histogram(jj, [0, 8, 16, 24])
print(n1)
[ 0 18018 2457]
[ 0 18032 2436]
Since the first two arrays have different \(J\)-characteristics (see the section Statistical properties of orthogonal arrays for details), they are non-isomorphic. For the isomorphic arrays, it is possible to obtain the array transformation to make the arrays identical using the function reduceConferenceTransformation.