# 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')
print(arrayclass)

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


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.