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('indices: %s' % 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.