{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import sympy\n",
    "import qsymm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}1.0 \\alpha k_{z} + \\frac{0.5 \\hbar^{2} k_{x}^{2}}{m} + \\frac{0.5 \\hbar^{2} k_{y}^{2}}{m} + \\frac{0.5 \\hbar^{2} k_{z}^{2}}{m} & 1.0 \\alpha k_{x} - 1.0 i \\alpha k_{y}\\\\1.0 \\alpha k_{x} + 1.0 i \\alpha k_{y} & - 1.0 \\alpha k_{z} + \\frac{0.5 \\hbar^{2} k_{x}^{2}}{m} + \\frac{0.5 \\hbar^{2} k_{y}^{2}}{m} + \\frac{0.5 \\hbar^{2} k_{z}^{2}}{m}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[1.0*alpha*k_z + 0.5*hbar**2*k_x**2/m + 0.5*hbar**2*k_y**2/m + 0.5*hbar**2*k_z**2/m,                                                     1.0*alpha*k_x - 1.0*I*alpha*k_y],\n",
       "[                                                   1.0*alpha*k_x + 1.0*I*alpha*k_y, -1.0*alpha*k_z + 0.5*hbar**2*k_x**2/m + 0.5*hbar**2*k_y**2/m + 0.5*hbar**2*k_z**2/m]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ham = (\"hbar^2 / (2 * m) * (k_x**2 + k_y**2 + k_z**2) * eye(2) +\" +\n",
    "        \"alpha * sigma_x * k_x + alpha * sigma_y * k_y + alpha * sigma_z * k_z\")\n",
    "# Convert to standard monomials form\n",
    "H = qsymm.Model(ham)\n",
    "H.tosympy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "cubic_group = qsymm.groups.cubic()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "sg, cg = qsymm.symmetries(H, cubic_group)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "48 0\n"
     ]
    }
   ],
   "source": [
    "print(len(sg), len(cg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$R\\left(-\\frac{\\pi}{2}, [1 0 0]\\right)  \\mathcal{T}$"
      ],
      "text/plain": [
       "R(-π/2, [1 0 0]) T"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$R\\left(\\frac{\\pi}{2}, [1 0 0]\\right)  \\mathcal{T}$"
      ],
      "text/plain": [
       "R(π/2, [1 0 0]) T"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$R\\left(\\pi, [1 0 0]\\right)  \\mathcal{T}$"
      ],
      "text/plain": [
       "R(π, [1 0 0]) T"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/latex": [
       "$R\\left(\\pi, [1 1 0]\\right)  \\mathcal{T}$"
      ],
      "text/plain": [
       "R(π, [1 1 0]) T"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import display\n",
    "\n",
    "for i in range(1, 5):\n",
    "  display(sg[-i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle U H(\\mathbf{k})^* U^{-1} = H(-R\\mathbf{k}) \\\\R = R\\left(\\pi, [0 1 0]\\right)\\\\U = \\begin{bmatrix} 1.+0.j&-0.+0.j\\\\-0.+0.j& 1.+0.j\\\\\\end{bmatrix}$"
      ],
      "text/plain": [
       "<IPython.core.display.Math object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from IPython.display import Math\n",
    "\n",
    "display(Math(qsymm.groups.pretty_print_pge(sg[28], latex=True, full=True)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "C4 = qsymm.rotation(1/4, [1, 0, 0])\n",
    "C3 = qsymm.rotation(1/3, [1, 1, 1])\n",
    "TR = qsymm.time_reversal(3)\n",
    "\n",
    "set(sg) == qsymm.groups.generate_group({C3, C4, TR})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "ham_degenerate = \"kron(eye(2), \" + ham + \")\"\n",
    "H_degenerate = qsymm.Model(ham_degenerate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "sg, cg = qsymm.symmetries(H_degenerate, cubic_group)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\left[ H(\\mathbf{{k}}), L \\right] = 0 \\\\L = \\begin{bmatrix}1.+0.j&0.+0.j&0.+0.j&0.+0.j\\\\0.+0.j&1.+0.j&0.+0.j&0.+0.j\\\\ 0.+0.j& 0.+0.j&-1.+0.j& 0.+0.j\\\\ 0.+0.j& 0.+0.j& 0.+0.j&-1.+0.j\\\\\\end{bmatrix} \\\\\\\\\\left[ H(\\mathbf{{k}}), L \\right] = 0 \\\\L = \\begin{bmatrix}0.+0.j&0.+0.j&1.+0.j&0.+0.j\\\\0.+0.j&0.+0.j&0.+0.j&1.+0.j\\\\1.+0.j&0.+0.j&0.+0.j&0.+0.j\\\\0.+0.j&1.+0.j&0.+0.j&0.+0.j\\\\\\end{bmatrix} \\\\\\\\\\left[ H(\\mathbf{{k}}), L \\right] = 0 \\\\L = \\begin{bmatrix}0.+0.j&0.+0.j&0.+1.j&0.+0.j\\\\0.+0.j&0.+0.j&0.+0.j&0.+1.j\\\\0.-1.j&0.+0.j&0.+0.j&0.+0.j\\\\0.+0.j&0.-1.j&0.+0.j&0.+0.j\\\\\\end{bmatrix} \\\\$"
      ],
      "text/plain": [
       "[\n",
       "[H(k), L] = 0\n",
       "L = [[ 1.+0.j  0.+0.j  0.+0.j  0.+0.j]\n",
       "     [ 0.+0.j  1.+0.j  0.+0.j  0.+0.j]\n",
       "     [ 0.+0.j  0.+0.j -1.+0.j  0.+0.j]\n",
       "     [ 0.+0.j  0.+0.j  0.+0.j -1.+0.j]],\n",
       " \n",
       "[H(k), L] = 0\n",
       "L = [[0.+0.j 0.+0.j 1.+0.j 0.+0.j]\n",
       "     [0.+0.j 0.+0.j 0.+0.j 1.+0.j]\n",
       "     [1.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
       "     [0.+0.j 1.+0.j 0.+0.j 0.+0.j]],\n",
       " \n",
       "[H(k), L] = 0\n",
       "L = [[0.+0.j 0.+0.j 0.+1.j 0.+0.j]\n",
       "     [0.+0.j 0.+0.j 0.+0.j 0.+1.j]\n",
       "     [0.-1.j 0.+0.j 0.+0.j 0.+0.j]\n",
       "     [0.+0.j 0.-1.j 0.+0.j 0.+0.j]]]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n"
     ]
    }
   ],
   "source": [
    "ham_ph = \"kron(sigma_z, \" + ham + \")\"\n",
    "H_ph = qsymm.Model(ham_ph)\n",
    "sg, cg = qsymm.symmetries(H_ph, cubic_group)\n",
    "print(len(cg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\left[ H(\\mathbf{{k}}), L \\right] = 0 \\\\L = \\begin{bmatrix}-0.5+0.j& 0. +0.j& 0. +0.j& 0. +0.j\\\\ 0. +0.j&-0.5+0.j& 0. +0.j& 0. +0.j\\\\0. +0.j&0. +0.j&0.5+0.j&0. +0.j\\\\0. +0.j&0. +0.j&0. +0.j&0.5+0.j\\\\\\end{bmatrix} \\\\$"
      ],
      "text/plain": [
       "[\n",
       "[H(k), L] = 0\n",
       "L = [[-0.5+0.j  0. +0.j  0. +0.j  0. +0.j]\n",
       "     [ 0. +0.j -0.5+0.j  0. +0.j  0. +0.j]\n",
       "     [ 0. +0.j  0. +0.j  0.5+0.j  0. +0.j]\n",
       "     [ 0. +0.j  0. +0.j  0. +0.j  0.5+0.j]]]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\frac{3 \\alpha k_{z}}{2} + \\frac{\\hbar^{2} k_{x}^{2}}{2 m} + \\frac{\\hbar^{2} k_{y}^{2}}{2 m} + \\frac{\\hbar^{2} k_{z}^{2}}{2 m} & \\frac{\\sqrt{3} \\alpha k_{x}}{2} - \\frac{\\sqrt{3} i \\alpha k_{y}}{2} & 0 & 0\\\\\\frac{\\sqrt{3} \\alpha k_{x}}{2} + \\frac{\\sqrt{3} i \\alpha k_{y}}{2} & \\frac{\\alpha k_{z}}{2} + \\frac{\\hbar^{2} k_{x}^{2}}{2 m} + \\frac{\\hbar^{2} k_{y}^{2}}{2 m} + \\frac{\\hbar^{2} k_{z}^{2}}{2 m} & \\alpha k_{x} - i \\alpha k_{y} & 0\\\\0 & \\alpha k_{x} + i \\alpha k_{y} & - \\frac{\\alpha k_{z}}{2} + \\frac{\\hbar^{2} k_{x}^{2}}{2 m} + \\frac{\\hbar^{2} k_{y}^{2}}{2 m} + \\frac{\\hbar^{2} k_{z}^{2}}{2 m} & \\frac{\\sqrt{3} \\alpha k_{x}}{2} - \\frac{\\sqrt{3} i \\alpha k_{y}}{2}\\\\0 & 0 & \\frac{\\sqrt{3} \\alpha k_{x}}{2} + \\frac{\\sqrt{3} i \\alpha k_{y}}{2} & - \\frac{3 \\alpha k_{z}}{2} + \\frac{\\hbar^{2} k_{x}^{2}}{2 m} + \\frac{\\hbar^{2} k_{y}^{2}}{2 m} + \\frac{\\hbar^{2} k_{z}^{2}}{2 m}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[3*alpha*k_z/2 + hbar**2*k_x**2/(2*m) + hbar**2*k_y**2/(2*m) + hbar**2*k_z**2/(2*m),                                      sqrt(3)*alpha*k_x/2 - sqrt(3)*I*alpha*k_y/2,                                                                                 0,                                                                                   0],\n",
       "[                                       sqrt(3)*alpha*k_x/2 + sqrt(3)*I*alpha*k_y/2, alpha*k_z/2 + hbar**2*k_x**2/(2*m) + hbar**2*k_y**2/(2*m) + hbar**2*k_z**2/(2*m),                                                           alpha*k_x - I*alpha*k_y,                                                                                   0],\n",
       "[                                                                                 0,                                                          alpha*k_x + I*alpha*k_y, -alpha*k_z/2 + hbar**2*k_x**2/(2*m) + hbar**2*k_y**2/(2*m) + hbar**2*k_z**2/(2*m),                                         sqrt(3)*alpha*k_x/2 - sqrt(3)*I*alpha*k_y/2],\n",
       "[                                                                                 0,                                                                                0,                                       sqrt(3)*alpha*k_x/2 + sqrt(3)*I*alpha*k_y/2, -3*alpha*k_z/2 + hbar**2*k_x**2/(2*m) + hbar**2*k_y**2/(2*m) + hbar**2*k_z**2/(2*m)]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "J_x, J_y, J_z = qsymm.groups.spin_matrices(3/2)\n",
    "ham_rashba = (\n",
    "    \"hbar^2 / (2 * m) * (k_x**2 + k_y**2 + k_z**2) * eye(4) +\" +\n",
    "    \"alpha * J_x * k_x + alpha * J_y * k_y + alpha * J_z * k_z\"\n",
    ")\n",
    "H_rashba = qsymm.Model(ham_rashba, locals=dict(J_x=J_x, J_y=J_y, J_z=J_z))\n",
    "H_rashba.tosympy(nsimplify=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "sg, cg = qsymm.symmetries(H_rashba, cubic_group)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(sg) == qsymm.groups.generate_group({C4, C3, TR})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "hex_group_2D = qsymm.groups.hexagonal()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle m \\left(\\cos{\\left(k_{x} \\right)} + \\cos{\\left(- \\frac{k_{x}}{2} + \\frac{\\sqrt{3} k_{y}}{2} \\right)} + \\cos{\\left(\\frac{k_{x}}{2} + \\frac{\\sqrt{3} k_{y}}{2} \\right)}\\right)$"
      ],
      "text/plain": [
       "m*(cos(k_x) + cos(-k_x/2 + sqrt(3)*k_y/2) + cos(k_x/2 + sqrt(3)*k_y/2))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ham_tri = 'm * (cos(k_x) + cos(1/2*k_x + sqrt(3)/2*k_y) + cos(-1/2*k_x + sqrt(3)/2*k_y))'\n",
    "display(qsymm.sympify(ham_tri))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "H_tri = qsymm.Model(ham_tri, momenta=['k_x', 'k_y'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "sg, cg = qsymm.symmetries(H_tri, hex_group_2D)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(sg) == qsymm.groups.hexagonal(ph=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left[\\begin{matrix}\\alpha k_{z} + \\frac{\\hbar^{2} \\left(k_{x}^{2} + k_{y}^{2} + k_{z}^{2}\\right)}{2 m} & \\alpha k_{x} - i \\alpha k_{y}\\\\\\alpha k_{x} + i \\alpha k_{y} & - \\alpha k_{z} + \\frac{\\hbar^{2} \\left(k_{x}^{2} + k_{y}^{2} + k_{z}^{2}\\right)}{2 m}\\end{matrix}\\right]$"
      ],
      "text/plain": [
       "Matrix([\n",
       "[alpha*k_z + hbar**2*(k_x**2 + k_y**2 + k_z**2)/(2*m),                               alpha*k_x - I*alpha*k_y],\n",
       "[                             alpha*k_x + I*alpha*k_y, -alpha*k_z + hbar**2*(k_x**2 + k_y**2 + k_z**2)/(2*m)]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(qsymm.sympify(ham))\n",
    "pg, cg = qsymm.symmetries(H, continuous_rotations=True, prettify=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$e^{-i\\phi L}H(\\mathbf{k})e^{i\\phi L} = H(R_{\\phi}\\mathbf{k}) \\\\R_{\\phi} = R\\left(\\phi, [0 0 1]\\right)\\\\L = \\begin{bmatrix}0.5+0.j&0. +0.j\\\\ 0. +0.j&-0.5+0.j\\\\\\end{bmatrix} \\\\\\\\e^{-i\\phi L}H(\\mathbf{k})e^{i\\phi L} = H(R_{\\phi}\\mathbf{k}) \\\\R_{\\phi} = R\\left(\\phi, [ 0 -1  0]\\right)\\\\L = \\begin{bmatrix}0.+0.j &0.+0.5j\\\\0.-0.5j&0.+0.j \\\\\\end{bmatrix} \\\\\\\\e^{-i\\phi L}H(\\mathbf{k})e^{i\\phi L} = H(R_{\\phi}\\mathbf{k}) \\\\R_{\\phi} = R\\left(\\phi, [1 0 0]\\right)\\\\L = \\begin{bmatrix}0. +0.j&0.5+0.j\\\\0.5+0.j&0. +0.j\\\\\\end{bmatrix} \\\\$"
      ],
      "text/plain": [
       "[\n",
       "exp(-i ϕ L)⋅H(k)⋅exp(i ϕ L) = H(R_ϕ⋅k)\n",
       "R_ϕ = R(ϕ, [0 0 1])\n",
       "L = [[ 0.5+0.j  0. +0.j]\n",
       "     [ 0. +0.j -0.5+0.j]],\n",
       " \n",
       "exp(-i ϕ L)⋅H(k)⋅exp(i ϕ L) = H(R_ϕ⋅k)\n",
       "R_ϕ = R(ϕ, [ 0 -1  0])\n",
       "L = [[0.+0.j  0.+0.5j]\n",
       "     [0.-0.5j 0.+0.j ]],\n",
       " \n",
       "exp(-i ϕ L)⋅H(k)⋅exp(i ϕ L) = H(R_ϕ⋅k)\n",
       "R_ϕ = R(ϕ, [1 0 0])\n",
       "L = [[0. +0.j 0.5+0.j]\n",
       "     [0.5+0.j 0. +0.j]]]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "ham_kp = 'Matrix([[hbar**2*k_x*gamma_0*k_x/(2*m_0)+hbar**2*k_y*gamma_0*k_y/(2*m_0)+hbar**2*k_z*gamma_0*k_z/(2*m_0)+E_0+E_v,0,-sqrt(2)*P*k_x/2-sqrt(2)*I*P*k_y/2,sqrt(6)*P*k_z/3,sqrt(6)*P*k_x/6-sqrt(6)*I*P*k_y/6,0,-sqrt(3)*P*k_z/3,-sqrt(3)*P*k_x/3+sqrt(3)*I*P*k_y/3],[0,hbar**2*k_x*gamma_0*k_x/(2*m_0)+hbar**2*k_y*gamma_0*k_y/(2*m_0)+hbar**2*k_z*gamma_0*k_z/(2*m_0)+E_0+E_v,0,-sqrt(6)*P*k_x/6-sqrt(6)*I*P*k_y/6,sqrt(6)*P*k_z/3,sqrt(2)*P*k_x/2-sqrt(2)*I*P*k_y/2,-sqrt(3)*P*k_x/3-sqrt(3)*I*P*k_y/3,sqrt(3)*P*k_z/3],[-sqrt(2)*k_x*P/2+sqrt(2)*I*k_y*P/2,0,-hbar**2*k_x*gamma_1*k_x/(2*m_0)-hbar**2*k_x*gamma_2*k_x/(2*m_0)-I*hbar**2*k_x*k_y/(2*m_0)-3*I*hbar**2*k_x*kappa*k_y/(2*m_0)-hbar**2*k_y*gamma_1*k_y/(2*m_0)-hbar**2*k_y*gamma_2*k_y/(2*m_0)+I*hbar**2*k_y*k_x/(2*m_0)+3*I*hbar**2*k_y*kappa*k_x/(2*m_0)-hbar**2*k_z*gamma_1*k_z/(2*m_0)+hbar**2*k_z*gamma_2*k_z/m_0+E_v,sqrt(3)*hbar**2*k_x*gamma_3*k_z/(2*m_0)+sqrt(3)*hbar**2*k_x*k_z/(6*m_0)+sqrt(3)*hbar**2*k_x*kappa*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*gamma_3*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*k_z/(6*m_0)-sqrt(3)*I*hbar**2*k_y*kappa*k_z/(2*m_0)+sqrt(3)*hbar**2*k_z*gamma_3*k_x/(2*m_0)-sqrt(3)*I*hbar**2*k_z*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_z*k_x/(6*m_0)+sqrt(3)*I*hbar**2*k_z*k_y/(6*m_0)-sqrt(3)*hbar**2*k_z*kappa*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*kappa*k_y/(2*m_0),sqrt(3)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(3)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_y*gamma_2*k_y/(2*m_0)-sqrt(3)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),0,-sqrt(6)*hbar**2*k_x*gamma_3*k_z/(4*m_0)-sqrt(6)*hbar**2*k_x*k_z/(12*m_0)-sqrt(6)*hbar**2*k_x*kappa*k_z/(4*m_0)+sqrt(6)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)+sqrt(6)*I*hbar**2*k_y*k_z/(12*m_0)+sqrt(6)*I*hbar**2*k_y*kappa*k_z/(4*m_0)-sqrt(6)*hbar**2*k_z*gamma_3*k_x/(4*m_0)+sqrt(6)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)+sqrt(6)*hbar**2*k_z*k_x/(12*m_0)-sqrt(6)*I*hbar**2*k_z*k_y/(12*m_0)+sqrt(6)*hbar**2*k_z*kappa*k_x/(4*m_0)-sqrt(6)*I*hbar**2*k_z*kappa*k_y/(4*m_0),-sqrt(6)*hbar**2*k_x*gamma_2*k_x/(2*m_0)+sqrt(6)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)+sqrt(6)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(6)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0)],[sqrt(6)*k_z*P/3,-sqrt(6)*k_x*P/6+sqrt(6)*I*k_y*P/6,sqrt(3)*hbar**2*k_x*gamma_3*k_z/(2*m_0)-sqrt(3)*hbar**2*k_x*k_z/(6*m_0)-sqrt(3)*hbar**2*k_x*kappa*k_z/(2*m_0)+sqrt(3)*I*hbar**2*k_y*gamma_3*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*k_z/(6*m_0)-sqrt(3)*I*hbar**2*k_y*kappa*k_z/(2*m_0)+sqrt(3)*hbar**2*k_z*gamma_3*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*gamma_3*k_y/(2*m_0)+sqrt(3)*hbar**2*k_z*k_x/(6*m_0)+sqrt(3)*I*hbar**2*k_z*k_y/(6*m_0)+sqrt(3)*hbar**2*k_z*kappa*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*kappa*k_y/(2*m_0),-hbar**2*k_x*gamma_1*k_x/(2*m_0)+hbar**2*k_x*gamma_2*k_x/(2*m_0)-I*hbar**2*k_x*k_y/(6*m_0)-I*hbar**2*k_x*kappa*k_y/(2*m_0)-hbar**2*k_y*gamma_1*k_y/(2*m_0)+hbar**2*k_y*gamma_2*k_y/(2*m_0)+I*hbar**2*k_y*k_x/(6*m_0)+I*hbar**2*k_y*kappa*k_x/(2*m_0)-hbar**2*k_z*gamma_1*k_z/(2*m_0)-hbar**2*k_z*gamma_2*k_z/m_0+E_v,hbar**2*k_x*k_z/(3*m_0)+hbar**2*k_x*kappa*k_z/m_0-I*hbar**2*k_y*k_z/(3*m_0)-I*hbar**2*k_y*kappa*k_z/m_0-hbar**2*k_z*k_x/(3*m_0)+I*hbar**2*k_z*k_y/(3*m_0)-hbar**2*k_z*kappa*k_x/m_0+I*hbar**2*k_z*kappa*k_y/m_0,sqrt(3)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(3)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_y*gamma_2*k_y/(2*m_0)-sqrt(3)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),-sqrt(2)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(2)*I*hbar**2*k_x*k_y/(6*m_0)-sqrt(2)*I*hbar**2*k_x*kappa*k_y/(2*m_0)-sqrt(2)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(2)*I*hbar**2*k_y*k_x/(6*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_x/(2*m_0)+sqrt(2)*hbar**2*k_z*gamma_2*k_z/m_0,3*sqrt(2)*hbar**2*k_x*gamma_3*k_z/(4*m_0)-sqrt(2)*hbar**2*k_x*k_z/(12*m_0)-sqrt(2)*hbar**2*k_x*kappa*k_z/(4*m_0)-3*sqrt(2)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)+sqrt(2)*I*hbar**2*k_y*k_z/(12*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_z/(4*m_0)+3*sqrt(2)*hbar**2*k_z*gamma_3*k_x/(4*m_0)-3*sqrt(2)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)+sqrt(2)*hbar**2*k_z*k_x/(12*m_0)-sqrt(2)*I*hbar**2*k_z*k_y/(12*m_0)+sqrt(2)*hbar**2*k_z*kappa*k_x/(4*m_0)-sqrt(2)*I*hbar**2*k_z*kappa*k_y/(4*m_0)],[sqrt(6)*k_x*P/6+sqrt(6)*I*k_y*P/6,sqrt(6)*k_z*P/3,sqrt(3)*hbar**2*k_x*gamma_2*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(3)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),-hbar**2*k_x*k_z/(3*m_0)-hbar**2*k_x*kappa*k_z/m_0-I*hbar**2*k_y*k_z/(3*m_0)-I*hbar**2*k_y*kappa*k_z/m_0+hbar**2*k_z*k_x/(3*m_0)+I*hbar**2*k_z*k_y/(3*m_0)+hbar**2*k_z*kappa*k_x/m_0+I*hbar**2*k_z*kappa*k_y/m_0,-hbar**2*k_x*gamma_1*k_x/(2*m_0)+hbar**2*k_x*gamma_2*k_x/(2*m_0)+I*hbar**2*k_x*k_y/(6*m_0)+I*hbar**2*k_x*kappa*k_y/(2*m_0)-hbar**2*k_y*gamma_1*k_y/(2*m_0)+hbar**2*k_y*gamma_2*k_y/(2*m_0)-I*hbar**2*k_y*k_x/(6*m_0)-I*hbar**2*k_y*kappa*k_x/(2*m_0)-hbar**2*k_z*gamma_1*k_z/(2*m_0)-hbar**2*k_z*gamma_2*k_z/m_0+E_v,-sqrt(3)*hbar**2*k_x*gamma_3*k_z/(2*m_0)+sqrt(3)*hbar**2*k_x*k_z/(6*m_0)+sqrt(3)*hbar**2*k_x*kappa*k_z/(2*m_0)+sqrt(3)*I*hbar**2*k_y*gamma_3*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*k_z/(6*m_0)-sqrt(3)*I*hbar**2*k_y*kappa*k_z/(2*m_0)-sqrt(3)*hbar**2*k_z*gamma_3*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_z*k_x/(6*m_0)+sqrt(3)*I*hbar**2*k_z*k_y/(6*m_0)-sqrt(3)*hbar**2*k_z*kappa*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*kappa*k_y/(2*m_0),3*sqrt(2)*hbar**2*k_x*gamma_3*k_z/(4*m_0)-sqrt(2)*hbar**2*k_x*k_z/(12*m_0)-sqrt(2)*hbar**2*k_x*kappa*k_z/(4*m_0)+3*sqrt(2)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)-sqrt(2)*I*hbar**2*k_y*k_z/(12*m_0)-sqrt(2)*I*hbar**2*k_y*kappa*k_z/(4*m_0)+3*sqrt(2)*hbar**2*k_z*gamma_3*k_x/(4*m_0)+3*sqrt(2)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)+sqrt(2)*hbar**2*k_z*k_x/(12*m_0)+sqrt(2)*I*hbar**2*k_z*k_y/(12*m_0)+sqrt(2)*hbar**2*k_z*kappa*k_x/(4*m_0)+sqrt(2)*I*hbar**2*k_z*kappa*k_y/(4*m_0),sqrt(2)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(2)*I*hbar**2*k_x*k_y/(6*m_0)-sqrt(2)*I*hbar**2*k_x*kappa*k_y/(2*m_0)+sqrt(2)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(2)*I*hbar**2*k_y*k_x/(6*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_x/(2*m_0)-sqrt(2)*hbar**2*k_z*gamma_2*k_z/m_0],[0,sqrt(2)*k_x*P/2+sqrt(2)*I*k_y*P/2,0,sqrt(3)*hbar**2*k_x*gamma_2*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(3)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(3)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),-sqrt(3)*hbar**2*k_x*gamma_3*k_z/(2*m_0)-sqrt(3)*hbar**2*k_x*k_z/(6*m_0)-sqrt(3)*hbar**2*k_x*kappa*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*gamma_3*k_z/(2*m_0)-sqrt(3)*I*hbar**2*k_y*k_z/(6*m_0)-sqrt(3)*I*hbar**2*k_y*kappa*k_z/(2*m_0)-sqrt(3)*hbar**2*k_z*gamma_3*k_x/(2*m_0)-sqrt(3)*I*hbar**2*k_z*gamma_3*k_y/(2*m_0)+sqrt(3)*hbar**2*k_z*k_x/(6*m_0)+sqrt(3)*I*hbar**2*k_z*k_y/(6*m_0)+sqrt(3)*hbar**2*k_z*kappa*k_x/(2*m_0)+sqrt(3)*I*hbar**2*k_z*kappa*k_y/(2*m_0),-hbar**2*k_x*gamma_1*k_x/(2*m_0)-hbar**2*k_x*gamma_2*k_x/(2*m_0)+I*hbar**2*k_x*k_y/(2*m_0)+3*I*hbar**2*k_x*kappa*k_y/(2*m_0)-hbar**2*k_y*gamma_1*k_y/(2*m_0)-hbar**2*k_y*gamma_2*k_y/(2*m_0)-I*hbar**2*k_y*k_x/(2*m_0)-3*I*hbar**2*k_y*kappa*k_x/(2*m_0)-hbar**2*k_z*gamma_1*k_z/(2*m_0)+hbar**2*k_z*gamma_2*k_z/m_0+E_v,sqrt(6)*hbar**2*k_x*gamma_2*k_x/(2*m_0)+sqrt(6)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(6)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(6)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),-sqrt(6)*hbar**2*k_x*gamma_3*k_z/(4*m_0)-sqrt(6)*hbar**2*k_x*k_z/(12*m_0)-sqrt(6)*hbar**2*k_x*kappa*k_z/(4*m_0)-sqrt(6)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)-sqrt(6)*I*hbar**2*k_y*k_z/(12*m_0)-sqrt(6)*I*hbar**2*k_y*kappa*k_z/(4*m_0)-sqrt(6)*hbar**2*k_z*gamma_3*k_x/(4*m_0)-sqrt(6)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)+sqrt(6)*hbar**2*k_z*k_x/(12*m_0)+sqrt(6)*I*hbar**2*k_z*k_y/(12*m_0)+sqrt(6)*hbar**2*k_z*kappa*k_x/(4*m_0)+sqrt(6)*I*hbar**2*k_z*kappa*k_y/(4*m_0)],[-sqrt(3)*k_z*P/3,-sqrt(3)*k_x*P/3+sqrt(3)*I*k_y*P/3,-sqrt(6)*hbar**2*k_x*gamma_3*k_z/(4*m_0)+sqrt(6)*hbar**2*k_x*k_z/(12*m_0)+sqrt(6)*hbar**2*k_x*kappa*k_z/(4*m_0)-sqrt(6)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)+sqrt(6)*I*hbar**2*k_y*k_z/(12*m_0)+sqrt(6)*I*hbar**2*k_y*kappa*k_z/(4*m_0)-sqrt(6)*hbar**2*k_z*gamma_3*k_x/(4*m_0)-sqrt(6)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)-sqrt(6)*hbar**2*k_z*k_x/(12*m_0)-sqrt(6)*I*hbar**2*k_z*k_y/(12*m_0)-sqrt(6)*hbar**2*k_z*kappa*k_x/(4*m_0)-sqrt(6)*I*hbar**2*k_z*kappa*k_y/(4*m_0),-sqrt(2)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(2)*I*hbar**2*k_x*k_y/(6*m_0)-sqrt(2)*I*hbar**2*k_x*kappa*k_y/(2*m_0)-sqrt(2)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(2)*I*hbar**2*k_y*k_x/(6*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_x/(2*m_0)+sqrt(2)*hbar**2*k_z*gamma_2*k_z/m_0,3*sqrt(2)*hbar**2*k_x*gamma_3*k_z/(4*m_0)+sqrt(2)*hbar**2*k_x*k_z/(12*m_0)+sqrt(2)*hbar**2*k_x*kappa*k_z/(4*m_0)-3*sqrt(2)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)-sqrt(2)*I*hbar**2*k_y*k_z/(12*m_0)-sqrt(2)*I*hbar**2*k_y*kappa*k_z/(4*m_0)+3*sqrt(2)*hbar**2*k_z*gamma_3*k_x/(4*m_0)-3*sqrt(2)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)-sqrt(2)*hbar**2*k_z*k_x/(12*m_0)+sqrt(2)*I*hbar**2*k_z*k_y/(12*m_0)-sqrt(2)*hbar**2*k_z*kappa*k_x/(4*m_0)+sqrt(2)*I*hbar**2*k_z*kappa*k_y/(4*m_0),sqrt(6)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(6)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)-sqrt(6)*hbar**2*k_y*gamma_2*k_y/(2*m_0)-sqrt(6)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),-hbar**2*k_x*gamma_1*k_x/(2*m_0)-I*hbar**2*k_x*k_y/(3*m_0)-I*hbar**2*k_x*kappa*k_y/m_0-hbar**2*k_y*gamma_1*k_y/(2*m_0)+I*hbar**2*k_y*k_x/(3*m_0)+I*hbar**2*k_y*kappa*k_x/m_0-hbar**2*k_z*gamma_1*k_z/(2*m_0)-Delta+E_v,hbar**2*k_x*k_z/(3*m_0)+hbar**2*k_x*kappa*k_z/m_0-I*hbar**2*k_y*k_z/(3*m_0)-I*hbar**2*k_y*kappa*k_z/m_0-hbar**2*k_z*k_x/(3*m_0)+I*hbar**2*k_z*k_y/(3*m_0)-hbar**2*k_z*kappa*k_x/m_0+I*hbar**2*k_z*kappa*k_y/m_0],[-sqrt(3)*k_x*P/3-sqrt(3)*I*k_y*P/3,sqrt(3)*k_z*P/3,-sqrt(6)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(6)*I*hbar**2*k_x*gamma_3*k_y/(2*m_0)+sqrt(6)*hbar**2*k_y*gamma_2*k_y/(2*m_0)-sqrt(6)*I*hbar**2*k_y*gamma_3*k_x/(2*m_0),3*sqrt(2)*hbar**2*k_x*gamma_3*k_z/(4*m_0)+sqrt(2)*hbar**2*k_x*k_z/(12*m_0)+sqrt(2)*hbar**2*k_x*kappa*k_z/(4*m_0)+3*sqrt(2)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)+sqrt(2)*I*hbar**2*k_y*k_z/(12*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_z/(4*m_0)+3*sqrt(2)*hbar**2*k_z*gamma_3*k_x/(4*m_0)+3*sqrt(2)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)-sqrt(2)*hbar**2*k_z*k_x/(12*m_0)-sqrt(2)*I*hbar**2*k_z*k_y/(12*m_0)-sqrt(2)*hbar**2*k_z*kappa*k_x/(4*m_0)-sqrt(2)*I*hbar**2*k_z*kappa*k_y/(4*m_0),sqrt(2)*hbar**2*k_x*gamma_2*k_x/(2*m_0)-sqrt(2)*I*hbar**2*k_x*k_y/(6*m_0)-sqrt(2)*I*hbar**2*k_x*kappa*k_y/(2*m_0)+sqrt(2)*hbar**2*k_y*gamma_2*k_y/(2*m_0)+sqrt(2)*I*hbar**2*k_y*k_x/(6*m_0)+sqrt(2)*I*hbar**2*k_y*kappa*k_x/(2*m_0)-sqrt(2)*hbar**2*k_z*gamma_2*k_z/m_0,-sqrt(6)*hbar**2*k_x*gamma_3*k_z/(4*m_0)+sqrt(6)*hbar**2*k_x*k_z/(12*m_0)+sqrt(6)*hbar**2*k_x*kappa*k_z/(4*m_0)+sqrt(6)*I*hbar**2*k_y*gamma_3*k_z/(4*m_0)-sqrt(6)*I*hbar**2*k_y*k_z/(12*m_0)-sqrt(6)*I*hbar**2*k_y*kappa*k_z/(4*m_0)-sqrt(6)*hbar**2*k_z*gamma_3*k_x/(4*m_0)+sqrt(6)*I*hbar**2*k_z*gamma_3*k_y/(4*m_0)-sqrt(6)*hbar**2*k_z*k_x/(12*m_0)+sqrt(6)*I*hbar**2*k_z*k_y/(12*m_0)-sqrt(6)*hbar**2*k_z*kappa*k_x/(4*m_0)+sqrt(6)*I*hbar**2*k_z*kappa*k_y/(4*m_0),-hbar**2*k_x*k_z/(3*m_0)-hbar**2*k_x*kappa*k_z/m_0-I*hbar**2*k_y*k_z/(3*m_0)-I*hbar**2*k_y*kappa*k_z/m_0+hbar**2*k_z*k_x/(3*m_0)+I*hbar**2*k_z*k_y/(3*m_0)+hbar**2*k_z*kappa*k_x/m_0+I*hbar**2*k_z*kappa*k_y/m_0,-hbar**2*k_x*gamma_1*k_x/(2*m_0)+I*hbar**2*k_x*k_y/(3*m_0)+I*hbar**2*k_x*kappa*k_y/m_0-hbar**2*k_y*gamma_1*k_y/(2*m_0)-I*hbar**2*k_y*k_x/(3*m_0)-I*hbar**2*k_y*kappa*k_x/m_0-hbar**2*k_z*gamma_1*k_z/(2*m_0)-Delta+E_v]])'\n",
    "Hkp = qsymm.Model(ham_kp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "96\n"
     ]
    }
   ],
   "source": [
    "sg, cg = qsymm.symmetries(Hkp, cubic_group)\n",
    "print(len(sg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1} 96 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1, 'P': 0, 'Delta': 0} 96 7\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1, 'P': 0, 'Delta': 0, 'gamma_3': 0} 96 15\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1, 'gamma_2': 'gamma_1', 'gamma_3': 'gamma_1', 'k_z': 0} 32 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1, 'P': 0, 'Delta': 0, 'gamma_3': 0} 96 15\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'hbar': 1, 'Delta': 0, 'k_z': 0} 32 7\n"
     ]
    }
   ],
   "source": [
    "kp_examples = [\n",
    "    {'hbar': 1},\n",
    "    {'hbar': 1, 'P': 0, 'Delta': 0},\n",
    "    {'hbar': 1, 'P': 0, 'Delta': 0, 'gamma_3': 0},\n",
    "    {'hbar': 1, 'gamma_2': 'gamma_1', 'gamma_3': 'gamma_1', 'k_z': 0},\n",
    "    {'hbar': 1, 'P': 0, 'Delta': 0, 'gamma_3': 0},\n",
    "    {'hbar': 1, 'Delta': 0, 'k_z': 0},\n",
    "]\n",
    "\n",
    "for subs in kp_examples:\n",
    "    Hkp = qsymm.Model(ham_kp, locals=subs)\n",
    "    sg, cg = qsymm.symmetries(Hkp, cubic_group)\n",
    "    print(subs, len(sg), len(cg))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}