%% if you are submitting an initial manuscript then you should have submission as an option here
%% if you are submitting a revised manuscript then you should have revision as an option here
%% otherwise options taken by the article class will be accepted
\documentclass[submission]{FPSAC2019}
%% but DO NOT pass any options (or change anything else anywhere) which alters page size / layout / font size etc

\articlenumber{105}
\addbibresource{105.bib}

%% note that the class file already loads {amsmath, amsthm, amssymb}

\usepackage[utf8]{inputenc}

% \DeclareUnicodeCharacter{4F3}{}

\newtheorem{thm}{Theorem}
\newtheorem{lem}{Lemma}

\usepackage{enumerate}
\usepackage{listings}
\usepackage{tikz,pgflibraryshapes}

\definecolor{deepblue}{rgb}{0,0,0.5}
\definecolor{deepred}{rgb}{0.6,0,0}
\definecolor{deepgreen}{rgb}{0,0.5,0}
\definecolor{violet}{rgb}{0.5,0,0.5}

% Default fixed font does not support bold face
\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{11} % for bold
\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{11}  % for normal
\DeclareFixedFont{\ttc}{T1}{txtt}{m}{n}{10}  % for comments

% Prettier comments, see
% https://tex.stackexchange.com/questions/184833/condensed-comment-font-in-listings
\newcommand*{\mycommentstyle}[1]{%
  \begingroup
    \ttc
    \lstset{columns=fullflexible}%
    \color{deepgreen}%
    #1%
  \endgroup
}

