'set the commutation parameter ``c`` for commutation groups ``i, j``
Parameters
i, j : symbols representing commutation groups
c  :  group commutation number
Notes
``i, j`` can be symbols, strings or numbers,
apart from ``0, 1`` and ``2`` which are reserved respectively
for commuting, anticommuting tensors and tensors not commuting
with any other group apart with the commuting tensors.
For the remaining cases, use this method to set the commutation rules;
by default ``c=None``.
The group commutation number ``c`` is assigned in correspondence
to the group commutation symbols; it can be
0        commuting
1        anticommuting
None     no commutation property
Examples
``G`` and ``GH`` do not commute with themselves and commute with
each other; A is commuting.
>>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensorhead, TensorManager
>>> Lorentz = TensorIndexType(\'Lorentz\')
>>> i0,i1,i2,i3,i4 = tensor_indices(\'i0:5\', Lorentz)
>>> A = tensorhead(\'A\', [Lorentz], [[1]])
>>> G = tensorhead(\'G\', [Lorentz], [[1]], \'Gcomm\')
>>> GH = tensorhead(\'GH\', [Lorentz], [[1]], \'GHcomm\')
>>> TensorManager.set_comm(\'Gcomm\', \'GHcomm\', 0)
>>> (GH(i1)*G(i0)).canon_bp()
G(i0)*GH(i1)
>>> (G(i1)*G(i0)).canon_bp()
G(i1)*G(i0)
>>> (G(i1)*A(i0)).canon_bp()
A(i0)*G(i1)'

def set_comm(self, i, j, c):

    if (c not in (0, 1, None)):
        raise ValueError('`c`    can    assume    only    the    values    0,    1    or    None')
    if (i not in self._comm_symbols2i):
        n = len(self._comm)
        self._comm.append({})
        self._comm[n][0] = 0
        self._comm[0][n] = 0
        self._comm_symbols2i[i] = n
        self._comm_i2symbol[n] = i
    if (j not in self._comm_symbols2i):
        n = len(self._comm)
        self._comm.append({})
        self._comm[0][n] = 0
        self._comm[n][0] = 0
        self._comm_symbols2i[j] = n
        self._comm_i2symbol[n] = j
    ni = self._comm_symbols2i[i]
    nj = self._comm_symbols2i[j]
    self._comm[ni][nj] = c
    self._comm[nj][ni] = c
