This document is one of More SageMath Tutorials. You may edit it on github. \(\def\NN{\mathbb{N}}\) \(\def\ZZ{\mathbb{Z}}\) \(\def\QQ{\mathbb{Q}}\) \(\def\RR{\mathbb{R}}\) \(\def\CC{\mathbb{C}}\)

Demonstration: A real life example, parallel testing of a conjecture on J-Trivial monoids using MuPAD (experimental)ΒΆ

Requirements

This demonstration requires experimental code that has not yet been migrated from the Sage-Combinat queue to the sage-semigroups package, as well as MuPAD and MuPAD-Combinat.

sage: from sage.combinat.j_trivial_monoids import *
sage: def pij(j): return lambda i: i if i != j+1 else j
sage: pi2 = pij(2)
sage: pi2(1), pi2(2), pi2(3), pi2(4)
(1, 2, 2, 4)
sage: class NDPFMonoid(AutomaticMonoid):
....:    def __init__(self, n):
....:      ambient_monoid = DiscreteFunctions(range(1,n+1), action="right")
....:      pi = Family(range(1, n), lambda j: ambient_monoid(pij(j)))
....:      AutomaticMonoid.__init__(self, pi, one = ambient_monoid.one(),
....:                               category = (SubFiniteMonoidsOfFunctions(),
....:                                           JTrivialMonoids().Finite()))
sage: Mon = NDPFMonoid(3)
sage: Mon.cardinality()
5
sage: Mon.list()
[[], [1], [2], [1, 2], [2, 1]]
sage: [ NDPFMonoid(n).cardinality() for n in range(6)]
[1, 1, 2, 5, 14, 42]
sage: MuMon = mupad(Mon); MuMon
              / +-               -+ \
              | |  0, 1, 2, 3, 4  | |
              | |                 | |
              | |  1, 1, 4, 4, 4  | |
              | |                 | |
  Dom::MMonoid| |  2, 3, 2, 3, 4  | |
              | |                 | |
              | |  3, 3, 4, 4, 4  | |
              | |                 | |
              | |  4, 4, 4, 4, 4  | |
              \ +-               -+ /

sage: MuMon.count()
   5

sage: MuAlg = mupad.Dom.MonoidAlgebra(MuMon); MuAlg

sage: MuCMat = MuAlg.cartanInvariantsMatrix(); MuCMat
  +-            -+
  |  1, 0, 0, 0  |
  |              |
  |  0, 1, 1, 0  |
  |              |
  |  0, 0, 1, 0  |
  |              |
  |  0, 0, 0, 1  |
  +-            -+

sage: MuCMat.sage()
[1 0 0 0]
[0 1 1 0]
[0 0 1 0]
[0 0 0 1]
sage: M4 = NDPFMonoid(4)
sage: var('q')
q
sage: cartconj = M4.cartan_matrix(q); cartconj
[  1   0   0   0   0   0   0   0]
[  0   1   q q^2   0   0   0   0]
[  0   0   1   q   0   0   0   0]
[  0   0   0   1   0   0   0   0]
[  0   0   0   0   1   0   q   0]
[  0   0   0   0   q   1 q^2   0]
[  0   0   0   0   0   0   1   0]
[  0   0   0   0   0   0   0   1]

sage: cart = M4.cartan_matrix_mupad(q); cart
[  1   0   0   0   0   0   0   0]
[  0   1   0   0   q   0   0   0]
[  0   q   1   0 q^2   0   0   0]
[  0   0   0   1   0 q^2   q   0]
[  0   0   0   0   1   0   0   0]
[  0   0   0   0   0   1   0   0]
[  0   0   0   0   0   q   1   0]
[  0   0   0   0   0   0   0   1]

sage: def is_isomorphic_matrices(m1, m2):
....:  coeffs1 = set([ c for row in m1 for c in row ])
....:  coeffs2 = set([ c for row in m2 for c in row ])
....:  if coeffs1 != coeffs2:
....:      return False
....:  f = sage.combinat.ranker.rank_from_list(sorted(coeffs1))
....:  def graph(m):
....:      m = matrix([[f(m[i,j]) for j in range(m.ncols()) ] for i in range(m.nrows())])
....:      return DiGraph(m, multiple_edges = True)
....:  return graph(m1).is_isomorphic(graph(m2))

sage: is_isomorphic_matrices(cart, cartconj)
True

sage: P4 = Posets(4); P4
Posets containing 4 vertices

sage: P4.cardinality()
16

sage: Pos = P4[9]; Pos.cover_relations()
[[0, 2], [1, 2], [2, 3]]

sage: #Pos.plot()

sage: MP = NDPFMonoidPoset(Pos); MP
NDPF monoid of Poset ([[0, 2], [1, 2], [2, 3]])
sage: is_isomorphic_matrices(MP.cartan_matrix(q), MP.cartan_matrix_mupad(q))
True

sage: @parallel()
....: def check_conj_parallel(Pos):
....:     MP = NDPFMonoidPoset(Pos)
....:     return is_isomorphic_matrices(MP.cartan_matrix(q),
....:                                   MP.cartan_matrix_mupad(q))

sage: for (((poset,), _), res) in check_conj_parallel(Posets(3).list()): print poset.cover_relations(), res

sage: all(x[1] for x in check_conj_parallel(Posets(4).list()))
True