% Python style for highlighting
\newcommand{\pythonstyle}{\lstset{
language=Python,
basicstyle=\small\ttm,
commentstyle=\mycommentstyle,
otherkeywords={self},             % Add keywords here
keywordstyle=\ttb\color{deepblue},
emph={sage,__init__,True,False,None,InfeasibleError},  % Custom highlighting
emphstyle=\ttb\color{deepred},    % Custom highlighting style
stringstyle=\color{violet},
frame=tb,                         % Any extra options here
showstringspaces=false,
literate={č}{{\v c}}1 {ć}{{\' c}}1 {š}{{\v s}}1 {ž}{{\v z}}1
}}

\lstnewenvironment{python}[1][]
{
\pythonstyle
\lstset{#1}
}
{}

% Python for external files
\newcommand\pythonexternal[2][]{{
\pythonstyle
\lstinputlisting[#1]{#2}}}

% Python for inline
\newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}}

\newcommand{\noop}[1]{}
\newcommand{\M}{\ensuremath{\mathcal{M}}}
\newcommand{\R}{\ensuremath{\mathbb{R}}}

%% define your title in the usual way
\title[sage-drg]{Computing distance-regular graph
and association scheme parameters in SageMath with {\tt sage-drg}}

%% define your authors in the usual way
%% use \addressmark{1}, \addressmark{2} etc for the institutions, and use \thanks{} for contact details
\author{Jano\v{s} Vidali%
\thanks{\href{janos.vidali@fmf.uni-lj.si}{janos.vidali@fmf.uni-lj.si}.}%
}

%% then use \addressmark to match authors to institutions here
\address{Faculty of Mathematics and Physics, University of Ljubljana, Slovenia \\
Institute of Mathematics, Physics and Mechanics, Ljubljana, Slovenia}

%% put the date of submission here
\received{April 27, 2019}

%% leave this blank until submitting a revised version
%\revised{}

%% put your English abstract here, or comment this out if you don't have one yet
%% please don't use custom commands in your abstract / resume, as these will be displayed online
%% likewise for citations -- please don't use \cite, and instead write out your citation as something like (author year)
\abstract{The {\tt sage-drg} package for the SageMath computer algebra system
has been originally developed for computation of parameters
of distance-regular graphs.
Recently,
its functionality has been extended to handle general association schemes.
The package has been used to obtain nonexistence results
for both distance-regular graphs and $Q$-polynomial association schemes,
mostly using the triple intersection numbers technique.
}

%% put your French abstract here, or comment this out if you don't have one
\resumetitle{Povzetek}
\resume{Paket {\tt sage-drg} za program za simbolno ra\v{c}unanje SageMath
je bil prvotno razvit
za namene ra\v{c}unanja parametrov razdaljno regularnih grafov.
Njegova funkcionalnost je bila nedavno raz\v{s}irjena
s podporo za splo\v{s}ne asociativne sheme.
Paket je bil uporabljen pri dokazovanju neobstoja
tako razdaljno regularnih grafov kot tudi $Q$-polinomskih asociativnih shem,
ve\v{c}inoma z uporabo tehnike ra\v{c}unanja trojnih prese\v{c}nih \v{s}tevil.
}

%% put your keywords here, or comment this out if you don't have them yet
\keywords{association schemes, distance-regular graphs, Krein parameters,
triple intersection numbers, symbolic computation}

%% you can include your bibliography however you want, but using an external .bib file is STRONGLY RECOMMENDED and will make the editor's life much easier
%% regardless of how you do it, please use numerical citations, ie. [xx, yy] in the text

%% this sample uses biblatex, which (among other things) takes care of URLs in a more flexible way than bibtex
%% but you can use bibtex if you want
%\usepackage[backend=bibtex]{biblatex}
%\addbibresource{sage-drg.bib}
%% note the \printbibliography command at the end of the file which goes with these biblatex commands

\makeatletter
\def\blx@maxline{77}
\makeatother

\begin{document}

\maketitle
%% note that you DO NOT have to put your abstract here -- it is generated by \maketitle and the \abstract and \resume commands above

\section{Introduction}

Let $X$ be a finite set of vertices
and $\{R_0, R_1, \dots, R_D\}$ be a set of non-empty subsets of $X \times X$
(i.e., binary relations on $X$).
Let $A_i$ denote the adjacency matrix of the graph $(X, R_i)$
($0 \le i \le D$).
The pair $(X,\{R_i\}_{i=0}^D)$ is called
a {\em (symmetric) association scheme} with $D$ classes
if the following conditions hold:
\begin{enumerate}[(1)]
\item $A_0 = I_{|X|}$, which is the identity matrix of size $|X|$,
\item $\sum_{i=0}^D A_i = J_{|X|}$,
which is the square all-one matrix of size $|X|$,
\item $A_i^\top = A_i$ ($1 \le i \le D$),
\item $A_i A_j = \sum_{k=0}^D p_{ij}^k A_k$,
where $p_{ij}^k$ (the {\em intersection numbers})
are nonnegative integers ($0 \le i,j \le D$).
\label{prop:intnum}
\end{enumerate}

\begin{figure}
\centering
\begin{tikzpicture}[thick, scale=1]
\tikzstyle{vertex}=[draw, circle, fill=white, inner sep=0pt, minimum size=3mm]
\draw (0, -0.5) -- (0, 3.5);
\draw (1, -0.5) -- (1, 3.5);
\draw (2, -0.5) -- (2, 3.5);
\draw (3, -0.5) -- (3, 3.5);
\draw (-0.5, 0) -- (3.5, 0);
\draw (-0.5, 1) -- (3.5, 1);
\draw (-0.5, 2) -- (3.5, 2);
\draw (-0.5, 3) -- (3.5, 3);

\node (u00) at (0, 0) [vertex,fill=black] {};
\node (u01) at (0, 1) [vertex,fill=red] {};
\node (u02) at (0, 2) [vertex,fill=blue] {};
\node (u03) at (0, 3) [vertex,fill=green] {};
\node (u10) at (1, 0) [vertex,fill=red] {};
\node (u11) at (1, 1) [vertex,fill=black] {};
\node (u12) at (1, 2) [vertex,fill=green] {};
\node (u13) at (1, 3) [vertex,fill=blue] {};
\node (u20) at (2, 0) [vertex,fill=blue] {};
\node (u21) at (2, 1) [vertex,fill=green] {};
\node (u22) at (2, 2) [vertex,fill=black] {};
\node (u23) at (2, 3) [vertex,fill=red] {};
\node (u30) at (3, 0) [vertex,fill=green] {};
\node (u31) at (3, 1) [vertex,fill=blue] {};
\node (u32) at (3, 2) [vertex,fill=red] {};
\node (u33) at (3, 3) [vertex,fill=black] {};

\draw (4.5, 0.2) -- (8.5, 0.2);
\draw (5, 1.07) -- (9, 1.07);
\draw (5.5, 1.93) -- (9.5, 1.93);
\draw (6, 2.8) -- (10, 2.8);
\draw (4.75, -0.23) -- (6.75, 3.23);
\draw (5.75, -0.23) -- (7.75, 3.23);
\draw (6.75, -0.23) -- (8.75, 3.23);
\draw (7.75, -0.23) -- (9.75, 3.23);
\draw (5.25, -0.23) -- (4.75, 0.63);
\draw (6.25, -0.23) -- (5.25, 1.5);
\draw (7.25, -0.23) -- (5.75, 2.37);
\draw (8.25, -0.23) -- (6.25, 3.23);
\draw (8.75,  0.63) -- (7.25, 3.23);
\draw (9.25,  1.5)  -- (8.25, 3.23);
\draw (9.75,  2.37) -- (9.25, 3.23);

\node (v00) at (5, 0.2) [vertex,fill=black] {};
\node (v01) at (5.5, 1.07) [vertex,fill=red] {};
\node (v02) at (6, 1.93) [vertex,fill=black] {};
\node (v03) at (6.5, 2.8) [vertex,fill=red] {};
\node (v10) at (6, 0.2) [vertex,fill=green] {};
\node (v11) at (6.5, 1.07) [vertex,fill=blue] {};
\node (v12) at (7, 1.93) [vertex,fill=green] {};
\node (v13) at (7.5, 2.8) [vertex,fill=blue] {};
\node (v20) at (7, 0.2) [vertex,fill=black] {};
\node (v21) at (7.5, 1.07) [vertex,fill=red] {};
\node (v22) at (8, 1.93) [vertex,fill=black] {};
\node (v23) at (8.5, 2.8) [vertex,fill=red] {};
\node (v30) at (8, 0.2) [vertex,fill=green] {};
\node (v31) at (8.5, 1.07) [vertex,fill=blue] {};
\node (v32) at (9, 1.93) [vertex,fill=green] {};
\node (v33) at (9.5, 2.8) [vertex,fill=blue] {};
\end{tikzpicture}

\bigskip
\begin{tikzpicture}[thick, scale=1]
\tikzstyle{vertex}=[draw, circle, fill=white, inner sep=0pt, minimum size=3mm]
\draw (0, -0.5) -- (0, 3.5);
\draw (1, -0.5) -- (1, 3.5);
\draw (2, -0.5) -- (2, 3.5);
\draw (3, -0.5) -- (3, 3.5);
\draw (-0.5, 0) -- (3.5, 0);
\draw (-0.5, 1) -- (3.5, 1);
\draw (-0.5, 2) -- (3.5, 2);
\draw (-0.5, 3) -- (3.5, 3);

\node (u00) at (0, 0) [vertex,fill=black] {};
\node (u01) at (0, 1) [vertex,fill=red] {};
\node (u02) at (0, 2) [vertex,fill=green] {};
\node (u03) at (0, 3) [vertex,fill=blue] {};
\node (u10) at (1, 0) [vertex,fill=blue] {};
\node (u11) at (1, 1) [vertex,fill=black] {};
\node (u12) at (1, 2) [vertex,fill=red] {};
\node (u13) at (1, 3) [vertex,fill=green] {};
\node (u20) at (2, 0) [vertex,fill=green] {};
\node (u21) at (2, 1) [vertex,fill=blue] {};
\node (u22) at (2, 2) [vertex,fill=black] {};
\node (u23) at (2, 3) [vertex,fill=red] {};
\node (u30) at (3, 0) [vertex,fill=red] {};
\node (u31) at (3, 1) [vertex,fill=green] {};
\node (u32) at (3, 2) [vertex,fill=blue] {};
\node (u33) at (3, 3) [vertex,fill=black] {};

\draw (4.5, 0.2) -- (8.5, 0.2);
\draw (5, 1.07) -- (9, 1.07);
\draw (5.5, 1.93) -- (9.5, 1.93);
\draw (6, 2.8) -- (10, 2.8);
\draw (4.75, -0.23) -- (6.75, 3.23);
\draw (5.75, -0.23) -- (7.75, 3.23);
\draw (6.75, -0.23) -- (8.75, 3.23);
\draw (7.75, -0.23) -- (9.75, 3.23);
\draw (5.25, -0.23) -- (4.75, 0.63);
\draw (6.25, -0.23) -- (5.25, 1.5);
\draw (7.25, -0.23) -- (5.75, 2.37);
\draw (8.25, -0.23) -- (6.25, 3.23);
\draw (8.75,  0.63) -- (7.25, 3.23);
\draw (9.25,  1.5)  -- (8.25, 3.23);
\draw (9.75,  2.37) -- (9.25, 3.23);

\node (v00) at (5, 0.2) [vertex,fill=black] {};
\node (v01) at (5.5, 1.07) [vertex,fill=red] {};
\node (v02) at (6, 1.93) [vertex,fill=blue] {};
\node (v03) at (6.5, 2.8) [vertex,fill=red] {};
\node (v10) at (6, 0.2) [vertex,fill=green] {};
\node (v11) at (6.5, 1.07) [vertex,fill=black] {};
\node (v12) at (7, 1.93) [vertex,fill=green] {};
\node (v13) at (7.5, 2.8) [vertex,fill=blue] {};
\node (v20) at (7, 0.2) [vertex,fill=blue] {};
\node (v21) at (7.5, 1.07) [vertex,fill=red] {};
\node (v22) at (8, 1.93) [vertex,fill=black] {};
\node (v23) at (8.5, 2.8) [vertex,fill=red] {};
\node (v30) at (8, 0.2) [vertex,fill=green] {};
\node (v31) at (8.5, 1.07) [vertex,fill=blue] {};
\node (v32) at (9, 1.93) [vertex,fill=green] {};
\node (v33) at (9.5, 2.8) [vertex,fill=black] {};

\end{tikzpicture}
\caption{Examples of association schemes with $3$ classes
with the same parameters.}
\label{fig:ex}
\end{figure}

Let us now consider the examples given in \cref{fig:ex}.
For each of them, we define relations on their vertices.
If $u$ and $v$ are vertices of the association scheme,
we have $(u, v) \in R_0$ whenever $u = v$,
$(u, v) \in R_1$ when there is an edge between $u$ and $v$,
$(u, v) \in R_2$ when $u$ and $v$ have the same color,
and $(u, v) \in R_3$ if none of these apply.
Note that in the two examples on the left, the lines represent cliques,
so $(u, v) \in R_1$ holds whenever $u$ and $v$ are in the same row or column
(but not both),
while the two examples on the right are embedded on a torus
(i.e., we identify parallel boundaries)
and show actual edges between the vertices.
We can easily verify that these examples satisfy the above conditions
and thus represent association schemes with $3$ classes.
In fact, they all share the same intersection numbers.
\begin{align*}
(p^0_{ij})_{i,j=0}^3 &=
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 6 & 0 & 0 \\
0 & 0 & 3 & 0 \\
0 & 0 & 0 & 6
\end{pmatrix} &
(p^1_{ij})_{i,j=0}^3 &=
\begin{pmatrix}
0 & 1 & 0 & 0 \\
1 & 2 & 1 & 2 \\
0 & 1 & 0 & 2 \\
0 & 2 & 2 & 2
\end{pmatrix} \\
(p^2_{ij})_{i,j=0}^3 &=
\begin{pmatrix}
0 & 0 & 1 & 0 \\
0 & 2 & 0 & 4 \\
1 & 0 & 2 & 0 \\
0 & 4 & 0 & 2
\end{pmatrix} &
(p^3_{ij})_{i,j=0}^3 &=
\begin{pmatrix}
0 & 0 & 0 & 1 \\
0 & 2 & 2 & 2 \\
0 & 2 & 0 & 1 \\
1 & 2 & 1 & 2
\end{pmatrix}
\end{align*}
Nonetheless,
the four association schemes can be checked to be mutually non-iso\-mor\-phic.

Let us now return to general association schemes.
The vector space $\M$ over $\R$
spanned by the matrices $A_i$ ($0 \le i \le D$)
forms an algebra (called the {\em Bose-Mesner algebra}),
which has a second basis $\{E_0, E_1, \dots, E_D\}$
consisting of projectors to the common eigenspaces
of the matrices $A_i$ ($0 \le i \le D$).
These projectors follow a property dual to~(\ref{prop:intnum}) above:
$$
E_i \circ E_j = \frac{1}{|X|} \sum_{k=0}^D q_{ij}^k E_k
\quad (0 \le i,j \le D).
$$
Here, $\circ$ represents entrywise matrix multiplication.
The constants $q_{ij}^k$ are called the {\em Krein parameters}.
The Krein parameters thus have a role dual to the intersection numbers,
although, unlike the latter, they are not required to be integral
-- however, by the {\em Krein condition}, they must always be nonnegative.
The Krein parameters of an association scheme
can be computed from its intersection numbers and vice-versa.
In fact, we may do so for the association schemes from \cref{fig:ex}
using {\tt sage-drg}\footnote{
The outputs have been condensed for brevity.
}.

\smallskip
\begin{python}
sage: import drg
sage: p = [[[1, 0, 0, 0], [0, 6, 0, 0], [0, 0, 3, 0], [0, 0, 0, 6]],
....:      [[0, 1, 0, 0], [1, 2, 1, 2], [0, 1, 0, 2], [0, 2, 2, 2]],
....:      [[0, 0, 1, 0], [0, 2, 0, 4], [1, 0, 2, 0], [0, 4, 0, 2]],
....:      [[0, 0, 0, 1], [0, 2, 2, 2], [0, 2, 0, 1], [1, 2, 1, 2]]]
sage: scheme = drg.ASParameters(p)
sage: scheme.kreinParameters()
0: [1 0 0 0]    1: [0 1 0 0]    2: [0 0 1 0]    3: [0 0 0 1]
   [0 6 0 0]       [1 2 1 2]       [0 2 0 4]       [0 2 2 2]
   [0 0 3 0]       [0 1 0 2]       [1 0 2 0]       [0 2 0 1]
   [0 0 0 6]       [0 2 2 2]       [0 4 0 2]       [1 2 1 2]
\end{python}
We notice that the Krein parameters match the intersection numbers,
showing that our schemes are {\em formally self-dual}.

A standard problem in the theory of association scheme
is that of existence and classification:
given a parameter set, does such an association scheme exist?
If so, is it unique?
Can all examples be constructed?
A parameter set is said to be {\em feasible}
if no condition is known that would rule out its existence.
For more about association schemes, see Bannai \& Ito~\cite{BI}.

A special class of association schemes
is that of {\em $P$-polynomial} (or {\em metric}) association schemes.
An association scheme is said to be $P$-polynomial whenever $A_i = v_i(A_1)$,
where $v_i$ is a polynomial of degree $i$ ($0 \le i \le D$),
for some ordering of its relations.
Equivalently, the relation $R_i$ corresponds to
being at distance $i$ in the graph $(X, R_1)$.
These graphs are precisely the {\em distance-regular graphs},
which have been extensively studied,
and for which many tables of feasible parameters have been compiled~%
\cite{Bdrg,Bsrg,BCN,DKT}.
All the parameters of a $P$-polynomial association scheme
can be computed from a subset of its intersection numbers,
namely $b_i = p^i_{1,i+1}$ ($0 \le i \le D-1$)
and $c_i = p^i_{1,i-1}$ ($1 \le i \le D$).
These are usually written as the {\em intersection array}
$\{b_0, b_1, \dots, b_{D-1}; c_1, c_2, \dots, c_D\}$.

Dually, we may define a class of {\em $Q$-polynomial}
(or {\em cometric}) association schemes
as those for which $E_i = v^*_i(E_1)$,
where $v^*_i$ is a polynomial (for entrywise multiplication)
of degree $i$ ($0 \le i \le D$),
for some ordering of its eigenspaces.
Similarly as for $P$-polynomial schemes,
the parameters of a $Q$-polynomial association scheme
can be computed from a subset of its Krein parameters,
namely $b^*_i = q^i_{1,i+1}$ ($0 \le i \le D-1$)
and $c^*_i = q^i_{1,i-1}$ ($1 \le i \le D$).
These are usually written as the {\em Krein array}
$\{b^*_0, b^*_1, \dots, b^*_{D-1}; c^*_1, c^*_2, \dots, c^*_D\}$.
Unlike for the $P$-polynomial association schemes,
no general combinatorial characterization is known for $Q$-polynomial schemes.
Although it was already Delsarte~\cite{D}
who noticed that many $Q$-polynomial association schemes
are related to combinatorial designs,
they have only received considerable attention in the past few years~%
\cite{DMM,K,MMW,MT,MW,PW}.
Williford~\cite{WQpoly} has also published a list of feasible parameters
for certain types of $Q$-polynomial association schemes with few classes.

\section{The {\tt sage-drg} package}

As the name suggests,
the {\tt sage-drg} package~\cite{Vdrg} has been developed by the author
to support his research in distance-regular graphs.
Recently, the functionality of the package has been extended
to support general association schemes.
It is written as an extension
for the SageMath computer algebra system~\cite{Sage},
which is free open-source software
written in the Python programming language~\cite{Python},
with many functionalities deriving from other free open-source software,
such as Maxima~\cite{Maxima}, which is used for symbolic computation,
or the GLPK~\cite{GLPK} and CBC~\cite{CBC} linear programming solvers.
The {\tt sage-drg} package is thus also free open-source software
available under the MIT license,
written in the Python programming language,
making use of the SageMath library.

Once the package is installed and loaded into SageMath,
the \pythoninline{DRGParameters} class
can be used to represent parameter sets of distance-regular graphs.
To instantiate such an object,
an intersection array can be passed to its constructor
in the form of two lists or tuples of the same length.

\smallskip
\begin{python}
sage: from drg import DRGParameters
sage: syl = DRGParameters([5, 4, 2], [1, 1, 4])
sage: syl
Parameters of a distance-regular graph with intersection array
{5, 4, 2; 1, 1, 4}
\end{python}

For parameter sets of $Q$-polynomial association schemes,
the \pythoninline{QPolyParameters} class can be used
to instantiate objects from Krein arrays.

\smallskip
\begin{python}
sage: from drg import QPolyParameters
sage: m11 = QPolyParameters([10, 242/27, 11/5], [1, 55/27, 44/5])
sage: m11
Parameters of a Q-polynomial association scheme with Krein array
{10, 242/27, 11/5; 1, 55/27, 44/5}
\end{python}

Given these arrays, the remaining parameters can be computed.

\smallskip
\begin{python}
sage: syl.pTable()
0: [ 1  0  0  0]    1: [0 1 0 0]
   [ 0  5  0  0]       [1 0 4 0]
   [ 0  0 20  0]       [0 4 8 8]
   [ 0  0  0 10]       [0 0 8 2]

2: [ 0  0  1  0]    3: [ 0  0  0  1]
   [ 0  1  2  2]       [ 0  0  4  1]
   [ 1  2 11  6]       [ 0  4 12  4]
   [ 0  2  6  2]       [ 1  1  4  4]

sage: syl.kreinParameters()
0: [ 1  0  0  0]                    1: [   0    1    0    0]
   [ 0 16  0  0]                       [   1 44/5 22/5  9/5]
   [ 0  0 10  0]                       [   0 22/5    2 18/5]
   [ 0  0  0  9]                       [   0  9/5 18/5 18/5]

2: [     0      0      1      0]    3: [   0    0    0    1]
   [     0 176/25   16/5 144/25]       [   0 16/5 32/5 32/5]
   [     1   16/5      4    9/5]       [   0 32/5    2  8/5]
   [     0 144/25    9/5  36/25]       [   1 32/5  8/5    0]
\end{python}

The package also supports variables in the parameters.

\smallskip
\begin{python}
sage: r = var("r")
sage: f = DRGParameters([2*r^2*(2*r+1), (2*r-1)*(2*r^2+r+1), 2*r^2],
                        [1, 2*r^2, r*(4*r^2-1)])
sage: f1 = f.subs(r == 1)
sage: f1
Parameters of a distance-regular graph with intersection array
{6, 4, 2; 1, 2, 3}
sage: f2 = f.subs(r == 2)
sage: f2
Parameters of a distance-regular graph with intersection array
{40, 33, 8; 1, 8, 30}
\end{python}

The parameter sets can be checked for feasibility.
Note that many more feasibility conditions
are known for $P$-polynomial schemes
than for general or $Q$-polynomial schemes.

\smallskip
\begin{python}
sage: f1.check_feasible() # no error, parameter set is feasible
sage: f2.check_feasible()
...
InfeasibleError: nonexistence by JurišićVidali12
\end{python}

A more detailed description of the usage of the package
is given in~\cite{Vsupp}.

\section{Nonexistence results}

The package can also be used to compute {\em triple intersection numbers}
of an association scheme,
i.e., counts of vertices in given relations to a chosen triple of vertices.
Unlike the intersection numbers,
which are constants with regard to the choice
of two vertices in a given relation and the relations to each of them,
triple intersection numbers may depend on the particular choice of the triple
and not only the relations between them.
Still, in some cases,
equations can be obtained from the Krein condition~\cite{CJ}
which limit the possible values of triple intersection numbers,
sometimes down to a manageable number of solutions.

In the paper introducing the package~\cite{V},
the author has used it to compute triple intersection numbers
for a family of feasible intersection arrays of distance-regular graphs
and three more sporadic cases,
each time obtaining a contradiction,
thus concluding the nonexistence of the corresponding graphs.
In a subsequent collaboration with Gavrilyuk and Suda~\cite{GSV},
the same technique has been used to show nonexistence
for a family of feasible Krein arrays of $Q$-polynomial association schemes
derived from a class of putative tight $4$-designs,
thus also showing their nonexistence
and closing a long-standing problem in design theory.

Gavrilyuk and the author have also used the package to show nonexistence
of many feasible examples of $Q$-polynomial association schemes
appearing in the tables by Williford~\cite{WQpoly}
(paper still in preparation).
Although it was enough, in most cases,
to observe that there are no solutions for triple intersection numbers
corresponding to a particular triple of vertices,
a few cases required further checks
which showed that the obtained solutions were inconsistent,
and thus corresponding association schemes cannot exist.
Integer linear programming facilities provided by SageMath
have been employed to efficiently generate the needed solutions
to either derive a contradiction
or arrive to a set of solutions which are consistent with each other.

To obtain the above results,
the newly added features of {\tt sage-drg} have been used extensively.
More than $2000$ lines of code (nearly half of the existing codebase)
have been written or rewritten to support general association schemes
(and, in particular, $Q$-polynomial association schemes)
and to implement a generator of integral solutions
of systems of linear inequalities,
which was used to search for contradictions as described above.
Altogether,
the results imply nonexistence
for $133$ sets of parameters of association schemes
listed in tables of feasible parameters,
and four infinite families of parameter sets.

\acknowledgements{
Jano\v{s} Vidali was partially supported by the Slovenian Research Agency
(research program P1-0285 and project J1-8130).}

%% if you use biblatex then this generates the bibliography
%% if you use some other method then remove this and do it your own way
\printbibliography



\end{document}
