{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\operatorname{tr}\\left(\\left(0.5 \\left(AA G_{AA} + 0.5 AB G_{BA} + 0.5 AR G_{RA}\\right) AB + \\left(AA G_{AB} + 0.5 AB G_{BB} + 0.5 AR G_{RB}\\right) BB + 0.5 \\left(AA G_{AR} + 0.5 AB G_{BR} + 0.5 AR G_{RR}\\right) RB\\right) G_{BA} \\right) + \\operatorname{tr}\\left(\\left(0.25 BA G_{AA} AB + 0.5 BA G_{AB} BB + 0.25 BA G_{AR} RB\\right) G_{BB} \\right) + \\operatorname{tr}\\left(\\left(0.25 RA G_{AA} AB + 0.5 RA G_{AB} BB + 0.25 RA G_{AR} RB\\right) G_{BR} \\right) + 0.5 \\operatorname{tr}\\left(\\left(AA G_{AB} + 0.5 AB G_{BB} + 0.5 AR G_{RB}\\right) BA G_{AA} \\right) + 0.5 \\operatorname{tr}\\left(\\left(AA G_{AB} + 0.5 AB G_{BB} + 0.5 AR G_{RB}\\right) BR G_{RA} \\right) + 0.25 \\operatorname{tr}\\left(BA G_{AB} BA G_{AB} \\right) + 0.25 \\operatorname{tr}\\left(BA G_{AB} BR G_{RB} \\right) + 0.25 \\operatorname{tr}\\left(RA G_{AB} BA G_{AR} \\right) + 0.25 \\operatorname{tr}\\left(RA G_{AB} BR G_{RR} \\right)$" ], "text/plain": [ "Trace((0.5*(AA*G_AA + 0.5*AB*G_BA + 0.5*AR*G_RA)*AB + (AA*G_AB + 0.5*AB*G_BB + 0.5*AR*G_RB)*BB + 0.5*(AA*G_AR + 0.5*AB*G_BR + 0.5*AR*G_RR)*RB)*G_BA) + Trace((0.25*BA*G_AA*AB + 0.5*BA*G_AB*BB + 0.25*BA*G_AR*RB)*G_BB) + Trace((0.25*RA*G_AA*AB + 0.5*RA*G_AB*BB + 0.25*RA*G_AR*RB)*G_BR) + 0.5*Trace((AA*G_AB + 0.5*AB*G_BB + 0.5*AR*G_RB)*BA*G_AA) + 0.5*Trace((AA*G_AB + 0.5*AB*G_BB + 0.5*AR*G_RB)*BR*G_RA) + 0.25*Trace(BA*G_AB*BA*G_AB) + 0.25*Trace(BA*G_AB*BR*G_RB) + 0.25*Trace(RA*G_AB*BA*G_AR) + 0.25*Trace(RA*G_AB*BR*G_RR)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import MatrixSymbol, BlockMatrix, ZeroMatrix, trace, block_collapse\n", "\n", "# Define MatrixSymbols with specific sizes\n", "# A = 2x2, B = 3x3, R = 4x4\n", "AA = MatrixSymbol(\"AA\", 2, 2) # 2x2\n", "AB = MatrixSymbol(\"AB\", 2, 3) # 2x3\n", "BA = MatrixSymbol(\"BA\", 3, 2) # 3x2\n", "AR = MatrixSymbol(\"AR\", 2, 4) # 2x4\n", "RA = MatrixSymbol(\"RA\", 4, 2) # 4x2\n", "BB = MatrixSymbol(\"BB\", 3, 3) # 3x3\n", "BR = MatrixSymbol(\"BR\", 3, 4) # 3x4\n", "RB = MatrixSymbol(\"RB\", 4, 3) # 4x3\n", "RR = MatrixSymbol(\"RR\", 4, 4) # 4x4\n", "\n", "# Create block matrices VA and VB using BlockMatrix\n", "# We need to use ZeroMatrix with appropriate dimensions for padding\n", "VA = BlockMatrix(\n", " [\n", " [AA, 0.5 * AB, 0.5 * AR],\n", " [0.5 * BA, ZeroMatrix(3, 3), ZeroMatrix(3, 4)],\n", " [0.5 * RA, ZeroMatrix(4, 3), ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "VB = BlockMatrix(\n", " [\n", " [ZeroMatrix(2, 2), 0.5 * AB, ZeroMatrix(2, 4)],\n", " [0.5 * BA, BB, 0.5 * BR],\n", " [ZeroMatrix(4, 2), 0.5 * RB, ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "# Define G matrix symbols with matching dimensions\n", "G_AA = MatrixSymbol(\"G_AA\", 2, 2)\n", "G_AB = MatrixSymbol(\"G_AB\", 2, 3)\n", "G_BA = MatrixSymbol(\"G_BA\", 3, 2)\n", "G_AR = MatrixSymbol(\"G_AR\", 2, 4)\n", "G_RA = MatrixSymbol(\"G_RA\", 4, 2)\n", "G_BB = MatrixSymbol(\"G_BB\", 3, 3)\n", "G_BR = MatrixSymbol(\"G_BR\", 3, 4)\n", "G_RB = MatrixSymbol(\"G_RB\", 4, 3)\n", "G_RR = MatrixSymbol(\"G_RR\", 4, 4)\n", "\n", "# Create G matrix as a BlockMatrix\n", "G = BlockMatrix([[G_AA, G_AB, G_AR], [G_BA, G_BB, G_BR], [G_RA, G_RB, G_RR]])\n", "\n", "\n", "# Calculate the trace of VA@G@VB@G\n", "# First, let's calculate the product step by step\n", "product = block_collapse(VA @ G @ VB @ G)\n", "\n", "# Calculate the trace\n", "result = trace(product)\n", "result" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trace((0.5*(AA*G_AA + 0.5*AB*G_BA)*AB + (AA*G_AB + 0.5*AB*G_BB)*BB)*G_BA) + Trace((0.25*BA*G_AA*AB + 0.5*BA*G_AB*BB)*G_BB) + 0.5*Trace((AA*G_AB + 0.5*AB*G_BB)*BA*G_AA) + 0.25*Trace(BA*G_AB*BA*G_AB)\n" ] } ], "source": [ "# Define MatrixSymbols with specific sizes\n", "AA = MatrixSymbol(\"AA\", 2, 2) # 2x2\n", "AB = MatrixSymbol(\"AB\", 2, 3) # 2x3\n", "BA = MatrixSymbol(\"BA\", 3, 2) # 3x2\n", "BB = MatrixSymbol(\"BB\", 3, 3) # 3x3\n", "\n", "# Create block matrices VA and VB using BlockMatrix\n", "# R-related terms are replaced with zero matrices\n", "VA = BlockMatrix(\n", " [\n", " [AA, 0.5 * AB, ZeroMatrix(2, 4)],\n", " [0.5 * BA, ZeroMatrix(3, 3), ZeroMatrix(3, 4)],\n", " [ZeroMatrix(4, 2), ZeroMatrix(4, 3), ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "VB = BlockMatrix(\n", " [\n", " [ZeroMatrix(2, 2), 0.5 * AB, ZeroMatrix(2, 4)],\n", " [0.5 * BA, BB, ZeroMatrix(3, 4)],\n", " [ZeroMatrix(4, 2), ZeroMatrix(4, 3), ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "# Define G matrix symbols with matching dimensions (kept original)\n", "G_AA = MatrixSymbol(\"G_AA\", 2, 2)\n", "G_AB = MatrixSymbol(\"G_AB\", 2, 3)\n", "G_BA = MatrixSymbol(\"G_BA\", 3, 2)\n", "G_AR = MatrixSymbol(\"G_AR\", 2, 4)\n", "G_RA = MatrixSymbol(\"G_RA\", 4, 2)\n", "G_BB = MatrixSymbol(\"G_BB\", 3, 3)\n", "G_BR = MatrixSymbol(\"G_BR\", 3, 4)\n", "G_RB = MatrixSymbol(\"G_RB\", 4, 3)\n", "G_RR = MatrixSymbol(\"G_RR\", 4, 4)\n", "\n", "# Create G matrix as a BlockMatrix (kept original)\n", "G = BlockMatrix([[G_AA, G_AB, G_AR], [G_BA, G_BB, G_BR], [G_RA, G_RB, G_RR]])\n", "\n", "# Calculate the product and trace\n", "product = block_collapse(VA @ G @ VB @ G)\n", "result = trace(product)\n", "print(result)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trace(AA*G_AB*BB*G_BA)\n" ] } ], "source": [ "from sympy import MatrixSymbol, BlockMatrix, ZeroMatrix, trace, block_collapse\n", "\n", "# Define MatrixSymbols with specific sizes\n", "AA = MatrixSymbol(\"AA\", 2, 2) # 2x2\n", "BB = MatrixSymbol(\"BB\", 3, 3) # 3x3\n", "\n", "# Create block matrices VA and VB using BlockMatrix with only AA and BB\n", "VA = BlockMatrix(\n", " [\n", " [AA, ZeroMatrix(2, 3), ZeroMatrix(2, 4)],\n", " [ZeroMatrix(3, 2), ZeroMatrix(3, 3), ZeroMatrix(3, 4)],\n", " [ZeroMatrix(4, 2), ZeroMatrix(4, 3), ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "VB = BlockMatrix(\n", " [\n", " [ZeroMatrix(2, 2), ZeroMatrix(2, 3), ZeroMatrix(2, 4)],\n", " [ZeroMatrix(3, 2), BB, ZeroMatrix(3, 4)],\n", " [ZeroMatrix(4, 2), ZeroMatrix(4, 3), ZeroMatrix(4, 4)],\n", " ]\n", ")\n", "\n", "# Define G matrix symbols with matching dimensions\n", "G_AA = MatrixSymbol(\"G_AA\", 2, 2)\n", "G_AB = MatrixSymbol(\"G_AB\", 2, 3)\n", "G_BA = MatrixSymbol(\"G_BA\", 3, 2)\n", "G_AR = MatrixSymbol(\"G_AR\", 2, 4)\n", "G_RA = MatrixSymbol(\"G_RA\", 4, 2)\n", "G_BB = MatrixSymbol(\"G_BB\", 3, 3)\n", "G_BR = MatrixSymbol(\"G_BR\", 3, 4)\n", "G_RB = MatrixSymbol(\"G_RB\", 4, 3)\n", "G_RR = MatrixSymbol(\"G_RR\", 4, 4)\n", "\n", "# Create G matrix as a BlockMatrix\n", "G = BlockMatrix([[G_AA, G_AB, G_AR], [G_BA, G_BB, G_BR], [G_RA, G_RB, G_RR]])\n", "\n", "# Calculate the product and simplify\n", "product = block_collapse(VA @ G @ VB @ G)\n", "\n", "# Calculate the trace\n", "result = trace(product)\n", "simplified_result = result.simplify()\n", "\n", "print(simplified_result)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.9.6" } }, "nbformat": 4, "nbformat_minor": 2 }