From a252418f99b49f7f0ade397bb14e195416c7900b Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Sat, 2 Aug 2025 13:34:23 +0200 Subject: [PATCH 1/6] Adding the notebook --- notebooks/Kalman_Filter_Gradients.ipynb | 743 ++++++++++++++++++++++++ 1 file changed, 743 insertions(+) create mode 100644 notebooks/Kalman_Filter_Gradients.ipynb diff --git a/notebooks/Kalman_Filter_Gradients.ipynb b/notebooks/Kalman_Filter_Gradients.ipynb new file mode 100644 index 00000000..9f33d39e --- /dev/null +++ b/notebooks/Kalman_Filter_Gradients.ipynb @@ -0,0 +1,743 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "69ae14a1", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "id": "90979a41", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import pytensor\n", + "import pytensor.tensor as pt\n", + "import matplotlib.pyplot as plt\n", + "from pytensor.compile.builders import OpFromGraph\n", + "from time import perf_counter\n", + "from collections import defaultdict" + ] + }, + { + "cell_type": "markdown", + "id": "a0d008fc", + "metadata": {}, + "source": [ + "### Generate dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "id": "f75a72e8", + "metadata": {}, + "outputs": [], + "source": [ + "def generate_kalman_dataset(n, N=100, seed=0):\n", + " rng = np.random.default_rng(seed)\n", + "\n", + " # 0. Initial state and cov\n", + " A0 = rng.normal(loc=0.0, scale=1.0, size=(n,))\n", + " # 3. Random process noise covariance Q (PSD)\n", + " P0_base = rng.normal(0, 1, size=(n, n))\n", + " P0 = P0_base @ P0_base.T + np.eye(n) * 1e-3 # ensure positive definite\n", + "\n", + " # 1. T stable random transition matrix T\n", + " T = rng.normal(0, 1, size=(n, n))\n", + " eigvals = np.linalg.eigvals(T)\n", + " spectral_radius = max(abs(eigvals))\n", + " T = T / (1.1 * spectral_radius) # shrink to ensure stability\n", + "\n", + " # 2. Random observation matrix Z\n", + " Z = rng.normal(0, 1, size=(n, n)) # full observations (m = n)\n", + "\n", + " # 3. Random process noise covariance Q (PSD)\n", + " Q_base = rng.normal(0, 1, size=(n, n))\n", + " Q = Q_base @ Q_base.T + np.eye(n) * 1e-3 # ensure positive definite\n", + "\n", + " # 4. Random observation noise covariance H (PSD)\n", + " H_base = rng.normal(0, 1, size=(n, n))\n", + " H = H_base @ H_base.T + np.eye(n) * 1e-3\n", + "\n", + " # 5. Initial state\n", + " x = np.zeros((N, n))\n", + " y = np.zeros((N, n))\n", + " x[0] = A0\n", + "\n", + " # 6. Simulate the system\n", + " for t in range(1, N):\n", + " w_t = rng.multivariate_normal(mean=np.zeros(n), cov=Q)\n", + " x[t] = T @ x[t-1] + w_t\n", + "\n", + " for t in range(N):\n", + " v_t = rng.multivariate_normal(mean=np.zeros(n), cov=H)\n", + " y[t] = Z @ x[t] + v_t\n", + "\n", + " return {\n", + " \"T\": T, \"Z\": Z, \"Q\": Q, \"H\": H,\n", + " \"x\": x, \"y\": y, \"A0\": A0, \"P0\": P0\n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "51b7e885", + "metadata": {}, + "source": [ + "### Symbolic variable" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "id": "3661408d", + "metadata": {}, + "outputs": [], + "source": [ + "# Paramètres symboliques\n", + "A_sym = pt.matrix(\"A\") # (n, n)\n", + "H_sym = pt.matrix(\"H\") # (n, n)\n", + "Q_sym = pt.matrix(\"Q\") # (n, n)\n", + "R_sym = pt.matrix(\"R\") # (n, n)\n", + "T_sym = pt.matrix(\"T\") # (n, n)\n", + "Z_sym = pt.matrix(\"Z\") # (n, n)\n", + "\n", + "x0_sym = pt.vector(\"x0\") # (n,)\n", + "y_sym = pt.matrix(\"y\") # (T, n) : observations\n", + "\n", + "a0_sym = pt.vector(\"a0\") \n", + "P0_sym = pt.matrix(\"P0\") \n", + "\n", + "data_sym = pt.matrix('data_sym') # [T, obs_dim]" + ] + }, + { + "cell_type": "markdown", + "id": "19e6a32d", + "metadata": {}, + "source": [ + "### Kalman filter with classic gradient" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "id": "35351096", + "metadata": {}, + "outputs": [], + "source": [ + "def predict(a, P, T, Q):\n", + " a_hat = T @ a # x_n|n-1\n", + " P_hat = T @ P @ T.T + Q # P_n|n-1\n", + " return a_hat, P_hat\n", + "\n", + "def update(y, a, P, Z, H):\n", + " v = y - Z.dot(a) # z_n\n", + " PZT = P.dot(Z.T) \n", + "\n", + " F = Z.dot(PZT) + H # S_n\n", + " F_inv = pt.linalg.inv(F) # S_n^(-1)\n", + " K = PZT.dot(F_inv) # K_n\n", + "\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + " a_filtered = a + K.dot(v) # x_n|n\n", + " P_filtered = I_KZ @ P # P_n|n\n", + "\n", + " inner_term = v.T @ F_inv @ v\n", + " _, F_logdet = pt.linalg.slogdet(F) # log det S_n\n", + " ll = (F_logdet + inner_term).ravel()[0] # Loss\n", + "\n", + " return [a_filtered, P_filtered, Z.dot(a), F, ll]\n", + "\n", + "def kalman_step(y, a, P, T, Z, H, Q):\n", + " a_filtered, P_filtered, obs_mu, obs_cov, ll = update(y=y, a=a, P=P, Z=Z, H=H)\n", + " a_hat, P_hat = predict(a=a_filtered, P=P_filtered, T=T, Q=Q)\n", + " return [a_filtered, a_hat, obs_mu, P_filtered, P_hat, obs_cov, ll]\n", + "\n", + "\n", + "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", + "\n", + "results_seq, updates = pytensor.scan(\n", + " kalman_step,\n", + " sequences=[data_sym],\n", + " outputs_info=outputs_info,\n", + " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", + " strict=False,\n", + ")\n", + "# --- Loss ---\n", + "a_upd_seq, a_pred_seq, y_hat_seq, P_upd_seq, P_pred_seq, obs_cov, ll_seq = results_seq\n", + "loss = pt.sum(ll_seq)" + ] + }, + { + "cell_type": "markdown", + "id": "ece2f47e", + "metadata": {}, + "source": [ + "### Custom gradient" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "afb362e5", + "metadata": {}, + "outputs": [], + "source": [ + "def custom_grad(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_filtered, P_filtered, y_hat = out\n", + " a_hat_grad, P_hat_grad, y_grad = out_grad\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " H_inv = pt.linalg.inv(H)\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + " \n", + " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", + " grad_y = K.T @ T.T @ a_hat_grad + 2 * F_inv @ v\n", + "\n", + "\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x')\n", + " v = v.dimshuffle(0, 'x')\n", + " \n", + " P_filtered_grad = T.T @ P_hat_grad @ T\n", + " a_filtered_grad = T.T @ a_hat_grad \n", + "\n", + " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", + " grad_Z = None\n", + " grad_T = None\n", + " grad_Q = P_hat_grad\n", + " grad_H = K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv\n", + "\n", + " return [grad_P_hat,\n", + " grad_a_pred,\n", + " grad_y,\n", + " grad_Z,\n", + " grad_T,\n", + " grad_Q,\n", + " grad_H]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "ee21ef4e", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_a_hat(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, _, _ = out_grad\n", + "\n", + " v = y - Z.dot(a) \n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H \n", + " F_inv = pt.linalg.inv(F)\n", + " \n", + " K = PZT.dot(F_inv) \n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", + "\n", + " return grad_a_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "8c89b018", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_P_hat(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_hat_grad, ll_grad = out_grad\n", + "\n", + " v = y - Z.dot(a)\n", + " v = v.dimshuffle(0, 'x')\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", + "\n", + " P_filtered_grad = T.T @ P_hat_grad @ T\n", + " a_filtered_grad = T.T @ a_hat_grad \n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + "\n", + " H_inv = pt.linalg.inv(H) \n", + " F_inv = pt.linalg.inv(F)\n", + " \n", + " K = PZT.dot(F_inv) \n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", + "\n", + " return grad_P_hat" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "bba53a26", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_y(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_h_grad, y_grad = out_grad\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv) \n", + " \n", + " return K.T @ T.T @ a_hat_grad + 2 * F_inv @ v" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c17949b7", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_Q(inp, out, out_grad):\n", + " _, P_h_grad, _ = out_grad\n", + " return P_h_grad" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "84cb6867", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_H(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_h_grad, y_grad = out_grad\n", + " \n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + "\n", + " v = v.dimshuffle(0, 'x')\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", + "\n", + " a_filtered_grad = T.T @ a_hat_grad\n", + " P_filtered_grad = T.T @ P_h_grad @ T\n", + "\n", + " return K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv" + ] + }, + { + "cell_type": "markdown", + "id": "607753a1", + "metadata": {}, + "source": [ + "### Custom Kalman Filter" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "7cead2c1", + "metadata": {}, + "outputs": [], + "source": [ + "y_sym = pt.vector(\"y\")\n", + "\n", + "kalman_step_op = OpFromGraph(\n", + " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", + " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, None, None, grad_H, grad_Q],\n", + " inline=True\n", + ")\n", + "\n", + "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", + "\n", + "results_op, updates = pytensor.scan(\n", + " kalman_step_op,\n", + " sequences=[data_sym],\n", + " outputs_info=outputs_info,\n", + " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", + " strict=False,\n", + ")\n", + "# --- Loss ---\n", + "a_upd_op, a_pred_op, y_hat_op, P_upd_op, P_pred_op, obs_cov, ll_op = results_op\n", + "loss_op = pt.sum(ll_op)" + ] + }, + { + "cell_type": "markdown", + "id": "f0575c2c", + "metadata": {}, + "source": [ + "### Speed observation" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "07c3879e", + "metadata": {}, + "outputs": [], + "source": [ + "states = [1, 5, 10, 20, 35, 50, 75, 90, 100]" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "f90f682d", + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark_kalman_gradients(loss, state_dims, N=30):\n", + " results = defaultdict(dict)\n", + " for _ in range(10):\n", + " for n in state_dims:\n", + " data = generate_kalman_dataset(n, N=N, seed=42 + n)\n", + "\n", + " # --- gradients symboliques ---\n", + " t0 = perf_counter()\n", + " grad_list = pt.grad(loss, [a0_sym])\n", + " t1 = perf_counter()\n", + " grad_symbolic_time = t1 - t0\n", + " results[n][\"grad_symbolic_time\"] = grad_symbolic_time/10\n", + "\n", + " # --- compilation ---\n", + " t0 = perf_counter()\n", + " f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list,\n", + " )\n", + " t1 = perf_counter()\n", + " compile_time = t1 - t0\n", + " results[n][\"compile_time\"] = compile_time/10\n", + "\n", + " # --- exécution ---\n", + " t0 = perf_counter()\n", + " _ = f_grad(\n", + " data[\"y\"],\n", + " data[\"A0\"],\n", + " data[\"P0\"],\n", + " data[\"T\"],\n", + " data[\"Z\"],\n", + " data[\"H\"],\n", + " data[\"Q\"],\n", + " )\n", + " t1 = perf_counter()\n", + " exec_time = t1 - t0\n", + " results[n][\"exec_time\"] = exec_time/10\n", + "\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "27a60fb3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", + " r = _umath_linalg.det(a, signature=signature)\n" + ] + } + ], + "source": [ + "results = benchmark_kalman_gradients(loss, states, N=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f6d314a", + "metadata": {}, + "outputs": [], + "source": [ + "results_op = benchmark_kalman_gradients(loss_op, states, N=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "382e90ef", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "tps_execution = [results[i][\"exec_time\"] for i in states]\n", + "tps_execution_op = [results_op[i][\"exec_time\"] for i in states]\n", + "plt.plot(states, tps_execution, color=\"C1\")\n", + "plt.plot(states, tps_execution_op, color=\"limegreen\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "287cb6ef", + "metadata": {}, + "source": [ + "### Handmade Numpy Backpropagation " + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "e1469fb0", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_grad(observations, a0, P0, a_pred_seq, P_pred_seq, Z, H, T):\n", + " # Constant\n", + " SHAPE_a0 = a0.shape[0]\n", + " NB_obs = len(observations)\n", + "\n", + " # Initialisation for the backprop\n", + " PZT = P_pred_seq[-2].dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + " \n", + " grad = [0 for _ in range(NB_obs)]\n", + " grad[-1] = - 2 * Z.T @ F_inv @ (observations[-1] - Z @ a_pred_seq[-2])\n", + "\n", + " # Backprop\n", + " for i in range(3, NB_obs+1):\n", + "\n", + " PZT = P_pred_seq[-i].dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", + "\n", + " grad[1-i] = I_KZ.T @ T.T @ grad[2-i] - (2 * Z.T @ F_inv @ (observations[1-i] - Z @ a_pred_seq[-i])).T \n", + "\n", + " # Last iter with a0/P0\n", + " PZT = P0.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", + "\n", + " grad[0] = I_KZ.T @ T.T @ grad[1] - (2 * Z.T @ F_inv @ (observations[0] - Z @ a0)).T\n", + "\n", + " return grad" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "479b8832", + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark_kalman_gradients_np(loss, a_pred_seq, P_pred_seq, state_dims, N=3):\n", + " results = defaultdict(dict)\n", + " kalman_fn = pytensor.function(inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=(a_pred_seq, P_pred_seq))\n", + " \n", + " for _ in range(10):\n", + " for n in state_dims:\n", + " data = generate_kalman_dataset(n, N=N, seed=42 + n)\n", + "\n", + " # --- forward pass ---\n", + " t0 = perf_counter()\n", + " a_pred, P_pred = kalman_fn(data[\"y\"],\n", + " data[\"A0\"],\n", + " data[\"P0\"],\n", + " data[\"T\"],\n", + " data[\"Z\"],\n", + " data[\"H\"],\n", + " data[\"Q\"],)\n", + " t1 = perf_counter()\n", + " forward_pass = t1 - t0\n", + " results[n][\"Forward pass\"] = forward_pass/10\n", + "\n", + " # --- Backprop ---\n", + " t0 = perf_counter()\n", + " grad = compute_grad(data[\"y\"],\n", + " data[\"A0\"],\n", + " data[\"P0\"],\n", + " a_pred,\n", + " P_pred,\n", + " data[\"Z\"],\n", + " data[\"H\"],\n", + " data[\"T\"],)\n", + " t1 = perf_counter()\n", + " compile_time = t1 - t0\n", + " results[n][\"Backprop\"] = compile_time/10\n", + "\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "1e633e75", + "metadata": {}, + "outputs": [], + "source": [ + "results_np = benchmark_kalman_gradients_np(loss, a_pred_seq, P_pred_seq, states, N=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "id": "7109d7bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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/HyvY+90Ohk8eLCOfR3dc889DB8+nBtvvNGrXce6/ixZsoSkpCRuu+022rVrR9++fXnhhRc87+tY159rrrmGDz74gO3btwOwYcMGVq9ezbBhwwAd64ZSm+Oak5NDaWmpV58OHTrQu3fvBjn2zWpCy/NRWFhIeXk5MTExXu0xMTHk5+fbVJX/McaQnp7ONddcQ+/evQE8x7eqY//dd99d8BqbuoULF7Ju3Tq++OKLSu/pWNefHTt2MGfOHNLT05k6dSqff/4548ePx+l0ctddd+lY16NJkybhcrno0aMHQUFBlJeXM336dH7xi18A+nvdUGpzXPPz8wkJCaFNmzaV+jTEb6dCjY8CAgK81o0xldqk7u699142btzI6tWrK72nY3/+du/ezYQJE1ixYgWhoaHV9tOxPn8VFRUkJSXxxBNPANC3b182b97MnDlzuOuuuzz9dKzP36JFi1iwYAGvvPIKl112GevXryctLY0OHTowduxYTz8d64ZRl+PaUMdep59qKTo6mqCgoErJsqCgoFJKlbq57777WLJkCR999BEdO3b0tMfGxgLo2NeDnJwcCgoKSExMxOFw4HA4yMrK4rnnnsPhcHiOp471+Wvfvj29evXyauvZsyd5eXmA/l7Xp/vvv5/Jkyfz85//nMsvv5wxY8YwceJEMjIyAB3rhlKb4xobG0tJSQmHDh2qtk99UqippZCQEBITE8nMzPRqz8zMpH///jZV5R+MMdx777288cYbfPjhh8TFxXm9HxcXR2xsrNexLykpISsrS8feRzfccAObNm1i/fr1nldSUhJ33HEH69evJz4+Xse6ngwYMKDSowm2b99Oly5dAP29rk/Hjx8nMND75ywoKMhzS7eOdcOozXFNTEwkODjYq8++ffv48ssvG+bY1/ulx37s1C3d8+fPN1u2bDFpaWkmPDzc7Nq1y+7SmrTf/va3JjIy0qxcudLs27fP8zp+/Linz4wZM0xkZKR54403zKZNm8wvfvEL3Y5ZT868+8kYHev68vnnnxuHw2GmT59uvv76a/Ovf/3LtGjRwixYsMDTR8e6fowdO9b86Ec/8tzS/cYbb5jo6GjzwAMPeProWNfNkSNHTG5ursnNzTWAefbZZ01ubq7nUSa1Oa6pqammY8eO5v333zfr1q0z119/vW7pbiyef/5506VLFxMSEmISEhI8tx1L3QFVvl588UVPn4qKCvPwww+b2NhY43Q6zaBBg8ymTZvsK9qPnB1qdKzrz9KlS03v3r2N0+k0PXr0MPPmzfN6X8e6frjdbjNhwgTTuXNnExoaauLj4820adNMcXGxp4+Odd189NFHVf77PHbsWGNM7Y5rUVGRuffee03btm1NWFiYGTFihMnLy2uQegOMMab+x39ERERELixdUyMiIiJ+QaFGRERE/IJCjYiIiPgFhRoRERHxCwo1IiIi4hcUakRERMQvKNSIiIiIX1CoEREREb+gUCMiIiJ+QaFGRERE/IJCjYiIiPgFhRoRERHxC/8fLd2ekRekri0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "tps_execution = [results[i][\"exec_time\"] for i in states]\n", + "tps_execution_np = [results_np[i][\"Backprop\"] + results_np[i][\"Forward pass\"] for i in states]\n", + "plt.plot(states, tps_execution, color=\"C1\")\n", + "plt.plot(states, tps_execution_np, color=\"limegreen\")" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "f2dbe75f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0017101200064644217\n" + ] + } + ], + "source": [ + "print(results[20][\"exec_time\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "614d5f94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.00022822999162599444\n" + ] + } + ], + "source": [ + "print(results_np[20][\"Backprop\"] + results_np[20][\"Forward pass\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CausalPy", + "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.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 644b51f855c2c21ba01d3e90b53ba597c0ec579e Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Mon, 4 Aug 2025 17:03:30 +0200 Subject: [PATCH 2/6] Updating the notebook --- notebooks/Kalman_Filter_Gradient.ipynb | 1002 +++++++++++++++++++++++ notebooks/Kalman_Filter_Gradients.ipynb | 743 ----------------- 2 files changed, 1002 insertions(+), 743 deletions(-) create mode 100644 notebooks/Kalman_Filter_Gradient.ipynb delete mode 100644 notebooks/Kalman_Filter_Gradients.ipynb diff --git a/notebooks/Kalman_Filter_Gradient.ipynb b/notebooks/Kalman_Filter_Gradient.ipynb new file mode 100644 index 00000000..7bea8141 --- /dev/null +++ b/notebooks/Kalman_Filter_Gradient.ipynb @@ -0,0 +1,1002 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "69ae14a1", + "metadata": {}, + "source": [ + "### Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "id": "90979a41", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import pytensor\n", + "import pytensor.tensor as pt\n", + "import matplotlib.pyplot as plt\n", + "from pytensor.compile.builders import OpFromGraph\n", + "from time import perf_counter\n", + "from collections import defaultdict\n", + "import pymc_extras as pmx\n", + "from pymc_extras.statespace import structural as sts\n", + "import pytensor\n", + "from pytensor.graph.basic import explicit_graph_inputs\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "a0d008fc", + "metadata": {}, + "source": [ + "### Generate a random dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdb156d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".f at 0x000001820DC942C0>\n" + ] + } + ], + "source": [ + "mod = (\n", + " sts.LevelTrendComponent(order=2, innovations_order=[0, 1], name='level') +\n", + " sts.AutoregressiveComponent(order=1, name='ar') +\n", + " sts.MeasurementError(name='obs_error')\n", + ").build(verbose = False)\n", + "\n", + "param_values = {\n", + " 'initial_level': np.array([10, 0.1]),\n", + " 'sigma_level': np.array([1e-2]),\n", + " 'params_ar': np.array([0.95]),\n", + " 'sigma_ar': np.array(1e-2),\n", + " 'sigma_obs_error': np.array(1e-2),\n", + "}\n", + "\n", + "data_fn = pmx.statespace.compile_statespace(mod, steps=100)\n", + "hidden_state_data, obs_data = data_fn(**param_values)\n", + "\n", + "matrices = mod._unpack_statespace_with_placeholders()\n", + "\n", + "matrix_fn = pytensor.function(list(explicit_graph_inputs(matrices)),\n", + " matrices)\n", + "a0, P0, c, d, T, Z, R, H, Q = matrix_fn(**param_values, initial_state_cov=np.eye(mod.k_states))" + ] + }, + { + "cell_type": "markdown", + "id": "51b7e885", + "metadata": {}, + "source": [ + "### Symbolic variable" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "id": "3661408d", + "metadata": {}, + "outputs": [], + "source": [ + "# Paramètres symboliques\n", + "A_sym = pt.matrix(\"A\") # (n, n)\n", + "H_sym = pt.matrix(\"H\") # (n, n)\n", + "Q_sym = pt.matrix(\"Q\") # (n, n)\n", + "R_sym = pt.matrix(\"R\") # (n, n)\n", + "T_sym = pt.matrix(\"T\") # (n, n)\n", + "Z_sym = pt.matrix(\"Z\") # (n, n)\n", + "y_sym = pt.matrix(\"y\") # (T, n) : observations\n", + "\n", + "a0_sym = pt.vector(\"a0\") # (n,) \n", + "P0_sym = pt.matrix(\"P0\") # (n, n)\n", + "\n", + "data_sym = pt.matrix('data_sym') # [T, obs_dim]" + ] + }, + { + "cell_type": "markdown", + "id": "19e6a32d", + "metadata": {}, + "source": [ + "## Kalman filter with classic gradient" + ] + }, + { + "cell_type": "markdown", + "id": "4fb4cef1", + "metadata": {}, + "source": [ + "### The Loss\n", + "\n", + "The Negative Log-Likelihood loss os given in the paper as the following expression :\n", + "\n", + "$$\n", + "L_{NLL} = \\sum l_{n|n} + l_{n|n-1}\n", + "$$\n", + "\n", + "Where :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&l_{n|n} = 0 \\\\\n", + "&l_{n|n-1} = log det(F) + v_n^TFv_n\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "id": "35351096", + "metadata": {}, + "outputs": [], + "source": [ + "def predict(a, P, T, Q):\n", + " a_hat = T @ a # x_n|n-1\n", + " P_hat = T @ P @ T.T + Q # P_n|n-1\n", + " return a_hat, P_hat\n", + "\n", + "def update(y, a, P, Z, H):\n", + " v = y - Z.dot(a) # z_n\n", + " PZT = P.dot(Z.T) \n", + "\n", + " F = Z.dot(PZT) + H # S_n\n", + " F_inv = pt.linalg.inv(F) # S_n^(-1)\n", + " K = PZT.dot(F_inv) # K_n\n", + "\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + " a_filtered = a + K.dot(v) # x_n|n\n", + " P_filtered = I_KZ @ P # P_n|n\n", + "\n", + " inner_term = v.T @ F_inv @ v\n", + " _, F_logdet = pt.linalg.slogdet(F) # log det S_n\n", + " ll = (F_logdet + inner_term).ravel()[0] # Loss\n", + "\n", + " return [a_filtered, P_filtered, Z.dot(a), F, ll]\n", + "\n", + "def kalman_step(y, a, P, T, Z, H, Q):\n", + " a_filtered, P_filtered, obs_mu, obs_cov, ll = update(y=y, a=a, P=P, Z=Z, H=H)\n", + " a_hat, P_hat = predict(a=a_filtered, P=P_filtered, T=T, Q=Q)\n", + " return [a_filtered, a_hat, obs_mu, P_filtered, P_hat, obs_cov, ll]\n", + "\n", + "\n", + "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", + "\n", + "results_seq, updates = pytensor.scan(\n", + " kalman_step,\n", + " sequences=[data_sym],\n", + " outputs_info=outputs_info,\n", + " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", + " strict=False,\n", + ")\n", + "\n", + "# --- Loss ---\n", + "a_upd_seq, a_pred_seq, y_hat_seq, P_upd_seq, P_pred_seq, obs_cov, ll_seq = results_seq\n", + "loss = pt.sum(ll_seq)" + ] + }, + { + "cell_type": "markdown", + "id": "ece2f47e", + "metadata": {}, + "source": [ + "## Custom gradient" + ] + }, + { + "cell_type": "markdown", + "id": "5dc91ae7", + "metadata": {}, + "source": [ + "### Gradient with respect to **$a_{n-1|n-1}$**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{da_{n-1|n-1}} = T_n^T \\frac{dL}{da_{n|n-1}} \n", + "+ \\frac{dl_{n-1|n-1}}{da_{n-1|n-1}} \\quad &\\text{(equation 22)} \\\\\n", + "&\\frac{dl_{n|n}}{da_{n|n}} = 0 \\quad &\\text{(equation 28)}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{da_{n-1|n-1}} = T_n^T \\frac{dL}{da_{n|n-1}} \n", + "\\end{align}\n", + "$$\n", + "\n", + "### Gradient with respect to **$P_{n-1|n-1}$**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dP_{n-1|n-1}} = T_n^T \\frac{dL}{dP_{n|n-1}} T_n\n", + "+ \\frac{dl_{n-1|n-1}}{dP_{n-1|n-1}} \\quad &\\text{(equation 23)} \\\\\n", + "&\\frac{dl_{n|n}}{dP_{n|n}} = 0 \\quad &\\text{(equation 28)}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dP_{n-1|n-1}} = T_n^T \\frac{dL}{dP_{n|n-1}} T_n\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "id": "22a3560b", + "metadata": {}, + "source": [ + "### Gradient with respect to **$a_{n|n-1}$**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{da_{n|n-1}} = (I - K_n Z_n)^T \\frac{dL}{da_{n|n}} + \\frac{dl_{n|n-1}}{da_{n|n-1}} \\quad &\\text{(equation 20)} \\\\\n", + "&\\frac{dl_{n|n-1}}{da_{n|n-1}} = -2 Z_n^{T}F_n^{-1} v_n \\quad &\\text{(equation 30)} \\\\\n", + "&\\frac{dL}{da_{n|n}} = T_n^T \\frac{dL}{da_{n+1|n}} \\quad &\\text{see gradient with respect to} \\quad a_{n|n}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{da_{n|n-1}} = (I - K_n Z_n)^T T_n^T \\frac{dL}{da_{n+1|n}} - 2 Z_n^{T}F^{-1} v_n\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "ee21ef4e", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_a_hat(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, _, _ = out_grad\n", + "\n", + " v = y - Z.dot(a) \n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H \n", + " F_inv = pt.linalg.inv(F)\n", + " \n", + " K = PZT.dot(F_inv) \n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", + "\n", + " return grad_a_pred" + ] + }, + { + "cell_type": "markdown", + "id": "293d8d65", + "metadata": {}, + "source": [ + "### Gradient with respect to **$P_{n|n-1}$**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dP_{n|n-1}} = (I - K_n Z_n)^T [\n", + " \\frac{dL}{dP_{n|n}}\n", + " + \\frac{1}{2} \\frac{dL}{da_{n|n}} v_n^T H_n^-1 Z_n\n", + " + \\frac{1}{2} Z_n^T R_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T\n", + " ](I - K_n Z_n) \n", + " + \\frac{dl{n|n-1}}{dP_{n|n-1}} \\quad &\\text{(equation 21)} \\\\\n", + "&\\frac{dl_{n|n-1}}{dP_{n|n-1}} = Z_n^T F_n^{-1} Z_n - Z_n^T F_n^-1 v_n v_n^T F_n^{-1} Z_n \\quad &\\text{(equation 29)} \\\\\n", + "&\\frac{dL}{da_{n|n}} = T_n^T \\frac{dL}{da_{n+1|n}} \\quad &\\text{see gradient with respect to} \\quad a_{n|n} \\\\\n", + "&\\frac{dL}{dP_{n|n}} = T_n^T \\frac{dL}{dP_{n+1|n}} T_n \\quad &\\text{see gradient with respect to} \\quad P_{n|n}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dP_{n|n-1}} = (I - K_n Z_n)^T [\n", + " T_n^T \\frac{dL}{dP_{n+1|n}} T_n\n", + " + \\frac{1}{2} T_n^T \\frac{dL}{da_{n+1|n}} v_n^T H_n^{-1} Z_n\n", + " + \\frac{1}{2} Z_n^T H_n^{-1} v_n (T_n^T \\frac{dL}{da_{n+1|n}})^T\n", + " ](I - K_n Z_n) \n", + " + Z_n^T F_n^{-1} Z_n \n", + " - Z_n^T F_n^{-1} v_n v_n^T F_n^{-1} Z_n\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "8c89b018", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_P_hat(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_hat_grad, ll_grad = out_grad\n", + "\n", + " v = y - Z.dot(a)\n", + " v = v.dimshuffle(0, 'x')\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", + "\n", + " P_filtered_grad = T.T @ P_hat_grad @ T\n", + " a_filtered_grad = T.T @ a_hat_grad \n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + "\n", + " H_inv = pt.linalg.inv(H) \n", + " F_inv = pt.linalg.inv(F)\n", + " \n", + " K = PZT.dot(F_inv) \n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", + "\n", + " return grad_P_hat" + ] + }, + { + "cell_type": "markdown", + "id": "f0f2dce4", + "metadata": {}, + "source": [ + "### Gradient with respect to **y**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dy_n} = K_n^T\\frac{dL}{da_{n|n}} + \\frac{dl_{n|n-1}}{dy_n} \\quad &\\text{(equation 24)} \\\\\n", + "&\\frac{dl_{n|n-1}}{dy_n} = 2F^{-1}v_n \\quad &\\text{(equation 31)} \\\\\n", + "&\\frac{dL}{da_{n|n}} = T_n^T \\frac{dL}{da_{n+1|n}} \\quad &\\text{see gradient with respect to} \\quad a_{n|n} \\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dy_n} = K_n^TT_n^T\\frac{dL}{da_{n+1|n}} + 2F^{-1}v_n\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "bba53a26", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_y(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_h_grad, y_grad = out_grad\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv) \n", + " \n", + " return K.T @ T.T @ a_hat_grad + 2 * F_inv @ v" + ] + }, + { + "cell_type": "markdown", + "id": "d6b48789", + "metadata": {}, + "source": [ + "### Gradient with respect to Q\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "\\frac{dL}{dQ_n} = \\frac{dL}{dP_{n|n-1}} & \\quad \\text{(equation 25)}\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c17949b7", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_Q(inp, out, out_grad):\n", + " _, P_h_grad, _ = out_grad\n", + " return P_h_grad" + ] + }, + { + "cell_type": "markdown", + "id": "f0bc0287", + "metadata": {}, + "source": [ + "## Gradient with respect to **H**\n", + "\n", + "From the article we have :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dH_n} = K_n^T\\frac{dL}{dP_{n|n}}K_n \n", + "- \\frac{1}{2} K_n^T \\frac{dL}{da_{n|n}} v_n^T F^{-1}\n", + "- \\frac{1}{2} S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T K_n\n", + "+ \\frac{dl_{n|n-1}}{dH_n} \n", + "\\quad &\\text{(equation 26)} \\\\\n", + "&\\frac{dl_{n|n-1}}{dH_n} = F^{-1} - F_n^{-1} v_n v_n^T F_n^{-1} \n", + "\\quad &\\text{(equation 31)} \\\\\n", + "&\\frac{dL}{da_{n|n}} = T_n^T \\frac{dL}{da_{n+1|n}} \\quad &\\text{see gradient with respect to} \\quad a_{n|n} \\\\\n", + "&\\frac{dL}{dP_{n|n}} = T_n^T \\frac{dL}{dP_{n+1|n}} T_n \\quad &\\text{see gradient with respect to} \\quad P_{n|n}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Givent this two equations, we now have :\n", + "$$\n", + "\\begin{align}\n", + "&\\frac{dL}{dH_n} = K_n^T T_n^T \\frac{dL}{dP_{n+1|n}} T_n K_n \n", + "- \\frac{1}{2} K_n^T T_n^T \\frac{dL}{da_{n+1|n}} v_n^T F^{-1}\n", + "- \\frac{1}{2} F_n^{-1} v_n (T_n^T \\frac{dL}{da_{n+1|n}})^T K_n\n", + "+ F^{-1} - F_n^{-1} v_n v_n^T F_n^{-1}\n", + "\\end{align}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "84cb6867", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_H(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_h_grad, y_grad = out_grad\n", + " \n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + "\n", + " v = v.dimshuffle(0, 'x')\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", + "\n", + " a_filtered_grad = T.T @ a_hat_grad\n", + " P_filtered_grad = T.T @ P_h_grad @ T\n", + "\n", + " return K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv" + ] + }, + { + "cell_type": "markdown", + "id": "bd458dee", + "metadata": {}, + "source": [ + "### Total grad" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afb362e5", + "metadata": {}, + "outputs": [], + "source": [ + "def custom_grad(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_filtered, P_filtered, y_hat = out\n", + " a_hat_grad, P_hat_grad, y_grad = out_grad\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " H_inv = pt.linalg.inv(H)\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + " \n", + " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", + " grad_y = K.T @ T.T @ a_hat_grad + 2 * F_inv @ v\n", + "\n", + "\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x')\n", + " v = v.dimshuffle(0, 'x')\n", + " \n", + " P_filtered_grad = T.T @ P_hat_grad @ T\n", + " a_filtered_grad = T.T @ a_hat_grad \n", + "\n", + " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", + " grad_Z = None\n", + " grad_T = None\n", + " grad_Q = P_hat_grad\n", + " grad_H = K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv\n", + "\n", + " return [grad_P_hat,\n", + " grad_a_pred,\n", + " grad_y,\n", + " grad_Z,\n", + " grad_T,\n", + " grad_Q,\n", + " grad_H]\n" + ] + }, + { + "cell_type": "markdown", + "id": "607753a1", + "metadata": {}, + "source": [ + "## Custom Kalman Filter" + ] + }, + { + "cell_type": "code", + "execution_count": 259, + "id": "7cead2c1", + "metadata": {}, + "outputs": [], + "source": [ + "y_sym = pt.vector(\"y\")\n", + "\n", + "kalman_step_op = OpFromGraph(\n", + " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", + " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, None, None, grad_H, grad_Q],\n", + " inline=True\n", + ")\n", + "\n", + "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", + "\n", + "results_op, updates = pytensor.scan(\n", + " kalman_step_op,\n", + " sequences=[data_sym],\n", + " outputs_info=outputs_info,\n", + " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", + " strict=False,\n", + ")\n", + "# --- Loss ---\n", + "a_upd_op, a_pred_op, y_hat_op, P_upd_op, P_pred_op, obs_cov, ll_op = results_op\n", + "loss_op = pt.sum(ll_op)" + ] + }, + { + "cell_type": "markdown", + "id": "3f79c5c6", + "metadata": {}, + "source": [ + "## Handmade Numpy Backpropagation " + ] + }, + { + "cell_type": "code", + "execution_count": 264, + "id": "b6eb5d48", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_grad_a0(observations, a0, P0, a_pred_seq, P_pred_seq, Z, H, T):\n", + " # Constant\n", + " SHAPE_a0 = a0.shape[0]\n", + " NB_obs = len(observations)\n", + "\n", + " # Initialisation for the backprop\n", + " PZT = P_pred_seq[-2].dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + " \n", + " grad = [0 for _ in range(NB_obs)]\n", + " grad[-1] = - 2 * Z.T @ F_inv @ (observations[-1] - Z @ a_pred_seq[-2])\n", + "\n", + " # Backprop\n", + " for i in range(3, NB_obs+1):\n", + "\n", + " PZT = P_pred_seq[-i].dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", + "\n", + " grad[1-i] = I_KZ.T @ T.T @ grad[2-i] - (2 * Z.T @ F_inv @ (observations[1-i] - Z @ a_pred_seq[-i])).T \n", + "\n", + " # Last iter with a0/P0\n", + " PZT = P0.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", + "\n", + " grad[0] = I_KZ.T @ T.T @ grad[1] - (2 * Z.T @ F_inv @ (observations[0] - Z @ a0)).T\n", + "\n", + " return grad" + ] + }, + { + "cell_type": "markdown", + "id": "f0575c2c", + "metadata": {}, + "source": [ + "## Speed observation" + ] + }, + { + "cell_type": "markdown", + "id": "c99fddf9", + "metadata": {}, + "source": [ + "### Benchmark for pytensor computed gradients" + ] + }, + { + "cell_type": "code", + "execution_count": 253, + "id": "908946b0", + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark_kalman_gradients(loss, obs_data, a0, P0, T, Z, R, H, Q):\n", + " results = defaultdict(dict)\n", + " exec_time = 0\n", + "\n", + " grad_list = pt.grad(loss, [a0_sym])\n", + " f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list,\n", + " )\n", + "\n", + " for _ in range(20):\n", + " \n", + " # --- exécution ---\n", + " t0 = perf_counter()\n", + " _ = f_grad(\n", + " obs_data[:, np.newaxis],\n", + " a0,\n", + " P0,\n", + " T,\n", + " Z,\n", + " H,\n", + " R @ Q @ R.T,\n", + " )\n", + " t1 = perf_counter()\n", + " exec_time += (t1 - t0)/20\n", + " \n", + " \n", + " results[\"exec_time\"] = exec_time\n", + "\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "f03a7555", + "metadata": {}, + "source": [ + "### Benchmark for numpy computed gradient" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a85fe92e", + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark_kalman_gradients_np(a_pred_seq, P_pred_seq, obs_data, a0, P0, T, Z, R, H, Q):\n", + " results = defaultdict(dict)\n", + " forward_pass = 0\n", + " backprop = 0\n", + " kalman_fn = pytensor.function(inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=(a_pred_seq, P_pred_seq))\n", + "\n", + " for _ in range(20):\n", + "\n", + " # --- forward pass ---\n", + " t0 = perf_counter()\n", + " a_pred, P_pred = kalman_fn(obs_data[:, np.newaxis],\n", + " a0,\n", + " P0,\n", + " T,\n", + " Z,\n", + " H,\n", + " R@Q@R.T,)\n", + " t1 = perf_counter()\n", + " forward_pass += (t1 - t0)/20\n", + " \n", + "\n", + " # --- Backprop ---\n", + " t0 = perf_counter()\n", + " _ = compute_grad_a0(\n", + " obs_data,\n", + " a0,\n", + " P0,\n", + " a_pred,\n", + " P_pred,\n", + " Z,\n", + " H,\n", + " T,)\n", + " t1 = perf_counter()\n", + " backprop += (t1 - t0)/20\n", + "\n", + " results[\"Forward pass\"] = forward_pass \n", + " results[\"Backprop\"] = backprop\n", + "\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "b413f411", + "metadata": {}, + "source": [ + "### Comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 254, + "id": "27a60fb3", + "metadata": {}, + "outputs": [], + "source": [ + "results = benchmark_kalman_gradients(loss, obs_data, a0, P0, T, Z, R, H, Q)" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "id": "a413c8e9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "defaultdict(, {'exec_time': 0.016296579997288063})\n" + ] + } + ], + "source": [ + "print(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 260, + "id": "d35b98d6", + "metadata": {}, + "outputs": [], + "source": [ + "results_op = benchmark_kalman_gradients(loss_op, obs_data, a0, P0, T, Z, R, H, Q)" + ] + }, + { + "cell_type": "code", + "execution_count": 261, + "id": "539c18c2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "defaultdict(, {'exec_time': 0.015451419999590144})\n" + ] + } + ], + "source": [ + "print(results_op)" + ] + }, + { + "cell_type": "code", + "execution_count": 267, + "id": "1e633e75", + "metadata": {}, + "outputs": [], + "source": [ + "results_np = benchmark_kalman_gradients_np(a_pred_seq, P_pred_seq, obs_data, a0, P0, T, Z, R, H, Q)" + ] + }, + { + "cell_type": "code", + "execution_count": 268, + "id": "7118dfec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "defaultdict(, {'Forward pass': 0.00269013000652194, 'Backprop': 0.002321220003068447})\n" + ] + } + ], + "source": [ + "print(results_np)" + ] + }, + { + "cell_type": "markdown", + "id": "d77cf70b", + "metadata": {}, + "source": [ + "## Error observation" + ] + }, + { + "cell_type": "markdown", + "id": "90fabd6f", + "metadata": {}, + "source": [ + "### Comparing the gradient with respect to a0" + ] + }, + { + "cell_type": "code", + "execution_count": 274, + "id": "fbae0189", + "metadata": {}, + "outputs": [], + "source": [ + "# First the classic way with autodiff\n", + "\n", + "grad_list = pt.grad(loss, [a0_sym])\n", + "f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list,\n", + ")\n", + "\n", + "grad_a0 = f_grad(obs_data[:, np.newaxis], a0, P0, T, Z, H, R @ Q @ R.T)\n", + "\n", + "# Now using our OpFromGraph custom gradient\n", + "\n", + "grad_list_op = pt.grad(loss_op, [a0_sym])\n", + "f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list_op,\n", + ")\n", + "\n", + "grad_a0_op = f_grad(obs_data[:, np.newaxis], a0, P0, T, Z, H, R @ Q @ R.T)\n", + "\n", + "# And here using our handmaid numpy backprop\n", + "\n", + "kalman_fn = pytensor.function(inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=(a_pred_seq, P_pred_seq))\n", + "a_pred, P_pred = kalman_fn(obs_data[:, np.newaxis], a0, P0, T, Z, H, R@Q@R.T)\n", + "\n", + "grad_a0_np = compute_grad_a0(obs_data, a0, P0, a_pred, P_pred, Z, H, T)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 278, + "id": "c3a114b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", + "Comparison between classic a0 gradient and our handmaid NumPy backprop : True\n" + ] + } + ], + "source": [ + "print(\"Comparison between classic a0 gradient and our custom OpFromGraph :\", np.allclose(grad_a0, grad_a0_op))\n", + "print(\"Comparison between classic a0 gradient and our handmaid NumPy backprop :\", np.allclose(grad_a0, grad_a0_np))" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "id": "867d5e2f", + "metadata": {}, + "outputs": [], + "source": [ + "# First the classic way with autodiff\n", + "\n", + "grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, H_sym, Q_sym])\n", + "f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list,\n", + ")\n", + "\n", + "grad_a0 = f_grad(obs_data[:, np.newaxis], a0, P0, T, Z, H, R @ Q @ R.T)\n", + "\n", + "# Now using our OpFromGraph custom gradient\n", + "\n", + "grad_list_op = pt.grad(loss_op, [data_sym, a0_sym, P0_sym, H_sym, Q_sym])\n", + "f_grad = pytensor.function(\n", + " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", + " outputs=grad_list_op,\n", + ")\n", + "\n", + "grad_a0_op = f_grad(obs_data[:, np.newaxis], a0, P0, T, Z, H, R @ Q @ R.T)" + ] + }, + { + "cell_type": "code", + "execution_count": 289, + "id": "25f0a57b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comparison between classic y gradient and our custom OpFromGraph : True\n", + "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", + "Comparison between classic P0 gradient and our custom OpFromGraph : True\n", + "Comparison between classic H gradient and our custom OpFromGraph : True\n", + "Comparison between classic Q gradient and our custom OpFromGraph : True\n" + ] + } + ], + "source": [ + "print(\"Comparison between classic y gradient and our custom OpFromGraph :\", np.allclose(grad_a0[0], grad_a0_op[0]))\n", + "print(\"Comparison between classic a0 gradient and our custom OpFromGraph :\", np.allclose(grad_a0[1], grad_a0_op[1]))\n", + "print(\"Comparison between classic P0 gradient and our custom OpFromGraph :\", np.allclose((grad_a0[2] + grad_a0[2].T)/2, grad_a0_op[2]))\n", + "print(\"Comparison between classic H gradient and our custom OpFromGraph :\", np.allclose(grad_a0[3], grad_a0_op[3]))\n", + "print(\"Comparison between classic Q gradient and our custom OpFromGraph :\", np.allclose((grad_a0[4] + grad_a0[4].T)/2, grad_a0_op[4]))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CausalPy", + "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.13.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/Kalman_Filter_Gradients.ipynb b/notebooks/Kalman_Filter_Gradients.ipynb deleted file mode 100644 index 9f33d39e..00000000 --- a/notebooks/Kalman_Filter_Gradients.ipynb +++ /dev/null @@ -1,743 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "69ae14a1", - "metadata": {}, - "source": [ - "### Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "90979a41", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import pytensor\n", - "import pytensor.tensor as pt\n", - "import matplotlib.pyplot as plt\n", - "from pytensor.compile.builders import OpFromGraph\n", - "from time import perf_counter\n", - "from collections import defaultdict" - ] - }, - { - "cell_type": "markdown", - "id": "a0d008fc", - "metadata": {}, - "source": [ - "### Generate dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "id": "f75a72e8", - "metadata": {}, - "outputs": [], - "source": [ - "def generate_kalman_dataset(n, N=100, seed=0):\n", - " rng = np.random.default_rng(seed)\n", - "\n", - " # 0. Initial state and cov\n", - " A0 = rng.normal(loc=0.0, scale=1.0, size=(n,))\n", - " # 3. Random process noise covariance Q (PSD)\n", - " P0_base = rng.normal(0, 1, size=(n, n))\n", - " P0 = P0_base @ P0_base.T + np.eye(n) * 1e-3 # ensure positive definite\n", - "\n", - " # 1. T stable random transition matrix T\n", - " T = rng.normal(0, 1, size=(n, n))\n", - " eigvals = np.linalg.eigvals(T)\n", - " spectral_radius = max(abs(eigvals))\n", - " T = T / (1.1 * spectral_radius) # shrink to ensure stability\n", - "\n", - " # 2. Random observation matrix Z\n", - " Z = rng.normal(0, 1, size=(n, n)) # full observations (m = n)\n", - "\n", - " # 3. Random process noise covariance Q (PSD)\n", - " Q_base = rng.normal(0, 1, size=(n, n))\n", - " Q = Q_base @ Q_base.T + np.eye(n) * 1e-3 # ensure positive definite\n", - "\n", - " # 4. Random observation noise covariance H (PSD)\n", - " H_base = rng.normal(0, 1, size=(n, n))\n", - " H = H_base @ H_base.T + np.eye(n) * 1e-3\n", - "\n", - " # 5. Initial state\n", - " x = np.zeros((N, n))\n", - " y = np.zeros((N, n))\n", - " x[0] = A0\n", - "\n", - " # 6. Simulate the system\n", - " for t in range(1, N):\n", - " w_t = rng.multivariate_normal(mean=np.zeros(n), cov=Q)\n", - " x[t] = T @ x[t-1] + w_t\n", - "\n", - " for t in range(N):\n", - " v_t = rng.multivariate_normal(mean=np.zeros(n), cov=H)\n", - " y[t] = Z @ x[t] + v_t\n", - "\n", - " return {\n", - " \"T\": T, \"Z\": Z, \"Q\": Q, \"H\": H,\n", - " \"x\": x, \"y\": y, \"A0\": A0, \"P0\": P0\n", - " }" - ] - }, - { - "cell_type": "markdown", - "id": "51b7e885", - "metadata": {}, - "source": [ - "### Symbolic variable" - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "id": "3661408d", - "metadata": {}, - "outputs": [], - "source": [ - "# Paramètres symboliques\n", - "A_sym = pt.matrix(\"A\") # (n, n)\n", - "H_sym = pt.matrix(\"H\") # (n, n)\n", - "Q_sym = pt.matrix(\"Q\") # (n, n)\n", - "R_sym = pt.matrix(\"R\") # (n, n)\n", - "T_sym = pt.matrix(\"T\") # (n, n)\n", - "Z_sym = pt.matrix(\"Z\") # (n, n)\n", - "\n", - "x0_sym = pt.vector(\"x0\") # (n,)\n", - "y_sym = pt.matrix(\"y\") # (T, n) : observations\n", - "\n", - "a0_sym = pt.vector(\"a0\") \n", - "P0_sym = pt.matrix(\"P0\") \n", - "\n", - "data_sym = pt.matrix('data_sym') # [T, obs_dim]" - ] - }, - { - "cell_type": "markdown", - "id": "19e6a32d", - "metadata": {}, - "source": [ - "### Kalman filter with classic gradient" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "id": "35351096", - "metadata": {}, - "outputs": [], - "source": [ - "def predict(a, P, T, Q):\n", - " a_hat = T @ a # x_n|n-1\n", - " P_hat = T @ P @ T.T + Q # P_n|n-1\n", - " return a_hat, P_hat\n", - "\n", - "def update(y, a, P, Z, H):\n", - " v = y - Z.dot(a) # z_n\n", - " PZT = P.dot(Z.T) \n", - "\n", - " F = Z.dot(PZT) + H # S_n\n", - " F_inv = pt.linalg.inv(F) # S_n^(-1)\n", - " K = PZT.dot(F_inv) # K_n\n", - "\n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", - " a_filtered = a + K.dot(v) # x_n|n\n", - " P_filtered = I_KZ @ P # P_n|n\n", - "\n", - " inner_term = v.T @ F_inv @ v\n", - " _, F_logdet = pt.linalg.slogdet(F) # log det S_n\n", - " ll = (F_logdet + inner_term).ravel()[0] # Loss\n", - "\n", - " return [a_filtered, P_filtered, Z.dot(a), F, ll]\n", - "\n", - "def kalman_step(y, a, P, T, Z, H, Q):\n", - " a_filtered, P_filtered, obs_mu, obs_cov, ll = update(y=y, a=a, P=P, Z=Z, H=H)\n", - " a_hat, P_hat = predict(a=a_filtered, P=P_filtered, T=T, Q=Q)\n", - " return [a_filtered, a_hat, obs_mu, P_filtered, P_hat, obs_cov, ll]\n", - "\n", - "\n", - "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", - "\n", - "results_seq, updates = pytensor.scan(\n", - " kalman_step,\n", - " sequences=[data_sym],\n", - " outputs_info=outputs_info,\n", - " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", - " strict=False,\n", - ")\n", - "# --- Loss ---\n", - "a_upd_seq, a_pred_seq, y_hat_seq, P_upd_seq, P_pred_seq, obs_cov, ll_seq = results_seq\n", - "loss = pt.sum(ll_seq)" - ] - }, - { - "cell_type": "markdown", - "id": "ece2f47e", - "metadata": {}, - "source": [ - "### Custom gradient" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "id": "afb362e5", - "metadata": {}, - "outputs": [], - "source": [ - "def custom_grad(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_filtered, P_filtered, y_hat = out\n", - " a_hat_grad, P_hat_grad, y_grad = out_grad\n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - "\n", - " y_hat = Z.dot(a)\n", - " v = y - y_hat\n", - "\n", - " H_inv = pt.linalg.inv(H)\n", - " F_inv = pt.linalg.inv(F)\n", - "\n", - " K = PZT.dot(F_inv)\n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", - " \n", - " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", - " grad_y = K.T @ T.T @ a_hat_grad + 2 * F_inv @ v\n", - "\n", - "\n", - " a_hat_grad = a_hat_grad.dimshuffle(0, 'x')\n", - " v = v.dimshuffle(0, 'x')\n", - " \n", - " P_filtered_grad = T.T @ P_hat_grad @ T\n", - " a_filtered_grad = T.T @ a_hat_grad \n", - "\n", - " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", - " grad_Z = None\n", - " grad_T = None\n", - " grad_Q = P_hat_grad\n", - " grad_H = K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv\n", - "\n", - " return [grad_P_hat,\n", - " grad_a_pred,\n", - " grad_y,\n", - " grad_Z,\n", - " grad_T,\n", - " grad_Q,\n", - " grad_H]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "id": "ee21ef4e", - "metadata": {}, - "outputs": [], - "source": [ - "def grad_a_hat(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_hat_grad, _, _ = out_grad\n", - "\n", - " v = y - Z.dot(a) \n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H \n", - " F_inv = pt.linalg.inv(F)\n", - " \n", - " K = PZT.dot(F_inv) \n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", - "\n", - " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", - "\n", - " return grad_a_pred" - ] - }, - { - "cell_type": "code", - "execution_count": 133, - "id": "8c89b018", - "metadata": {}, - "outputs": [], - "source": [ - "def grad_P_hat(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_hat_grad, P_hat_grad, ll_grad = out_grad\n", - "\n", - " v = y - Z.dot(a)\n", - " v = v.dimshuffle(0, 'x')\n", - " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", - "\n", - " P_filtered_grad = T.T @ P_hat_grad @ T\n", - " a_filtered_grad = T.T @ a_hat_grad \n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - "\n", - " H_inv = pt.linalg.inv(H) \n", - " F_inv = pt.linalg.inv(F)\n", - " \n", - " K = PZT.dot(F_inv) \n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", - "\n", - " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", - "\n", - " return grad_P_hat" - ] - }, - { - "cell_type": "code", - "execution_count": 134, - "id": "bba53a26", - "metadata": {}, - "outputs": [], - "source": [ - "def grad_y(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_hat_grad, P_h_grad, y_grad = out_grad\n", - "\n", - " y_hat = Z.dot(a)\n", - " v = y - y_hat\n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - " F_inv = pt.linalg.inv(F)\n", - "\n", - " K = PZT.dot(F_inv) \n", - " \n", - " return K.T @ T.T @ a_hat_grad + 2 * F_inv @ v" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "c17949b7", - "metadata": {}, - "outputs": [], - "source": [ - "def grad_Q(inp, out, out_grad):\n", - " _, P_h_grad, _ = out_grad\n", - " return P_h_grad" - ] - }, - { - "cell_type": "code", - "execution_count": 135, - "id": "84cb6867", - "metadata": {}, - "outputs": [], - "source": [ - "def grad_H(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_hat_grad, P_h_grad, y_grad = out_grad\n", - " \n", - " y_hat = Z.dot(a)\n", - " v = y - y_hat\n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - " F_inv = pt.linalg.inv(F)\n", - "\n", - " K = PZT.dot(F_inv)\n", - "\n", - " v = v.dimshuffle(0, 'x')\n", - " a_hat_grad = a_hat_grad.dimshuffle(0, 'x') \n", - "\n", - " a_filtered_grad = T.T @ a_hat_grad\n", - " P_filtered_grad = T.T @ P_h_grad @ T\n", - "\n", - " return K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv" - ] - }, - { - "cell_type": "markdown", - "id": "607753a1", - "metadata": {}, - "source": [ - "### Custom Kalman Filter" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "id": "7cead2c1", - "metadata": {}, - "outputs": [], - "source": [ - "y_sym = pt.vector(\"y\")\n", - "\n", - "kalman_step_op = OpFromGraph(\n", - " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", - " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", - " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, None, None, grad_H, grad_Q],\n", - " inline=True\n", - ")\n", - "\n", - "outputs_info = [None, a0_sym, None, None, P0_sym, None, None]\n", - "\n", - "results_op, updates = pytensor.scan(\n", - " kalman_step_op,\n", - " sequences=[data_sym],\n", - " outputs_info=outputs_info,\n", - " non_sequences=[T_sym, Z_sym, H_sym, Q_sym],\n", - " strict=False,\n", - ")\n", - "# --- Loss ---\n", - "a_upd_op, a_pred_op, y_hat_op, P_upd_op, P_pred_op, obs_cov, ll_op = results_op\n", - "loss_op = pt.sum(ll_op)" - ] - }, - { - "cell_type": "markdown", - "id": "f0575c2c", - "metadata": {}, - "source": [ - "### Speed observation" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "id": "07c3879e", - "metadata": {}, - "outputs": [], - "source": [ - "states = [1, 5, 10, 20, 35, 50, 75, 90, 100]" - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "id": "f90f682d", - "metadata": {}, - "outputs": [], - "source": [ - "def benchmark_kalman_gradients(loss, state_dims, N=30):\n", - " results = defaultdict(dict)\n", - " for _ in range(10):\n", - " for n in state_dims:\n", - " data = generate_kalman_dataset(n, N=N, seed=42 + n)\n", - "\n", - " # --- gradients symboliques ---\n", - " t0 = perf_counter()\n", - " grad_list = pt.grad(loss, [a0_sym])\n", - " t1 = perf_counter()\n", - " grad_symbolic_time = t1 - t0\n", - " results[n][\"grad_symbolic_time\"] = grad_symbolic_time/10\n", - "\n", - " # --- compilation ---\n", - " t0 = perf_counter()\n", - " f_grad = pytensor.function(\n", - " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", - " outputs=grad_list,\n", - " )\n", - " t1 = perf_counter()\n", - " compile_time = t1 - t0\n", - " results[n][\"compile_time\"] = compile_time/10\n", - "\n", - " # --- exécution ---\n", - " t0 = perf_counter()\n", - " _ = f_grad(\n", - " data[\"y\"],\n", - " data[\"A0\"],\n", - " data[\"P0\"],\n", - " data[\"T\"],\n", - " data[\"Z\"],\n", - " data[\"H\"],\n", - " data[\"Q\"],\n", - " )\n", - " t1 = perf_counter()\n", - " exec_time = t1 - t0\n", - " results[n][\"exec_time\"] = exec_time/10\n", - "\n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "id": "27a60fb3", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n", - "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\numpy\\linalg\\_linalg.py:2383: RuntimeWarning: overflow encountered in det\n", - " r = _umath_linalg.det(a, signature=signature)\n" - ] - } - ], - "source": [ - "results = benchmark_kalman_gradients(loss, states, N=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3f6d314a", - "metadata": {}, - "outputs": [], - "source": [ - "results_op = benchmark_kalman_gradients(loss_op, states, N=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "382e90ef", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 123, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tps_execution = [results[i][\"exec_time\"] for i in states]\n", - "tps_execution_op = [results_op[i][\"exec_time\"] for i in states]\n", - "plt.plot(states, tps_execution, color=\"C1\")\n", - "plt.plot(states, tps_execution_op, color=\"limegreen\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "287cb6ef", - "metadata": {}, - "source": [ - "### Handmade Numpy Backpropagation " - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "e1469fb0", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_grad(observations, a0, P0, a_pred_seq, P_pred_seq, Z, H, T):\n", - " # Constant\n", - " SHAPE_a0 = a0.shape[0]\n", - " NB_obs = len(observations)\n", - "\n", - " # Initialisation for the backprop\n", - " PZT = P_pred_seq[-2].dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", - " \n", - " grad = [0 for _ in range(NB_obs)]\n", - " grad[-1] = - 2 * Z.T @ F_inv @ (observations[-1] - Z @ a_pred_seq[-2])\n", - "\n", - " # Backprop\n", - " for i in range(3, NB_obs+1):\n", - "\n", - " PZT = P_pred_seq[-i].dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", - "\n", - " K = PZT.dot(F_inv)\n", - " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", - "\n", - " grad[1-i] = I_KZ.T @ T.T @ grad[2-i] - (2 * Z.T @ F_inv @ (observations[1-i] - Z @ a_pred_seq[-i])).T \n", - "\n", - " # Last iter with a0/P0\n", - " PZT = P0.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - " F_inv = np.linalg.solve(F, np.eye(F.shape[0]))\n", - "\n", - " K = PZT.dot(F_inv)\n", - " I_KZ = np.eye(SHAPE_a0) - K.dot(Z)\n", - "\n", - " grad[0] = I_KZ.T @ T.T @ grad[1] - (2 * Z.T @ F_inv @ (observations[0] - Z @ a0)).T\n", - "\n", - " return grad" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "id": "479b8832", - "metadata": {}, - "outputs": [], - "source": [ - "def benchmark_kalman_gradients_np(loss, a_pred_seq, P_pred_seq, state_dims, N=3):\n", - " results = defaultdict(dict)\n", - " kalman_fn = pytensor.function(inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", - " outputs=(a_pred_seq, P_pred_seq))\n", - " \n", - " for _ in range(10):\n", - " for n in state_dims:\n", - " data = generate_kalman_dataset(n, N=N, seed=42 + n)\n", - "\n", - " # --- forward pass ---\n", - " t0 = perf_counter()\n", - " a_pred, P_pred = kalman_fn(data[\"y\"],\n", - " data[\"A0\"],\n", - " data[\"P0\"],\n", - " data[\"T\"],\n", - " data[\"Z\"],\n", - " data[\"H\"],\n", - " data[\"Q\"],)\n", - " t1 = perf_counter()\n", - " forward_pass = t1 - t0\n", - " results[n][\"Forward pass\"] = forward_pass/10\n", - "\n", - " # --- Backprop ---\n", - " t0 = perf_counter()\n", - " grad = compute_grad(data[\"y\"],\n", - " data[\"A0\"],\n", - " data[\"P0\"],\n", - " a_pred,\n", - " P_pred,\n", - " data[\"Z\"],\n", - " data[\"H\"],\n", - " data[\"T\"],)\n", - " t1 = perf_counter()\n", - " compile_time = t1 - t0\n", - " results[n][\"Backprop\"] = compile_time/10\n", - "\n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "id": "1e633e75", - "metadata": {}, - "outputs": [], - "source": [ - "results_np = benchmark_kalman_gradients_np(loss, a_pred_seq, P_pred_seq, states, N=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "id": "7109d7bf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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/HyvY+90Ohk8eLCOfR3dc889DB8+nBtvvNGrXce6/ixZsoSkpCRuu+022rVrR9++fXnhhRc87+tY159rrrmGDz74gO3btwOwYcMGVq9ezbBhwwAd64ZSm+Oak5NDaWmpV58OHTrQu3fvBjn2zWpCy/NRWFhIeXk5MTExXu0xMTHk5+fbVJX/McaQnp7ONddcQ+/evQE8x7eqY//dd99d8BqbuoULF7Ju3Tq++OKLSu/pWNefHTt2MGfOHNLT05k6dSqff/4548ePx+l0ctddd+lY16NJkybhcrno0aMHQUFBlJeXM336dH7xi18A+nvdUGpzXPPz8wkJCaFNmzaV+jTEb6dCjY8CAgK81o0xldqk7u699142btzI6tWrK72nY3/+du/ezYQJE1ixYgWhoaHV9tOxPn8VFRUkJSXxxBNPANC3b182b97MnDlzuOuuuzz9dKzP36JFi1iwYAGvvPIKl112GevXryctLY0OHTowduxYTz8d64ZRl+PaUMdep59qKTo6mqCgoErJsqCgoFJKlbq57777WLJkCR999BEdO3b0tMfGxgLo2NeDnJwcCgoKSExMxOFw4HA4yMrK4rnnnsPhcHiOp471+Wvfvj29evXyauvZsyd5eXmA/l7Xp/vvv5/Jkyfz85//nMsvv5wxY8YwceJEMjIyAB3rhlKb4xobG0tJSQmHDh2qtk99UqippZCQEBITE8nMzPRqz8zMpH///jZV5R+MMdx777288cYbfPjhh8TFxXm9HxcXR2xsrNexLykpISsrS8feRzfccAObNm1i/fr1nldSUhJ33HEH69evJz4+Xse6ngwYMKDSowm2b99Oly5dAP29rk/Hjx8nMND75ywoKMhzS7eOdcOozXFNTEwkODjYq8++ffv48ssvG+bY1/ulx37s1C3d8+fPN1u2bDFpaWkmPDzc7Nq1y+7SmrTf/va3JjIy0qxcudLs27fP8zp+/Linz4wZM0xkZKR54403zKZNm8wvfvEL3Y5ZT868+8kYHev68vnnnxuHw2GmT59uvv76a/Ovf/3LtGjRwixYsMDTR8e6fowdO9b86Ec/8tzS/cYbb5jo6GjzwAMPeProWNfNkSNHTG5ursnNzTWAefbZZ01ubq7nUSa1Oa6pqammY8eO5v333zfr1q0z119/vW7pbiyef/5506VLFxMSEmISEhI8tx1L3QFVvl588UVPn4qKCvPwww+b2NhY43Q6zaBBg8ymTZvsK9qPnB1qdKzrz9KlS03v3r2N0+k0PXr0MPPmzfN6X8e6frjdbjNhwgTTuXNnExoaauLj4820adNMcXGxp4+Odd189NFHVf77PHbsWGNM7Y5rUVGRuffee03btm1NWFiYGTFihMnLy2uQegOMMab+x39ERERELixdUyMiIiJ+QaFGRERE/IJCjYiIiPgFhRoRERHxCwo1IiIi4hcUakRERMQvKNSIiIiIX1CoEREREb+gUCMiIiJ+QaFGRERE/IJCjYiIiPgFhRoRERHxC/8fLd2ekRekri0AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tps_execution = [results[i][\"exec_time\"] for i in states]\n", - "tps_execution_np = [results_np[i][\"Backprop\"] + results_np[i][\"Forward pass\"] for i in states]\n", - "plt.plot(states, tps_execution, color=\"C1\")\n", - "plt.plot(states, tps_execution_np, color=\"limegreen\")" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "id": "f2dbe75f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0017101200064644217\n" - ] - } - ], - "source": [ - "print(results[20][\"exec_time\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "id": "614d5f94", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.00022822999162599444\n" - ] - } - ], - "source": [ - "print(results_np[20][\"Backprop\"] + results_np[20][\"Forward pass\"])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "CausalPy", - "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.13.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From fc48f87287413c717465ee1e625c4a0e52c09ab3 Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Thu, 7 Aug 2025 17:54:07 +0200 Subject: [PATCH 3/6] Adding Gradient with respect to T --- notebooks/Kalman_Filter_Gradient.ipynb | 144 +++++++++++++++++-------- 1 file changed, 100 insertions(+), 44 deletions(-) diff --git a/notebooks/Kalman_Filter_Gradient.ipynb b/notebooks/Kalman_Filter_Gradient.ipynb index 7bea8141..ff31dbbb 100644 --- a/notebooks/Kalman_Filter_Gradient.ipynb +++ b/notebooks/Kalman_Filter_Gradient.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 214, + "execution_count": 1, "id": "90979a41", "metadata": {}, "outputs": [], @@ -40,18 +40,10 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "fdb156d6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ".f at 0x000001820DC942C0>\n" - ] - } - ], + "outputs": [], "source": [ "mod = (\n", " sts.LevelTrendComponent(order=2, innovations_order=[0, 1], name='level') +\n", @@ -87,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 218, + "execution_count": 3, "id": "3661408d", "metadata": {}, "outputs": [], @@ -140,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 219, + "execution_count": 4, "id": "35351096", "metadata": {}, "outputs": [], @@ -268,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 5, "id": "ee21ef4e", "metadata": {}, "outputs": [], @@ -330,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 6, "id": "8c89b018", "metadata": {}, "outputs": [], @@ -387,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 7, "id": "bba53a26", "metadata": {}, "outputs": [], @@ -426,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "c17949b7", "metadata": {}, "outputs": [], @@ -441,7 +433,7 @@ "id": "f0bc0287", "metadata": {}, "source": [ - "## Gradient with respect to **H**\n", + "### Gradient with respect to **H**\n", "\n", "From the article we have :\n", "\n", @@ -472,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 9, "id": "84cb6867", "metadata": {}, "outputs": [], @@ -499,6 +491,68 @@ " return K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv" ] }, + { + "cell_type": "markdown", + "id": "4fa2ffc0", + "metadata": {}, + "source": [ + "### Gradient with respect to **T**\n", + "\n", + "This gradient was not given in the article. Here are the steps that got me to this expression :\n", + "\n", + "1 - Only $x_{n|n-1}$ and $P_{n|n-1}$ depends on $T_n$. Hence :\n", + "$$\n", + "\\frac{\\partial L}{\\partial T} = \\frac{\\partial L}{\\partial x_{n|n-1}} \\frac{\\partial x_{n|n-1}}{\\partial T} + \\frac{\\partial L}{\\partial P_{n|n-1}} \\frac{\\partial T}{\\partial P_{n|n-1}}\n", + "$$\n", + "2 - Using the equation (11) and (12) of the article, on the (1), we directly got that :\n", + "$$\n", + "\\frac{\\partial L}{\\partial x_{n|n-1}} \\frac{\\partial x_{n|n-1}}{\\partial T} = \\frac{\\partial L}{\\partial x_{n|n-1}} x_{n-1|n-1}^T\n", + "$$\n", + "3 - Recognizing the first quadratic form in the equation (2), and using equation (11) we got :\n", + "$$\n", + "\\frac{\\partial L}{\\partial P_{n|n-1}} \\frac{\\partial P_{n|n-1}}{\\partial T^T} = P_{n|n-1}T_n^T \\frac{\\partial L}{\\partial P_{n|n-1}}^T + P_{n|n-1}^T T_n^T \\frac{\\partial L}{\\partial P_{n|n-1}}\n", + "$$\n", + "4 - Now transposing to get the dependencies on T :\n", + "$$\n", + "\\frac{\\partial L}{\\partial P_{n|n-1}} \\frac{\\partial P_{n|n-1}}{\\partial T} = \\frac{\\partial L}{\\partial P_{n|n-1}} T_n P_{n|n-1}^T +\\frac{\\partial L}{\\partial P_{n|n-1}}^T T_n P_{n|n-1}\n", + "$$\n", + "5 - Finally, we have :\n", + "$$\n", + "\\frac{\\partial L}{\\partial T} = \\frac{\\partial L}{\\partial x_{n|n-1}} x_{n-1|n-1}^T + \\frac{\\partial L}{\\partial P_{n|n-1}} T_n P_{n|n-1}^T +\\frac{\\partial L}{\\partial P_{n|n-1}}^T T_n P_{n|n-1}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9a560ed9", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_T(inp, out, out_grad):\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_hat_grad, P_h_grad, y_grad = out_grad\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " v = v.dimshuffle(0, 'x')\n", + " a = a.dimshuffle(0, 'x')\n", + " a_hat_grad = a_hat_grad.dimshuffle(0, 'x')\n", + "\n", + " a_filtered = a + K.dot(v)\n", + " P_filtered = I_KZ @ P\n", + "\n", + " return a_hat_grad @ a_filtered.T + P_h_grad @ T @ P_filtered.T + P_h_grad.T @ T @ P_filtered" + ] + }, { "cell_type": "markdown", "id": "bd458dee", @@ -509,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "afb362e5", "metadata": {}, "outputs": [], @@ -566,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 259, + "execution_count": 12, "id": "7cead2c1", "metadata": {}, "outputs": [], @@ -576,7 +630,7 @@ "kalman_step_op = OpFromGraph(\n", " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", - " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, None, None, grad_H, grad_Q],\n", + " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, grad_T, None, grad_H, grad_Q],\n", " inline=True\n", ")\n", "\n", @@ -604,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": 264, + "execution_count": 13, "id": "b6eb5d48", "metadata": {}, "outputs": [], @@ -665,7 +719,7 @@ }, { "cell_type": "code", - "execution_count": 253, + "execution_count": 14, "id": "908946b0", "metadata": {}, "outputs": [], @@ -712,7 +766,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "a85fe92e", "metadata": {}, "outputs": [], @@ -769,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 254, + "execution_count": 16, "id": "27a60fb3", "metadata": {}, "outputs": [], @@ -779,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 257, + "execution_count": 17, "id": "a413c8e9", "metadata": {}, "outputs": [ @@ -787,7 +841,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.016296579997288063})\n" + "defaultdict(, {'exec_time': 0.017576184973586352})\n" ] } ], @@ -797,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 260, + "execution_count": 18, "id": "d35b98d6", "metadata": {}, "outputs": [], @@ -807,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 261, + "execution_count": 19, "id": "539c18c2", "metadata": {}, "outputs": [ @@ -815,7 +869,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.015451419999590144})\n" + "defaultdict(, {'exec_time': 0.021262520016171044})\n" ] } ], @@ -825,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 267, + "execution_count": 20, "id": "1e633e75", "metadata": {}, "outputs": [], @@ -835,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 268, + "execution_count": 21, "id": "7118dfec", "metadata": {}, "outputs": [ @@ -843,7 +897,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'Forward pass': 0.00269013000652194, 'Backprop': 0.002321220003068447})\n" + "defaultdict(, {'Forward pass': 0.002400995010975749, 'Backprop': 0.0018996200058609247})\n" ] } ], @@ -869,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 274, + "execution_count": 22, "id": "fbae0189", "metadata": {}, "outputs": [], @@ -905,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 278, + "execution_count": 23, "id": "c3a114b2", "metadata": {}, "outputs": [ @@ -914,25 +968,25 @@ "output_type": "stream", "text": [ "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", - "Comparison between classic a0 gradient and our handmaid NumPy backprop : True\n" + "Comparison between classic a0 gradient and our handmade NumPy backprop : True\n" ] } ], "source": [ "print(\"Comparison between classic a0 gradient and our custom OpFromGraph :\", np.allclose(grad_a0, grad_a0_op))\n", - "print(\"Comparison between classic a0 gradient and our handmaid NumPy backprop :\", np.allclose(grad_a0, grad_a0_np))" + "print(\"Comparison between classic a0 gradient and our handmade NumPy backprop :\", np.allclose(grad_a0, grad_a0_np))" ] }, { "cell_type": "code", - "execution_count": 279, + "execution_count": 24, "id": "867d5e2f", "metadata": {}, "outputs": [], "source": [ "# First the classic way with autodiff\n", "\n", - "grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, H_sym, Q_sym])\n", + "grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, T_sym, H_sym, Q_sym])\n", "f_grad = pytensor.function(\n", " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=grad_list,\n", @@ -942,7 +996,7 @@ "\n", "# Now using our OpFromGraph custom gradient\n", "\n", - "grad_list_op = pt.grad(loss_op, [data_sym, a0_sym, P0_sym, H_sym, Q_sym])\n", + "grad_list_op = pt.grad(loss_op, [data_sym, a0_sym, P0_sym, T_sym, H_sym, Q_sym])\n", "f_grad = pytensor.function(\n", " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=grad_list_op,\n", @@ -953,7 +1007,7 @@ }, { "cell_type": "code", - "execution_count": 289, + "execution_count": 25, "id": "25f0a57b", "metadata": {}, "outputs": [ @@ -964,6 +1018,7 @@ "Comparison between classic y gradient and our custom OpFromGraph : True\n", "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", "Comparison between classic P0 gradient and our custom OpFromGraph : True\n", + "Comparison between classic T gradient and our custom OpFromGraph : True\n", "Comparison between classic H gradient and our custom OpFromGraph : True\n", "Comparison between classic Q gradient and our custom OpFromGraph : True\n" ] @@ -973,8 +1028,9 @@ "print(\"Comparison between classic y gradient and our custom OpFromGraph :\", np.allclose(grad_a0[0], grad_a0_op[0]))\n", "print(\"Comparison between classic a0 gradient and our custom OpFromGraph :\", np.allclose(grad_a0[1], grad_a0_op[1]))\n", "print(\"Comparison between classic P0 gradient and our custom OpFromGraph :\", np.allclose((grad_a0[2] + grad_a0[2].T)/2, grad_a0_op[2]))\n", - "print(\"Comparison between classic H gradient and our custom OpFromGraph :\", np.allclose(grad_a0[3], grad_a0_op[3]))\n", - "print(\"Comparison between classic Q gradient and our custom OpFromGraph :\", np.allclose((grad_a0[4] + grad_a0[4].T)/2, grad_a0_op[4]))" + "print(\"Comparison between classic T gradient and our custom OpFromGraph :\", np.allclose(grad_a0[3], grad_a0_op[3]))\n", + "print(\"Comparison between classic H gradient and our custom OpFromGraph :\", np.allclose(grad_a0[4], grad_a0_op[4]))\n", + "print(\"Comparison between classic Q gradient and our custom OpFromGraph :\", np.allclose((grad_a0[5] + grad_a0[5].T)/2, grad_a0_op[5]))" ] } ], From 38385822541d2954427cdda3e3bd10a74efcd0e6 Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Thu, 14 Aug 2025 14:33:41 +0200 Subject: [PATCH 4/6] Adding the gradient with respect to Z --- notebooks/Kalman_Filter_Gradient.ipynb | 300 +++++++++++++++++++++---- 1 file changed, 261 insertions(+), 39 deletions(-) diff --git a/notebooks/Kalman_Filter_Gradient.ipynb b/notebooks/Kalman_Filter_Gradient.ipynb index ff31dbbb..ea7ed556 100644 --- a/notebooks/Kalman_Filter_Gradient.ipynb +++ b/notebooks/Kalman_Filter_Gradient.ipynb @@ -10,10 +10,19 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "90979a41", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING (pytensor.configdefaults): g++ not available, if using conda: `conda install gxx`\n", + "WARNING (pytensor.configdefaults): g++ not detected! PyTensor will be unable to compile C-implementations and will default to Python. Performance may be severely degraded. To remove this warning, set PyTensor flags cxx to an empty string.\n" + ] + } + ], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -40,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "fdb156d6", "metadata": {}, "outputs": [], @@ -79,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "3661408d", "metadata": {}, "outputs": [], @@ -132,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "35351096", "metadata": {}, "outputs": [], @@ -260,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "ee21ef4e", "metadata": {}, "outputs": [], @@ -322,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "8c89b018", "metadata": {}, "outputs": [], @@ -379,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "bba53a26", "metadata": {}, "outputs": [], @@ -418,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "c17949b7", "metadata": {}, "outputs": [], @@ -464,7 +473,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "84cb6867", "metadata": {}, "outputs": [], @@ -524,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "9a560ed9", "metadata": {}, "outputs": [], @@ -553,6 +562,177 @@ " return a_hat_grad @ a_filtered.T + P_h_grad @ T @ P_filtered.T + P_h_grad.T @ T @ P_filtered" ] }, + { + "cell_type": "markdown", + "id": "32c8125d", + "metadata": {}, + "source": [ + "### Gradient with respect to Z\n", + "\n", + "To obtain this gradient, I used the matrix differential + trace trick. Meaning that is we consider that $Z_n$ influences the loss only through $P_{n|n}$ and $a_{n|n}$, then $\\frac{dL}{dZ_n}$ is the matrix that verify :\n", + "\n", + "$$\n", + "dL = tr((\\frac{dL}{dP_{n|n}})^TdP_{n|n}) + tr((\\frac{dL}{da_{n|n}})^Tda_{n|n}) = tr((\\frac{dL}{dZ_n})^TdZ_n)\n", + "$$\n", + "\n", + "We now list the intermediate quantities that depend on $Z_n$ :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "dv_n &= - dZ_n a_{n|n-1} \\\\\n", + "dS_n &= dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T \\\\\n", + "d(S_n^{-1}) &= -S_n^{-1} dS_n S_n^{-1} \\\\\n", + "dK_n &= P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) \\\\\n", + "da_{n|n} &= dK_n v_n + K_n dv_n \\\\\n", + "dP_{n|n} &= - (dK_n Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "Okay, now let's put all that together to get an expression of $da_{n|n}$ and $dP_{n|n}$ that only relies on $dZ_n$ :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "da_{n|n} &= dK_n v_n + K_n dv_n \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", + "&- P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n \\\\\n", + "&- P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", + "&- K_n dZ_n a_{n|n-1} \\\\\n", + "\\\\\n", + "dP_{n|n} &= - (dK_n Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - P_{n|n-1}(dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&+ P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&+ P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&- K_n dZ_n P_{n|n-1} \\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "Now, going back to the trace. We'll use the following facts : \n", + "- **ciclicity of the trace** : $tr(A) = tr(A^T)$ ; \n", + "- **transpose invariance** : $tr(ABC) = tr(CAB) = tr(BCA)$. \n", + "\n", + "Also to make this easier to follow, I'll go term by term, using the additivity of the trace. Let's start with the terms of $da_{n|n}$:\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) = tr(P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n) = tr(P_{n|n-1} Z_n^T S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) \\\\\n", + "&= tr(P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{a_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T K_n dZ_n a_{n|n-1}) = tr(a_{n|n-1} (\\frac{dL}{dda_{n|n}})^T K_n dZ_n) \\\\\n", + "\\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "So the contibution of $Z_n$ through $a_{n|n}$ is :\n", + "$$\n", + "\\begin{align}\n", + "&tr((\\frac{dL}{da_{n|n}})^T da_{n|n}) = tr((P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - P_{n|n-1} Z_n^T S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} \\\\\n", + "&- P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) dZ_n) \\\\\n", + "&= tr((P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - K_n v_n (\\frac{dL}{da_{n|n}})^T K_n - P_n{n|n-1}^T Z_n^T K_n^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) dZ_n)\n", + "\\end{align}\n", + "$$\n", + "\n", + "Let's do the same with the terms of $dP_{n|n}$:\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&tr((\\frac{dL}{dP_{n|n}})^T P_{n|n-1}(dZ_n)^T S_n^{-1} Z_n P_{n|n-1}) = tr(P_{n|n-1}^T Z_n^T S_n^{-T} dZ_n P_{n|n-1}^T \\frac{dL}{dP_{n|n}}) = tr(P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{dP_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1}) = tr(P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n) \\\\\n", + "&tr((\\frac{dL}{dP_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} Z_n P_{n|n-1}) = tr(P_{n|n-1}^T Z_n^T S_n^{-T} dZ_n P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{dP_{n|n}}) \\\\\n", + "&= tr(P_{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{dP_{n|n}})^T K_n dZ_n P_{n|n-1}) = tr(P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n dZ_n) \\\\\n", + "\\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "So the contibution of $Z_n$ through $P_{n|n}$ is :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "&tr((\\frac{dL}{dP_{n|n}})^T dP_{n|n}) = tr((- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} \\\\\n", + "&+ P_{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) dZ_n) \\\\\n", + "&= tr((- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + K_n Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n + P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) dZ_n)\n", + "\\end{align}\n", + "$$\n", + "\n", + "We finally get the gradient of the loss according to $Z_n$, considering his dependencies on $a_{n|n}$ and $P_{n|n}$ :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "(\\frac{dL}{dZ_n})^T &= (P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - K_n v_n (\\frac{dL}{da_{n|n}})^T K_n - P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) \\\\\n", + "&+ (- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + K_n Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n + P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) \\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "And after transposition :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "\\frac{dL}{dZ_n} &= S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} v_n^T K_n^T - S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} a_{n|n-1}^T \\\\\n", + "&- S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} + K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T K_n^T + S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T \\\\\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "df925ee8", + "metadata": {}, + "outputs": [], + "source": [ + "def grad_Z(inp, out, out_grad):\n", + "\n", + " y, a, P, T, Z, H, Q = inp\n", + " a_h_grad, P_h_grad, y_grad = out_grad\n", + "\n", + " y_hat = Z.dot(a)\n", + " v = y - y_hat\n", + "\n", + " PZT = P.dot(Z.T)\n", + " F = Z.dot(PZT) + H\n", + " F_inv = pt.linalg.inv(F)\n", + "\n", + " K = PZT.dot(F_inv)\n", + " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", + "\n", + " v = v.dimshuffle(0, 'x')\n", + " a = a.dimshuffle(0, 'x')\n", + " a_h_grad = a_h_grad.dimshuffle(0, 'x')\n", + "\n", + " a_filtered = a + K.dot(v)\n", + " P_filtered = I_KZ @ P\n", + "\n", + " a_filtered_grad = T.T @ a_h_grad\n", + " P_filtered_grad = T.T @ P_h_grad @ T\n", + "\n", + " # Contribution via Pnn\n", + "\n", + " term_P_1 = - F_inv @ Z @ P @ P_filtered_grad.T @ P\n", + " term_P_2 = K.T @ P_filtered_grad @ P.T @ Z.T @ K.T\n", + " term_P_3 = F_inv @ Z @ P @ P_filtered_grad.T @ K @ Z @ P\n", + " term_P_4 = - K.T @ P_filtered_grad @ P.T\n", + "\n", + " contrib_P = term_P_1 + term_P_2 + term_P_3 + term_P_4\n", + "\n", + " # Contibution via xnn\n", + "\n", + " term_x_1 = F_inv @ v @ a_filtered_grad.T @ P\n", + " term_x_2 = - K.T @ a_filtered_grad @ v.T @ K.T\n", + " term_x_3 = - F_inv @ v @ a_filtered_grad.T @ K @ Z @ P\n", + " term_x_4 = - K.T @ a_filtered_grad @ a.T\n", + "\n", + " contrib_x = term_x_1 + term_x_2 + term_x_3 + term_x_4\n", + "\n", + " return contrib_x + contrib_P" + ] + }, { "cell_type": "markdown", "id": "bd458dee", @@ -563,7 +743,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "afb362e5", "metadata": {}, "outputs": [], @@ -620,7 +800,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 33, "id": "7cead2c1", "metadata": {}, "outputs": [], @@ -630,7 +810,7 @@ "kalman_step_op = OpFromGraph(\n", " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", - " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, grad_T, None, grad_H, grad_Q],\n", + " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, grad_T, grad_Z, grad_H, grad_Q],\n", " inline=True\n", ")\n", "\n", @@ -658,7 +838,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "id": "b6eb5d48", "metadata": {}, "outputs": [], @@ -719,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 35, "id": "908946b0", "metadata": {}, "outputs": [], @@ -728,7 +908,7 @@ " results = defaultdict(dict)\n", " exec_time = 0\n", "\n", - " grad_list = pt.grad(loss, [a0_sym])\n", + " grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym])\n", " f_grad = pytensor.function(\n", " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=grad_list,\n", @@ -766,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "id": "a85fe92e", "metadata": {}, "outputs": [], @@ -823,17 +1003,26 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 36, "id": "27a60fb3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n" + ] + } + ], "source": [ "results = benchmark_kalman_gradients(loss, obs_data, a0, P0, T, Z, R, H, Q)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 37, "id": "a413c8e9", "metadata": {}, "outputs": [ @@ -841,7 +1030,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.017576184973586352})\n" + "defaultdict(, {'exec_time': 0.07424874001881107})\n" ] } ], @@ -851,17 +1040,26 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 38, "id": "d35b98d6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n" + ] + } + ], "source": [ "results_op = benchmark_kalman_gradients(loss_op, obs_data, a0, P0, T, Z, R, H, Q)" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 39, "id": "539c18c2", "metadata": {}, "outputs": [ @@ -869,7 +1067,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.021262520016171044})\n" + "defaultdict(, {'exec_time': 0.11171145999105649})\n" ] } ], @@ -879,7 +1077,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "id": "1e633e75", "metadata": {}, "outputs": [], @@ -889,7 +1087,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "id": "7118dfec", "metadata": {}, "outputs": [ @@ -897,7 +1095,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'Forward pass': 0.002400995010975749, 'Backprop': 0.0018996200058609247})\n" + "defaultdict(, {'Forward pass': 0.1035015100147575, 'Backprop': 0.024320614989846952})\n" ] } ], @@ -923,10 +1121,21 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 40, "id": "fbae0189", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n" + ] + } + ], "source": [ "# First the classic way with autodiff\n", "\n", @@ -959,7 +1168,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 41, "id": "c3a114b2", "metadata": {}, "outputs": [ @@ -979,14 +1188,25 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 42, "id": "867d5e2f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n", + "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", + " warn(\n" + ] + } + ], "source": [ "# First the classic way with autodiff\n", "\n", - "grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, T_sym, H_sym, Q_sym])\n", + "grad_list = pt.grad(loss, [data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym])\n", "f_grad = pytensor.function(\n", " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=grad_list,\n", @@ -996,7 +1216,7 @@ "\n", "# Now using our OpFromGraph custom gradient\n", "\n", - "grad_list_op = pt.grad(loss_op, [data_sym, a0_sym, P0_sym, T_sym, H_sym, Q_sym])\n", + "grad_list_op = pt.grad(loss_op, [data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym])\n", "f_grad = pytensor.function(\n", " inputs=[data_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=grad_list_op,\n", @@ -1007,7 +1227,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 43, "id": "25f0a57b", "metadata": {}, "outputs": [ @@ -1019,6 +1239,7 @@ "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", "Comparison between classic P0 gradient and our custom OpFromGraph : True\n", "Comparison between classic T gradient and our custom OpFromGraph : True\n", + "Comparison between classic Z gradient and our custom OpFromGraph : False\n", "Comparison between classic H gradient and our custom OpFromGraph : True\n", "Comparison between classic Q gradient and our custom OpFromGraph : True\n" ] @@ -1029,8 +1250,9 @@ "print(\"Comparison between classic a0 gradient and our custom OpFromGraph :\", np.allclose(grad_a0[1], grad_a0_op[1]))\n", "print(\"Comparison between classic P0 gradient and our custom OpFromGraph :\", np.allclose((grad_a0[2] + grad_a0[2].T)/2, grad_a0_op[2]))\n", "print(\"Comparison between classic T gradient and our custom OpFromGraph :\", np.allclose(grad_a0[3], grad_a0_op[3]))\n", - "print(\"Comparison between classic H gradient and our custom OpFromGraph :\", np.allclose(grad_a0[4], grad_a0_op[4]))\n", - "print(\"Comparison between classic Q gradient and our custom OpFromGraph :\", np.allclose((grad_a0[5] + grad_a0[5].T)/2, grad_a0_op[5]))" + "print(\"Comparison between classic Z gradient and our custom OpFromGraph :\", np.allclose(grad_a0[4], grad_a0_op[4]))\n", + "print(\"Comparison between classic H gradient and our custom OpFromGraph :\", np.allclose(grad_a0[5], grad_a0_op[5]))\n", + "print(\"Comparison between classic Q gradient and our custom OpFromGraph :\", np.allclose((grad_a0[6] + grad_a0[6].T)/2, grad_a0_op[6]))" ] } ], From 6ea37a3749d4d136f64a3ed68b03e0a38031a4fb Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Tue, 19 Aug 2025 10:56:53 +0200 Subject: [PATCH 5/6] Correcting parameter Z gradient --- notebooks/Kalman_Filter_Gradient.ipynb | 2303 +++++++++++++++++++++++- 1 file changed, 2206 insertions(+), 97 deletions(-) diff --git a/notebooks/Kalman_Filter_Gradient.ipynb b/notebooks/Kalman_Filter_Gradient.ipynb index ea7ed556..c05d202f 100644 --- a/notebooks/Kalman_Filter_Gradient.ipynb +++ b/notebooks/Kalman_Filter_Gradient.ipynb @@ -10,19 +10,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 66, "id": "90979a41", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING (pytensor.configdefaults): g++ not available, if using conda: `conda install gxx`\n", - "WARNING (pytensor.configdefaults): g++ not detected! PyTensor will be unable to compile C-implementations and will default to Python. Performance may be severely degraded. To remove this warning, set PyTensor flags cxx to an empty string.\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -49,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 67, "id": "fdb156d6", "metadata": {}, "outputs": [], @@ -88,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 68, "id": "3661408d", "metadata": {}, "outputs": [], @@ -141,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 69, "id": "35351096", "metadata": {}, "outputs": [], @@ -269,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 70, "id": "ee21ef4e", "metadata": {}, "outputs": [], @@ -331,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 71, "id": "8c89b018", "metadata": {}, "outputs": [], @@ -388,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 72, "id": "bba53a26", "metadata": {}, "outputs": [], @@ -427,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 73, "id": "c17949b7", "metadata": {}, "outputs": [], @@ -473,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 74, "id": "84cb6867", "metadata": {}, "outputs": [], @@ -533,7 +524,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 75, "id": "9a560ed9", "metadata": {}, "outputs": [], @@ -564,81 +555,123 @@ }, { "cell_type": "markdown", - "id": "32c8125d", + "id": "2666eaec", "metadata": {}, "source": [ "### Gradient with respect to Z\n", "\n", - "To obtain this gradient, I used the matrix differential + trace trick. Meaning that is we consider that $Z_n$ influences the loss only through $P_{n|n}$ and $a_{n|n}$, then $\\frac{dL}{dZ_n}$ is the matrix that verify :\n", + "To obtain this gradient, I used the matrix differential + trace trick. So we consider that $Z_n$ influences the loss directly through $v_n$ and $F_n$, and indirectly through backpropagation through $P_{n|n}$ and $a_{n|n}$. Then $\\frac{dL}{dZ_n}$ is the matrix that verify :\n", "\n", "$$\n", - "dL = tr((\\frac{dL}{dP_{n|n}})^TdP_{n|n}) + tr((\\frac{dL}{da_{n|n}})^Tda_{n|n}) = tr((\\frac{dL}{dZ_n})^TdZ_n)\n", + "dL = tr((\\frac{dL}{dv_n})^T dv_n + (\\frac{dL}{dF_n})^T dF_n + (\\frac{dL}{dP_{n|n}})^T dP_{n|n} + (\\frac{dL}{da_{n|n}})^T da_{n|n}) = tr((\\frac{dL}{dZ_n})^TdZ_n)\n", "$$\n", "\n", - "We now list the intermediate quantities that depend on $Z_n$ :\n", + "It is worth also writing that we'll use simple trace tricks :\n", + "- **transpose invariance** : $tr(A) = tr(A^T)$ ; \n", + "- **ciclicity of the trace** : $tr(ABC) = tr(CAB) = tr(BCA)$. " + ] + }, + { + "cell_type": "markdown", + "id": "65986a5b", + "metadata": {}, + "source": [ + "#### **First term** : $(\\frac{dL}{dv_n})^T dv_n$\n", + "\n", + "First noticing that :\n", "\n", "$$\n", "\\begin{align}\n", - "dv_n &= - dZ_n a_{n|n-1} \\\\\n", - "dS_n &= dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T \\\\\n", - "d(S_n^{-1}) &= -S_n^{-1} dS_n S_n^{-1} \\\\\n", - "dK_n &= P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) \\\\\n", - "da_{n|n} &= dK_n v_n + K_n dv_n \\\\\n", - "dP_{n|n} &= - (dK_n Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "\\frac{dL}{dy_n} &= \\frac{dL}{dv_n}\\frac{dv_n}{dy_n} = \\frac{dL}{dv_n} I = \\frac{dL}{dv_n} \\\\\n", + "dv_n &= - dZ_n a_{n|n-1}\n", "\\end{align}\n", "$$\n", "\n", - "Okay, now let's put all that together to get an expression of $da_{n|n}$ and $dP_{n|n}$ that only relies on $dZ_n$ :\n", + "And since we directly got from equation (31) of the paper that :\n", "\n", "$$\n", "\\begin{align}\n", - "da_{n|n} &= dK_n v_n + K_n dv_n \\\\\n", - "&= P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) v_n - K_n dZ_n a_{n|n-1} \\\\\n", - "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", - "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", - "&= P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", - "&- P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n \\\\\n", - "&- P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", - "&- K_n dZ_n a_{n|n-1} \\\\\n", - "\\\\\n", - "dP_{n|n} &= - (dK_n Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", - "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", - "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", - "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", - "&= - P_{n|n-1}(dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", - "&+ P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", - "&+ P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", - "&- K_n dZ_n P_{n|n-1} \\\\\n", + "\\frac{dL}{dy_n} = \\frac{dl_{n|n-1}}{dy_n} = 2 F_n^{-1} v_n\n", "\\end{align}\n", "$$\n", "\n", - "Now, going back to the trace. We'll use the following facts : \n", - "- **ciclicity of the trace** : $tr(A) = tr(A^T)$ ; \n", - "- **transpose invariance** : $tr(ABC) = tr(CAB) = tr(BCA)$. \n", + "We ultimately have that :\n", "\n", - "Also to make this easier to follow, I'll go term by term, using the additivity of the trace. Let's start with the terms of $da_{n|n}$:\n", + "$$\n", + "\\begin{align}\n", + "(\\frac{dL}{dv_n})^T dv_n &= ( 2 F_n^{-1} v_n )^T (- dZ_n a_{n|n-1}) = - 2 v_n^T F_n^{-T} dZ_n a_{n|n-1}\n", + "\\end{align}\n", + "$$\n", + "\n", + "Now, using trace tricks :\n", "\n", "$$\n", "\\begin{align}\n", - "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) = tr(P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", - "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n) = tr(P_{n|n-1} Z_n^T S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n) \\\\\n", - "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) \\\\\n", - "&= tr(P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{a_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", - "&tr((\\frac{dL}{da_{n|n}})^T K_n dZ_n a_{n|n-1}) = tr(a_{n|n-1} (\\frac{dL}{dda_{n|n}})^T K_n dZ_n) \\\\\n", - "\\\\\n", + "tr((\\frac{dL}{dv_n})^T dv_n) = tr( - 2 F_n^{-1} v_n dZ_n a_{n|n-1} ) = tr( (- 2 F_n^{-1} v_n a_{n|n-1}^T)^T dZ_n)\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f7ae123c", + "metadata": {}, + "source": [ + "#### **Second term** : $(\\frac{dL}{dF_n})^T dF_n$\n", + "\n", + "Starting with differentiations and derivatives :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "dF_n &= dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T \\\\\n", + "d(F_n^{-1}) &= -F_n^{-1} dF_n F_n^{-1} \\\\\n", + "\\frac{dL}{dF_n} &= F_n^{-1} - F_n^{-1} z_n z_n^T F_n^{-1}\\\\\n", "\\end{align}\n", "$$\n", "\n", - "So the contibution of $Z_n$ through $a_{n|n}$ is :\n", + "Now, using the trace trick :\n", + "\n", "$$\n", "\\begin{align}\n", - "&tr((\\frac{dL}{da_{n|n}})^T da_{n|n}) = tr((P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - P_{n|n-1} Z_n^T S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} \\\\\n", - "&- P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) dZ_n) \\\\\n", - "&= tr((P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - K_n v_n (\\frac{dL}{da_{n|n}})^T K_n - P_n{n|n-1}^T Z_n^T K_n^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) dZ_n)\n", + "tr((\\frac{dL}{dF_n})^T dF_n) &= tr((F_n^{-1} - F_n^{-1} z_n z_n^T F_n^{-1})^T (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T)) \\\\\n", + "&=tr(F_n^{-T} dZ_n P_{n|n-1} Z_n^T + F_n^{-T} Z_n P_{n|n-1} (dZ_n)^T - F_n^{-T} z_n z_n^T F_n^{-T} dZ_n P_{n|n-1} Z_n^T - F_n^{-T} z_n z_n^T F_n^{-T} Z_n P_{n|n-1} (dZ_n)^T) \\\\\n", + "&=tr(P_{n|n-1} Z_n^T F_n^{-T} dZ_n + P_{n|n-1}^T Z_n^T F_n^{-1} dZ_n - P_{n|n-1} Z_n^T F_n^{-T} z_n z_n^T F_n^{-T} dZ_n - P_{n|n-1} F_n^{-1} z_n z_n^T F_n^{-1} dZ_n) \\\\\n", + "&=tr((F_n^{-1} Z_n P_{n|n-1}^T + F_n^{-T} Z_n P_{n|n-1} - F_n^{-1} z_n z_n^T F_n^{-1} Z_n P_{n|n-1}^T - F_n^{-T} z_n z_n^T F_n^{-T} Z_n P_{n|n-1}^T)^T dZ_n)\n", "\\end{align}\n", "$$\n", "\n", - "Let's do the same with the terms of $dP_{n|n}$:\n", + "Noticing that $P_{n|n-1}^T = P_{n|n-1}$ and $F_n^T = F_n$ :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "tr((\\frac{dL}{dF_n})^T dF_n) &= tr((2 F_n^{-1} Z_n P_{n|n-1} - 2 F_n^{-1} z_n z_n^T F_n^{-1} Z_n P_{n|n-1})^T dZ_n)\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4d4c8cd8", + "metadata": {}, + "source": [ + "#### **Third term** : $(\\frac{dL}{dP_{n|n}})^T dP_{n|n}$\n", + "\n", + "Starting with differencciations :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "dP_{n|n} &= - (dK_n Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - (P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) Z_n + K_n dZ_n) P_{n|n-1} \\\\\n", + "&= - P_{n|n-1}(dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&+ P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&+ P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} Z_n P_{n|n-1} \\\\\n", + "&- K_n dZ_n P_{n|n-1} \\\\\n", + "\\end{align}\n", + "$$\n", + "\n", + "Term by term, let's use the trace trick to get $dZ_n$ at the right place :\n", "\n", "$$\n", "\\begin{align}\n", @@ -655,26 +688,68 @@ "\n", "$$\n", "\\begin{align}\n", - "&tr((\\frac{dL}{dP_{n|n}})^T dP_{n|n}) = tr((- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} \\\\\n", - "&+ P_{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) dZ_n) \\\\\n", - "&= tr((- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + K_n Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n + P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) dZ_n)\n", + "&tr((\\frac{dL}{dP_{n|n}})^T dP_{n|n}) = tr((- S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} + K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T K_n^T + S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T)^T K_n)^T dZ_n)\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "32c8125d", + "metadata": {}, + "source": [ + "#### **Fourth term** : $(\\frac{dL}{da_{n|n}})^T da_{n|n}$\n", + "\n", + "Starting with differenciations :\n", + "\n", + "$$\n", + "\\begin{align}\n", + "da_{n|n} &= dK_n v_n + K_n dv_n \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} + Z_n^T d(S_n^{-1})) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} dS_n S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1}((dZ_n)^T S_n^{-1} - Z_n^T S_n^{-1} (dZ_n P_{n|n-1} Z_n^T + Z_n P_{n|n-1} (dZ_n)^T) S_n^{-1}) v_n - K_n dZ_n a_{n|n-1} \\\\\n", + "&= P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", + "&- P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n \\\\\n", + "&- P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n \\\\\n", + "&- K_n dZ_n a_{n|n-1} \\\\\n", "\\end{align}\n", "$$\n", "\n", - "We finally get the gradient of the loss according to $Z_n$, considering his dependencies on $a_{n|n}$ and $P_{n|n}$ :\n", + "Term by term, let's use the trace trick to get $dZ_n$ at the right place :\n", "\n", "$$\n", "\\begin{align}\n", - "(\\frac{dL}{dZ_n})^T &= (P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - K_n v_n (\\frac{dL}{da_{n|n}})^T K_n - P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} - a_{n|n-1} (\\frac{dL}{da_{n|n}})^T K_n) \\\\\n", - "&+ (- P_{n|n-1}^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} + K_n Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n + P_{n|n-1}^T Z_n^T K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T S_n^{-T} - P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) = tr(P_{n|n-1}^T \\frac{dL}{da_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n P_{n|n-1} Z_n^T S_n^{-1} v_n) = tr(P_{n|n-1} Z_n^T S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T P_{n|n-1} Z_n^T S_n^{-1} Z_n P_{n|n-1} (dZ_n)^T S_n^{-1} v_n) = tr(v_n^T S_n^{-T} dZ_n P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{da_{n|n}}) \\\\\n", + "&= tr(P_n{n|n-1}^T Z_n^T S_n^{-T} Z_n P_{n|n-1}^T \\frac{dL}{a_{n|n}} v_n^T S_n^{-T} dZ_n) \\\\\n", + "&tr((\\frac{dL}{da_{n|n}})^T K_n dZ_n a_{n|n-1}) = tr(a_{n|n-1} (\\frac{dL}{dda_{n|n}})^T K_n dZ_n) \\\\\n", + "\\\\\n", "\\end{align}\n", "$$\n", "\n", - "And after transposition :\n", + "So the contibution of $Z_n$ through $a_{n|n}$ is :\n", + "$$\n", + "\\begin{align}\n", + "&tr((\\frac{dL}{da_{n|n}})^T da_{n|n}) = tr((S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} v_n^T K_n^T - S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} a_{n|n-1}^T)^T dZ_n) \\\\\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f9e35a41", + "metadata": {}, + "source": [ + "#### **To sum up** :\n", + "\n", + "In the end, the gradient of $L$ with respect to $Z_n$ is :\n", "\n", "$$\n", "\\begin{align}\n", - "\\frac{dL}{dZ_n} &= S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} v_n^T K_n^T - S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} a_{n|n-1}^T \\\\\n", + "\\frac{dL}{dZ_n} &= - 2 F_n^{-1} v_n a_{n|n-1}^T\\\\\n", + "&+ 2 F_n^{-1} Z_n P_{n|n-1} - 2 F_n^{-1} z_n z_n^T F_n^{-1} Z_n P_{n|n-1}\\\\\n", + "&+ S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} v_n^T K_n^T - S_n^{-1} v_n (\\frac{dL}{da_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{da_{n|n}} a_{n|n-1}^T \\\\\n", "&- S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T P_{n|n-1} + K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T Z_n^T K_n^T + S_n^{-1} Z_n P_{n|n-1} (\\frac{dL}{dP_{n|n}})^T K_n Z_n P_{n|n-1} - K_n^T \\frac{dL}{dP_{n|n}} P_{n|n-1}^T \\\\\n", "\\end{align}\n", "$$" @@ -682,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 76, "id": "df925ee8", "metadata": {}, "outputs": [], @@ -698,17 +773,12 @@ " PZT = P.dot(Z.T)\n", " F = Z.dot(PZT) + H\n", " F_inv = pt.linalg.inv(F)\n", - "\n", " K = PZT.dot(F_inv)\n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", "\n", " v = v.dimshuffle(0, 'x')\n", " a = a.dimshuffle(0, 'x')\n", " a_h_grad = a_h_grad.dimshuffle(0, 'x')\n", "\n", - " a_filtered = a + K.dot(v)\n", - " P_filtered = I_KZ @ P\n", - "\n", " a_filtered_grad = T.T @ a_h_grad\n", " P_filtered_grad = T.T @ P_h_grad @ T\n", "\n", @@ -730,7 +800,17 @@ "\n", " contrib_x = term_x_1 + term_x_2 + term_x_3 + term_x_4\n", "\n", - " return contrib_x + contrib_P" + " # Contribution via Fn\n", + " \n", + " term_F_1 = 2 * F_inv @ Z @ P \n", + " term_F_2 = - 2 *F_inv @ v @ v.T @ F_inv @ Z @ P\n", + "\n", + " contrib_F = term_F_1 + term_F_2\n", + "\n", + " # Contribution via vn\n", + " contrib_v = - 2 * F_inv @ v @ a.T\n", + " \n", + " return contrib_x + contrib_P + contrib_F + contrib_v" ] }, { @@ -743,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 77, "id": "afb362e5", "metadata": {}, "outputs": [], @@ -800,7 +880,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 78, "id": "7cead2c1", "metadata": {}, "outputs": [], @@ -838,7 +918,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 79, "id": "b6eb5d48", "metadata": {}, "outputs": [], @@ -899,7 +979,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 80, "id": "908946b0", "metadata": {}, "outputs": [], @@ -946,7 +1026,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 81, "id": "a85fe92e", "metadata": {}, "outputs": [], @@ -1003,7 +1083,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 82, "id": "27a60fb3", "metadata": {}, "outputs": [ @@ -1014,15 +1094,2044 @@ "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", " warn(\n" ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 16655700 function calls (16473469 primitive calls) in 19.496 seconds\n", + "\n", + " Ordered by: internal time\n", + "\n", + " ncalls tottime percall cumtime percall filename:lineno(function)\n", + "137658/137401 0.869 0.000 0.941 0.000 utils.py:229(__eq__)\n", + " 37352 0.852 0.000 2.619 0.000 elemwise.py:662(perform)\n", + " 22220 0.644 0.000 0.676 0.000 blas.py:894(perform)\n", + " 248821 0.610 0.000 8.445 0.000 op.py:536(rval)\n", + " 40 0.603 0.015 8.766 0.219 op.py:1663(perform)\n", + " 79609 0.577 0.000 0.577 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", + "1286912/1286852 0.457 0.000 0.863 0.000 {built-in method builtins.isinstance}\n", + " 37352 0.395 0.000 0.771 0.000 elemwise.py:730(_check_runtime_broadcast)\n", + " 52632 0.380 0.000 1.348 0.000 _util.py:491(_asarray_validated)\n", + " 4060/20 0.379 0.000 9.575 0.479 vm.py:380(__call__)\n", + " 12120 0.350 0.000 0.373 0.000 blas.py:182(perform)\n", + " 52576 0.343 0.000 0.962 0.000 _function_base_impl.py:579(asarray_chkfinite)\n", + " 215301 0.342 0.000 0.343 0.000 utils.py:282(__getattribute__)\n", + " 24240 0.292 0.000 0.415 0.000 _basic.py:503(_solve_triangular)\n", + " 113823 0.265 0.000 0.332 0.000 type.py:395(broadcastable)\n", + " 165936 0.254 0.000 0.254 0.000 {built-in method numpy.asarray}\n", + " 56791 0.250 0.000 0.482 0.000 elemwise.py:227(perform)\n", + " 1259 0.232 0.000 0.690 0.001 basic.py:1525(io_toposort)\n", + " 767900 0.220 0.000 0.220 0.000 {built-in method _abc._abc_instancecheck}\n", + "20896/20866 0.214 0.000 2.663 0.000 fg.py:710(execute_callbacks)\n", + " 20200 0.212 0.000 0.228 0.000 blas.py:1131(perform)\n", + " 287 0.194 0.001 0.207 0.001 {built-in method _io.open}\n", + " 558074 0.180 0.000 0.242 0.000 {built-in method builtins.getattr}\n", + "320948/320880 0.177 0.000 0.598 0.000 {built-in method builtins.all}\n", + " 767900 0.163 0.000 0.383 0.000 :117(__instancecheck__)\n", + " 59300 0.161 0.000 0.258 0.000 basic.py:449(__init__)\n", + " 807095 0.160 0.000 0.160 0.000 {built-in method builtins.len}\n", + " 20259 0.150 0.000 0.150 0.000 {method 'index' of 'list' objects}\n", + " 41/29 0.144 0.004 6.249 0.215 basic.py:2309(apply)\n", + " 8080 0.138 0.000 0.162 0.000 blas_scipy.py:9(perform)\n", + "268809/268353 0.132 0.000 0.388 0.000 {built-in method builtins.hasattr}\n", + " 18390 0.130 0.000 0.377 0.000 type.py:71(__init__)\n", + " 24240 0.127 0.000 1.858 0.000 _basic.py:411(solve_triangular)\n", + " 28402 0.120 0.000 0.281 0.000 basic.py:126(__init__)\n", + " 40456 0.119 0.000 0.165 0.000 blas.py:384(getter)\n", + "119636/106086 0.118 0.000 3.767 0.000 basic.py:1079(transform)\n", + " 58811 0.116 0.000 0.116 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", + " 223550 0.108 0.000 0.157 0.000 {method 'get' of 'dict' objects}\n", + " 76870 0.106 0.000 0.124 0.000 basic.py:919(expand)\n", + " 14140 0.102 0.000 0.102 0.000 {method 'astype' of 'numpy.generic' objects}\n", + " 2076 0.102 0.000 0.339 0.000 _basic.py:75(solve)\n", + " 88813 0.101 0.000 0.313 0.000 basic.py:835(walk)\n", + " 56791 0.098 0.000 0.098 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", + " 58026 0.098 0.000 0.603 0.000 {method 'all' of 'numpy.ndarray' objects}\n", + " 27308 0.094 0.000 0.148 0.000 utils.py:16(simple_extract_stack)\n", + " 570 0.087 0.000 0.087 0.000 {built-in method nt._getfinalpathname}\n", + " 400941 0.086 0.000 0.086 0.000 {method 'append' of 'list' objects}\n", + " 61194 0.084 0.000 0.414 0.000 {built-in method builtins.any}\n", + " 4040 0.079 0.000 0.107 0.000 _twodim_base_impl.py:163(eye)\n", + " 29592 0.075 0.000 0.219 0.000 _dtype.py:350(_name_get)\n", + " 59300 0.074 0.000 0.075 0.000 utils.py:292(__init__)\n", + " 440525 0.074 0.000 0.074 0.000 {built-in method time.perf_counter}\n", + "176916/89552 0.074 0.000 0.138 0.000 {built-in method builtins.hash}\n", + " 20460 0.073 0.000 0.093 0.000 shape.py:259(perform)\n", + " 27308 0.073 0.000 0.306 0.000 utils.py:76(add_tag_trace)\n", + " 5 0.071 0.014 0.483 0.097 elemwise.py:671(find_fuseable_subgraph)\n", + " 2020 0.070 0.000 0.135 0.000 _linalg.py:496(inv)\n", + " 693712 0.070 0.000 0.070 0.000 basic.py:433(owner)\n", + " 56 0.070 0.001 0.127 0.002 destroyhandler.py:27(_contains_cycle)\n", + " 212871 0.066 0.000 0.066 0.000 type.py:398()\n", + " 282811 0.064 0.000 0.088 0.000 basic.py:1559()\n", + " 5776 0.064 0.000 0.669 0.000 elemwise.py:384(get_output_info)\n", + " 14140 0.063 0.000 0.377 0.000 basic.py:1271(perform)\n", + " 28761 0.062 0.000 0.279 0.000 _dtype.py:34(__str__)\n", + " 6220 0.061 0.000 0.108 0.000 basic.py:1648(perform)\n", + "206427/199827 0.060 0.000 0.076 0.000 {built-in method builtins.issubclass}\n", + " 11150 0.059 0.000 0.442 0.000 shape.py:318(set_shape)\n", + "34766/31349 0.058 0.000 0.130 0.000 utils.py:222(__hash__)\n", + " 791/776 0.057 0.000 1.882 0.002 fg.py:342(import_node)\n", + " 24240 0.057 0.000 1.915 0.000 slinalg.py:863(perform)\n", + " 12120 0.057 0.000 0.057 0.000 {method 'take' of 'numpy.ndarray' objects}\n", + " 134805 0.057 0.000 0.078 0.000 configparser.py:405(__get__)\n", + " 65181 0.057 0.000 0.531 0.000 _methods.py:67(_all)\n", + " 10309 0.056 0.000 0.144 0.000 basic.py:599(process_node)\n", + " 22090 0.055 0.000 0.240 0.000 copy.py:62(copy)\n", + "113246/110047 0.053 0.000 6.259 0.000 basic.py:1885(process_node)\n", + " 30036 0.051 0.000 0.118 0.000 numerictypes.py:471(issubdtype)\n", + " 9343 0.051 0.000 0.297 0.000 variable.py:999(sum)\n", + "10747/10393 0.051 0.000 1.366 0.000 basic.py:1269(clone_node_and_cache)\n", + " 76512 0.050 0.000 0.138 0.000 {method 'extend' of 'list' objects}\n", + " 115826 0.049 0.000 0.065 0.000 basic.py:1564()\n", + "7816/5260 0.048 0.000 1.521 0.000 shape.py:533(on_import)\n", + " 7834 0.045 0.000 0.219 0.000 variable.py:1039(no_nan)\n", + " 2020 0.044 0.000 0.081 0.000 _linalg.py:2331(det)\n", + " 6776 0.044 0.000 0.242 0.000 fg.py:220(remove_client)\n", + "7542/2891 0.044 0.000 0.125 0.000 basic.py:270(_get_underlying_scalar_constant_value)\n", + " 43738 0.043 0.000 0.106 0.000 destroyhandler.py:408(get_destroyers_of)\n", + " 5347 0.042 0.000 0.503 0.000 extra_ops.py:1512(broadcast_shape_iter)\n", + " 133649 0.042 0.000 0.051 0.000 {method 'setdefault' of 'dict' objects}\n", + " 55400 0.042 0.000 0.112 0.000 basic.py:766(__hash__)\n", + " 4052 0.040 0.000 0.135 0.000 fromnumeric.py:69(_wrapreduction)\n", + " 82641 0.040 0.000 0.059 0.000 op.py:216(n_mit_mot)\n", + " 2100 0.040 0.000 0.069 0.000 subtensor.py:1749(perform)\n", + " 5407 0.039 0.000 0.113 0.000 basic.py:60(upcast)\n", + " 303005 0.039 0.000 0.039 0.000 {built-in method builtins.id}\n", + " 2020 0.039 0.000 0.106 0.000 _decomp_lu.py:20(lu_factor)\n", + " 5776 0.038 0.000 1.330 0.000 elemwise.py:451(make_node)\n", + " 22073 0.038 0.000 0.106 0.000 copy.py:248(_reconstruct)\n", + " 2020 0.037 0.000 0.039 0.000 blas.py:1234(perform)\n", + " 6871 0.037 0.000 0.042 0.000 functools.py:686(_c3_merge)\n", + " 14542 0.036 0.000 0.036 0.000 {built-in method numpy.zeros}\n", + " 162916 0.036 0.000 0.059 0.000 basic.py:87(__hash__)\n", + " 158136 0.036 0.000 0.038 0.000 {method 'add' of 'set' objects}\n", + " 21390 0.035 0.000 0.137 0.000 variable.py:884(__init__)\n", + "10747/10393 0.035 0.000 1.249 0.000 basic.py:238(clone_with_new_inputs)\n", + " 60072 0.034 0.000 0.063 0.000 numerictypes.py:289(issubclass_)\n", + " 6220 0.034 0.000 0.034 0.000 basic.py:1631(_check_runtime_broadcast)\n", + " 19326 0.033 0.000 0.033 0.000 {method 'remove' of 'list' objects}\n", + " 6100 0.033 0.000 0.043 0.000 basic.py:4335(perform)\n", + " 4040 0.033 0.000 0.487 0.000 basic.py:4172(impl)\n", + " 6974 0.032 0.000 0.400 0.000 basic.py:1232(make_node)\n", + " 52632 0.032 0.000 0.064 0.000 _base.py:1401(issparse)\n", + " 5017 0.032 0.000 0.276 0.000 variable.py:1061(__init__)\n", + " 18199 0.032 0.000 0.205 0.000 {built-in method builtins.sorted}\n", + " 63717 0.032 0.000 0.046 0.000 type.py:392(__hash__)\n", + " 12851 0.032 0.000 0.115 0.000 fromnumeric.py:89(_wrapreduction_any_all)\n", + " 200/198 0.031 0.000 3.341 0.017 basic.py:2013(apply)\n", + " 588 0.031 0.000 0.588 0.001 basic.py:687(apply)\n", + " 113257 0.031 0.000 0.044 0.000 type.py:400(ndim)\n", + " 6871/829 0.031 0.000 0.076 0.000 functools.py:713(_c3_mro)\n", + " 8157 0.030 0.000 0.030 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", + " 157184 0.030 0.000 0.030 0.000 {method 'pop' of 'list' objects}\n", + " 2808 0.030 0.000 0.082 0.000 basic.py:136(__call__)\n", + " 52632 0.029 0.000 0.047 0.000 core.py:6732(isMaskedArray)\n", + " 12547 0.029 0.000 0.029 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", + " 6041 0.029 0.000 0.157 0.000 shape.py:366(update_shape)\n", + " 14569 0.029 0.000 0.035 0.000 {built-in method builtins.sum}\n", + " 6776 0.028 0.000 2.510 0.000 fg.py:406(change_node_input)\n", + " 83058 0.028 0.000 0.028 0.000 elemwise.py:740()\n", + " 4407 0.028 0.000 0.040 0.000 destroyhandler.py:524(on_import)\n", + " 86960 0.028 0.000 0.028 0.000 {method 'update' of 'set' objects}\n", + " 5433 0.027 0.000 0.100 0.000 basic.py:307(filter)\n", + " 14140 0.027 0.000 0.118 0.000 basic.py:1208(_cast_to_promised_scalar_dtype)\n", + " 27224 0.027 0.000 0.138 0.000 basic.py:417(make_variable)\n", + " 2647 0.026 0.000 0.136 0.000 types.py:160(validate)\n", + " 10450 0.026 0.000 0.353 0.000 basic.py:791(__init__)\n", + " 4455 0.025 0.000 0.039 0.000 core.py:3024(_update_from)\n", + " 2076 0.025 0.000 0.064 0.000 _basic.py:396(_ensure_dtype_cdsz)\n", + "17930/16880 0.025 0.000 0.546 0.000 functools.py:930(wrapper)\n", + " 6041 0.025 0.000 0.219 0.000 shape.py:591(on_change_input)\n", + "9861/8579 0.024 0.000 2.039 0.000 op.py:249(__call__)\n", + " 29592 0.024 0.000 0.111 0.000 _dtype.py:334(_name_includes_bit_suffix)\n", + "15959/1244 0.023 0.000 1.332 0.001 pfunc.py:172(clone_v_get_shared_updates)\n", + " 5433 0.023 0.000 0.058 0.000 numeric.py:2475(array_equal)\n", + "10747/10393 0.023 0.000 0.452 0.000 basic.py:208(clone)\n", + " 56022 0.023 0.000 0.023 0.000 variable.py:652(dtype)\n", + " 4040 0.023 0.000 0.023 0.000 shape.py:451()\n", + " 41392 0.023 0.000 0.023 0.000 frozendict.py:24(__contains__)\n", + " 4887 0.023 0.000 0.544 0.000 basic.py:201(constant)\n", + " 56560 0.022 0.000 0.022 0.000 multiarray.py:761(dot)\n", + " 11310 0.022 0.000 0.219 0.000 basic.py:528(clone)\n", + " 15 0.022 0.001 0.072 0.005 basic.py:1420(general_toposort)\n", + " 121037 0.021 0.000 0.021 0.000 basic.py:1557()\n", + " 98647 0.021 0.000 0.030 0.000 utils.py:230()\n", + " 22073 0.021 0.000 0.040 0.000 {method '__reduce_ex__' of 'object' objects}\n", + " 4455 0.021 0.000 0.123 0.000 core.py:2879(__new__)\n", + " 1140 0.021 0.000 0.021 0.000 {method 'search' of 're.Pattern' objects}\n", + " 25889 0.021 0.000 0.021 0.000 {method 'format' of 'str' objects}\n", + " 34090 0.021 0.000 0.118 0.000 math.py:306(is_inverse_pair)\n", + " 3379 0.021 0.000 0.237 0.000 variable.py:954(__eq__)\n", + " 28443 0.020 0.000 0.056 0.000 utils.py:298(__setattr__)\n", + " 5960 0.020 0.000 0.033 0.000 destroyhandler.py:601(on_change_input)\n", + " 4040 0.020 0.000 0.449 0.000 basic.py:4417(perform)\n", + " 77882 0.020 0.000 0.275 0.000 basic.py:897(ancestors)\n", + " 5159 0.020 0.000 0.042 0.000 type.py:153(filter)\n", + " 14140 0.020 0.000 0.396 0.000 basic.py:4163(_perform)\n", + " 89239 0.020 0.000 0.029 0.000 utils.py:223()\n", + " 5535 0.020 0.000 0.141 0.000 math.py:320(local_func_inv)\n", + " 12120 0.019 0.000 0.076 0.000 subtensor.py:2133(perform)\n", + " 98647 0.019 0.000 0.026 0.000 utils.py:232()\n", + " 285 0.019 0.000 0.021 0.000 {method 'read' of '_io.TextIOWrapper' objects}\n", + " 5694 0.019 0.000 0.040 0.000 shape.py:244(unpack)\n", + " 4897 0.018 0.000 2.535 0.001 fg.py:464(replace)\n", + " 10963 0.018 0.000 0.078 0.000 basic.py:682(__init__)\n", + " 15401 0.018 0.000 0.053 0.000 basic.py:988(as_scalar)\n", + " 2020 0.018 0.000 0.077 0.000 _basic.py:378(_matrix_norm_general)\n", + " 26242 0.018 0.000 2.421 0.000 op.py:1411(fn)\n", + " 6930 0.018 0.000 0.068 0.000 basic.py:529(local_useless_elemwise)\n", + " 16858 0.018 0.000 0.334 0.000 type.py:214(__call__)\n", + " 4042 0.018 0.000 0.153 0.000 fromnumeric.py:3328(prod)\n", + " 47218 0.017 0.000 0.017 0.000 {method 'items' of 'dict' objects}\n", + " 2020 0.017 0.000 0.031 0.000 slinalg.py:640(perform)\n", + " 2020 0.016 0.000 0.046 0.000 sort.py:172(perform)\n", + " 4040 0.016 0.000 0.030 0.000 _linalg.py:148(_commonType)\n", + " 4020 0.016 0.000 0.072 0.000 basic.py:1866(equal_computations)\n", + " 42608 0.016 0.000 0.016 0.000 {method 'update' of 'dict' objects}\n", + " 4040 0.016 0.000 0.170 0.000 basic.py:1993(impl)\n", + " 148962 0.016 0.000 0.016 0.000 {method 'pop' of 'collections.deque' objects}\n", + "14227/601 0.016 0.000 0.121 0.000 dispatcher.py:266(__call__)\n", + " 33261 0.016 0.000 0.016 0.000 type.py:386(__eq__)\n", + " 6191 0.016 0.000 0.052 0.000 math.py:1419(local_useless_elemwise_comparison)\n", + " 65535 0.016 0.000 0.226 0.000 elemwise.py:691()\n", + " 21926 0.016 0.000 0.024 0.000 fg.py:205(add_client)\n", + " 3371 0.015 0.000 0.020 0.000 destroyhandler.py:563(on_prune)\n", + " 5477 0.015 0.000 0.023 0.000 basic.py:1098(__repr__)\n", + " 4887 0.015 0.000 0.107 0.000 basic.py:232(convert)\n", + "6961/6946 0.015 0.000 1.911 0.000 fg.py:304(import_var)\n", + " 4707 0.015 0.000 0.489 0.000 elemwise.py:747(infer_shape)\n", + " 84861 0.015 0.000 0.015 0.000 {method 'popleft' of 'collections.deque' objects}\n", + " 4455 0.015 0.000 0.070 0.000 core.py:3050(__array_finalize__)\n", + " 9779 0.015 0.000 0.243 0.000 type.py:126(__call__)\n", + " 2728 0.015 0.000 2.776 0.001 features.py:728(replace_all_validate)\n", + " 2020 0.015 0.000 0.045 0.000 shape.py:442(perform)\n", + " 30494 0.014 0.000 0.014 0.000 fromnumeric.py:2118(shape)\n", + " 2654 0.014 0.000 0.022 0.000 destroyhandler.py:178(_build_droot_impact)\n", + " 7155 0.014 0.000 0.040 0.000 {method 'all' of 'numpy.generic' objects}\n", + " 15 0.014 0.001 0.041 0.003 basic.py:1809(apply_depends_on)\n", + " 78722 0.014 0.000 0.014 0.000 basic.py:756(__eq__)\n", + " 4455 0.014 0.000 0.046 0.000 core.py:5238(sum)\n", + " 6830 0.014 0.000 0.028 0.000 type.py:335(is_super)\n", + "17865/17002 0.014 0.000 0.527 0.000 __init__.py:18(as_tensor_variable)\n", + " 29367 0.014 0.000 0.028 0.000 linecache.py:22(getline)\n", + " 78 0.014 0.000 0.028 0.000 destroyhandler.py:692(orderings)\n", + " 17930 0.014 0.000 0.029 0.000 functools.py:844(dispatch)\n", + " 59520 0.013 0.000 0.014 0.000 {built-in method builtins.next}\n", + "7764/5208 0.013 0.000 1.193 0.000 shape.py:125(get_node_infer_shape)\n", + " 9803 0.013 0.000 0.089 0.000 type.py:186(make_variable)\n", + " 3401/941 0.013 0.000 0.041 0.000 math.py:895(get_num_denum)\n", + " 508 0.013 0.000 0.017 0.000 features.py:955(validate)\n", + " 5461 0.013 0.000 0.013 0.000 basic.py:372(dtype_specs)\n", + " 2020 0.013 0.000 0.099 0.000 nlinalg.py:217(perform)\n", + " 4040 0.013 0.000 0.120 0.000 basic.py:1392(perform)\n", + " 11364 0.013 0.000 0.030 0.000 {built-in method builtins.max}\n", + " 2020 0.013 0.000 0.013 0.000 {built-in method numpy.arange}\n", + " 2020 0.013 0.000 0.238 0.000 tmp6jqq5u7h:1(fgraph_to_python)\n", + " 57571 0.012 0.000 0.012 0.000 {method 'extend' of 'collections.deque' objects}\n", + "3430/1038 0.012 0.000 0.028 0.000 basic.py:1948(compare_nodes)\n", + " 9 0.012 0.001 0.118 0.013 basic.py:1316(cmodule_key_)\n", + " 2020 0.012 0.000 0.158 0.000 nlinalg.py:117(perform)\n", + " 18740 0.012 0.000 0.012 0.000 basic.py:1651()\n", + " 17930 0.012 0.000 0.012 0.000 weakref.py:414(__getitem__)\n", + " 76839 0.011 0.000 0.011 0.000 basic.py:445(index)\n", + " 2577 0.011 0.000 0.064 0.000 elemwise.py:427(local_upcast_elemwise_constant_inputs)\n", + " 8395 0.011 0.000 0.082 0.000 fromnumeric.py:2589(all)\n", + " 43849 0.011 0.000 0.033 0.000 destroyhandler.py:450(refresh_droot_impact)\n", + " 4112 0.011 0.000 0.027 0.000 op.py:220(n_mit_mot_outs)\n", + " 3233 0.011 0.000 0.025 0.000 basic.py:257(local_elemwise_alloc)\n", + " 4438 0.011 0.000 0.029 0.000 {method 'any' of 'numpy.generic' objects}\n", + " 17304 0.011 0.000 0.019 0.000 basic.py:1299(__hash__)\n", + " 290 0.011 0.000 0.011 0.000 {method '__exit__' of '_io._IOBase' objects}\n", + " 5213 0.011 0.000 0.087 0.000 type.py:138(clone)\n", + " 5960 0.010 0.000 0.137 0.000 basic.py:556(on_change_input)\n", + " 116358 0.010 0.000 0.010 0.000 basic.py:821(owner)\n", + " 611 0.010 0.000 0.087 0.000 basic.py:142(_as_tensor_Sequence)\n", + " 6776 0.010 0.000 0.013 0.000 features.py:419(on_change_input)\n", + " 3/1 0.010 0.003 2.469 2.469 vm.py:1199(make_all)\n", + " 24820 0.010 0.000 0.767 0.000 utils.py:258(__ne__)\n", + " 1140 0.010 0.000 0.033 0.000 _local.py:289(drive)\n", + " 1140 0.010 0.000 0.020 0.000 _local.py:257(_parse_path)\n", + " 974 0.010 0.000 0.042 0.000 elemwise.py:602(prepare_node)\n", + " 12260 0.010 0.000 0.010 0.000 basic.py:4337()\n", + " 4060 0.009 0.000 0.009 0.000 vm.py:318(perform_updates)\n", + " 3378 0.009 0.000 0.105 0.000 basic.py:1249(output_types)\n", + " 34543 0.009 0.000 0.011 0.000 basic.py:620()\n", + " 285 0.009 0.000 0.009 0.000 {method 'split' of 're.Pattern' objects}\n", + " 3 0.009 0.003 0.124 0.041 elemwise.py:620(initialize_fuseable_mappings)\n", + " 4455 0.009 0.000 0.018 0.000 warnings.py:188(_add_filter)\n", + " 8910 0.009 0.000 0.079 0.000 {method 'view' of 'numpy.ndarray' objects}\n", + " 4435 0.009 0.000 0.305 0.000 basic.py:566(on_import)\n", + " 855 0.009 0.000 0.041 0.000 _local.py:227(__str__)\n", + " 876 0.009 0.000 0.227 0.000 math.py:1183(transform)\n", + " 22073 0.009 0.000 0.012 0.000 copyreg.py:98(__newobj__)\n", + " 622 0.009 0.000 0.056 0.000 blockwise.py:322(infer_shape)\n", + " 43825 0.009 0.000 0.009 0.000 {method 'append' of 'collections.deque' objects}\n", + " 1141 0.008 0.000 0.108 0.000 basic.py:1325(supports_c_code)\n", + " 2020 0.008 0.000 0.179 0.000 tmpbf7ngv9i:1(fgraph_to_python)\n", + " 18391 0.008 0.000 0.017 0.000 fg.py:191(setup_var)\n", + " 5347 0.008 0.000 0.511 0.000 extra_ops.py:1494(broadcast_shape)\n", + " 6906 0.008 0.000 0.020 0.000 basic.py:1606(compute_deps)\n", + " 285 0.008 0.000 0.439 0.002 op.py:338(load_c_code)\n", + " 4455 0.008 0.000 0.008 0.000 {method 'view' of 'numpy.generic' objects}\n", + " 10325 0.008 0.000 0.066 0.000 basic.py:1098(unconditional_constant_folding)\n", + " 29386 0.008 0.000 0.011 0.000 linecache.py:32(getlines)\n", + " 4686 0.008 0.000 0.101 0.000 basic.py:414(upcast)\n", + " 29592 0.008 0.000 0.008 0.000 _dtype.py:24(_kind_name)\n", + " 24234 0.008 0.000 0.011 0.000 basic.py:620()\n", + " 10100 0.008 0.000 0.026 0.000 basic.py:1951(impl)\n", + " 2020 0.008 0.000 0.008 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", + " 15144 0.008 0.000 0.008 0.000 {method 'insert' of 'list' objects}\n", + " 6116 0.008 0.000 0.008 0.000 _basic.py:37(_solve_check)\n", + " 2020 0.008 0.000 0.330 0.000 slinalg.py:996(perform)\n", + " 2020 0.008 0.000 0.023 0.000 fromnumeric.py:1130(argsort)\n", + " 2020 0.007 0.000 0.007 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", + " 3255 0.007 0.000 0.070 0.000 basic.py:1283(transform)\n", + " 27314 0.007 0.000 0.007 0.000 {method 'reverse' of 'list' objects}\n", + " 15385 0.007 0.000 0.096 0.000 shape.py:492(init_r)\n", + " 34 0.007 0.000 0.128 0.004 blas.py:345(_gemm_from_factored_list)\n", + " 2939 0.007 0.000 0.044 0.000 shape.py:221(shape_tuple)\n", + " 2773 0.007 0.000 0.010 0.000 {built-in method _functools.reduce}\n", + " 2020 0.007 0.000 0.113 0.000 slinalg.py:693(perform)\n", + " 4896 0.007 0.000 0.228 0.000 basic.py:585(process_atomic)\n", + " 4455 0.007 0.000 0.011 0.000 core.py:1360(_replace_dtype_fields)\n", + " 17740 0.007 0.000 0.181 0.000 shape.py:353()\n", + " 22324 0.007 0.000 0.007 0.000 {built-in method _abc._abc_subclasscheck}\n", + " 2020 0.007 0.000 0.020 0.000 _ufunc_config.py:440(__enter__)\n", + " 30494 0.007 0.000 0.007 0.000 fromnumeric.py:2114(_shape_dispatcher)\n", + " 29607 0.007 0.000 0.007 0.000 {method 'strip' of 'str' objects}\n", + " 3371 0.007 0.000 0.020 0.000 basic.py:573(on_prune)\n", + " 8972 0.007 0.000 0.011 0.000 :1390(_handle_fromlist)\n", + " 1650 0.007 0.000 0.066 0.000 dispatch.py:142(etuplize_step)\n", + " 27328 0.007 0.000 0.007 0.000 {built-in method sys._getframe}\n", + " 601 0.007 0.000 0.116 0.000 core.py:27(stream_eval)\n", + " 18390 0.007 0.000 0.007 0.000 type.py:297(dtype_specs)\n", + " 32402 0.007 0.000 0.007 0.000 basic.py:774(get_scalar_type)\n", + " 3448 0.007 0.000 0.013 0.000 basic.py:1387(in_sig)\n", + " 6906 0.007 0.000 0.028 0.000 basic.py:1462(_compute_deps_cache_)\n", + " 1608 0.007 0.000 0.143 0.000 basic.py:957(local_useless_switch)\n", + " 2076 0.007 0.000 0.010 0.000 shape_base.py:80(atleast_2d)\n", + " 10401 0.007 0.000 0.079 0.000 basic.py:1155(constant_folding)\n", + " 829 0.006 0.000 0.100 0.000 functools.py:758(_compose_mro)\n", + " 3300 0.006 0.000 0.008 0.000 core.py:143(__init__)\n", + " 2659/124 0.006 0.000 0.427 0.003 builders.py:57(local_traverse)\n", + " 1655 0.006 0.000 0.020 0.000 subtensor.py:105(indices_from_subtensor)\n", + " 671 0.006 0.000 0.025 0.000 math.py:2495(add_calculate)\n", + " 9643 0.006 0.000 0.014 0.000 utils.py:285(__setattr__)\n", + " 18308 0.006 0.000 0.011 0.000 elemwise.py:393()\n", + " 4455 0.006 0.000 0.007 0.000 warnings.py:488(__enter__)\n", + " 1168 0.006 0.000 0.026 0.000 params_type.py:358(__init__)\n", + " 4040 0.006 0.000 0.006 0.000 _linalg.py:198(_assert_stacked_square)\n", + " 5433 0.006 0.000 0.214 0.000 basic.py:974(__init__)\n", + " 2020 0.006 0.000 0.006 0.000 {built-in method numpy._core._multiarray_umath._make_extobj}\n", + " 21694 0.006 0.000 0.012 0.000 type.py:121()\n", + " 31273 0.006 0.000 0.007 0.000 basic.py:1834()\n", + " 548/526 0.006 0.000 0.064 0.000 elemwise.py:348(local_dimshuffle_lift)\n", + " 5983 0.006 0.000 0.007 0.000 frozendict.py:30(__iter__)\n", + " 5960 0.006 0.000 0.027 0.000 features.py:929(on_change_input)\n", + " 13771 0.006 0.000 0.008 0.000 basic.py:110(_as_tensor_Variable)\n", + " 4456 0.006 0.000 0.049 0.000 fromnumeric.py:2477(any)\n", + " 4455 0.006 0.000 0.024 0.000 warnings.py:170(simplefilter)\n", + " 10302 0.006 0.000 0.017 0.000 basic.py:70(make_array)\n", + " 6915 0.005 0.000 0.017 0.000 functools.py:767(is_related)\n", + " 2728 0.005 0.000 0.365 0.000 features.py:635(validate_)\n", + " 9690 0.005 0.000 0.005 0.000 {built-in method sys.intern}\n", + " 8080 0.005 0.000 0.008 0.000 _linalg.py:128(isComplexType)\n", + " 6228 0.005 0.000 0.010 0.000 _basic.py:408()\n", + "9812/8162 0.005 0.000 0.103 0.000 {method 'send' of 'generator' objects}\n", + " 18688 0.005 0.000 0.005 0.000 basic.py:1293(__eq__)\n", + " 4665 0.005 0.000 0.107 0.000 basic.py:1019(upcast_out)\n", + " 2020 0.005 0.000 0.015 0.000 fromnumeric.py:51(_wrapfunc)\n", + " 8080 0.005 0.000 0.005 0.000 {built-in method _operator.index}\n", + " 22324 0.005 0.000 0.012 0.000 :121(__subclasscheck__)\n", + " 611 0.005 0.000 0.046 0.000 basic.py:1886(make_node)\n", + " 5999 0.005 0.000 0.016 0.000 type.py:277(filter_variable)\n", + " 28502 0.005 0.000 0.005 0.000 basic.py:437(owner)\n", + " 2891 0.005 0.000 0.130 0.000 basic.py:529(get_underlying_scalar_constant_value)\n", + " 474 0.005 0.000 0.022 0.000 raise_op.py:71(make_node)\n", + " 1986 0.005 0.000 0.010 0.000 math.py:627(local_expm1)\n", + " 26840 0.005 0.000 0.005 0.000 {built-in method __new__ of type object at 0x00007FFCA4F8EE30}\n", + " 14698 0.005 0.000 0.005 0.000 basic.py:861()\n", + " 4152 0.005 0.000 0.008 0.000 getlimits.py:493(__new__)\n", + " 8238 0.005 0.000 0.006 0.000 op.py:222()\n", + " 2020 0.005 0.000 0.005 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", + " 285 0.005 0.000 0.505 0.002 variable.py:320(dimshuffle)\n", + " 10758 0.005 0.000 0.005 0.000 typing.py:426(inner)\n", + " 285 0.005 0.000 0.452 0.002 elemwise.py:128(__init__)\n", + " 4455 0.005 0.000 0.006 0.000 warnings.py:509(__exit__)\n", + " 770 0.005 0.000 0.082 0.000 math.py:1096(simplify_constants)\n", + " 8927 0.005 0.000 0.005 0.000 core.py:3493(dtype)\n", + " 411 0.005 0.000 0.094 0.000 math.py:2252(local_add_remove_zeros)\n", + " 3495 0.005 0.000 0.032 0.000 shape.py:426()\n", + " 151 0.005 0.000 0.636 0.004 subtensor.py:270(get_canonical_form_slice)\n", + " 829 0.005 0.000 0.106 0.000 basic.py:1178(_find_impl)\n", + " 5769 0.005 0.000 0.006 0.000 type.py:624(c_code_cache_version)\n", + "5519/5393 0.005 0.000 0.014 0.000 {method 'join' of 'str' objects}\n", + " 14152 0.005 0.000 0.006 0.000 basic.py:1840()\n", + " 5980 0.005 0.000 0.006 0.000 :827(items)\n", + "4104/1626 0.005 0.000 0.012 0.000 subtensor.py:129(convert_indices)\n", + " 49 0.004 0.000 0.108 0.002 utils.py:1095(forced_replace)\n", + " 2577 0.004 0.000 0.016 0.000 basic.py:1038(local_merge_switch_same_cond)\n", + " 2958 0.004 0.000 0.216 0.000 utils.py:354(get)\n", + " 15247 0.004 0.000 0.004 0.000 ordered_set.py:17(__iter__)\n", + " 602 0.004 0.000 0.023 0.000 elemwise.py:1100(c_code_cache_version_apply)\n", + " 1012 0.004 0.000 0.210 0.000 variable.py:1107(equals)\n", + " 16313 0.004 0.000 0.006 0.000 extra_ops.py:1543()\n", + " 482 0.004 0.000 0.007 0.000 ipkernel.py:775(_clean_thread_parent_frames)\n", + " 979 0.004 0.000 0.379 0.000 basic.py:2345(apply_cleanup)\n", + " 3304 0.004 0.000 0.006 0.000 type.py:110(parse_bcast_and_shape)\n", + " 4040 0.004 0.000 0.004 0.000 _linalg.py:192(_assert_stacked_2d)\n", + " 4040 0.004 0.000 0.012 0.000 basic.py:4143(py_perform_fn)\n", + "2340/2100 0.004 0.000 0.022 0.000 subtensor.py:1754(_convert)\n", + " 12932 0.004 0.000 0.009 0.000 extra_ops.py:1547()\n", + " 476 0.004 0.000 0.036 0.000 elemwise.py:1324(make_node)\n", + " 8221 0.004 0.000 0.004 0.000 frozendict.py:21(__getitem__)\n", + " 4040 0.004 0.000 0.006 0.000 utils.py:230(to_return_values)\n", + " 18452 0.004 0.000 0.004 0.000 {method 'pop' of 'dict' objects}\n", + " 4455 0.004 0.000 0.004 0.000 core.py:1328(_replace_dtype_fields_recursive)\n", + " 17930 0.004 0.000 0.004 0.000 {built-in method _abc.get_cache_token}\n", + " 4040 0.004 0.000 0.007 0.000 _linalg.py:142(_realType)\n", + " 11226 0.004 0.000 0.014 0.000 basic.py:1100()\n", + " 343 0.004 0.000 0.049 0.000 elemwise.py:186(make_node)\n", + " 3300 0.004 0.000 0.005 0.000 core.py:129(__new__)\n", + " 4455 0.004 0.000 0.020 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", + " 2646 0.004 0.000 0.158 0.000 destroyhandler.py:647(validate)\n", + " 6101 0.004 0.000 0.011 0.000 :897(__iter__)\n", + " 4455 0.004 0.000 0.004 0.000 core.py:1408(getmask)\n", + " 5473 0.004 0.000 0.031 0.000 basic.py:1095(__str__)\n", + " 1475 0.004 0.000 0.015 0.000 basic.py:328(local_fill_sink)\n", + " 695 0.004 0.000 0.064 0.000 type.py:785(tensor)\n", + " 5474 0.004 0.000 0.026 0.000 {built-in method builtins.repr}\n", + " 2585 0.004 0.000 0.179 0.000 variable.py:991(__hash__)\n", + " 1425 0.004 0.000 0.006 0.000 _local.py:117(__init__)\n", + " 2020 0.004 0.000 0.006 0.000 _linalg.py:123(_makearray)\n", + " 4059 0.004 0.000 0.004 0.000 {method 'index' of 'tuple' objects}\n", + " 2020 0.004 0.000 0.008 0.000 _ufunc_config.py:456(__exit__)\n", + " 10620 0.004 0.000 0.004 0.000 {method 'remove' of 'set' objects}\n", + " 4541 0.003 0.000 0.003 0.000 {built-in method numpy.array}\n", + " 5795 0.003 0.000 0.014 0.000 elemwise.py:439()\n", + " 1175 0.003 0.000 0.006 0.000 op.py:501(make_py_thunk)\n", + " 770 0.003 0.000 0.088 0.000 math.py:1045(simplify)\n", + " 3344 0.003 0.000 0.354 0.000 basic.py:179(_as_tensor_numbers)\n", + " 3300 0.003 0.000 0.013 0.000 core.py:142(__subclasscheck__)\n", + " 11348 0.003 0.000 0.003 0.000 fg.py:286()\n", + " 1140 0.003 0.000 0.005 0.000 _local.py:237(_format_parsed_parts)\n", + " 2475 0.003 0.000 0.014 0.000 core.py:342(etuple)\n", + " 14035 0.003 0.000 0.003 0.000 basic.py:638()\n", + " 285 0.003 0.000 0.109 0.000 :702(realpath)\n", + " 1037 0.003 0.000 2.260 0.002 features.py:792(replace_all_validate_remove)\n", + " 490/28 0.003 0.000 0.008 0.000 basic.py:1767(describe)\n", + " 1141 0.003 0.000 0.014 0.000 op.py:57(compute_test_value)\n", + " 285 0.003 0.000 0.156 0.001 op.py:287(get_path)\n", + " 6671 0.003 0.000 0.011 0.000 elemwise.py:1018(local_useless_composite_outputs)\n", + " 2728 0.003 0.000 0.003 0.000 features.py:356(__call__)\n", + " 4455 0.003 0.000 0.014 0.000 core.py:1374(make_mask_descr)\n", + " 1168 0.003 0.000 0.011 0.000 params_type.py:456(generate_struct_name)\n", + " 34305 0.003 0.000 0.003 0.000 typing.py:2371(cast)\n", + " 4040 0.003 0.000 0.003 0.000 basic.py:2943(impl)\n", + " 2020 0.003 0.000 0.003 0.000 basic.py:2051(impl)\n", + " 1274 0.003 0.000 0.020 0.000 math.py:1212(same)\n", + " 9661 0.003 0.000 0.003 0.000 {method 'discard' of 'set' objects}\n", + " 4455 0.003 0.000 0.008 0.000 core.py:3866(filled)\n", + " 2558 0.003 0.000 0.005 0.000 basic.py:1053()\n", + " 2255 0.003 0.000 0.015 0.000 math.py:1213()\n", + " 414 0.003 0.000 0.003 0.000 {built-in method numpy.empty}\n", + " 1425 0.003 0.000 0.009 0.000 _local.py:498(__init__)\n", + " 825 0.003 0.000 0.011 0.000 basic.py:2905(copy_stack_trace)\n", + " 2854 0.003 0.000 0.005 0.000 rewriting.py:105(local_lift_DiracDelta)\n", + " 5630 0.003 0.000 0.008 0.000 basic.py:655(local_cast_cast)\n", + " 2076 0.003 0.000 0.004 0.000 shape_base.py:21(atleast_1d)\n", + " 66 0.003 0.000 0.114 0.002 basic.py:1321(clone_get_equiv)\n", + " 1420 0.003 0.000 0.043 0.000 basic.py:947()\n", + " 40 0.003 0.000 0.004 0.000 types.py:1125(free)\n", + " 10866 0.003 0.000 0.003 0.000 numeric.py:2471(_dtype_cannot_hold_nan)\n", + " 42 0.003 0.000 0.003 0.000 {built-in method nt.stat}\n", + " 10747 0.003 0.000 0.003 0.000 basic.py:1286()\n", + " 17152 0.003 0.000 0.003 0.000 frozendict.py:39(__hash__)\n", + " 3880 0.003 0.000 0.013 0.000 type.py:315(in_same_class)\n", + " 825 0.003 0.000 0.072 0.000 core.py:22(trampoline_eval)\n", + " 4476 0.003 0.000 0.003 0.000 variable.py:1080(signature)\n", + " 4455 0.003 0.000 0.005 0.000 core.py:3771(_get_data)\n", + " 3034 0.003 0.000 0.003 0.000 {built-in method _hashlib.openssl_sha256}\n", + " 951 0.003 0.000 0.011 0.000 basic.py:1081()\n", + " 601 0.003 0.000 0.129 0.000 basic.py:1615(transform)\n", + " 7349 0.003 0.000 0.006 0.000 variable.py:635(ndim)\n", + " 2020 0.003 0.000 0.003 0.000 {method '__array_wrap__' of 'numpy.ndarray' objects}\n", + " 5410 0.003 0.000 0.007 0.000 basic.py:274(dimshuffled_alloc)\n", + " 425/240 0.003 0.000 0.008 0.000 subtensor.py:708(index_vars_to_types)\n", + " 2218 0.003 0.000 0.004 0.000 op.py:617()\n", + " 1855 0.003 0.000 0.159 0.000 fg.py:539(replace_all)\n", + " 216 0.002 0.000 0.071 0.000 basic.py:801(cast)\n", + " 18 0.002 0.000 0.298 0.017 rewriting.py:90(remove_constants_and_unused_inputs_scan)\n", + " 449/323 0.002 0.000 0.059 0.000 blas.py:217(_gemm_canonicalize)\n", + " 1238 0.002 0.000 0.003 0.000 utils.py:5(transitive_get)\n", + " 825 0.002 0.000 0.016 0.000 unify.py:84(cdr_Variable)\n", + " 13365 0.002 0.000 0.002 0.000 {built-in method _warnings._filters_mutated}\n", + " 9533 0.002 0.000 0.002 0.000 type.py:343()\n", + " 4455 0.002 0.000 0.019 0.000 _methods.py:58(_any)\n", + " 3666 0.002 0.000 0.002 0.000 {method 'difference_update' of 'set' objects}\n", + " 855 0.002 0.000 0.009 0.000 _abc.py:130(with_segments)\n", + " 4455 0.002 0.000 0.002 0.000 warnings.py:462(__init__)\n", + " 2870 0.002 0.000 0.009 0.000 core.py:180(_unify_Iterable)\n", + " 70 0.002 0.000 1.341 0.019 pfunc.py:107(rebuild_collect_shared)\n", + " 9 0.002 0.000 6.414 0.713 base_events.py:1954(_run_once)\n", + " 2452 0.002 0.000 0.006 0.000 configparser.py:425(__set__)\n", + " 6172 0.002 0.000 0.002 0.000 _misc.py:181(_datacopied)\n", + " 1200 0.002 0.000 0.003 0.000 configparser.py:306(change_flags)\n", + " 537 0.002 0.000 0.004 0.000 elemwise.py:322(is_dimshuffle_useless)\n", + " 4455 0.002 0.000 0.016 0.000 _methods.py:50(_sum)\n", + " 285 0.002 0.000 0.445 0.002 op.py:300(__init__)\n", + " 137 0.002 0.000 0.021 0.000 subtensor.py:859(make_node)\n", + " 1999 0.002 0.000 0.002 0.000 {built-in method nt._path_splitroot_ex}\n", + " 4656 0.002 0.000 0.040 0.000 shape.py:447()\n", + " 5230 0.002 0.000 0.015 0.000 basic.py:1462()\n", + " 1661 0.002 0.000 0.002 0.000 basic.py:743()\n", + " 611 0.002 0.000 0.005 0.000 basic.py:1883(__init__)\n", + " 1200 0.002 0.000 0.006 0.000 configparser.py:48(__enter__)\n", + " 151 0.002 0.000 0.002 0.000 {method 'sub' of 're.Pattern' objects}\n", + " 2404 0.002 0.000 0.078 0.000 unify.py:202(_unify_Variable_ExpressionTuple)\n", + " 5230 0.002 0.000 0.006 0.000 basic.py:1447()\n", + " 285 0.002 0.000 0.004 0.000 _local.py:148(__truediv__)\n", + " 17682 0.002 0.000 0.002 0.000 features.py:309(on_prune)\n", + " 8/0 0.002 0.000 0.000 {built-in method select.select}\n", + " 1140 0.002 0.000 0.004 0.000 _local.py:277(_raw_path)\n", + " 3636 0.002 0.000 0.003 0.000 elemwise.py:831()\n", + " 2124 0.002 0.000 0.003 0.000 basic.py:1022(expand)\n", + " 82 0.002 0.000 0.047 0.001 blockwise.py:232(_create_dummy_core_node)\n", + " 232 0.002 0.000 0.382 0.002 subtensor.py:950(infer_shape)\n", + " 452 0.002 0.000 0.009 0.000 subtensor.py:275(local_useless_slice)\n", + " 96 0.002 0.000 0.010 0.000 basic.py:4426(c_code_template)\n", + " 3 0.002 0.001 0.002 0.001 {built-in method _io.open_code}\n", + " 1141 0.002 0.000 0.009 0.000 basic.py:477(get_test_value)\n", + " 1390 0.002 0.000 0.037 0.000 basic.py:1024(upcast_out_nobool)\n", + " 18 0.002 0.000 0.010 0.001 socket.py:623(send)\n", + " 1942 0.002 0.000 0.004 0.000 basic.py:1577(compute_deps_cache)\n", + " 800/624 0.002 0.000 0.005 0.000 subtensor.py:194(as_index_literal)\n", + " 1593 0.002 0.000 0.021 0.000 subtensor.py:252(get_idx_list)\n", + " 284 0.002 0.000 0.010 0.000 subtensor.py:940(perform)\n", + " 1425 0.002 0.000 0.003 0.000 _local.py:505(__new__)\n", + " 7701 0.002 0.000 0.002 0.000 fg.py:272()\n", + " 5776 0.002 0.000 0.003 0.000 frozendict.py:33(__len__)\n", + " 764 0.002 0.000 0.003 0.000 blockwise.py:319(batch_ndim)\n", + " 1862 0.002 0.000 0.004 0.000 elemwise.py:465(__str__)\n", + " 6 0.002 0.000 0.199 0.033 elemwise.py:69(apply)\n", + " 1289 0.002 0.000 0.002 0.000 type.py:405(__str__)\n", + " 8395 0.002 0.000 0.002 0.000 fromnumeric.py:2584(_all_dispatcher)\n", + " 3327 0.002 0.000 0.002 0.000 {method 'replace' of 'str' objects}\n", + " 1141 0.002 0.000 0.004 0.000 utils.py:133(get_variable_trace_string)\n", + " 6756 0.002 0.000 0.006 0.000 basic.py:1252()\n", + " 1195 0.002 0.000 0.002 0.000 {method 'split' of 'str' objects}\n", + " 9 0.002 0.000 0.221 0.025 builders.py:86(construct_nominal_fgraph)\n", + " 72 0.002 0.000 0.055 0.001 blockwise.py:278(make_node)\n", + " 3053 0.002 0.000 0.002 0.000 basic.py:634(local_alloc_unary)\n", + " 5776 0.002 0.000 0.002 0.000 basic.py:317(nout)\n", + " 285 0.002 0.000 0.239 0.001 _abc.py:628(read_text)\n", + " 3034 0.002 0.000 0.002 0.000 {method 'hexdigest' of '_hashlib.HASH' objects}\n", + " 2306 0.002 0.000 0.004 0.000 basic.py:1714(on_import)\n", + " 11026 0.002 0.000 0.002 0.000 basic.py:711(index)\n", + " 285 0.002 0.000 0.241 0.001 _local.py:539(read_text)\n", + " 6741 0.002 0.000 0.002 0.000 features.py:363(__init__)\n", + " 4024 0.002 0.000 0.014 0.000 op.py:319(__ne__)\n", + " 1202 0.002 0.000 0.010 0.000 core.py:158(_unify_Var_object)\n", + " 1106 0.002 0.000 0.019 0.000 basic.py:587(get_scalar_constant_value)\n", + " 629 0.002 0.000 0.002 0.000 linalg.py:67(is_matrix_transpose)\n", + " 110/104 0.002 0.000 0.042 0.000 variable.py:457(__getitem__)\n", + " 5042 0.002 0.000 0.002 0.000 variable.py:1064()\n", + " 3252 0.002 0.000 0.013 0.000 subtensor.py:146()\n", + " 4563 0.002 0.000 0.007 0.000 basic.py:1172(local_view_op)\n", + " 1079 0.002 0.000 0.240 0.000 variable.py:125(__sub__)\n", + " 2452 0.002 0.000 0.002 0.000 configparser.py:380(apply)\n", + " 820 0.002 0.000 0.007 0.000 op.py:615(__repr__)\n", + " 2385 0.002 0.000 0.002 0.000 {method 'match' of 're.Pattern' objects}\n", + " 7726 0.002 0.000 0.002 0.000 features.py:820(on_import)\n", + " 2312 0.002 0.000 0.019 0.000 {built-in method nt.fspath}\n", + " 2737 0.002 0.000 0.002 0.000 __init__.py:330(_compile)\n", + " 588 0.002 0.000 0.005 0.000 math.py:1258(__str__)\n", + " 5353 0.002 0.000 0.006 0.000 basic.py:769()\n", + " 75/69 0.002 0.000 0.354 0.005 fg.py:80(__init__)\n", + " 1145 0.002 0.000 0.051 0.000 op.py:108(make_thunk)\n", + " 1042 0.002 0.000 0.006 0.000 subtensor.py:1004(__hash__)\n", + " 570 0.002 0.000 0.020 0.000 :80(isabs)\n", + " 4647 0.002 0.000 0.002 0.000 multiarray.py:383(where)\n", + " 3308 0.002 0.000 0.004 0.000 basic.py:1424(__hash__)\n", + " 3813 0.002 0.000 0.005 0.000 basic.py:733(local_remove_useless_assert)\n", + " 1293 0.002 0.000 0.003 0.000 basic.py:491(__str__)\n", + " 11463 0.001 0.000 0.001 0.000 basic.py:698(owner)\n", + " 4 0.001 0.000 0.012 0.003 fg.py:812(check_integrity)\n", + " 2020 0.001 0.000 0.001 0.000 _ufunc_config.py:430(__init__)\n", + " 825 0.001 0.000 0.004 0.000 core.py:254(__getitem__)\n", + " 948 0.001 0.000 0.002 0.000 math.py:3424(__init__)\n", + " 474 0.001 0.000 0.101 0.000 math.py:3833(all)\n", + " 241 0.001 0.000 0.002 0.000 threading.py:1477(enumerate)\n", + " 2546 0.001 0.000 0.002 0.000 variable.py:1083(unique_value)\n", + " 770 0.001 0.000 0.002 0.000 math.py:1064(simplify_factors)\n", + " 829 0.001 0.000 0.114 0.000 basic.py:1191(get_trackers)\n", + " 5113 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", + " 3422 0.001 0.000 0.002 0.000 ordered_set.py:20(__len__)\n", + " 4042 0.001 0.000 0.001 0.000 fromnumeric.py:3323(_prod_dispatcher)\n", + " 1014 0.001 0.000 0.005 0.000 basic.py:1165(add_tracker)\n", + " 3 0.001 0.000 0.299 0.100 blas.py:447(apply)\n", + " 1175 0.001 0.000 0.050 0.000 op.py:555(make_thunk)\n", + " 2990 0.001 0.000 0.001 0.000 {method 'startswith' of 'str' objects}\n", + " 2385 0.001 0.000 0.005 0.000 __init__.py:164(match)\n", + " 4376 0.001 0.000 0.001 0.000 {built-in method numpy.asanyarray}\n", + " 1200 0.001 0.000 0.005 0.000 configparser.py:60(__exit__)\n", + " 3521 0.001 0.000 0.002 0.000 ordered_set.py:23(add)\n", + " 4040 0.001 0.000 0.001 0.000 _linalg.py:492(_unary_dispatcher)\n", + " 112 0.001 0.000 0.002 0.000 numeric.py:137(ones)\n", + " 4950 0.001 0.000 0.002 0.000 {built-in method _operator.length_hint}\n", + " 4066 0.001 0.000 0.004 0.000 basic.py:1452()\n", + " 412 0.001 0.000 0.004 0.000 math.py:1927(local_add_neg_to_sub)\n", + " 6 0.001 0.000 0.858 0.143 rewriting.py:420(scan_push_out_seq)\n", + " 63/0 0.001 0.000 0.000 gradient.py:1165(access_term_cache)\n", + " 5721 0.001 0.000 0.014 0.000 elemwise.py:751()\n", + " 825 0.001 0.000 0.074 0.000 dispatch.py:109(etuplize)\n", + " 6181 0.001 0.000 0.001 0.000 {built-in method builtins.iter}\n", + " 447 0.001 0.000 0.003 0.000 math.py:3112(infer_shape)\n", + " 323 0.001 0.000 0.003 0.000 inspect.py:919(getfile)\n", + " 304 0.001 0.000 0.001 0.000 {built-in method _winapi.LCMapStringEx}\n", + " 1168 0.001 0.000 0.027 0.000 elemwise.py:121(params_type)\n", + " 4455 0.001 0.000 0.001 0.000 core.py:1870(_check_mask_axis)\n", + " 3504 0.001 0.000 0.003 0.000 params_type.py:462()\n", + " 19 0.001 0.000 0.391 0.021 subtensor.py:769(merge_two_slices)\n", + " 18 0.001 0.000 0.010 0.001 db.py:348(query)\n", + " 3 0.001 0.000 0.002 0.001 utils.py:230(gc_helper)\n", + " 2555 0.001 0.000 0.003 0.000 basic.py:688(merge_signature)\n", + " 1537 0.001 0.000 0.002 0.000 basic.py:938(equivalent_up_to_constant_casting)\n", + " 8055 0.001 0.000 0.001 0.000 basic.py:764(c_code_cache_version)\n", + " 5447 0.001 0.000 0.001 0.000 type.py:265()\n", + " 2495 0.001 0.000 0.002 0.000 basic.py:1302(__str__)\n", + " 1650 0.001 0.000 0.011 0.000 core.py:24(__instancecheck__)\n", + " 4600 0.001 0.000 0.002 0.000 ordered_set.py:14(__contains__)\n", + " 2125 0.001 0.000 0.002 0.000 basic.py:2402(importer)\n", + " 3102 0.001 0.000 0.001 0.000 features.py:959()\n", + " 54 0.001 0.000 0.005 0.000 math.py:2177(local_mul_specialize)\n", + " 6 0.001 0.000 0.107 0.018 rewriting.py:212(scan_push_out_non_seq)\n", + " 9 0.001 0.000 0.015 0.002 basic.py:1709(as_string)\n", + " 688 0.001 0.000 0.004 0.000 subtensor.py:918(movable)\n", + " 17/3 0.001 0.000 2.584 0.861 basic.py:260(apply)\n", + " 56 0.001 0.000 0.001 0.000 _basic.py:53(_find_matrix_structure)\n", + " 474 0.001 0.000 0.097 0.000 math.py:3430(make_node)\n", + " 855 0.001 0.000 0.042 0.000 _local.py:166(__fspath__)\n", + " 702 0.001 0.000 0.002 0.000 :730(remove)\n", + " 1650 0.001 0.000 0.010 0.000 core.py:19(__instancecheck__)\n", + " 264 0.001 0.000 0.398 0.002 subtensor.py:360(local_subtensor_merge)\n", + " 326 0.001 0.000 0.006 0.000 subtensor.py:884(local_IncSubtensor_serialize)\n", + " 11 0.001 0.000 0.011 0.001 op.py:895(make_node)\n", + " 584 0.001 0.000 0.034 0.000 op.py:437(c_code_cache_version)\n", + " 285 0.001 0.000 0.002 0.000 :322(decode)\n", + " 673 0.001 0.000 0.002 0.000 variable.py:10(__instancecheck__)\n", + " 5983 0.001 0.000 0.001 0.000 :850(__init__)\n", + " 70 0.001 0.000 0.013 0.000 math.py:3009(make_node)\n", + " 708 0.001 0.000 0.003 0.000 fg.py:177(add_input)\n", + " 253 0.001 0.000 0.032 0.000 shape.py:208(shape_ir)\n", + " 1687 0.001 0.000 0.001 0.000 threading.py:1110(ident)\n", + " 5097 0.001 0.000 0.001 0.000 basic.py:724()\n", + " 625 0.001 0.000 0.003 0.000 basic.py:150(extract_constants)\n", + " 36 0.001 0.000 0.011 0.000 math.py:1949(local_mul_zero)\n", + " 989 0.001 0.000 0.001 0.000 elemwise.py:248(infer_shape)\n", + " 2 0.001 0.001 0.376 0.188 rewriting.py:1236(scan_save_mem_rewrite)\n", + " 224 0.001 0.000 0.003 0.000 type.py:360(values_eq)\n", + " 8493 0.001 0.000 0.001 0.000 features.py:288(on_import)\n", + " 56 0.001 0.000 0.033 0.001 slinalg.py:284(make_node)\n", + " 1022 0.001 0.000 0.003 0.000 math.py:1910(local_sub_neg_to_add)\n", + " 2929 0.001 0.000 0.001 0.000 {method 'values' of 'dict' objects}\n", + " 287 0.001 0.000 0.002 0.000 :99(join)\n", + " 5469 0.001 0.000 0.001 0.000 elemwise.py:846()\n", + " 2259 0.001 0.000 0.001 0.000 elemwise.py:1116()\n", + " 513 0.001 0.000 0.002 0.000 basic.py:728(__new__)\n", + " 285 0.001 0.000 0.001 0.000 {built-in method nt.getcwd}\n", + " 2 0.001 0.000 0.001 0.000 {built-in method nt.open}\n", + " 1573 0.001 0.000 0.033 0.000 basic.py:1733(output_types)\n", + " 3275 0.001 0.000 0.001 0.000 basic.py:2198(on_import)\n", + " 1956 0.001 0.000 0.001 0.000 ordered_set.py:8(__init__)\n", + " 3191 0.001 0.000 0.033 0.000 shape.py:226()\n", + " 3 0.001 0.000 0.007 0.002 types.py:1223(insert_deepcopy)\n", + " 476 0.001 0.000 0.001 0.000 elemwise.py:1288(_acc_dtype)\n", + " 6673 0.001 0.000 0.001 0.000 features.py:299(on_change_input)\n", + " 5433 0.001 0.000 0.001 0.000 numeric.py:2456(_array_equal_dispatcher)\n", + " 40 0.001 0.000 8.812 0.220 op.py:1646(rval)\n", + " 182 0.001 0.000 0.009 0.000 math.py:134(local_0_dot_x)\n", + " 285 0.001 0.000 0.011 0.000 _local.py:329(parent)\n", + " 625 0.001 0.000 0.004 0.000 basic.py:160()\n", + " 285 0.001 0.000 0.114 0.000 _local.py:664(resolve)\n", + " 1992 0.001 0.000 0.002 0.000 basic.py:1428(output_types)\n", + " 311/309 0.001 0.000 0.343 0.001 fg.py:669(attach_feature)\n", + " 513 0.001 0.000 0.006 0.000 basic.py:748(__init__)\n", + " 474 0.001 0.000 0.002 0.000 math.py:3441(clone)\n", + " 2156 0.001 0.000 0.010 0.000 basic.py:999(vars_between)\n", + " 3053 0.001 0.000 0.003 0.000 elemwise.py:1318(local_useless_2f1grad_loop)\n", + " 10201 0.001 0.000 0.001 0.000 op.py:460(do_constant_folding)\n", + " 1750 0.001 0.000 0.035 0.000 interface.py:226(c_code_cache_version_apply)\n", + " 390 0.001 0.000 0.003 0.000 subtensor.py:1697(__hash__)\n", + " 3020 0.001 0.000 0.001 0.000 {method 'encode' of 'str' objects}\n", + " 18 0.001 0.000 0.452 0.025 op.py:2175(infer_shape)\n", + " 2475 0.001 0.000 0.001 0.000 core.py:270(__len__)\n", + " 101 0.001 0.000 0.002 0.000 math.py:1266(mul_calculate)\n", + " 245 0.001 0.000 0.005 0.000 subtensor.py:442(local_subtensor_remove_broadcastable_index)\n", + " 197 0.001 0.000 0.016 0.000 shape.py:250(make_node)\n", + " 5042 0.001 0.000 0.001 0.000 variable.py:1076()\n", + " 36/3 0.001 0.000 0.013 0.004 db.py:119(__query__)\n", + " 4456 0.001 0.000 0.001 0.000 fromnumeric.py:2472(_any_dispatcher)\n", + " 1141 0.001 0.000 0.109 0.000 elemwise.py:623(elemwise_scalar_op_has_c_code)\n", + " 1650 0.001 0.000 0.002 0.000 dispatch.py:20(_unify_ExpressionTuple)\n", + " 285 0.001 0.000 0.001 0.000 :312(__init__)\n", + " 3192 0.001 0.000 0.001 0.000 basic.py:2295(get_node_rewriters)\n", + " 68 0.001 0.000 0.001 0.000 utils.py:274(check)\n", + " 1650 0.001 0.000 0.001 0.000 unify.py:74(car_Variable)\n", + " 601 0.001 0.000 0.118 0.000 core.py:238(unify)\n", + " 416/268 0.001 0.000 0.050 0.000 math.py:999(merge_num_denum)\n", + " 698 0.001 0.000 0.004 0.000 utils.py:188(hash_from_code)\n", + " 2452 0.001 0.000 0.001 0.000 configparser.py:389(validate)\n", + " 170 0.001 0.000 0.003 0.000 shape.py:467(set_shape_i)\n", + " 952 0.001 0.000 0.001 0.000 elemwise.py:1175(__init__)\n", + " 139 0.001 0.000 0.013 0.000 basic.py:618(make_node)\n", + " 4582 0.001 0.000 0.001 0.000 basic.py:2202(on_change_input)\n", + " 3 0.001 0.000 0.001 0.000 utils.py:40(map_storage)\n", + " 185 0.001 0.000 0.271 0.001 fg.py:169(add_output)\n", + " 138 0.001 0.000 0.003 0.000 math.py:685(local_mul_switch_sink)\n", + " 2433 0.001 0.000 0.117 0.000 elemwise.py:851()\n", + " 41 0.001 0.000 0.002 0.000 basic.py:2298(add_requirements)\n", + " 243 0.001 0.000 0.010 0.000 subtensor.py:641(local_useless_subtensor)\n", + " 636/243 0.001 0.000 0.005 0.000 subtensor.py:815(conv)\n", + " 5744 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", + " 10/1 0.001 0.000 0.000 0.000 events.py:87(_run)\n", + " 41/39 0.001 0.000 0.303 0.008 shape.py:500(on_attach)\n", + " 4058 0.001 0.000 0.001 0.000 basic.py:1722(on_change_input)\n", + " 2587 0.001 0.000 0.001 0.000 dispatch.py:176()\n", + " 825 0.001 0.000 0.003 0.000 core.py:201(car)\n", + " 13 0.001 0.000 0.041 0.003 replace.py:238(vectorize_graph)\n", + " 285 0.001 0.000 0.001 0.000 {built-in method _codecs.utf_8_decode}\n", + " 1862 0.001 0.000 0.001 0.000 {method 'capitalize' of 'str' objects}\n", + " 212 0.001 0.000 0.005 0.000 basic.py:673(make_node)\n", + " 3 0.001 0.000 0.003 0.001 types.py:364(__init__)\n", + " 285 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", + " 262 0.001 0.000 0.004 0.000 basic.py:752(clone)\n", + " 18 0.001 0.000 0.448 0.025 builders.py:29(infer_shape)\n", + " 56 0.001 0.000 0.004 0.000 _basic.py:348(_matrix_norm_diagonal)\n", + " 20 0.001 0.000 0.391 0.020 basic.py:1513(infer_static_shape)\n", + " 300 0.001 0.000 0.001 0.000 basic.py:1829(attach_updater)\n", + " 28 0.001 0.000 0.005 0.000 blas.py:844(make_node)\n", + " 550 0.001 0.000 0.001 0.000 basic.py:852(merge_profile)\n", + " 49 0.001 0.000 0.009 0.000 math.py:2617(local_greedy_distributor)\n", + " 601 0.001 0.000 0.001 0.000 core.py:16(assoc)\n", + " 323 0.001 0.000 0.188 0.001 blas.py:402(_gemm_from_node2)\n", + " 30 0.001 0.000 1.176 0.039 replace.py:56(clone_replace)\n", + " 1030 0.001 0.000 0.002 0.000 rewriting.py:265()\n", + " 1200 0.001 0.000 0.001 0.000 configparser.py:35(__init__)\n", + " 98 0.001 0.000 0.008 0.000 shape.py:718(infer_shape)\n", + " 825 0.001 0.000 0.018 0.000 core.py:248(cdr)\n", + " 737/263 0.001 0.000 0.002 0.000 subtensor.py:694(helper)\n", + " 590 0.001 0.000 0.006 0.000 subtensor.py:318(analyze)\n", + " 2020 0.001 0.000 0.001 0.000 fromnumeric.py:1126(_argsort_dispatcher)\n", + " 112 0.001 0.000 0.002 0.000 _twodim_base_impl.py:245(diag)\n", + " 369 0.001 0.000 0.002 0.000 subtensor_lift.py:591(local_subtensor_make_vector)\n", + " 460 0.001 0.000 0.089 0.000 variable.py:108(__add__)\n", + " 584 0.001 0.000 0.002 0.000 params_type.py:819(c_code_cache_version)\n", + " 626 0.001 0.000 0.001 0.000 frozendict.py:36(__repr__)\n", + " 2319 0.001 0.000 0.001 0.000 {method 'extendleft' of 'collections.deque' objects}\n", + " 193 0.001 0.000 0.001 0.000 __init__.py:599(__init__)\n", + " 243 0.001 0.000 0.009 0.000 subtensor.py:774(get_constant_idx)\n", + " 643 0.001 0.000 0.236 0.000 elemwise.py:688(variables_depend_on)\n", + " 2419 0.001 0.000 0.001 0.000 basic.py:420(__str__)\n", + " 53 0.001 0.000 0.004 0.000 fg.py:762(orderings)\n", + " 434 0.001 0.000 0.003 0.000 linalg.py:234(no_transpose_symmetric)\n", + " 2728 0.001 0.000 0.001 0.000 features.py:824(validate)\n", + " 306 0.001 0.000 0.014 0.000 {built-in method nt._path_normpath}\n", + " 250 0.001 0.000 0.001 0.000 utils.py:137(broadcast_static_dim_lengths)\n", + " 60/0 0.001 0.000 0.000 gradient.py:1487(access_grad_cache)\n", + " 149 0.001 0.000 0.002 0.000 basic.py:1775(do_constant_folding)\n", + " 304 0.001 0.000 0.002 0.000 :50(normcase)\n", + " 18 0.001 0.000 0.006 0.000 basic.py:2231(__init__)\n", + " 540 0.001 0.000 0.002 0.000 variable.py:640(broadcastable)\n", + " 145 0.001 0.000 0.014 0.000 shape.py:72(make_node)\n", + " 20 0.001 0.000 9.577 0.479 types.py:884(__call__)\n", + " 780 0.001 0.000 0.001 0.000 subtensor.py:1698()\n", + " 155/152 0.001 0.000 0.002 0.000 elemwise.py:499(flatten_nested_add_mul)\n", + " 1112 0.001 0.000 0.002 0.000 rewriting.py:473()\n", + " 806 0.001 0.000 0.001 0.000 utils.py:342(discard)\n", + " 292 0.001 0.000 0.001 0.000 basic.py:1632(default_node_formatter)\n", + " 151 0.001 0.000 0.002 0.000 gradient.py:931(_node_to_pattern)\n", + " 3300 0.001 0.000 0.001 0.000 core.py:153()\n", + " 268 0.001 0.000 0.005 0.000 op.py:181(copy_var_format)\n", + " 6 0.001 0.000 0.001 0.000 elemwise.py:681(shallow_clone_defaultdict)\n", + " 257 0.001 0.000 0.006 0.000 utils.py:38(safe_new)\n", + " 1175 0.001 0.000 0.001 0.000 op.py:52(is_thunk_type)\n", + " 204 0.001 0.000 0.002 0.000 ordered_set.py:33(update)\n", + " 361 0.001 0.000 0.023 0.000 subtensor_lift.py:487(local_subtensor_of_alloc)\n", + " 570 0.001 0.000 0.012 0.000 op.py:346()\n", + " 703 0.001 0.000 0.004 0.000 core.py:153(_unify)\n", + " 1202 0.001 0.000 0.001 0.000 variable.py:69(__hash__)\n", + " 1 0.001 0.001 0.460 0.460 op.py:2370(L_op)\n", + " 1650 0.001 0.000 0.001 0.000 core.py:264(__iter__)\n", + " 86 0.001 0.000 0.001 0.000 :835(__eq__)\n", + " 1311 0.001 0.000 0.002 0.000 basic.py:162()\n", + " 285 0.001 0.000 0.207 0.001 _local.py:529(open)\n", + " 61 0.001 0.000 0.002 0.000 subtensor.py:529(local_useless_inc_subtensor)\n", + " 4066 0.000 0.000 0.000 0.000 basic.py:1468()\n", + " 285 0.000 0.000 0.003 0.000 _local.py:245(_from_parsed_parts)\n", + " 755 0.000 0.000 0.001 0.000 basic.py:177(default_output)\n", + " 1315 0.000 0.000 0.001 0.000 basic.py:1889()\n", + " 112 0.000 0.000 0.000 0.000 {method 'diagonal' of 'numpy.ndarray' objects}\n", + " 71/42 0.000 0.000 0.020 0.000 blas.py:172(_beta_L_plus_alpha_M)\n", + " 3504 0.000 0.000 0.000 0.000 params_type.py:380()\n", + " 1875 0.000 0.000 0.003 0.000 variable.py:81(isvar)\n", + " 351 0.000 0.000 0.000 0.000 basic.py:681(perform)\n", + " 1752 0.000 0.000 0.001 0.000 params_type.py:820()\n", + " 49 0.000 0.000 0.005 0.000 utils.py:174(_parse_gufunc_signature)\n", + " 601 0.000 0.000 0.120 0.000 core.py:252(unify_NoMap)\n", + " 1039 0.000 0.000 0.000 0.000 vm.py:1167()\n", + " 212 0.000 0.000 0.006 0.000 basic.py:670(__call__)\n", + " 139 0.000 0.000 0.015 0.000 basic.py:104(_as_tensor_Scalar)\n", + " 2076 0.000 0.000 0.000 0.000 shape_base.py:76(_atleast_2d_dispatcher)\n", + " 9 0.000 0.000 0.353 0.039 op.py:680(__init__)\n", + " 96 0.000 0.000 0.131 0.001 variable.py:204(__radd__)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", + " 91 0.000 0.000 0.002 0.000 features.py:684(on_attach)\n", + " 260 0.000 0.000 0.006 0.000 builders.py:139()\n", + " 13 0.000 0.000 0.003 0.000 basic.py:1086(truncated_graph_inputs)\n", + " 91 0.000 0.000 0.110 0.001 fg.py:746(toposort)\n", + " 12 0.000 0.000 0.021 0.002 subtensor.py:2815(make_node)\n", + " 2354 0.000 0.000 0.000 0.000 configparser.py:461(_apply)\n", + " 1424 0.000 0.000 0.043 0.000 basic.py:927(graph_inputs)\n", + " 2076 0.000 0.000 0.000 0.000 shape_base.py:17(_atleast_1d_dispatcher)\n", + " 114 0.000 0.000 0.000 0.000 {built-in method numpy.frompyfunc}\n", + " 317/119 0.000 0.000 0.007 0.000 subtensor.py:152(as_index_constant)\n", + " 232 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", + " 18 0.000 0.000 0.019 0.001 subtensor.py:618(indexed_result_shape)\n", + " 285 0.000 0.000 0.020 0.000 _local.py:406(is_absolute)\n", + " 2181 0.000 0.000 0.000 0.000 basic.py:1718(on_prune)\n", + " 15 0.000 0.000 0.000 0.000 {built-in method builtins.__build_class__}\n", + " 36 0.000 0.000 0.107 0.003 blas.py:685(local_dot22_to_ger_or_gemv)\n", + " 105 0.000 0.000 0.002 0.000 basic.py:1844(variable_depends_on)\n", + " 71 0.000 0.000 0.064 0.001 linalg.py:105(inv_as_solve)\n", + " 2076 0.000 0.000 0.000 0.000 multiarray.py:690(result_type)\n", + " 242 0.000 0.000 0.001 0.000 subtensor_lift.py:169(local_subtensor_of_elemwise)\n", + " 19 0.000 0.000 0.005 0.000 inspect.py:1661(getframeinfo)\n", + " 285 0.000 0.000 0.001 0.000 :146(splitdrive)\n", + " 1039 0.000 0.000 0.000 0.000 vm.py:1255()\n", + " 116 0.000 0.000 0.002 0.000 basic.py:466(local_alloc_sink_dimshuffle)\n", + " 207 0.000 0.000 0.002 0.000 subtensor_lift.py:722(local_subtensor_shape_constant)\n", + " 260 0.000 0.000 0.001 0.000 basic.py:1490()\n", + " 6 0.000 0.000 0.114 0.019 rewriting.py:827(scan_push_out_add)\n", + " 361 0.000 0.000 0.001 0.000 inspect.py:298(ismodule)\n", + " 227 0.000 0.000 0.085 0.000 variable.py:133(__mul__)\n", + " 180 0.000 0.000 0.003 0.000 linalg.py:91(transinv_to_invtrans)\n", + " 11 0.000 0.000 0.016 0.001 basic.py:518(on_attach)\n", + " 3 0.000 0.000 0.634 0.211 elemwise.py:595(apply)\n", + " 191 0.000 0.000 0.003 0.000 subtensor.py:836(as_nontensor_scalar)\n", + " 1203 0.000 0.000 0.000 0.000 {built-in method builtins.setattr}\n", + " 755 0.000 0.000 0.001 0.000 basic.py:307(out)\n", + " 1689 0.000 0.000 0.001 0.000 basic.py:1088(add_requirements)\n", + " 177 0.000 0.000 0.068 0.000 math.py:170(local_lift_transpose_through_dot)\n", + " 601 0.000 0.000 0.000 0.000 math.py:1405(local_elemwise_sub_zeros)\n", + " 54 0.000 0.000 0.001 0.000 math.py:573(local_mul_pow_to_pow_add)\n", + " 5 0.000 0.000 0.608 0.122 elemwise.py:605(find_next_fuseable_subgraph)\n", + " 147 0.000 0.000 0.001 0.000 utils.py:197()\n", + " 119 0.000 0.000 0.007 0.000 blockwise.py:72(local_eager_useless_unbatched_blockwise)\n", + " 825 0.000 0.000 0.003 0.000 dispatch.py:74(rator)\n", + " 43 0.000 0.000 0.005 0.000 blockwise.py:163(__init__)\n", + " 109 0.000 0.000 0.001 0.000 op.py:148(check_broadcast)\n", + " 948 0.000 0.000 0.001 0.000 raise_op.py:92()\n", + " 268 0.000 0.000 0.002 0.000 basic.py:1487(c_code)\n", + " 30 0.000 0.000 0.002 0.000 destroyhandler.py:225(inplace_candidates)\n", + " 141 0.000 0.000 0.010 0.000 type.py:197(make_constant)\n", + " 316 0.000 0.000 0.001 0.000 math.py:1571()\n", + " 6 0.000 0.000 0.068 0.011 functional.py:79(inner)\n", + " 298 0.000 0.000 0.001 0.000 subtensor_lift.py:111(local_subtensor_of_dot)\n", + " 8 0.000 0.000 0.000 0.000 op.py:446(get_oinp_iinp_iout_oout_mappings)\n", + " 107 0.000 0.000 0.004 0.000 math.py:2573(attempt_distribution)\n", + " 40/12 0.000 0.000 0.001 0.000 math.py:3403(perform_sigm_times_exp)\n", + " 143 0.000 0.000 0.001 0.000 fg.py:694(remove_feature)\n", + " 825 0.000 0.000 0.018 0.000 dispatch.py:79(rands)\n", + " 1311 0.000 0.000 0.000 0.000 basic.py:1892()\n", + " 101 0.000 0.000 0.001 0.000 special.py:110(softmax_simplifier)\n", + " 590 0.000 0.000 0.000 0.000 type.py:633(__instancecheck__)\n", + " 933 0.000 0.000 0.001 0.000 utils.py:113(import_func_from_string)\n", + " 403 0.000 0.000 0.001 0.000 utils.py:316(__getitem__)\n", + " 243 0.000 0.000 0.001 0.000 subtensor.py:490(local_subtensor_inc_subtensor)\n", + " 40 0.000 0.000 0.002 0.000 elemwise.py:1395(perform)\n", + " 51/15 0.000 0.000 9.287 0.619 basic.py:110(rewrite)\n", + " 36 0.000 0.000 0.015 0.000 blockwise.py:40(local_useless_unbatched_blockwise)\n", + " 600 0.000 0.000 0.030 0.000 elemwise.py:839()\n", + " 2042 0.000 0.000 0.000 0.000 op.py:847()\n", + " 47 0.000 0.000 0.087 0.002 basic.py:2108(transpose)\n", + " 18 0.000 0.000 0.001 0.000 utils.py:255(__init__)\n", + " 109/84 0.000 0.000 0.000 0.000 basic.py:1790(view_roots)\n", + " 200 0.000 0.000 0.001 0.000 variable.py:458(includes_bool)\n", + " 32 0.000 0.000 0.017 0.001 blas.py:579(local_dot_to_dot22)\n", + " 18 0.000 0.000 0.001 0.000 blockwise.py:256(filter_candidate_pairs)\n", + " 75 0.000 0.000 0.000 0.000 features.py:390(on_attach)\n", + " 2452 0.000 0.000 0.000 0.000 configparser.py:376(mutable)\n", + " 117 0.000 0.000 0.026 0.000 op.py:1251(__eq__)\n", + " 951 0.000 0.000 0.011 0.000 basic.py:1061(applys_between)\n", + " 145 0.000 0.000 0.015 0.000 shape.py:149(shape)\n", + " 27 0.000 0.000 0.001 0.000 basic.py:1222(__init__)\n", + " 222 0.000 0.000 0.001 0.000 utils.py:319(__setitem__)\n", + " 759 0.000 0.000 0.000 0.000 ordered_set.py:26(discard)\n", + " 164 0.000 0.000 0.000 0.000 {method 'setflags' of 'numpy.ndarray' objects}\n", + " 82 0.000 0.000 0.000 0.000 basic.py:1200(get_rewriters)\n", + " 16 0.000 0.000 0.022 0.001 elemwise.py:277(create_inplace_node)\n", + " 18/3 0.000 0.000 0.013 0.004 db.py:410(query)\n", + " 550 0.000 0.000 0.000 0.000 basic.py:2217(merge_dict)\n", + " 283 0.000 0.000 0.002 0.000 subtensor.py:674(get_slice_elements)\n", + " 291 0.000 0.000 0.003 0.000 basic.py:1272()\n", + " 187 0.000 0.000 0.001 0.000 basic.py:1983(add_requirements)\n", + " 137 0.000 0.000 0.005 0.000 subtensor.py:855(__init__)\n", + " 15 0.000 0.000 0.279 0.019 basic.py:1593(make_node)\n", + " 24 0.000 0.000 0.001 0.000 elemwise.py:334(__init__)\n", + " 2 0.000 0.000 0.004 0.002 utils.py:666(fgraph_to_python)\n", + " 315 0.000 0.000 0.001 0.000 subtensor.py:300(undo_scalarization)\n", + " 1136 0.000 0.000 0.003 0.000 elemwise.py:1136(local_inline_composite_constants)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method marshal.loads}\n", + " 598 0.000 0.000 0.000 0.000 variable.py:64(__eq__)\n", + " 285 0.000 0.000 0.002 0.000 _local.py:252(_from_parsed_string)\n", + " 3/1 0.000 0.000 2.472 2.472 types.py:1641(create)\n", + " 112 0.000 0.000 0.001 0.000 fromnumeric.py:1695(diagonal)\n", + " 154 0.000 0.000 0.001 0.000 basic.py:1954(c_code)\n", + " 32 0.000 0.000 0.004 0.000 blas.py:1114(make_node)\n", + " 1116 0.000 0.000 0.000 0.000 {method 'copy' of 'set' objects}\n", + " 601 0.000 0.000 0.000 0.000 unify.py:217()\n", + " 1142 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", + " 1911 0.000 0.000 0.000 0.000 contextlib.py:444(__init__)\n", + " 109 0.000 0.000 0.000 0.000 math.py:109(__getattr__)\n", + " 529 0.000 0.000 0.000 0.000 basic.py:1419(__eq__)\n", + " 10 0.000 0.000 0.171 0.017 utils.py:550(reconstruct_graph)\n", + " 75 0.000 0.000 0.000 0.000 features.py:704(unpickle)\n", + " 37 0.000 0.000 0.014 0.000 blas.py:636(local_gemm_to_gemv)\n", + " 122 0.000 0.000 0.001 0.000 basic.py:441(local_useless_alloc)\n", + " 243 0.000 0.000 0.001 0.000 __init__.py:270(findall)\n", + " 375 0.000 0.000 0.002 0.000 type.py:36(in_same_class)\n", + " 10 0.000 0.000 0.171 0.017 utils.py:589(__init__)\n", + " 3 0.000 0.000 0.009 0.003 features.py:341(on_attach)\n", + " 1911 0.000 0.000 0.000 0.000 contextlib.py:450(__exit__)\n", + " 375 0.000 0.000 0.002 0.000 type.py:53(is_super)\n", + " 241 0.000 0.000 0.001 0.000 subtensor_lift.py:244(local_subtensor_of_reduce)\n", + " 194 0.000 0.000 0.000 0.000 shape.py:1241(local_Shape_i_ground)\n", + " 203 0.000 0.000 0.000 0.000 shape.py:226(__init__)\n", + " 16 0.000 0.000 0.003 0.000 basic.py:1058()\n", + " 149 0.000 0.000 0.005 0.000 elemwise.py:1183(constant_fold_branches_of_add_mul)\n", + " 1192 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", + " 20 0.000 0.000 0.001 0.000 math.py:2047(local_intdiv_by_one)\n", + " 241 0.000 0.000 0.001 0.000 subtensor_lift.py:301(local_subtensor_of_softmax)\n", + " 109 0.000 0.000 0.002 0.000 __init__.py:183(sub)\n", + " 3 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", + " 185 0.000 0.000 0.001 0.000 fg.py:38(make_node)\n", + " 6 0.000 0.000 0.000 0.000 arrayprint.py:987(fillFormat)\n", + " 75/4 0.000 0.000 0.001 0.000 gradient.py:1045(account_for)\n", + " 19 0.000 0.000 0.003 0.000 inspect.py:1052(findsource)\n", + " 21 0.000 0.000 0.001 0.000 utils.py:16(hash_from_ndarray)\n", + " 3 0.000 0.000 0.041 0.014 pfunc.py:480(construct_pfunc_ins_and_outs)\n", + " 12 0.000 0.000 0.013 0.001 blockwise.py:291(create_inplace_node)\n", + " 1140 0.000 0.000 0.000 0.000 _local.py:298(root)\n", + " 456 0.000 0.000 0.000 0.000 elemwise.py:164()\n", + " 162 0.000 0.000 0.000 0.000 basic.py:1227(local_dimshuffle_alloc)\n", + " 11 0.000 0.000 0.006 0.001 elemwise.py:538(_bgrad)\n", + " 3 0.000 0.000 0.133 0.044 rewriting.py:1035(apply)\n", + " 139 0.000 0.000 0.000 0.000 basic.py:243(local_scalar_tensor_scalar)\n", + " 1145 0.000 0.000 0.000 0.000 {method 'copy' of 'list' objects}\n", + " 78 0.000 0.000 0.000 0.000 subtensor.py:1222(local_useless_inc_subtensor_alloc)\n", + " 20 0.000 0.000 0.001 0.000 basic.py:2156(c_code)\n", + " 207 0.000 0.000 0.000 0.000 subtensor_lift.py:676(local_subtensor_of_join)\n", + " 12 0.000 0.000 0.031 0.003 math.py:3046(grad)\n", + " 241 0.000 0.000 0.000 0.000 subtensor_lift.py:438(local_subtensor_of_transpose)\n", + " 2 0.000 0.000 0.009 0.005 elemwise.py:555(elemwise_to_scalar)\n", + " 36 0.000 0.000 0.001 0.000 subtensor.py:582(group_indices)\n", + " 13 0.000 0.000 0.002 0.000 subtensor.py:1708(make_node)\n", + " 258 0.000 0.000 0.004 0.000 pfunc.py:253(clone_inputs)\n", + " 42 0.000 0.000 0.001 0.000 textwrap.py:419(dedent)\n", + " 241 0.000 0.000 0.000 0.000 subtensor_lift.py:364(local_subtensor_of_expand_dims)\n", + " 112 0.000 0.000 0.001 0.000 blas.py:856()\n", + " 23 0.000 0.000 0.000 0.000 slinalg.py:885(inplace_on_inputs)\n", + " 614 0.000 0.000 0.001 0.000 shape.py:479()\n", + " 285 0.000 0.000 0.001 0.000 op.py:349()\n", + " 38 0.000 0.000 0.001 0.000 inspect.py:959(getsourcefile)\n", + " 8 0.000 0.000 0.018 0.002 basic.py:4283(__init__)\n", + " 78 0.000 0.000 0.069 0.001 rewriting.py:69(_split_decomp_and_solve_steps)\n", + " 570 0.000 0.000 0.000 0.000 {built-in method _io.text_encoding}\n", + " 35 0.000 0.000 0.008 0.000 variable.py:657(__dot__)\n", + " 48 0.000 0.000 0.010 0.000 shape.py:1261(local_shape_to_shape_i)\n", + " 202 0.000 0.000 0.000 0.000 blockwise.py:283()\n", + " 2 0.000 0.000 0.014 0.007 ioloop.py:750(_run_callback)\n", + " 35 0.000 0.000 0.007 0.000 math.py:3164(dense_dot)\n", + " 300 0.000 0.000 0.001 0.000 basic.py:1867(detach_updater)\n", + " 34 0.000 0.000 0.000 0.000 slinalg.py:854(__init__)\n", + " 29 0.000 0.000 0.013 0.000 blas.py:929(infer_shape)\n", + " 210 0.000 0.000 0.007 0.000 variable.py:530()\n", + " 21 0.000 0.000 0.000 0.000 dataclasses.py:1599(_replace)\n", + " 1911 0.000 0.000 0.000 0.000 contextlib.py:447(__enter__)\n", + " 345 0.000 0.000 0.000 0.000 elemwise.py:397(local_useless_dimshuffle_makevector)\n", + " 7 0.000 0.000 0.035 0.005 blockwise.py:411(L_op)\n", + " 54 0.000 0.000 0.000 0.000 math.py:531(local_mul_exp_to_exp_add)\n", + " 112 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", + " 15 0.000 0.000 0.000 0.000 :101(_path_join)\n", + " 1140 0.000 0.000 0.000 0.000 _local.py:307(_tail)\n", + " 21 0.000 0.000 0.060 0.003 basic.py:4114(swapaxes)\n", + " 6 0.000 0.000 0.000 0.000 :480(_call_with_frames_removed)\n", + " 2 0.000 0.000 0.001 0.000 op.py:1319(prepare_fgraph)\n", + " 108 0.000 0.000 0.024 0.000 variable.py:179(__floordiv__)\n", + " 22/11 0.000 0.000 0.000 0.000 arrayprint.py:837(recurser)\n", + " 6 0.000 0.000 0.007 0.001 rewriting.py:173(_scan_split_non_sequence_decomposition_and_solve)\n", + " 75 0.000 0.000 0.000 0.000 features.py:610(on_attach)\n", + " 7 0.000 0.000 0.014 0.002 slinalg.py:1024(solve)\n", + " 1762 0.000 0.000 0.000 0.000 dispatch.py:116()\n", + " 12 0.000 0.000 0.001 0.000 blas.py:158(make_node)\n", + " 75 0.000 0.000 0.000 0.000 features.py:406(unpickle)\n", + " 164 0.000 0.000 0.000 0.000 {method 'squeeze' of 'numpy.ndarray' objects}\n", + " 15/3 0.000 0.000 0.322 0.107 basic.py:339(add_requirements)\n", + " 37 0.000 0.000 0.002 0.000 linecache.py:66(checkcache)\n", + " 12 0.000 0.000 0.021 0.002 slinalg.py:894(solve_triangular)\n", + " 12 0.000 0.000 0.002 0.000 blas.py:264(make_node)\n", + " 200 0.000 0.000 0.000 0.000 op.py:1769()\n", + " 48/27 0.000 0.000 0.000 0.000 types.py:74(view_tree_set)\n", + " 649 0.000 0.000 0.000 0.000 basic.py:2205(reset)\n", + " 5 0.000 0.000 0.015 0.003 types.py:172(add_supervisor_to_fgraph)\n", + " 104 0.000 0.000 0.001 0.000 blockwise.py:47()\n", + " 285 0.000 0.000 0.000 0.000 :263(__init__)\n", + " 8/0 0.000 0.000 0.000 selectors.py:310(select)\n", + " 138 0.000 0.000 0.028 0.000 subtensor.py:450(switch_neg_step)\n", + " 428 0.000 0.000 0.000 0.000 basic.py:830(value)\n", + " 8 0.000 0.000 0.008 0.001 basic.py:1219(clone)\n", + " 121 0.000 0.000 0.001 0.000 basic.py:736(_str)\n", + " 915 0.000 0.000 0.000 0.000 basic.py:1092(tracks)\n", + " 1 0.000 0.000 0.001 0.001 basic.py:1636(io_connection_pattern)\n", + " 44 0.000 0.000 0.000 0.000 shape.py:123(c_code_cache_version)\n", + " 243 0.000 0.000 0.002 0.000 basic.py:1863()\n", + " 3/1 0.000 0.000 2.469 2.469 basic.py:238(make_thunk)\n", + " 40/12 0.000 0.000 0.001 0.000 math.py:3236(parse_mul_tree)\n", + " 3 0.000 0.000 9.301 3.100 types.py:1511(__init__)\n", + " 1180 0.000 0.000 0.000 0.000 op.py:481(prepare_node)\n", + " 342 0.000 0.000 0.000 0.000 basic.py:1711(c_code)\n", + " 175 0.000 0.000 0.000 0.000 subtensor_lift.py:557(local_subtensor_SpecifyShape_lift)\n", + " 24 0.000 0.000 0.001 0.000 basic.py:2648(make_node)\n", + " 9 0.000 0.000 0.000 0.000 configparser.py:194(get_config_hash)\n", + " 23 0.000 0.000 0.003 0.000 blas.py:779(local_dot22_to_dot22scalar)\n", + " 39 0.000 0.000 0.003 0.000 basic.py:1268(__str__)\n", + " 19 0.000 0.000 0.001 0.000 inspect.py:1000(getmodule)\n", + " 100 0.000 0.000 0.001 0.000 type.py:127(filter_variable)\n", + " 47/27 0.000 0.000 0.000 0.000 types.py:51(alias_root)\n", + " 60 0.000 0.000 0.000 0.000 basic.py:55(__init__)\n", + " 47 0.000 0.000 0.019 0.000 basic.py:111(alloc_like)\n", + " 3 0.000 0.000 0.006 0.002 vm.py:996(make_vm)\n", + " 56 0.000 0.000 0.000 0.000 math.py:3146(is_neg)\n", + " 58 0.000 0.000 0.001 0.000 subtensor.py:1072(local_incsubtensor_of_zeros)\n", + " 1/0 0.000 0.000 0.000 gradient.py:557(grad)\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", + " 315 0.000 0.000 0.003 0.000 subtensor.py:870()\n", + " 342 0.000 0.000 0.000 0.000 inspect.py:302(isclass)\n", + " 10 0.000 0.000 0.001 0.000 op.py:2311(connection_pattern)\n", + " 34 0.000 0.000 0.000 0.000 blas.py:304(_factor_canonicalized)\n", + " 3/1 0.000 0.000 9.399 9.399 types.py:1753(orig_function)\n", + " 250 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", + " 233 0.000 0.000 0.000 0.000 __init__.py:673(update)\n", + " 6 0.000 0.000 0.001 0.000 op.py:614(validate_inner_graph)\n", + " 4 0.000 0.000 0.006 0.001 rewriting.py:2067(apply)\n", + " 24 0.000 0.000 0.000 0.000 elemwise.py:378(__setstate__)\n", + " 474 0.000 0.000 0.000 0.000 math.py:3427(_output_dtype)\n", + " 7 0.000 0.000 0.000 0.000 attrsettr.py:66(_get_attr_opt)\n", + " 6 0.000 0.000 0.003 0.000 subtensor.py:2852(infer_shape)\n", + " 600 0.000 0.000 0.000 0.000 {method 'appendleft' of 'collections.deque' objects}\n", + " 3 0.000 0.000 9.282 3.094 types.py:1448(prepare_fgraph)\n", + " 6 0.000 0.000 0.010 0.002 subtensor.py:2968(vectorize_advanced_subtensor)\n", + " 44 0.000 0.000 0.000 0.000 uncanonicalize.py:125(local_dimshuffle_alloc)\n", + " 78 0.000 0.000 0.070 0.001 rewriting.py:229(reuse_decomposition_multiple_solves)\n", + " 9 0.000 0.000 0.119 0.013 basic.py:1275(cmodule_key_variables)\n", + " 8 0.000 0.000 0.011 0.001 basic.py:4095(_cleanup_graph)\n", + " 65 0.000 0.000 0.036 0.001 replace.py:214(vectorize_node)\n", + " 22 0.000 0.000 0.000 0.000 utils.py:604(get_name_for_object)\n", + " 11 0.000 0.000 0.007 0.001 blockwise.py:559(vectorize_node_fallback)\n", + " 44 0.000 0.000 0.009 0.000 basic.py:4228(__eq__)\n", + " 61 0.000 0.000 0.000 0.000 blockwise.py:544(__str__)\n", + " 1290 0.000 0.000 0.000 0.000 basic.py:84(__eq__)\n", + " 48 0.000 0.000 0.009 0.000 shape.py:497(make_vector_shape)\n", + " 27 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", + " 1 0.000 0.000 0.091 0.091 op.py:2450(compute_all_gradients)\n", + " 10 0.000 0.000 0.001 0.000 math.py:2534(distribute_greedy)\n", + " 442 0.000 0.000 0.000 0.000 op.py:228(n_sit_sot)\n", + " 310 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", + " 6 0.000 0.000 0.035 0.006 slinalg.py:761(_lu_solve)\n", + " 47 0.000 0.000 0.087 0.002 variable.py:235(T)\n", + " 479 0.000 0.000 0.000 0.000 utils.py:225(normalize_reduce_axis)\n", + " 42 0.000 0.000 0.000 0.000 subtensor.py:527(is_basic_idx)\n", + " 21 0.000 0.000 0.061 0.003 basic.py:2132(matrix_transpose)\n", + " 825 0.000 0.000 0.000 0.000 dispatch.py:104(etuplize_fn)\n", + " 10 0.000 0.000 0.002 0.000 sort.py:163(make_node)\n", + " 36 0.000 0.000 0.001 0.000 unify.py:221(_unify_ConstrainedVar_object)\n", + " 2 0.000 0.000 0.000 0.000 socket.py:700(send_multipart)\n", + " 6 0.000 0.000 0.000 0.000 rewriting.py:2333(scan_push_out_dot1)\n", + " 153 0.000 0.000 0.000 0.000 basic.py:1062()\n", + " 43 0.000 0.000 0.000 0.000 slinalg.py:246(__init__)\n", + " 183 0.000 0.000 0.000 0.000 shape.py:1277(local_track_shape_i)\n", + " 40 0.000 0.000 0.000 0.000 io.py:171(__init__)\n", + " 13 0.000 0.000 0.002 0.000 slinalg.py:632(make_node)\n", + " 60 0.000 0.000 0.000 0.000 basic.py:2567(impl)\n", + " 40 0.000 0.000 0.000 0.000 math.py:3103(is_mul)\n", + " 101 0.000 0.000 0.000 0.000 math.py:2297(check_for_x_over_absX)\n", + " 144 0.000 0.000 0.015 0.000 variable.py:268(shape)\n", + " 2 0.000 0.000 0.000 0.000 elemwise.py:874(update_fuseable_mappings_after_fg_replace)\n", + " 44 0.000 0.000 0.000 0.000 uncanonicalize.py:153(local_dimshuffle_subtensor)\n", + " 89 0.000 0.000 0.000 0.000 math.py:199(local_batched_matmul_to_core_matmul)\n", + " 67 0.000 0.000 0.000 0.000 elemwise.py:214(__str__)\n", + " 11 0.000 0.000 0.001 0.000 arrayprint.py:567(_array2string)\n", + " 825 0.000 0.000 0.000 0.000 dispatch.py:115()\n", + " 21 0.000 0.000 0.012 0.001 features.py:425(revert)\n", + " 4 0.000 0.000 0.075 0.019 rewriting.py:2125(scan_merge_inouts)\n", + " 45 0.000 0.000 0.001 0.000 destroyhandler.py:417(has_destroyers)\n", + " 35 0.000 0.000 0.008 0.000 math.py:3140(dot)\n", + " 41 0.000 0.000 0.001 0.000 utils.py:640(unique_name)\n", + " 114/14 0.000 0.000 0.000 0.000 gradient.py:1090(visit)\n", + " 56 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", + " 361 0.000 0.000 0.000 0.000 op.py:224(n_mit_sot)\n", + " 7 0.000 0.000 0.000 0.000 subtensor.py:1036(str_from_indices)\n", + " 28 0.000 0.000 0.062 0.002 op.py:371(L_op)\n", + " 168 0.000 0.000 0.000 0.000 blas.py:847()\n", + " 57 0.000 0.000 0.001 0.000 subtensor.py:1118(local_setsubtensor_of_constants)\n", + " 17 0.000 0.000 0.000 0.000 core.py:458(_check_fill_value)\n", + " 230 0.000 0.000 0.000 0.000 basic.py:2054(c_code)\n", + " 62 0.000 0.000 0.002 0.000 op.py:779(tensorConstructor)\n", + " 4 0.000 0.000 0.062 0.015 fg.py:867(clone_get_equiv)\n", + " 95 0.000 0.000 0.001 0.000 shape.py:872(shape_padleft)\n", + " 284 0.000 0.000 0.000 0.000 basic.py:772(signature)\n", + " 9 0.000 0.000 0.000 0.000 slinalg.py:964(__init__)\n", + " 11 0.000 0.000 0.033 0.003 blas.py:364(item_to_var)\n", + " 21 0.000 0.000 0.000 0.000 {built-in method nt._getfullpathname}\n", + " 22 0.000 0.000 0.003 0.000 basic.py:1104(__call__)\n", + " 30 0.000 0.000 0.000 0.000 replace.py:20(_format_replace)\n", + " 1 0.000 0.000 0.001 0.001 traceback.py:453(_extract_from_extended_frame_gen)\n", + " 34 0.000 0.000 0.004 0.000 blas.py:653(local_gemm_to_ger)\n", + " 122 0.000 0.000 0.000 0.000 basic.py:1181(local_merge_alloc)\n", + " 390 0.000 0.000 0.000 0.000 __init__.py:613(__missing__)\n", + " 50 0.000 0.000 0.011 0.000 variable.py:623(__iter__)\n", + " 1100 0.000 0.000 0.000 0.000 basic.py:854(merge_none_number)\n", + " 56 0.000 0.000 0.000 0.000 math.py:2347()\n", + " 13 0.000 0.000 0.001 0.000 arrayprint.py:550(wrapper)\n", + " 100 0.000 0.000 0.000 0.000 variable.py:522(is_empty_array)\n", + " 11 0.000 0.000 0.001 0.000 arrayprint.py:496(_get_format_function)\n", + " 355 0.000 0.000 0.000 0.000 subtensor.py:877()\n", + " 24 0.000 0.000 0.000 0.000 :2(__init__)\n", + " 3 0.000 0.000 0.001 0.000 db.py:499(query)\n", + " 11 0.000 0.000 0.006 0.001 elemwise.py:512(L_op)\n", + " 57 0.000 0.000 0.001 0.000 math.py:2055(local_zero_div)\n", + " 87 0.000 0.000 0.000 0.000 op.py:1306(__hash__)\n", + " 54 0.000 0.000 0.000 0.000 linecache.py:102(updatecache)\n", + " 78 0.000 0.000 0.000 0.000 linalg.py:353(local_lift_through_linalg)\n", + " 162 0.000 0.000 0.000 0.000 shape.py:1030(local_fuse_expand_dims_reshape)\n", + " 171 0.000 0.000 0.000 0.000 basic.py:1124(__call__)\n", + " 14 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", + " 12 0.000 0.000 0.001 0.000 elemwise.py:258(filter_candidate_pairs)\n", + " 56 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", + " 42 0.000 0.000 0.000 0.000 op.py:421(inner_non_seqs)\n", + " 45 0.000 0.000 0.000 0.000 blas.py:164(_is_real_vector)\n", + " 28 0.000 0.000 0.000 0.000 math.py:3077(is_exp)\n", + " 112 0.000 0.000 0.001 0.000 _methods.py:42(_amax)\n", + " 19 0.000 0.000 0.002 0.000 basic.py:802(__str__)\n", + " 6 0.000 0.000 0.068 0.011 slinalg.py:805(lu_solve)\n", + " 47 0.000 0.000 0.000 0.000 basic.py:1760(output_types)\n", + " 19 0.000 0.000 0.000 0.000 inspect.py:1639(__new__)\n", + " 44 0.000 0.000 0.000 0.000 shape.py:128()\n", + " 87 0.000 0.000 0.000 0.000 :29(__hash__)\n", + " 2 0.000 0.000 2.393 1.197 op.py:1462(make_thunk)\n", + " 41 0.000 0.000 0.005 0.000 variable.py:63(__neg__)\n", + " 24 0.000 0.000 0.000 0.000 utils.py:208(_props_dict)\n", + " 163 0.000 0.000 0.000 0.000 op.py:1220(is_cpu_vector)\n", + " 11 0.000 0.000 0.003 0.000 blas.py:612(local_inplace_gemm)\n", + " 11 0.000 0.000 0.002 0.000 arrayprint.py:605(array2string)\n", + " 33 0.000 0.000 0.010 0.000 destroyhandler.py:364(on_attach)\n", + " 2 0.000 0.000 0.015 0.008 fg.py:860(__repr__)\n", + " 98 0.000 0.000 0.000 0.000 blas.py:463(on_import)\n", + " 11 0.000 0.000 0.000 0.000 arrayprint.py:50(_make_options_dict)\n", + " 19 0.000 0.000 0.001 0.000 inspect.py:1654(_get_code_position)\n", + " 36/3 0.000 0.000 0.013 0.004 db.py:146(query)\n", + " 8 0.000 0.000 0.001 0.000 basic.py:4398(make_node)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:390(compress_outs)\n", + " 35 0.000 0.000 0.012 0.000 features.py:370(__call__)\n", + " 31 0.000 0.000 0.000 0.000 op.py:346(inner_sitsot)\n", + " 177 0.000 0.000 0.000 0.000 :345(__subclasshook__)\n", + " 84 0.000 0.000 0.000 0.000 enum.py:1587(_get_value)\n", + " 5 0.000 0.000 0.000 0.000 basic.py:4330(__str__)\n", + " 78 0.000 0.000 0.000 0.000 blockwise.py:93(local_blockwise_alloc)\n", + " 83 0.000 0.000 0.000 0.000 basic.py:2022(importer)\n", + " 75 0.000 0.000 0.000 0.000 features.py:623(unpickle)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:131(generic_solve_to_solve_triangular)\n", + " 101 0.000 0.000 0.000 0.000 subtensor.py:1532(local_blockwise_advanced_inc_subtensor)\n", + " 4 0.000 0.000 0.004 0.001 basic.py:2883(stack)\n", + " 403 0.000 0.000 0.000 0.000 op.py:1449(inner_inputs)\n", + " 38 0.000 0.000 0.008 0.000 __init__.py:60(get_vector_length)\n", + " 125 0.000 0.000 0.000 0.000 shape.py:88(infer_shape)\n", + " 12 0.000 0.000 0.000 0.000 arrayprint.py:1037()\n", + " 3 0.000 0.000 0.003 0.001 :1093(get_code)\n", + " 50 0.000 0.000 0.000 0.000 shape.py:1164(local_Shape_of_SpecifyShape)\n", + " 602 0.000 0.000 0.000 0.000 basic.py:1307(c_code_cache_version)\n", + " 311 0.000 0.000 0.000 0.000 op.py:931()\n", + " 432 0.000 0.000 0.000 0.000 utils.py:284(get_value)\n", + " 52 0.000 0.000 0.000 0.000 basic.py:1550(c_code)\n", + " 23/20 0.000 0.000 0.006 0.000 elemwise.py:310(apply_local_dimshuffle_lift)\n", + " 18 0.000 0.000 0.000 0.000 math.py:1655(local_sum_prod_all_to_none)\n", + " 193 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", + " 9 0.000 0.000 0.000 0.000 op.py:857(_mitmot_preallocations)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:669(rewrite_inv_diag_to_diag_reciprocal)\n", + " 72 0.000 0.000 0.000 0.000 ordered_set.py:42(difference_update)\n", + " 235 0.000 0.000 0.000 0.000 variable.py:602()\n", + " 56 0.000 0.000 0.000 0.000 subtensor.py:1097(local_incsubtensor_of_zeros_to_setsubtensor)\n", + " 49 0.000 0.000 0.009 0.000 basic.py:4372(fgraph)\n", + " 7 0.000 0.000 0.000 0.000 attrsettr.py:43(__getattr__)\n", + " 17 0.000 0.000 0.001 0.000 math.py:2339(local_abs_merge)\n", + " 2 0.000 0.000 0.125 0.063 rewriting.py:950(attempt_scan_inplace)\n", + " 101 0.000 0.000 0.000 0.000 linalg.py:543(svd_uv_merge)\n", + " 8 0.000 0.000 0.001 0.000 basic.py:4242(__hash__)\n", + " 24/17 0.000 0.000 0.001 0.000 elemwise.py:566(transform)\n", + " 6 0.000 0.000 0.001 0.000 subtensor.py:2121(make_node)\n", + " 40 0.000 0.000 0.000 0.000 elemwise.py:1241(ufunc)\n", + " 35 0.000 0.000 0.000 0.000 subtensor.py:1898(c_code_cache_version)\n", + " 9 0.000 0.000 0.015 0.002 basic.py:1296(toposort)\n", + " 15 0.000 0.000 0.000 0.000 rewriting.py:656(inner_sitsot_only_last_step_used)\n", + " 8 0.000 0.000 0.001 0.000 subtensor.py:976(local_inplace_setsubtensor)\n", + " 249 0.000 0.000 0.000 0.000 db.py:449()\n", + " 16 0.000 0.000 0.010 0.001 replace.py:220(_vectorize_not_needed)\n", + " 5 0.000 0.000 0.000 0.000 arrayprint.py:1282(__init__)\n", + " 12 0.000 0.000 0.002 0.000 arrayprint.py:1685(_array_str_implementation)\n", + " 5 0.000 0.000 0.116 0.023 basic.py:4313(make_node)\n", + " 3 0.000 0.000 0.005 0.002 :1349(_find_and_load)\n", + " 17 0.000 0.000 0.000 0.000 enum.py:1594(__or__)\n", + " 25 0.000 0.000 0.000 0.000 shape.py:1152(local_shape_ground)\n", + " 21 0.000 0.000 0.000 0.000 dataclasses.py:1580(replace)\n", + " 21 0.000 0.000 0.061 0.003 variable.py:239(mT)\n", + " 305 0.000 0.000 0.000 0.000 blas.py:219(scaled)\n", + " 27 0.000 0.000 0.001 0.000 math.py:1785(local_reduce_broadcastable)\n", + " 35 0.000 0.000 0.000 0.000 op.py:367(outer_nitsot)\n", + " 24 0.000 0.000 0.000 0.000 op.py:156(__init__)\n", + " 18 0.000 0.000 0.000 0.000 rewriting.py:917()\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:278(_really_send)\n", + " 114 0.000 0.000 0.000 0.000 inspect.py:966()\n", + " 13 0.000 0.000 0.000 0.000 subtensor.py:1681(__init__)\n", + " 183 0.000 0.000 0.000 0.000 blas.py:260()\n", + " 210 0.000 0.000 0.000 0.000 math.py:3027()\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:2763(as_index_variable)\n", + " 3 0.000 0.000 0.001 0.000 :1240(_find_spec)\n", + " 11 0.000 0.000 0.000 0.000 basic.py:1996(c_code)\n", + " 81 0.000 0.000 0.000 0.000 basic.py:1873()\n", + " 78 0.000 0.000 0.000 0.000 linalg.py:181(batched_vector_b_solve_to_matrix_b_solve)\n", + " 12 0.000 0.000 0.002 0.000 math.py:3536(local_sigm_times_exp)\n", + " 3 0.000 0.000 0.000 0.000 vm.py:279(__init__)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:471(__del__)\n", + " 18 0.000 0.000 0.000 0.000 basic.py:243(__init__)\n", + " 28 0.000 0.000 0.000 0.000 basic.py:2698(output_types_preference)\n", + " 56 0.000 0.000 0.000 0.000 basic.py:1070(same_out_nobool)\n", + " 23 0.000 0.000 0.003 0.000 variable.py:60(__abs__)\n", + " 3 0.000 0.000 0.001 0.000 types.py:1391(check_unused_inputs)\n", + " 19 0.000 0.000 0.000 0.000 inspect.py:988(getabsfile)\n", + " 9 0.000 0.000 0.016 0.002 {method 'run' of '_contextvars.Context' objects}\n", + " 2 0.000 0.000 0.376 0.188 rewriting.py:1795(scan_save_mem_prealloc)\n", + " 30 0.000 0.000 0.000 0.000 op.py:387(inner_shared)\n", + " 29 0.000 0.000 0.003 0.000 {built-in method builtins.abs}\n", + " 42 0.000 0.000 0.000 0.000 {built-in method _collections._count_elements}\n", + " 6 0.000 0.000 0.001 0.000 slinalg.py:653(pivot_to_permutation)\n", + " 9 0.000 0.000 0.247 0.027 basic.py:919(zeros)\n", + " 28 0.000 0.000 0.001 0.000 elemwise.py:543(as_scalar)\n", + " 35 0.000 0.000 0.000 0.000 blas.py:1142(infer_shape)\n", + " 1/0 0.000 0.000 0.000 gradient.py:1130(_populate_grad_dict)\n", + " 31 0.000 0.000 0.000 0.000 slinalg.py:346(_default_b_ndim)\n", + " 11 0.000 0.000 0.000 0.000 arrayprint.py:828(_formatArray)\n", + " 95 0.000 0.000 0.000 0.000 basic.py:1764(multi_index)\n", + " 89 0.000 0.000 0.000 0.000 blockwise.py:230(local_blockwise_of_subtensor)\n", + " 404 0.000 0.000 0.000 0.000 blockwise.py:555(c_code_cache_version)\n", + " 3 0.000 0.000 0.001 0.000 :1624(find_spec)\n", + " 36 0.000 0.000 0.002 0.000 subtensor.py:2822()\n", + " 2 0.000 0.000 0.001 0.000 shape.py:406(make_node)\n", + " 6 0.000 0.000 0.011 0.002 basic.py:4356(make_new_inplace)\n", + " 96 0.000 0.000 0.000 0.000 blas.py:586()\n", + " 3 0.000 0.000 0.000 0.000 vm.py:195(__init__)\n", + " 6 0.000 0.000 0.002 0.000 variable.py:210(__rmul__)\n", + " 185 0.000 0.000 0.000 0.000 fg.py:35(__init__)\n", + " 27 0.000 0.000 0.000 0.000 frozendict.py:17(__init__)\n", + " 20 0.000 0.000 0.000 0.000 fg.py:294(get_output_client)\n", + " 5 0.000 0.000 0.000 0.000 vm.py:310()\n", + " 24 0.000 0.000 0.000 0.000 op.py:161(__setstate__)\n", + " 119 0.000 0.000 0.000 0.000 basic.py:685(infer_shape)\n", + " 25 0.000 0.000 0.001 0.000 variable.py:454(astype)\n", + " 12 0.000 0.000 0.000 0.000 basic.py:1401(add_requirements)\n", + " 34 0.000 0.000 0.000 0.000 traceback.py:342(_set_lines)\n", + " 11 0.000 0.000 0.000 0.000 textwrap.py:470(indent)\n", + " 9 0.000 0.000 0.010 0.001 basic.py:892(zeros_like)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:595(rewrite_inv_inv)\n", + " 2 0.000 0.000 0.001 0.001 utils.py:347(scan_can_remove_outs)\n", + " 155 0.000 0.000 0.000 0.000 basic.py:1210()\n", + " 3 0.000 0.000 0.001 0.000 zmqstream.py:614(_handle_recv)\n", + " 76 0.000 0.000 0.000 0.000 inspect.py:485(istraceback)\n", + " 31 0.000 0.000 0.000 0.000 op.py:434(outer_non_seqs)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:1032(scalar_solve_to_division)\n", + " 118 0.000 0.000 0.000 0.000 {built-in method from_iterable}\n", + " 5 0.000 0.000 0.000 0.000 functools.py:36(update_wrapper)\n", + " 6 0.000 0.000 0.000 0.000 arrayprint.py:1073(__call__)\n", + " 102 0.000 0.000 0.000 0.000 basic.py:1705(__init__)\n", + " 28 0.000 0.000 0.000 0.000 basic.py:1147(same_out_nocomplex)\n", + " 18 0.000 0.000 0.000 0.000 traitlets.py:676(__get__)\n", + " 5 0.000 0.000 0.000 0.000 shape.py:1093(local_useless_specify_shape)\n", + " 150 0.000 0.000 0.000 0.000 features.py:351(__init__)\n", + " 114 0.000 0.000 0.000 0.000 inspect.py:969()\n", + " 4 0.000 0.000 0.001 0.000 subtensor.py:1477(inc_subtensor)\n", + " 94 0.000 0.000 0.000 0.000 op.py:706(get_test_values)\n", + " 54 0.000 0.000 0.000 0.000 math.py:2036(local_mul_to_sqr)\n", + " 3 0.000 0.000 0.000 0.000 :426(_get_module_lock)\n", + " 96 0.000 0.000 0.000 0.000 blas.py:1118()\n", + " 9 0.000 0.000 0.001 0.000 nlinalg.py:112(make_node)\n", + " 7 0.000 0.000 0.000 0.000 basic.py:4150(python_convert)\n", + " 6 0.000 0.000 0.000 0.000 :137(_path_split)\n", + " 3 0.000 0.000 0.000 0.000 socket.py:771(recv_multipart)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:636(rewrite_inv_eye_to_eye)\n", + " 4 0.000 0.000 0.001 0.000 blas_scipy.py:7(use_scipy_ger)\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:727(local_useless_AdvancedSubtensor1)\n", + " 6 0.000 0.000 0.001 0.000 blas.py:620(local_inplace_gemv)\n", + " 102 0.000 0.000 0.000 0.000 basic.py:1726(on_detach)\n", + " 235 0.000 0.000 0.000 0.000 op.py:1453(inner_outputs)\n", + " 38 0.000 0.000 0.000 0.000 enum.py:695(__call__)\n", + " 41 0.000 0.000 0.000 0.000 basic.py:2213(on_detach)\n", + " 2 0.000 0.000 0.002 0.001 utils.py:580(compile_function_src)\n", + " 26 0.000 0.000 0.016 0.001 basic.py:683(add_requirements)\n", + " 27 0.000 0.000 0.000 0.000 basic.py:1870(c_code)\n", + " 70 0.000 0.000 0.000 0.000 pfunc.py:670(iter_over_pairs)\n", + " 93 0.000 0.000 0.000 0.000 :1027(__iter__)\n", + " 45 0.000 0.000 0.000 0.000 configparser.py:209()\n", + " 56 0.000 0.000 0.000 0.000 _methods.py:46(_amin)\n", + " 6 0.000 0.000 0.000 0.000 :513(cache_from_source)\n", + " 3/1 0.000 0.000 9.440 9.440 pfunc.py:359(pfunc)\n", + " 174 0.000 0.000 0.000 0.000 features.py:316(orderings)\n", + " 18 0.000 0.000 0.000 0.000 subtensor.py:611(_non_consecutive_adv_indexing)\n", + " 34 0.000 0.000 0.000 0.000 blas.py:155(_is_real_matrix)\n", + " 112 0.000 0.000 0.000 0.000 multiarray.py:1098(copyto)\n", + " 27 0.000 0.000 0.000 0.000 basic.py:903(local_sum_make_vector)\n", + " 1 0.000 0.000 0.000 0.000 selector_events.py:141(_write_to_self)\n", + " 40 0.000 0.000 0.000 0.000 io.py:59(__init__)\n", + " 78 0.000 0.000 0.000 0.000 blockwise.py:205(local_blockwise_reshape)\n", + " 38 0.000 0.000 0.000 0.000 basic.py:1098()\n", + " 25 0.000 0.000 0.002 0.000 math.py:2869(variadic_add)\n", + " 61 0.000 0.000 0.000 0.000 subtensor.py:567()\n", + " 3 0.000 0.000 0.002 0.001 blockwise.py:344(extract_core_shape_from_infer_shape)\n", + " 72 0.000 0.000 0.000 0.000 blas.py:177()\n", + " 14 0.000 0.000 0.000 0.000 basic.py:4091(__init__)\n", + " 8 0.000 0.000 0.010 0.001 elemwise.py:263(grad)\n", + " 41 0.000 0.000 0.000 0.000 basic.py:2208(on_attach)\n", + " 16 0.000 0.000 0.000 0.000 basic.py:1097(__init__)\n", + " 20 0.000 0.000 0.002 0.000 elemwise.py:1675(vectorize_dimshuffle)\n", + " 76 0.000 0.000 0.000 0.000 inspect.py:495(isframe)\n", + " 3 0.000 0.000 0.003 0.001 :1020(exec_module)\n", + " 9 0.000 0.000 0.000 0.000 rewriting.py:90(find_solve_clients)\n", + " 93 0.000 0.000 0.000 0.000 __init__.py:1259(__getitem__)\n", + " 6 0.000 0.000 0.000 0.000 linalg.py:315(local_det_chol)\n", + " 26 0.000 0.000 0.000 0.000 basic.py:419(local_useless_fill)\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:231(add_callback)\n", + " 9 0.000 0.000 0.000 0.000 basic.py:554(__init__)\n", + " 60 0.000 0.000 0.000 0.000 blas.py:286()\n", + " 58 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", + " 12 0.000 0.000 0.006 0.000 math.py:4151(vectorize_node_dot)\n", + " 33 0.000 0.000 0.000 0.000 destroyhandler.py:326(__init__)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:537(set_result)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3631(set)\n", + " 12 0.000 0.000 0.041 0.003 basic.py:213(schedule)\n", + " 88 0.000 0.000 0.000 0.000 gradient.py:1294()\n", + " 17 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.ndarray' objects}\n", + " 112 0.000 0.000 0.000 0.000 _twodim_base_impl.py:241(_diag_dispatcher)\n", + " 6 0.000 0.000 0.001 0.000 subtensor.py:211(local_replace_AdvancedSubtensor)\n", + " 24 0.000 0.000 0.006 0.000 extra_ops.py:1562()\n", + " 2 0.000 0.000 0.010 0.005 iostream.py:259(schedule)\n", + " 11 0.000 0.000 0.000 0.000 arrayprint.py:446(_get_formatdict)\n", + " 24 0.000 0.000 0.001 0.000 rewriting.py:2254(map_out)\n", + " 54 0.000 0.000 0.000 0.000 basic.py:1952(infer_shape)\n", + " 21 0.000 0.000 0.000 0.000 basic.py:2732(c_code_cache_version)\n", + " 8 0.000 0.000 0.000 0.000 numeric.py:1386(normalize_axis_tuple)\n", + " 2 0.000 0.000 0.108 0.054 utils.py:225(expand_empty)\n", + " 40 0.000 0.000 0.000 0.000 pfunc.py:660(_pfunc_param_to_in)\n", + " 95 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", + " 8/0 0.000 0.000 0.000 selectors.py:304(_select)\n", + " 4 0.000 0.000 0.000 0.000 encoder.py:205(iterencode)\n", + " 21 0.000 0.000 0.000 0.000 basic.py:1786(__init__)\n", + " 3 0.000 0.000 0.006 0.002 subtensor.py:984(grad)\n", + " 3 0.000 0.000 0.004 0.001 :1304(_find_and_load_unlocked)\n", + " 2 0.000 0.000 0.006 0.003 subtensor.py:2019(grad)\n", + " 72 0.000 0.000 0.000 0.000 blockwise.py:303()\n", + " 3 0.000 0.000 0.004 0.001 :911(_load_unlocked)\n", + " 11 0.000 0.000 0.000 0.000 enum.py:1605(__and__)\n", + " 46 0.000 0.000 0.000 0.000 elemwise.py:506(connection_pattern)\n", + " 92 0.000 0.000 0.000 0.000 op.py:422()\n", + " 6 0.000 0.000 0.000 0.000 arrayprint.py:961(__init__)\n", + " 90 0.000 0.000 0.000 0.000 basic.py:1610(tracks)\n", + " 19 0.000 0.000 0.000 0.000 inspect.py:1748(currentframe)\n", + " 21 0.000 0.000 0.000 0.000 basic.py:1160(__init__)\n", + " 5 0.000 0.000 0.000 0.000 types.py:143(__init__)\n", + " 6 0.000 0.000 0.004 0.001 rewriting.py:1190(_is_default_scan_buffer)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", + " 1 0.000 0.000 0.000 0.000 cvm.py:1()\n", + " 3 0.000 0.000 0.000 0.000 :304(acquire)\n", + " 21 0.000 0.000 0.000 0.000 basic.py:1148()\n", + " 244 0.000 0.000 0.000 0.000 subtensor.py:442(switch_neg_step)\n", + " 45 0.000 0.000 0.000 0.000 basic.py:1916()\n", + " 5/0 0.000 0.000 0.000 {built-in method builtins.exec}\n", + " 38 0.000 0.000 0.000 0.000 subtensor.py:424()\n", + " 24 0.000 0.000 0.000 0.000 rewriting.py:445(add_to_replace)\n", + " 3 0.000 0.000 0.018 0.006 types.py:225(std_fgraph)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:655(write)\n", + " 169 0.000 0.000 0.000 0.000 gradient.py:1183()\n", + " 3 0.000 0.000 0.002 0.001 :1214(get_data)\n", + " 31 0.000 0.000 0.000 0.000 traceback.py:380(walk_stack)\n", + " 1 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", + " 4 0.000 0.000 0.001 0.000 nlinalg.py:203(make_node)\n", + " 69 0.000 0.000 0.000 0.000 op.py:347()\n", + " 21 0.000 0.000 0.000 0.000 :573(abspath)\n", + " 2 0.000 0.000 0.002 0.001 gradient.py:969(_populate_var_to_app_to_idx)\n", + " 4 0.000 0.000 0.000 0.000 basic.py:1964(L_op)\n", + " 108 0.000 0.000 0.000 0.000 basic.py:799(signature)\n", + " 91 0.000 0.000 0.000 0.000 features.py:387(__init__)\n", + " 87 0.000 0.000 0.000 0.000 shape.py:304(infer_shape)\n", + " 57 0.000 0.000 0.000 0.000 inspect.py:386(isfunction)\n", + " 18 0.000 0.000 0.000 0.000 math.py:1887(local_neg_div_neg)\n", + " 5 0.000 0.000 0.000 0.000 basic.py:83(broadcasted_by)\n", + " 57 0.000 0.000 0.000 0.000 inspect.py:306(ismethod)\n", + " 74 0.000 0.000 0.000 0.000 types.py:215()\n", + " 35 0.000 0.000 0.000 0.000 rewriting.py:235(add_to_replace)\n", + " 4 0.000 0.000 0.000 0.000 zmqstream.py:676(_update_handler)\n", + " 57 0.000 0.000 0.000 0.000 inspect.py:509(iscode)\n", + " 6 0.000 0.000 0.000 0.000 utils.py:762(inner_inputs)\n", + " 20 0.000 0.000 0.000 0.000 math.py:765(local_div_switch_sink)\n", + " 6 0.000 0.000 0.001 0.000 subtensor.py:103(transform_take)\n", + " 3 0.000 0.000 0.000 0.000 blas.py:444(add_requirements)\n", + " 169 0.000 0.000 0.000 0.000 gradient.py:1208()\n", + " 6 0.000 0.000 0.068 0.011 rewriting.py:34(solve_decomposed_system)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:263(cholesky_ldotlt)\n", + " 76 0.000 0.000 0.000 0.000 subtensor.py:428()\n", + " 11 0.000 0.000 0.000 0.000 arrayprint.py:801(_extendLine_pretty)\n", + " 105 0.000 0.000 0.000 0.000 features.py:264(on_attach)\n", + " 3 0.000 0.000 0.000 0.000 :372(release)\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:2853(is_bool_index)\n", + " 8 0.000 0.000 0.000 0.000 uncanonicalize.py:44(local_max_to_min)\n", + " 12 0.000 0.000 0.000 0.000 {built-in method numpy._core._multiarray_umath.dragon4_positional}\n", + " 18 0.000 0.000 0.000 0.000 __init__.py:1221(__init__)\n", + " 6 0.000 0.000 0.000 0.000 arrayprint.py:455()\n", + " 2 0.000 0.000 0.000 0.000 utils.py:630(unique_name_generator)\n", + " 4 0.000 0.000 0.062 0.015 fg.py:863(clone)\n", + " 3 0.000 0.000 0.000 0.000 vm.py:337(__init__)\n", + " 21 0.000 0.000 0.000 0.000 dataclasses.py:1326(_is_dataclass_instance)\n", + " 17 0.000 0.000 0.000 0.000 core.py:3509(shape)\n", + " 3 0.000 0.000 0.000 0.000 :833(spec_from_file_location)\n", + " 33 0.000 0.000 0.000 0.000 blockwise.py:405(connection_pattern)\n", + " 2 0.000 0.000 0.001 0.000 iostream.py:276()\n", + " 5 0.000 0.000 0.015 0.003 types.py:150(on_attach)\n", + " 18 0.000 0.000 0.000 0.000 op.py:358(inner_sitsot_outs)\n", + " 9 0.000 0.000 0.000 0.000 basic.py:1291(__init__)\n", + " 34 0.000 0.000 0.000 0.000 traceback.py:371(line)\n", + " 16 0.000 0.000 0.000 0.000 linalg.py:415(_find_diag_from_eye_mul)\n", + " 3 0.000 0.000 0.001 0.000 zmqstream.py:546(_run_callback)\n", + " 21 0.000 0.000 0.001 0.000 variable.py:995(pytensor_hash)\n", + " 3 0.000 0.000 0.006 0.002 extra_ops.py:562(squeeze)\n", + " 36 0.000 0.000 0.000 0.000 subtensor.py:2836()\n", + " 3 0.000 0.000 0.000 0.000 functools.py:544(decorating_function)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:479(rewrite_det_diag_to_prod_diag)\n", + " 56 0.000 0.000 0.000 0.000 basic.py:4447()\n", + " 24 0.000 0.000 0.000 0.000 op.py:354(outer_sitsot)\n", + " 2 0.000 0.000 0.001 0.001 tempfile.py:243(_mkstemp_inner)\n", + " 112 0.000 0.000 0.000 0.000 fromnumeric.py:1691(_diagonal_dispatcher)\n", + " 190 0.000 0.000 0.000 0.000 basic.py:126(add_requirements)\n", + " 3 0.000 0.000 0.000 0.000 :733(_init_module_attrs)\n", + " 22 0.000 0.000 0.000 0.000 math.py:1773(local_useless_reduce)\n", + " 25 0.000 0.000 0.000 0.000 {method 'intersection' of 'set' objects}\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:118(_run_event_pipe_gc)\n", + " 2 0.000 0.000 0.001 0.001 tempfile.py:537(NamedTemporaryFile)\n", + " 24 0.000 0.000 0.000 0.000 rewriting.py:2099(has_duplicates)\n", + " 3 0.000 0.000 0.001 0.000 zmqstream.py:573(_handle_events)\n", + " 3 0.000 0.000 0.009 0.003 math.py:1296(local_neg_to_mul)\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:2974()\n", + " 2 0.000 0.000 0.000 0.000 random.py:458(choices)\n", + " 40 0.000 0.000 0.000 0.000 configdefaults.py:66(_warn_cxx)\n", + " 24 0.000 0.000 0.000 0.000 subtensor.py:2827()\n", + " 2 0.000 0.000 0.001 0.000 slinalg.py:669(make_node)\n", + " 4 0.000 0.000 0.062 0.016 op.py:1457(clone)\n", + " 6 0.000 0.000 0.000 0.000 configdefaults.py:36(_filter_mode)\n", + " 46 0.000 0.000 0.000 0.000 basic.py:1533(check_type)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:904(rewrite_cholesky_diag_to_sqrt_diag)\n", + " 16 0.000 0.000 0.003 0.000 basic.py:1030(orphans_between)\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:999(connection_pattern)\n", + " 11 0.000 0.000 0.000 0.000 arrayprint.py:787(_extendLine)\n", + " 18 0.000 0.000 0.000 0.000 unify.py:64(__hash__)\n", + " 23 0.000 0.000 0.000 0.000 linalg.py:867(rewrite_remove_useless_cholesky)\n", + " 10 0.000 0.000 0.000 0.000 subtensor.py:1369(c_code_cache_version)\n", + " 36 0.000 0.000 0.000 0.000 subtensor.py:653()\n", + " 3 0.000 0.000 0.000 0.000 :782(_compile_bytecode)\n", + " 38 0.000 0.000 0.000 0.000 enum.py:1154(__new__)\n", + " 14 0.000 0.000 0.000 0.000 op.py:314(inner_mitsot)\n", + " 70 0.000 0.000 0.000 0.000 subtensor.py:2004(infer_shape)\n", + " 13 0.000 0.000 0.000 0.000 slinalg.py:301(infer_shape)\n", + " 11 0.000 0.000 0.000 0.000 linalg.py:245(psd_solve_with_chol)\n", + " 66 0.000 0.000 0.000 0.000 basic.py:1554()\n", + " 8 0.000 0.000 0.000 0.000 mode.py:519(get_mode)\n", + " 3 0.000 0.000 0.001 0.000 sort.py:210(argsort)\n", + " 1 0.000 0.000 0.000 0.000 interactiveshell.py:3025(write)\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:1152(local_adv_sub1_adv_inc_sub1)\n", + " 14 0.000 0.000 0.000 0.000 op.py:298(inner_mitmot)\n", + " 18 0.000 0.000 0.000 0.000 base_events.py:766(time)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:489(__getattr__)\n", + " 4 0.000 0.000 0.000 0.000 tasks.py:703(sleep)\n", + " 16 0.000 0.000 0.000 0.000 basic.py:2957(c_code)\n", + " 3 0.000 0.000 0.000 0.000 traitlets.py:718(_validate)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:86(__set__)\n", + " 62 0.000 0.000 0.000 0.000 op.py:388()\n", + " 7 0.000 0.000 0.000 0.000 events.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 shape.py:636(make_node)\n", + " 2 0.000 0.000 0.002 0.001 subtensor.py:2066(_sum_grad_over_bcasted_dims)\n", + " 8 0.000 0.000 0.000 0.000 threading.py:1134(is_alive)\n", + " 14 0.000 0.000 0.000 0.000 op.py:383(outer_nitsot_outs)\n", + " 21 0.000 0.000 0.000 0.000 math.py:1717(local_reduce_join)\n", + " 43 0.000 0.000 0.000 0.000 types.py:441()\n", + " 2 0.000 0.000 0.001 0.000 shape.py:542(specify_shape)\n", + " 3 0.000 0.000 0.001 0.000 db.py:519(query)\n", + " 15 0.000 0.000 0.000 0.000 basic.py:1913(c_code)\n", + " 43 0.000 0.000 0.000 0.000 subtensor.py:1732()\n", + " 18 0.000 0.000 0.000 0.000 traitlets.py:629(get)\n", + " 2 0.000 0.000 0.001 0.000 rewriting.py:1990(belongs_to_set)\n", + " 9 0.000 0.000 0.000 0.000 utils.py:212(operand_sig)\n", + " 4 0.000 0.000 0.001 0.000 subtensor.py:1441(set_subtensor)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:127(_event_pipe_gc)\n", + " 4 0.000 0.000 0.000 0.000 op.py:890(__setstate__)\n", + " 22 0.000 0.000 0.000 0.000 {method 'splitlines' of 'str' objects}\n", + " 6 0.000 0.000 0.000 0.000 __init__.py:1497(debug)\n", + " 36 0.000 0.000 0.000 0.000 rewriting.py:108()\n", + " 3 0.000 0.000 0.000 0.000 :697(_classify_pyc)\n", + " 12 0.000 0.000 0.003 0.000 rewriting.py:1110(select_max)\n", + " 15 0.000 0.000 0.000 0.000 basic.py:1529(c_code)\n", + " 15 0.000 0.000 0.000 0.000 op.py:395(outer_shared)\n", + " 11 0.000 0.000 0.000 0.000 uncanonicalize.py:73(local_alloc_dimshuffle)\n", + " 2 0.000 0.000 0.000 0.000 shape.py:228(default_infer_shape)\n", + " 6 0.000 0.000 0.007 0.001 rewriting.py:237(scan_split_non_sequence_decomposition_and_solve)\n", + " 24 0.000 0.000 0.000 0.000 extra_ops.py:1558()\n", + " 2 0.000 0.000 0.000 0.000 type.py:925(matrix)\n", + " 23 0.000 0.000 0.000 0.000 types.py:618()\n", + " 9 0.000 0.000 0.000 0.000 basic.py:160(__init__)\n", + " 3 0.000 0.000 0.002 0.001 basic.py:4462(expand_dims)\n", + " 20 0.000 0.000 0.000 0.000 basic.py:1550()\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:710(_flush_buffers)\n", + " 7 0.000 0.000 0.000 0.000 basic.py:1701(op_as_string)\n", + " 5 0.000 0.000 0.000 0.000 vm.py:1314(__setstate__)\n", + " 12 0.000 0.000 0.000 0.000 arrayprint.py:1042()\n", + " 1 0.000 0.000 0.001 0.001 slinalg.py:729(lu_factor)\n", + " 4 0.000 0.000 0.000 0.000 zmqstream.py:653(_rebuild_io_state)\n", + " 3 0.000 0.000 0.010 0.003 mode.py:153(add_requirements)\n", + " 42 0.000 0.000 0.000 0.000 op.py:288(inner_seqs)\n", + " 1 0.000 0.000 0.000 0.000 kernelbase.py:302(poll_control_queue)\n", + " 4 0.000 0.000 0.000 0.000 __init__.py:183(dumps)\n", + " 1 0.000 0.000 9.440 9.440 __init__.py:95(function)\n", + " 111 0.000 0.000 0.000 0.000 basic.py:180(add_requirements)\n", + " 2 0.000 0.000 0.000 0.000 mode.py:427(clone)\n", + " 6 0.000 0.000 0.000 0.000 blockwise.py:35(_squeeze_left)\n", + " 19 0.000 0.000 0.000 0.000 math.py:1672(local_reduce_chain)\n", + " 39 0.000 0.000 0.000 0.000 destroyhandler.py:381()\n", + " 4 0.000 0.000 0.001 0.000 blas_scipy.py:13(make_ger_destructive)\n", + " 11 0.000 0.000 0.000 0.000 op.py:405(inner_shared_outs)\n", + " 24 0.000 0.000 0.000 0.000 op.py:333(outer_mitsot)\n", + " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3052(max)\n", + " 40 0.000 0.000 0.000 0.000 types.py:1382(wrap_out)\n", + " 9 0.000 0.000 0.000 0.000 :89(_unpack_uint32)\n", + " 35 0.000 0.000 0.000 0.000 textwrap.py:483()\n", + " 6 0.000 0.000 0.000 0.000 subtensor.py:181(get_advsubtensor_axis)\n", + " 3 0.000 0.000 0.000 0.000 utils.py:208(safe_signature)\n", + " 85 0.000 0.000 0.000 0.000 math.py:3130(__str__)\n", + " 6 0.000 0.000 0.000 0.000 elemwise.py:54(add_requirements)\n", + " 3 0.000 0.000 0.000 0.000 :124(setdefault)\n", + " 1 0.000 0.000 0.002 0.002 shape.py:943(local_reshape_to_dimshuffle)\n", + " 4 0.000 0.000 0.001 0.000 type.py:824(scalar)\n", + " 26 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", + " 12 0.000 0.000 0.000 0.000 basic.py:2941()\n", + " 3 0.000 0.000 0.000 0.000 :806(module_from_spec)\n", + " 4 0.000 0.000 0.000 0.000 tempfile.py:446(cleanup)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:2059(L_op)\n", + " 3 0.000 0.000 0.000 0.000 :1619(_get_spec)\n", + " 41 0.000 0.000 0.000 0.000 types.py:614()\n", + " 3 0.000 0.000 0.013 0.004 mode.py:366(__get_optimizer)\n", + " 13 0.000 0.000 0.003 0.000 gradient.py:1528()\n", + " 3 0.000 0.000 0.001 0.000 :1522(_get_spec)\n", + " 1 0.000 0.000 0.000 0.000 arrayprint.py:1569(_array_repr_implementation)\n", + " 5 0.000 0.000 0.000 0.000 arrayprint.py:454()\n", + " 6 0.000 0.000 0.001 0.000 type.py:349(convert_variable)\n", + " 24 0.000 0.000 0.000 0.000 extra_ops.py:1556()\n", + " 19 0.000 0.000 0.000 0.000 :1()\n", + " 2 0.000 0.000 0.000 0.000 {method 'isoformat' of 'datetime.datetime' objects}\n", + " 24 0.000 0.000 0.000 0.000 math.py:489(local_sumsqr2dot)\n", + " 5 0.000 0.000 0.000 0.000 subtensor.py:1704(__str__)\n", + " 22 0.000 0.000 0.001 0.000 rewriting.py:1118(sanitize)\n", + " 3 0.000 0.000 0.000 0.000 rewriting.py:1823(add_requirements)\n", + " 18 0.000 0.000 0.000 0.000 :139()\n", + " 4 0.000 0.000 0.000 0.000 base_events.py:846(_call_soon)\n", + " 10 0.000 0.000 0.000 0.000 shape.py:633(__str__)\n", + " 29 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", + " 3 0.000 0.000 0.000 0.000 traitlets.py:689(set)\n", + " 8 0.000 0.000 0.000 0.000 basic.py:4438(atleast_Nd)\n", + " 24 0.000 0.000 0.000 0.000 op.py:302(outer_mitmot)\n", + " 9 0.000 0.000 0.000 0.000 utils.py:216()\n", + " 12 0.000 0.000 0.000 0.000 op.py:337(inner_mitsot_outs)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _imp.is_builtin}\n", + " 9 0.000 0.000 0.000 0.000 basic.py:1508(c_code)\n", + " 3 0.000 0.000 0.000 0.000 types.py:536(ValueAttribute)\n", + " 19 0.000 0.000 0.000 0.000 {method 'co_positions' of 'code' objects}\n", + " 3 0.000 0.000 0.000 0.000 base_events.py:775(call_later)\n", + " 1 0.000 0.000 0.000 0.000 blas.py:1211(make_node)\n", + " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", + " 2 0.000 0.000 0.000 0.000 shape.py:457(infer_shape)\n", + " 24 0.000 0.000 0.000 0.000 blockwise.py:293()\n", + " 3 0.000 0.000 0.000 0.000 base_events.py:799(call_at)\n", + " 4 0.000 0.000 0.000 0.000 queue.py:115(empty)\n", + " 36 0.000 0.000 0.000 0.000 subtensor.py:669()\n", + " 18 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", + " 9 0.000 0.000 0.000 0.000 basic.py:1290(FakeFunctionGraph)\n", + " 3 0.000 0.000 0.000 0.000 :177(_path_isabs)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:153(__next__)\n", + " 41 0.000 0.000 0.000 0.000 basic.py:2191(__init__)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:4222(prepare_node)\n", + " 12 0.000 0.000 0.000 0.000 elemwise.py:123()\n", + " 3 0.000 0.000 0.000 0.000 rewriting.py:946(add_requirements)\n", + " 1 0.000 0.000 0.000 0.000 session.py:690(serialize)\n", + " 3 0.000 0.000 0.018 0.006 basic.py:373(local_fill_to_alloc)\n", + " 2 0.000 0.000 0.000 0.000 type.py:879(vector)\n", + " 5 0.000 0.000 0.000 0.000 basic.py:4305(__init__)\n", + " 34 0.000 0.000 0.000 0.000 op.py:293(outer_seqs)\n", + " 3 0.000 0.000 0.000 0.000 :232(__init__)\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:20(_showwarnmsg_impl)\n", + " 40 0.000 0.000 0.000 0.000 types.py:1846(convert_function_input)\n", + " 12 0.000 0.000 0.000 0.000 op.py:307(inner_mitmot_outs)\n", + " 29 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", + " 3 0.000 0.000 0.000 0.000 types.py:110(fgraph_updated_vars)\n", + " 3 0.000 0.000 0.006 0.002 variable.py:818(squeeze)\n", + " 3 0.000 0.000 0.000 0.000 :642(_get_cached)\n", + " 4 0.000 0.000 0.000 0.000 type.py:866(_validate_static_shape)\n", + " 3 0.000 0.000 0.000 0.000 functools.py:677(cache)\n", + " 1 0.000 0.000 0.010 0.010 session.py:754(send)\n", + " 1 0.000 0.000 0.010 0.010 iostream.py:616(_flush)\n", + " 40 0.000 0.000 0.000 0.000 basic.py:4324()\n", + " 79 0.000 0.000 0.000 0.000 gradient.py:1250(try_to_copy_if_needed)\n", + " 20 0.000 0.000 0.000 0.000 basic.py:1546()\n", + " 6 0.000 0.000 0.000 0.000 subtensor.py:2014(connection_pattern)\n", + " 4 0.000 0.000 0.000 0.000 encoder.py:183(encode)\n", + " 9 0.000 0.000 0.000 0.000 selector_events.py:740(_process_events)\n", + " 3 0.000 0.000 0.001 0.000 iostream.py:157(_handle_event)\n", + " 24 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", + " 3 0.000 0.000 0.000 0.000 events.py:113(__init__)\n", + " 7 0.000 0.000 0.000 0.000 basic.py:202(__str__)\n", + " 6 0.000 0.000 0.000 0.000 blas_c.py:32(use_c_gemv)\n", + " 18 0.000 0.000 0.000 0.000 unify.py:59(__eq__)\n", + " 32 0.000 0.000 0.000 0.000 shape.py:1160()\n", + " 4 0.000 0.000 0.000 0.000 sort.py:180(infer_shape)\n", + " 28 0.000 0.000 0.000 0.000 rewriting.py:1762()\n", + " 45 0.000 0.000 0.000 0.000 shape.py:784()\n", + " 7 0.000 0.000 0.000 0.000 subtensor.py:161(is_full_slice)\n", + " 6 0.000 0.000 0.000 0.000 math.py:1302(local_sum_prod_of_mul_or_div)\n", + " 2 0.000 0.000 0.002 0.001 math.py:3535(sum)\n", + " 30 0.000 0.000 0.000 0.000 traceback.py:293(__init__)\n", + " 2 0.000 0.000 0.003 0.001 blas.py:129(_as_scalar)\n", + " 19 0.000 0.000 0.000 0.000 utils.py:240(__str__)\n", + " 30 0.000 0.000 0.000 0.000 linecache.py:184(lazycache)\n", + " 8 0.000 0.000 0.000 0.000 op.py:363(outer_sitsot_outs)\n", + " 3 0.000 0.000 0.000 0.000 traitlets.py:727(_cross_validate)\n", + " 71 0.000 0.000 0.000 0.000 shape.py:790(c_code_cache_version)\n", + " 3 0.000 0.000 0.000 0.000 shape.py:759(local_useless_expand_dims_in_reshape)\n", + " 51 0.000 0.000 0.000 0.000 basic.py:4380(do_constant_folding)\n", + " 40 0.000 0.000 0.000 0.000 types.py:1361(wrap_in)\n", + " 15 0.000 0.000 0.000 0.000 basic.py:1727(infer_shape)\n", + " 19 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", + " 2 0.000 0.000 0.000 0.000 events.py:157(cancel)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:516(__exit__)\n", + " 72 0.000 0.000 0.000 0.000 subtensor.py:435(switch_neg_step)\n", + " 3 0.000 0.000 0.000 0.000 :416(__enter__)\n", + " 1 0.000 0.000 0.000 0.000 {method 'copy' of '_hashlib.HMAC' objects}\n", + " 42 0.000 0.000 0.000 0.000 basic.py:441(index)\n", + " 4 0.000 0.000 0.000 0.000 linalg.py:970(slogdet_specialization)\n", + " 4 0.000 0.000 0.000 0.000 session.py:92(json_packer)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:2001(__init__)\n", + " 6 0.000 0.000 0.000 0.000 utils.py:786(inner_outputs)\n", + " 9 0.000 0.000 0.000 0.000 op.py:258(n_outer_inputs)\n", + " 3 0.000 0.000 0.000 0.000 :674(_check_name_wrapper)\n", + " 1 0.000 0.000 0.000 0.000 types.py:90(infer_reuse_pattern)\n", + " 18 0.000 0.000 0.000 0.000 unify.py:29(eval_if_etuple)\n", + " 3 0.000 0.000 0.296 0.099 shape.py:732(add_requirements)\n", + " 40 0.000 0.000 0.000 0.000 op.py:359()\n", + " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3190(min)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:762(rewrite_det_blockdiag)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:3025(L_op)\n", + " 16 0.000 0.000 0.000 0.000 {method 'random' of '_random.Random' objects}\n", + " 1 0.000 0.000 0.001 0.001 basic.py:866(ones_like)\n", + " 3 0.000 0.000 0.000 0.000 :74(__new__)\n", + " 3 0.000 0.000 0.000 0.000 functools.py:504(lru_cache)\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:35(_formatwarnmsg_impl)\n", + " 28 0.000 0.000 0.000 0.000 op.py:308()\n", + " 2 0.000 0.000 0.000 0.000 {method 'set_result' of '_asyncio.Future' objects}\n", + " 9 0.000 0.000 0.001 0.000 :145(_path_stat)\n", + " 9 0.000 0.000 0.000 0.000 op.py:271(n_outer_outputs)\n", + " 3 0.000 0.000 0.000 0.000 :445(cb)\n", + " 3 0.000 0.000 9.261 3.087 basic.py:122(__call__)\n", + " 31 0.000 0.000 0.000 0.000 traceback.py:445(extended_frame_gen)\n", + " 2 0.000 0.000 0.001 0.001 tempfile.py:577(opener)\n", + " 2 0.000 0.000 0.000 0.000 subtensor.py:1048(__str__)\n", + " 4 0.000 0.000 0.000 0.000 shape.py:1192(local_specify_shape_lift)\n", + " 2 0.000 0.000 0.000 0.000 shape.py:570()\n", + " 18 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", + " 3 0.000 0.000 0.000 0.000 traitlets.py:708(__set__)\n", + " 36 0.000 0.000 0.000 0.000 configparser.py:206()\n", + " 4 0.000 0.000 0.000 0.000 features.py:701(clone)\n", + " 40 0.000 0.000 0.000 0.000 basic.py:4399()\n", + " 2 0.000 0.000 0.000 0.000 slinalg.py:1008(inplace_on_inputs)\n", + " 3 0.000 0.000 0.000 0.000 :162(__enter__)\n", + " 3 0.000 0.000 0.000 0.000 elemwise.py:542(elemwise_max_operands_fct)\n", + " 3 0.000 0.000 0.000 0.000 :730(_validate_timestamp_pyc)\n", + " 2 0.000 0.000 0.000 0.000 jsonutil.py:107(json_default)\n", + " 45 0.000 0.000 0.000 0.000 subtensor.py:1311(helper_c_code_cache_version)\n", + " 3 0.000 0.000 0.000 0.000 :82(remove)\n", + " 1 0.000 0.000 0.000 0.000 session.py:649(msg)\n", + " 12 0.000 0.000 0.000 0.000 basic.py:1898()\n", + " 20 0.000 0.000 0.000 0.000 utils.py:630()\n", + " 35 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", + " 1 0.000 0.000 0.001 0.001 traceback.py:431(extract)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:2661(L_op)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:2082(output_types)\n", + " 34 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", + " 3 0.000 0.000 0.000 0.000 :420(__exit__)\n", + " 1 0.000 0.000 0.003 0.003 nlinalg.py:122(grad)\n", + " 30 0.000 0.000 0.000 0.000 op.py:299()\n", + " 3 0.000 0.000 0.000 0.000 types.py:578(ContainerAttribute)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1527(_notify_observers)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:1038(upgrade_to_float)\n", + " 4 0.000 0.000 0.000 0.000 math.py:3488(__init__)\n", + " 3 0.000 0.000 0.000 0.000 elemwise.py:552(add_requirements)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:114(_sanitize_params)\n", + " 1 0.000 0.000 0.000 0.000 session.py:675(sign)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:718(_rotate_buffers)\n", + " 3 0.000 0.000 0.000 0.000 :48(_new_module)\n", + " 1 0.000 0.000 0.010 0.010 iostream.py:271(send_multipart)\n", + " 1 0.000 0.000 0.000 0.000 queues.py:225(get)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:833(rewrite_det_kronecker)\n", + " 3 0.000 0.000 0.000 0.000 shape.py:884(local_useless_reshape)\n", + " 2 0.000 0.000 0.000 0.000 base_events.py:457(create_future)\n", + " 15 0.000 0.000 0.000 0.000 utils.py:213()\n", + " 10 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", + " 4 0.000 0.000 0.000 0.000 typing.py:1374(__instancecheck__)\n", + " 2 0.000 0.000 0.000 0.000 type.py:99(filter_inplace)\n", + " 8 0.000 0.000 0.000 0.000 basic.py:4391(output_types)\n", + " 6 0.000 0.000 0.001 0.000 shape.py:409()\n", + " 6 0.000 0.000 0.000 0.000 __init__.py:1764(isEnabledFor)\n", + " 4 0.000 0.000 0.000 0.000 rewriting.py:75(get_root_A)\n", + " 20 0.000 0.000 0.000 0.000 basic.py:1397(infer_shape)\n", + " 20 0.000 0.000 0.000 0.000 basic.py:1487(default_query)\n", + " 12 0.000 0.000 0.000 0.000 blas.py:230(infer_shape)\n", + " 22 0.000 0.000 0.000 0.000 utils.py:312(__init__)\n", + " 9 0.000 0.000 0.000 0.000 elemwise.py:1415(infer_shape)\n", + " 4 0.000 0.000 0.000 0.000 typing.py:1665(__subclasscheck__)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:812(__repr__)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:2526(grad)\n", + " 15 0.000 0.000 0.000 0.000 :491(_verbose_message)\n", + " 3 0.000 0.000 0.000 0.000 vm.py:842(accept)\n", + " 30 0.000 0.000 0.000 0.000 op.py:315()\n", + " 12 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", + " 1 0.000 0.000 0.001 0.001 gradient.py:1559(_float_ones_like)\n", + " 12 0.000 0.000 0.000 0.000 blas.py:304(infer_shape)\n", + " 18 0.000 0.000 0.000 0.000 op.py:2607()\n", + " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.BufferedRandom' objects}\n", + " 18 0.000 0.000 0.000 0.000 {built-in method _imp.acquire_lock}\n", + " 3 0.000 0.000 0.000 0.000 :823(keys)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1512(_notify_trait)\n", + " 31 0.000 0.000 0.000 0.000 op.py:2466()\n", + " 1 0.000 0.000 0.000 0.000 session.py:600(msg_id)\n", + " 1 0.000 0.000 0.005 0.005 nlinalg.py:225(grad)\n", + " 6 0.000 0.000 0.000 0.000 functional.py:8(vectorize)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:510(__enter__)\n", + " 6 0.000 0.000 0.000 0.000 math.py:1828(local_opt_alloc)\n", + " 3 0.000 0.000 0.006 0.002 variable.py:777(zeros_like)\n", + " 3 0.000 0.000 0.000 0.000 destroyhandler.py:407(unpickle)\n", + " 9 0.000 0.000 0.000 0.000 basic.py:1826(c_code)\n", + " 63 0.000 0.000 0.000 0.000 basic.py:702(owner)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:245(__str__)\n", + " 2 0.000 0.000 0.000 0.000 features.py:946(on_attach)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:2083()\n", + " 6 0.000 0.000 0.000 0.000 utils.py:219()\n", + " 27 0.000 0.000 0.000 0.000 op.py:406()\n", + " 12 0.000 0.000 0.000 0.000 :1226(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:313(gettempdir)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:2718(c_code)\n", + " 30 0.000 0.000 0.000 0.000 basic.py:1066(same_out)\n", + " 6 0.000 0.000 0.000 0.000 math.py:1389(local_sum_of_neg_to_neg_of_sum)\n", + " 7 0.000 0.000 0.000 0.000 {built-in method numpy.lib.array_utils.normalize_axis_index}\n", + " 3 0.000 0.000 0.001 0.000 :1551(find_spec)\n", + " 3 0.000 0.000 0.000 0.000 :67(_relax_case)\n", + " 2 0.000 0.000 0.000 0.000 threading.py:303(__enter__)\n", + " 24 0.000 0.000 0.000 0.000 basic.py:4325()\n", + " 6 0.000 0.000 0.000 0.000 subtensor.py:2173(infer_shape)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method nt._path_splitroot}\n", + " 18 0.000 0.000 0.000 0.000 {built-in method _imp.release_lock}\n", + " 3 0.000 0.000 0.000 0.000 :1233(path_stats)\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:2635(validate)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:587(_schedule_in_thread)\n", + " 38 0.000 0.000 0.000 0.000 basic.py:818(clone)\n", + " 8 0.000 0.000 0.000 0.000 basic.py:1770(warn_inplace)\n", + " 28 0.000 0.000 0.000 0.000 op.py:338()\n", + " 21 0.000 0.000 0.000 0.000 op.py:867()\n", + " 1 0.000 0.000 0.000 0.000 session.py:645(msg_header)\n", + " 2 0.000 0.000 0.001 0.001 asyncio.py:206(_handle_events)\n", + " 12 0.000 0.000 0.000 0.000 arrayprint.py:1046()\n", + " 2 0.000 0.000 0.000 0.000 basic.py:181(clone)\n", + " 1 0.000 0.000 0.000 0.000 type.py:419(__repr__)\n", + " 6 0.000 0.000 0.000 0.000 :632(cached)\n", + " 1 0.000 0.000 0.001 0.001 traceback.py:249(extract_stack)\n", + " 2 0.000 0.000 0.000 0.000 futures.py:310(_set_result_unless_cancelled)\n", + " 1 0.000 0.000 0.000 0.000 {method 'hexdigest' of '_hashlib.HMAC' objects}\n", + " 1 0.000 0.000 0.000 0.000 hmac.py:122(copy)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3474(validate)\n", + " 16 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", + " 3 0.000 0.000 0.000 0.000 base_events.py:817(call_soon)\n", + " 2 0.000 0.000 0.002 0.001 variable.py:671(sum)\n", + " 13 0.000 0.000 0.000 0.000 op.py:1386()\n", + " 3 0.000 0.000 0.000 0.000 :164(_path_isfile)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:483(__init__)\n", + " 4 0.000 0.000 0.000 0.000 shape.py:416()\n", + " 3 0.000 0.000 0.000 0.000 :79(__init__)\n", + " 3 0.000 0.000 0.000 0.000 :1500(_path_importer_cache)\n", + " 1 0.000 0.000 0.000 0.000 shape.py:708(grad)\n", + " 2 0.000 0.000 0.004 0.002 math.py:3403(outer)\n", + " 8 0.000 0.000 0.000 0.000 {built-in method nt.getpid}\n", + " 3 0.000 0.000 0.000 0.000 :155(_path_is_mode_type)\n", + " 2 0.000 0.000 0.002 0.001 math.py:328(makeKeepDims)\n", + " 9 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", + " 1 0.000 0.000 0.000 0.000 futures.py:391(_call_set_state)\n", + " 2 0.000 0.000 0.000 0.000 mode.py:309(__init__)\n", + " 3 0.000 0.000 0.000 0.000 mode.py:137(apply)\n", + " 24 0.000 0.000 0.000 0.000 subtensor.py:1000()\n", + " 1 0.000 0.000 0.000 0.000 {built-in method now}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:870(call_soon_threadsafe)\n", + " 1 0.000 0.000 0.000 0.000 asyncio.py:216(call_at)\n", + " 20 0.000 0.000 0.000 0.000 io.py:240(__init__)\n", + " 19 0.000 0.000 0.000 0.000 basic.py:4374(infer_shape)\n", + " 2 0.000 0.000 0.000 0.000 math.py:3528(clone)\n", + " 5 0.000 0.000 0.000 0.000 arrayprint.py:1297(__call__)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:874(__neg__)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3624(validate_elements)\n", + " 1 0.000 0.000 0.000 0.000 ioloop.py:604(call_later)\n", + " 1 0.000 0.000 0.000 0.000 arrayprint.py:1495(dtype_is_implied)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:1290(L_op)\n", + " 10 0.000 0.000 0.000 0.000 type.py:873()\n", + " 2 0.000 0.000 0.000 0.000 elemwise.py:1257(_output_dtype)\n", + " 3 0.000 0.000 0.000 0.000 :873(__iter__)\n", + " 12 0.000 0.000 0.000 0.000 arrayprint.py:1047()\n", + " 4 0.000 0.000 0.000 0.000 utils.py:797(outer_outputs)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _imp.find_frozen}\n", + " 4 0.000 0.000 0.000 0.000 {method 'update' of '_hashlib.HMAC' objects}\n", + " 3 0.000 0.000 0.000 0.000 :1128(find_spec)\n", + " 12 0.000 0.000 0.000 0.000 :1222(__enter__)\n", + " 2 0.000 0.000 0.000 0.000 functools.py:66(wraps)\n", + " 4 0.000 0.000 0.000 0.000 zmqstream.py:532(sending)\n", + " 2 0.000 0.000 0.000 0.000 arrayprint.py:1678(_guarded_repr_or_str)\n", + " 1 0.000 0.000 0.001 0.001 rewriting.py:22(decompose_A)\n", + " 18 0.000 0.000 0.000 0.000 rewriting.py:918()\n", + " 7 0.000 0.000 0.000 0.000 op.py:2417(get_inp_idx)\n", + " 4 0.000 0.000 0.000 0.000 utils.py:247()\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _heapq.heappush}\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _imp._fix_co_filename}\n", + " 4 0.000 0.000 0.000 0.000 hmac.py:117(update)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:213(_is_master_process)\n", + " 4 0.000 0.000 0.000 0.000 blas_c.py:15(use_c_ger)\n", + " 3 0.000 0.000 0.001 0.000 variable.py:614(copy)\n", + " 4 0.000 0.000 0.000 0.000 blas.py:1212()\n", + " 1 0.000 0.000 0.000 0.000 session.py:198(utcnow)\n", + " 1 0.000 0.000 0.000 0.000 queues.py:256(get_nowait)\n", + " 2 0.000 0.000 0.000 0.000 elemwise.py:1050(local_careduce_fusion)\n", + " 15 0.000 0.000 0.000 0.000 :15(__eq__)\n", + " 2 0.000 0.000 0.000 0.000 op.py:378(inner_nitsot_outs)\n", + " 5 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", + " 6 0.000 0.000 0.000 0.000 typing.py:1443(__hash__)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:497(func_wrapper)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:2304(validate)\n", + " 1 0.000 0.000 0.000 0.000 session.py:281(extract_header)\n", + " 1 0.000 0.000 0.001 0.001 variable.py:780(ones_like)\n", + " 11 0.000 0.000 0.000 0.000 rewriting.py:123()\n", + " 3 0.000 0.000 0.000 0.000 :645(parent)\n", + " 1 0.000 0.000 0.000 0.000 math.py:2321(local_abs_lift)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _heapq.heappop}\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:142(rng)\n", + " 2 0.000 0.000 0.000 0.000 ioloop.py:549(time)\n", + " 1 0.000 0.000 0.000 0.000 shape.py:844(reshape)\n", + " 6 0.000 0.000 0.000 0.000 elemwise.py:172()\n", + " 1 0.000 0.000 0.000 0.000 zmqstream.py:684()\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:85(_infer_return_type)\n", + " 3 0.000 0.000 0.000 0.000 :190(_path_abspath)\n", + " 1 0.000 0.000 0.000 0.000 session.py:272(msg_header)\n", + " 8 0.000 0.000 0.000 0.000 __init__.py:308()\n", + " 4 0.000 0.000 0.000 0.000 raise_op.py:68(__hash__)\n", + " 3 0.000 0.000 0.000 0.000 elemwise.py:1215()\n", + " 8 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:505(parent_header)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:138(_event_pipe)\n", + " 6 0.000 0.000 0.000 0.000 slinalg.py:629(__init__)\n", + " 4 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", + " 8 0.000 0.000 0.000 0.000 {method 'is_done' of '_thread._ThreadHandle' objects}\n", + " 1 0.000 0.000 0.000 0.000 history.py:1016(_writeout_output_cache)\n", + " 2 0.000 0.000 0.000 0.000 :855(fsdecode)\n", + " 3 0.000 0.000 0.000 0.000 __init__.py:101(find_spec)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:577(_schedule_flush)\n", + " 3 0.000 0.000 0.000 0.000 vm.py:908(accept_var_updates)\n", + " 3 0.000 0.000 0.000 0.000 :982(find_spec)\n", + " 1 0.000 0.000 0.000 0.000 contextlib.py:145(__exit__)\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:118(_formatwarnmsg)\n", + " 4 0.000 0.000 0.000 0.000 queue.py:267(_qsize)\n", + " 6 0.000 0.000 0.000 0.000 arrayprint.py:952(_none_or_positive_arg)\n", + " 2 0.000 0.000 0.000 0.000 mode.py:340(__setstate__)\n", + " 9 0.000 0.000 0.000 0.000 elemwise.py:1211()\n", + " 2 0.000 0.000 0.000 0.000 events.py:73(cancel)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:337(_invoke_callbacks)\n", + " 1 0.000 0.000 0.000 0.000 hmac.py:161(hexdigest)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:1247()\n", + " 1 0.000 0.000 0.000 0.000 nlinalg.py:168(matrix_dot)\n", + " 3 0.000 0.000 0.000 0.000 sort.py:17(_parse_sort_args)\n", + " 3 0.000 0.000 0.000 0.000 __init__.py:1256(__len__)\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _weakref._remove_dead_weakref}\n", + " 4 0.000 0.000 0.000 0.000 encoder.py:105(__init__)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:428(notify_all)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:330(__hash__)\n", + " 2 0.000 0.000 0.000 0.000 {method 'indices' of 'slice' objects}\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:1523(notify_change)\n", + " 7 0.000 0.000 0.000 0.000 zmqstream.py:528(receiving)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:725(_hooks)\n", + " 1 0.000 0.000 0.003 0.003 math.py:3497(L_op)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:398(notify)\n", + " 3 0.000 0.000 0.000 0.000 linecache.py:48(_getline_from_code)\n", + " 6 0.000 0.000 0.000 0.000 basic.py:170(allow_gc)\n", + " 2 0.000 0.000 0.000 0.000 {method '__enter__' of '_io._IOBase' objects}\n", + " 14 0.000 0.000 0.000 0.000 op.py:316()\n", + " 3 0.000 0.000 0.000 0.000 :173(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 features.py:943(__init__)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:922(__truediv__)\n", + " 5 0.000 0.000 0.000 0.000 elemwise.py:1347()\n", + " 12 0.000 0.000 0.000 0.000 subtensor.py:2015()\n", + " 5 0.000 0.000 0.000 0.000 op.py:1363()\n", + " 3 0.000 0.000 0.000 0.000 :599(__init__)\n", + " 2 0.000 0.000 0.000 0.000 jsonutil.py:38(_ensure_tzinfo)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:1250()\n", + " 8 0.000 0.000 0.000 0.000 types.py:275()\n", + " 8 0.000 0.000 0.000 0.000 nlinalg.py:233(__str__)\n", + " 6 0.000 0.000 0.000 0.000 math.py:892(tracks)\n", + " 1 0.000 0.000 0.000 0.000 shape.py:791(local_reshape_chain)\n", + " 3 0.000 0.000 0.000 0.000 sort.py:160(__init__)\n", + " 3 0.000 0.000 0.000 0.000 linecache.py:57(_getlines_from_code)\n", + " 2 0.000 0.000 0.000 0.000 traitlets.py:3486(validate_elements)\n", + " 2 0.000 0.000 0.000 0.000 raise_op.py:59(__eq__)\n", + " 4 0.000 0.000 0.000 0.000 blas.py:133()\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:97(_showwarnmsg)\n", + " 7 0.000 0.000 0.000 0.000 base_events.py:548(_check_closed)\n", + " 12 0.000 0.000 0.000 0.000 base_events.py:2052(get_debug)\n", + " 4 0.000 0.000 0.000 0.000 rewriting.py:1125(while_scan_merge_subtensor_last_element)\n", + " 8 0.000 0.000 0.000 0.000 basic.py:104()\n", + " 5 0.000 0.000 0.000 0.000 basic.py:629(infer_shape)\n", + " 6 0.000 0.000 0.000 0.000 raise_op.py:170(infer_shape)\n", + " 7 0.000 0.000 0.000 0.000 subtensor.py:2097()\n", + " 2 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedRandom' objects}\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:216(_check_mp_mode)\n", + " 1 0.000 0.000 0.000 0.000 iostream.py:550(_is_master_process)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:919(__mul__)\n", + " 3 0.000 0.000 0.000 0.000 op.py:2440(get_out_idx)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method math.isnan}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", + " 3 0.000 0.000 0.000 0.000 :412(__init__)\n", + " 1 0.000 0.000 0.000 0.000 threading.py:306(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 base_events.py:1939(_add_callback)\n", + " 4 0.000 0.000 0.000 0.000 traceback.py:329(__getitem__)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:691(equals)\n", + " 2 0.000 0.000 0.000 0.000 subtensor_lift.py:193()\n", + " 3 0.000 0.000 0.000 0.000 op.py:1349()\n", + " 10 0.000 0.000 0.000 0.000 utils.py:631()\n", + " 3 0.000 0.000 0.000 0.000 {built-in method _asyncio.get_running_loop}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:318(_is_owned)\n", + " 4 0.000 0.000 0.000 0.000 shape.py:705(connection_pattern)\n", + " 2 0.000 0.000 0.000 0.000 basic.py:4383(connection_pattern)\n", + " 3 0.000 0.000 0.000 0.000 blas.py:152(__str__)\n", + " 3 0.000 0.000 0.000 0.000 :1184(__init__)\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:425(__init__)\n", + " 3 0.000 0.000 0.000 0.000 linecache.py:54(_make_key)\n", + " 2 0.000 0.000 0.000 0.000 blas.py:822(__str__)\n", + " 8 0.000 0.000 0.000 0.000 threading.py:605(is_set)\n", + " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3185(_min_dispatcher)\n", + " 3 0.000 0.000 0.000 0.000 types.py:472()\n", + " 3 0.000 0.000 0.000 0.000 shape.py:735(apply)\n", + " 1 0.000 0.000 0.000 0.000 op.py:341(outer_mitsot_outs)\n", + " 3 0.000 0.000 0.000 0.000 op.py:2992()\n", + " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", + " 2 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", + " 1 0.000 0.000 0.000 0.000 threading.py:312(_release_save)\n", + " 2 0.000 0.000 0.000 0.000 tz.py:74(utcoffset)\n", + " 1 0.000 0.000 0.000 0.000 queues.py:173(qsize)\n", + " 4 0.000 0.000 0.000 0.000 op.py:606(inplace_on_inputs)\n", + " 6 0.000 0.000 0.000 0.000 subtensor.py:895(extract_const)\n", + " 1 0.000 0.000 0.000 0.000 blas.py:1245(infer_shape)\n", + " 3 0.000 0.000 0.000 0.000 {method 'cancelled' of '_asyncio.Future' objects}\n", + " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3047(_max_dispatcher)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:1471(tracks)\n", + " 3 0.000 0.000 0.000 0.000 subtensor_lift.py:204()\n", + " 1 0.000 0.000 0.000 0.000 rewriting.py:1102(select_min)\n", + " 1 0.000 0.000 0.000 0.000 slinalg.py:662(__init__)\n", + " 3 0.000 0.000 0.000 0.000 op.py:2993()\n", + " 1 0.000 0.000 0.000 0.000 tmp6jqq5u7h:1()\n", + " 1 0.000 0.000 0.000 0.000 tmpbf7ngv9i:1()\n", + " 3 0.000 0.000 0.000 0.000 :653(has_location)\n", + " 3 0.000 0.000 0.000 0.000 :1209(get_filename)\n", + " 1 0.000 0.000 0.000 0.000 math.py:1621(investigate_if_shape)\n", + " 3 0.000 0.000 0.000 0.000 configparser.py:372(default)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:312(nin)\n", + " 1 0.000 0.000 0.000 0.000 shape.py:628(__init__)\n", + " 1 0.000 0.000 0.000 0.000 slinalg.py:681(infer_shape)\n", + " 3 0.000 0.000 0.000 0.000 rewriting.py:133()\n", + " 5 0.000 0.000 0.000 0.000 op.py:2995()\n", + " 2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", + " 2 0.000 0.000 0.000 0.000 base_events.py:1949(_timer_handle_cancelled)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:440(__init__)\n", + " 1 0.000 0.000 0.000 0.000 slinalg.py:685(inplace_on_inputs)\n", + " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.StringIO' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", + " 3 0.000 0.000 0.000 0.000 :1017(create_module)\n", + " 3 0.000 0.000 0.000 0.000 :158(__init__)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:229(_get_candidate_names)\n", + " 1 0.000 0.000 0.000 0.000 queues.py:322(_consume_expired)\n", + " 1 0.000 0.000 0.000 0.000 blas.py:816()\n", + " 1 0.000 0.000 0.000 0.000 nlinalg.py:230(infer_shape)\n", + " 2 0.000 0.000 0.000 0.000 iostream.py:255(closed)\n", + " 1 0.000 0.000 0.000 0.000 basic.py:762(local_remove_all_assert)\n", + " 2 0.000 0.000 0.000 0.000 shape.py:91(connection_pattern)\n", + " 1 0.000 0.000 0.000 0.000 events.py:129(__lt__)\n", + " 2 0.000 0.000 0.000 0.000 tempfile.py:301(_gettempdir)\n", + " 2 0.000 0.000 0.000 0.000 op.py:2878()\n", + " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 traitlets.py:2558(_validate_bounds)\n", + " 1 0.000 0.000 0.000 0.000 nlinalg.py:161(infer_shape)\n", + " 1 0.000 0.000 0.000 0.000 subtensor_lift.py:213()\n", + " 2 0.000 0.000 0.000 0.000 op.py:379()\n", + " 1 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", + " 1 0.000 0.000 0.000 0.000 base_events.py:752(is_closed)\n", + " 1 0.000 0.000 0.000 0.000 hmac.py:139(_current)\n", + " 1 0.000 0.000 0.000 0.000 displaypub.py:150(is_publishing)\n", + " 1 0.000 0.000 0.000 0.000 history.py:1065(hold)\n", + " 1 0.000 0.000 0.000 0.000 queues.py:59(_set_timeout)\n", + " 1 0.000 0.000 0.000 0.000 utils.py:379()\n", + " 1 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", + " 1 0.000 0.000 0.000 0.000 displayhook.py:118(is_active)" + ] } ], "source": [ + "%%prun\n", "results = benchmark_kalman_gradients(loss, obs_data, a0, P0, T, Z, R, H, Q)" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 83, "id": "a413c8e9", "metadata": {}, "outputs": [ @@ -1030,7 +3139,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.07424874001881107})\n" + "defaultdict(, {'exec_time': 0.47910417499952024})\n" ] } ], @@ -1040,7 +3149,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 84, "id": "d35b98d6", "metadata": {}, "outputs": [ @@ -1059,7 +3168,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 85, "id": "539c18c2", "metadata": {}, "outputs": [ @@ -1067,7 +3176,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.11171145999105649})\n" + "defaultdict(, {'exec_time': 0.585526670049876})\n" ] } ], @@ -1077,7 +3186,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 86, "id": "1e633e75", "metadata": {}, "outputs": [], @@ -1087,7 +3196,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 87, "id": "7118dfec", "metadata": {}, "outputs": [ @@ -1095,7 +3204,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'Forward pass': 0.1035015100147575, 'Backprop': 0.024320614989846952})\n" + "defaultdict(, {'Forward pass': 0.05328435508999973, 'Backprop': 0.013503129919990897})\n" ] } ], @@ -1121,7 +3230,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 88, "id": "fbae0189", "metadata": {}, "outputs": [ @@ -1168,7 +3277,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 89, "id": "c3a114b2", "metadata": {}, "outputs": [ @@ -1188,7 +3297,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 90, "id": "867d5e2f", "metadata": {}, "outputs": [ @@ -1227,7 +3336,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 91, "id": "25f0a57b", "metadata": {}, "outputs": [ @@ -1239,7 +3348,7 @@ "Comparison between classic a0 gradient and our custom OpFromGraph : True\n", "Comparison between classic P0 gradient and our custom OpFromGraph : True\n", "Comparison between classic T gradient and our custom OpFromGraph : True\n", - "Comparison between classic Z gradient and our custom OpFromGraph : False\n", + "Comparison between classic Z gradient and our custom OpFromGraph : True\n", "Comparison between classic H gradient and our custom OpFromGraph : True\n", "Comparison between classic Q gradient and our custom OpFromGraph : True\n" ] From b92e1220f1c7eb388c6eb052d5d701f143cc3674 Mon Sep 17 00:00:00 2001 From: Jean Van Dyk Date: Wed, 20 Aug 2025 12:34:02 +0200 Subject: [PATCH 6/6] Removing some test --- notebooks/Kalman_Filter_Gradient.ipynb | 2144 +----------------------- 1 file changed, 48 insertions(+), 2096 deletions(-) diff --git a/notebooks/Kalman_Filter_Gradient.ipynb b/notebooks/Kalman_Filter_Gradient.ipynb index c05d202f..bec60971 100644 --- a/notebooks/Kalman_Filter_Gradient.ipynb +++ b/notebooks/Kalman_Filter_Gradient.ipynb @@ -10,10 +10,19 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 1, "id": "90979a41", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING (pytensor.configdefaults): g++ not available, if using conda: `conda install gxx`\n", + "WARNING (pytensor.configdefaults): g++ not detected! PyTensor will be unable to compile C-implementations and will default to Python. Performance may be severely degraded. To remove this warning, set PyTensor flags cxx to an empty string.\n" + ] + } + ], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -40,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 2, "id": "fdb156d6", "metadata": {}, "outputs": [], @@ -79,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 3, "id": "3661408d", "metadata": {}, "outputs": [], @@ -132,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 4, "id": "35351096", "metadata": {}, "outputs": [], @@ -260,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 5, "id": "ee21ef4e", "metadata": {}, "outputs": [], @@ -322,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 6, "id": "8c89b018", "metadata": {}, "outputs": [], @@ -379,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 7, "id": "bba53a26", "metadata": {}, "outputs": [], @@ -418,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 8, "id": "c17949b7", "metadata": {}, "outputs": [], @@ -464,7 +473,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 9, "id": "84cb6867", "metadata": {}, "outputs": [], @@ -524,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 10, "id": "9a560ed9", "metadata": {}, "outputs": [], @@ -757,7 +766,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 11, "id": "df925ee8", "metadata": {}, "outputs": [], @@ -823,51 +832,23 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 24, "id": "afb362e5", "metadata": {}, "outputs": [], "source": [ "def custom_grad(inp, out, out_grad):\n", - " y, a, P, T, Z, H, Q = inp\n", - " a_filtered, P_filtered, y_hat = out\n", - " a_hat_grad, P_hat_grad, y_grad = out_grad\n", - "\n", - " PZT = P.dot(Z.T)\n", - " F = Z.dot(PZT) + H\n", - "\n", - " y_hat = Z.dot(a)\n", - " v = y - y_hat\n", - "\n", - " H_inv = pt.linalg.inv(H)\n", - " F_inv = pt.linalg.inv(F)\n", - "\n", - " K = PZT.dot(F_inv)\n", - " I_KZ = pt.eye(a.shape[0]) - K.dot(Z)\n", - " \n", - " grad_a_pred = I_KZ.T @ T.T @ a_hat_grad - 2 * Z.T @ F_inv @ v\n", - " grad_y = K.T @ T.T @ a_hat_grad + 2 * F_inv @ v\n", "\n", "\n", - " a_hat_grad = a_hat_grad.dimshuffle(0, 'x')\n", - " v = v.dimshuffle(0, 'x')\n", - " \n", - " P_filtered_grad = T.T @ P_hat_grad @ T\n", - " a_filtered_grad = T.T @ a_hat_grad \n", + " P_hat = grad_P_hat(inp, out, out_grad)\n", + " a_hat = grad_a_hat(inp, out, out_grad)\n", + " y = grad_y(inp, out, out_grad)\n", + " Z = grad_Z(inp, out, out_grad)\n", + " T = grad_T(inp, out, out_grad)\n", + " Q = grad_Q(inp, out, out_grad)\n", + " H = grad_H(inp, out, out_grad)\n", "\n", - " grad_P_hat = I_KZ.T @ ( P_filtered_grad + 0.5 * a_filtered_grad @ v.T @ H_inv @ Z + 0.5 * Z.T @ H_inv @ v @ a_filtered_grad.T ) @ I_KZ + Z.T @ F_inv @ Z - Z.T @ F_inv @ v @ v.T @ F_inv @ Z\n", - " grad_Z = None\n", - " grad_T = None\n", - " grad_Q = P_hat_grad\n", - " grad_H = K.T @ P_filtered_grad @ K - 0.5 * K.T @ a_filtered_grad @ v.T @ F_inv - 0.5 * F_inv @ v @ a_filtered_grad.T @ K + F_inv - F_inv @ v @ v.T @ F_inv\n", - "\n", - " return [grad_P_hat,\n", - " grad_a_pred,\n", - " grad_y,\n", - " grad_Z,\n", - " grad_T,\n", - " grad_Q,\n", - " grad_H]\n" + " return [y, a_hat, P_hat, T, Z, H, Q]" ] }, { @@ -880,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 25, "id": "7cead2c1", "metadata": {}, "outputs": [], @@ -890,7 +871,7 @@ "kalman_step_op = OpFromGraph(\n", " inputs=[y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym],\n", " outputs=kalman_step(y_sym, a0_sym, P0_sym, T_sym, Z_sym, H_sym, Q_sym),\n", - " lop_overrides=[grad_y, grad_a_hat, grad_P_hat, grad_T, grad_Z, grad_H, grad_Q],\n", + " lop_overrides=custom_grad,\n", " inline=True\n", ")\n", "\n", @@ -918,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 14, "id": "b6eb5d48", "metadata": {}, "outputs": [], @@ -979,7 +960,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 15, "id": "908946b0", "metadata": {}, "outputs": [], @@ -1026,7 +1007,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 16, "id": "a85fe92e", "metadata": {}, "outputs": [], @@ -1083,7 +1064,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 28, "id": "27a60fb3", "metadata": {}, "outputs": [ @@ -1094,2044 +1075,15 @@ "c:\\Users\\jeanv\\miniconda3\\envs\\CausalPy\\Lib\\site-packages\\pytensor\\tensor\\rewriting\\elemwise.py:954: UserWarning: Loop fusion failed because the resulting node would exceed the kernel argument limit.\n", " warn(\n" ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 16655700 function calls (16473469 primitive calls) in 19.496 seconds\n", - "\n", - " Ordered by: internal time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - "137658/137401 0.869 0.000 0.941 0.000 utils.py:229(__eq__)\n", - " 37352 0.852 0.000 2.619 0.000 elemwise.py:662(perform)\n", - " 22220 0.644 0.000 0.676 0.000 blas.py:894(perform)\n", - " 248821 0.610 0.000 8.445 0.000 op.py:536(rval)\n", - " 40 0.603 0.015 8.766 0.219 op.py:1663(perform)\n", - " 79609 0.577 0.000 0.577 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - "1286912/1286852 0.457 0.000 0.863 0.000 {built-in method builtins.isinstance}\n", - " 37352 0.395 0.000 0.771 0.000 elemwise.py:730(_check_runtime_broadcast)\n", - " 52632 0.380 0.000 1.348 0.000 _util.py:491(_asarray_validated)\n", - " 4060/20 0.379 0.000 9.575 0.479 vm.py:380(__call__)\n", - " 12120 0.350 0.000 0.373 0.000 blas.py:182(perform)\n", - " 52576 0.343 0.000 0.962 0.000 _function_base_impl.py:579(asarray_chkfinite)\n", - " 215301 0.342 0.000 0.343 0.000 utils.py:282(__getattribute__)\n", - " 24240 0.292 0.000 0.415 0.000 _basic.py:503(_solve_triangular)\n", - " 113823 0.265 0.000 0.332 0.000 type.py:395(broadcastable)\n", - " 165936 0.254 0.000 0.254 0.000 {built-in method numpy.asarray}\n", - " 56791 0.250 0.000 0.482 0.000 elemwise.py:227(perform)\n", - " 1259 0.232 0.000 0.690 0.001 basic.py:1525(io_toposort)\n", - " 767900 0.220 0.000 0.220 0.000 {built-in method _abc._abc_instancecheck}\n", - "20896/20866 0.214 0.000 2.663 0.000 fg.py:710(execute_callbacks)\n", - " 20200 0.212 0.000 0.228 0.000 blas.py:1131(perform)\n", - " 287 0.194 0.001 0.207 0.001 {built-in method _io.open}\n", - " 558074 0.180 0.000 0.242 0.000 {built-in method builtins.getattr}\n", - "320948/320880 0.177 0.000 0.598 0.000 {built-in method builtins.all}\n", - " 767900 0.163 0.000 0.383 0.000 :117(__instancecheck__)\n", - " 59300 0.161 0.000 0.258 0.000 basic.py:449(__init__)\n", - " 807095 0.160 0.000 0.160 0.000 {built-in method builtins.len}\n", - " 20259 0.150 0.000 0.150 0.000 {method 'index' of 'list' objects}\n", - " 41/29 0.144 0.004 6.249 0.215 basic.py:2309(apply)\n", - " 8080 0.138 0.000 0.162 0.000 blas_scipy.py:9(perform)\n", - "268809/268353 0.132 0.000 0.388 0.000 {built-in method builtins.hasattr}\n", - " 18390 0.130 0.000 0.377 0.000 type.py:71(__init__)\n", - " 24240 0.127 0.000 1.858 0.000 _basic.py:411(solve_triangular)\n", - " 28402 0.120 0.000 0.281 0.000 basic.py:126(__init__)\n", - " 40456 0.119 0.000 0.165 0.000 blas.py:384(getter)\n", - "119636/106086 0.118 0.000 3.767 0.000 basic.py:1079(transform)\n", - " 58811 0.116 0.000 0.116 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 223550 0.108 0.000 0.157 0.000 {method 'get' of 'dict' objects}\n", - " 76870 0.106 0.000 0.124 0.000 basic.py:919(expand)\n", - " 14140 0.102 0.000 0.102 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 2076 0.102 0.000 0.339 0.000 _basic.py:75(solve)\n", - " 88813 0.101 0.000 0.313 0.000 basic.py:835(walk)\n", - " 56791 0.098 0.000 0.098 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 58026 0.098 0.000 0.603 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 27308 0.094 0.000 0.148 0.000 utils.py:16(simple_extract_stack)\n", - " 570 0.087 0.000 0.087 0.000 {built-in method nt._getfinalpathname}\n", - " 400941 0.086 0.000 0.086 0.000 {method 'append' of 'list' objects}\n", - " 61194 0.084 0.000 0.414 0.000 {built-in method builtins.any}\n", - " 4040 0.079 0.000 0.107 0.000 _twodim_base_impl.py:163(eye)\n", - " 29592 0.075 0.000 0.219 0.000 _dtype.py:350(_name_get)\n", - " 59300 0.074 0.000 0.075 0.000 utils.py:292(__init__)\n", - " 440525 0.074 0.000 0.074 0.000 {built-in method time.perf_counter}\n", - "176916/89552 0.074 0.000 0.138 0.000 {built-in method builtins.hash}\n", - " 20460 0.073 0.000 0.093 0.000 shape.py:259(perform)\n", - " 27308 0.073 0.000 0.306 0.000 utils.py:76(add_tag_trace)\n", - " 5 0.071 0.014 0.483 0.097 elemwise.py:671(find_fuseable_subgraph)\n", - " 2020 0.070 0.000 0.135 0.000 _linalg.py:496(inv)\n", - " 693712 0.070 0.000 0.070 0.000 basic.py:433(owner)\n", - " 56 0.070 0.001 0.127 0.002 destroyhandler.py:27(_contains_cycle)\n", - " 212871 0.066 0.000 0.066 0.000 type.py:398()\n", - " 282811 0.064 0.000 0.088 0.000 basic.py:1559()\n", - " 5776 0.064 0.000 0.669 0.000 elemwise.py:384(get_output_info)\n", - " 14140 0.063 0.000 0.377 0.000 basic.py:1271(perform)\n", - " 28761 0.062 0.000 0.279 0.000 _dtype.py:34(__str__)\n", - " 6220 0.061 0.000 0.108 0.000 basic.py:1648(perform)\n", - "206427/199827 0.060 0.000 0.076 0.000 {built-in method builtins.issubclass}\n", - " 11150 0.059 0.000 0.442 0.000 shape.py:318(set_shape)\n", - "34766/31349 0.058 0.000 0.130 0.000 utils.py:222(__hash__)\n", - " 791/776 0.057 0.000 1.882 0.002 fg.py:342(import_node)\n", - " 24240 0.057 0.000 1.915 0.000 slinalg.py:863(perform)\n", - " 12120 0.057 0.000 0.057 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 134805 0.057 0.000 0.078 0.000 configparser.py:405(__get__)\n", - " 65181 0.057 0.000 0.531 0.000 _methods.py:67(_all)\n", - " 10309 0.056 0.000 0.144 0.000 basic.py:599(process_node)\n", - " 22090 0.055 0.000 0.240 0.000 copy.py:62(copy)\n", - "113246/110047 0.053 0.000 6.259 0.000 basic.py:1885(process_node)\n", - " 30036 0.051 0.000 0.118 0.000 numerictypes.py:471(issubdtype)\n", - " 9343 0.051 0.000 0.297 0.000 variable.py:999(sum)\n", - "10747/10393 0.051 0.000 1.366 0.000 basic.py:1269(clone_node_and_cache)\n", - " 76512 0.050 0.000 0.138 0.000 {method 'extend' of 'list' objects}\n", - " 115826 0.049 0.000 0.065 0.000 basic.py:1564()\n", - "7816/5260 0.048 0.000 1.521 0.000 shape.py:533(on_import)\n", - " 7834 0.045 0.000 0.219 0.000 variable.py:1039(no_nan)\n", - " 2020 0.044 0.000 0.081 0.000 _linalg.py:2331(det)\n", - " 6776 0.044 0.000 0.242 0.000 fg.py:220(remove_client)\n", - "7542/2891 0.044 0.000 0.125 0.000 basic.py:270(_get_underlying_scalar_constant_value)\n", - " 43738 0.043 0.000 0.106 0.000 destroyhandler.py:408(get_destroyers_of)\n", - " 5347 0.042 0.000 0.503 0.000 extra_ops.py:1512(broadcast_shape_iter)\n", - " 133649 0.042 0.000 0.051 0.000 {method 'setdefault' of 'dict' objects}\n", - " 55400 0.042 0.000 0.112 0.000 basic.py:766(__hash__)\n", - " 4052 0.040 0.000 0.135 0.000 fromnumeric.py:69(_wrapreduction)\n", - " 82641 0.040 0.000 0.059 0.000 op.py:216(n_mit_mot)\n", - " 2100 0.040 0.000 0.069 0.000 subtensor.py:1749(perform)\n", - " 5407 0.039 0.000 0.113 0.000 basic.py:60(upcast)\n", - " 303005 0.039 0.000 0.039 0.000 {built-in method builtins.id}\n", - " 2020 0.039 0.000 0.106 0.000 _decomp_lu.py:20(lu_factor)\n", - " 5776 0.038 0.000 1.330 0.000 elemwise.py:451(make_node)\n", - " 22073 0.038 0.000 0.106 0.000 copy.py:248(_reconstruct)\n", - " 2020 0.037 0.000 0.039 0.000 blas.py:1234(perform)\n", - " 6871 0.037 0.000 0.042 0.000 functools.py:686(_c3_merge)\n", - " 14542 0.036 0.000 0.036 0.000 {built-in method numpy.zeros}\n", - " 162916 0.036 0.000 0.059 0.000 basic.py:87(__hash__)\n", - " 158136 0.036 0.000 0.038 0.000 {method 'add' of 'set' objects}\n", - " 21390 0.035 0.000 0.137 0.000 variable.py:884(__init__)\n", - "10747/10393 0.035 0.000 1.249 0.000 basic.py:238(clone_with_new_inputs)\n", - " 60072 0.034 0.000 0.063 0.000 numerictypes.py:289(issubclass_)\n", - " 6220 0.034 0.000 0.034 0.000 basic.py:1631(_check_runtime_broadcast)\n", - " 19326 0.033 0.000 0.033 0.000 {method 'remove' of 'list' objects}\n", - " 6100 0.033 0.000 0.043 0.000 basic.py:4335(perform)\n", - " 4040 0.033 0.000 0.487 0.000 basic.py:4172(impl)\n", - " 6974 0.032 0.000 0.400 0.000 basic.py:1232(make_node)\n", - " 52632 0.032 0.000 0.064 0.000 _base.py:1401(issparse)\n", - " 5017 0.032 0.000 0.276 0.000 variable.py:1061(__init__)\n", - " 18199 0.032 0.000 0.205 0.000 {built-in method builtins.sorted}\n", - " 63717 0.032 0.000 0.046 0.000 type.py:392(__hash__)\n", - " 12851 0.032 0.000 0.115 0.000 fromnumeric.py:89(_wrapreduction_any_all)\n", - " 200/198 0.031 0.000 3.341 0.017 basic.py:2013(apply)\n", - " 588 0.031 0.000 0.588 0.001 basic.py:687(apply)\n", - " 113257 0.031 0.000 0.044 0.000 type.py:400(ndim)\n", - " 6871/829 0.031 0.000 0.076 0.000 functools.py:713(_c3_mro)\n", - " 8157 0.030 0.000 0.030 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 157184 0.030 0.000 0.030 0.000 {method 'pop' of 'list' objects}\n", - " 2808 0.030 0.000 0.082 0.000 basic.py:136(__call__)\n", - " 52632 0.029 0.000 0.047 0.000 core.py:6732(isMaskedArray)\n", - " 12547 0.029 0.000 0.029 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 6041 0.029 0.000 0.157 0.000 shape.py:366(update_shape)\n", - " 14569 0.029 0.000 0.035 0.000 {built-in method builtins.sum}\n", - " 6776 0.028 0.000 2.510 0.000 fg.py:406(change_node_input)\n", - " 83058 0.028 0.000 0.028 0.000 elemwise.py:740()\n", - " 4407 0.028 0.000 0.040 0.000 destroyhandler.py:524(on_import)\n", - " 86960 0.028 0.000 0.028 0.000 {method 'update' of 'set' objects}\n", - " 5433 0.027 0.000 0.100 0.000 basic.py:307(filter)\n", - " 14140 0.027 0.000 0.118 0.000 basic.py:1208(_cast_to_promised_scalar_dtype)\n", - " 27224 0.027 0.000 0.138 0.000 basic.py:417(make_variable)\n", - " 2647 0.026 0.000 0.136 0.000 types.py:160(validate)\n", - " 10450 0.026 0.000 0.353 0.000 basic.py:791(__init__)\n", - " 4455 0.025 0.000 0.039 0.000 core.py:3024(_update_from)\n", - " 2076 0.025 0.000 0.064 0.000 _basic.py:396(_ensure_dtype_cdsz)\n", - "17930/16880 0.025 0.000 0.546 0.000 functools.py:930(wrapper)\n", - " 6041 0.025 0.000 0.219 0.000 shape.py:591(on_change_input)\n", - "9861/8579 0.024 0.000 2.039 0.000 op.py:249(__call__)\n", - " 29592 0.024 0.000 0.111 0.000 _dtype.py:334(_name_includes_bit_suffix)\n", - "15959/1244 0.023 0.000 1.332 0.001 pfunc.py:172(clone_v_get_shared_updates)\n", - " 5433 0.023 0.000 0.058 0.000 numeric.py:2475(array_equal)\n", - "10747/10393 0.023 0.000 0.452 0.000 basic.py:208(clone)\n", - " 56022 0.023 0.000 0.023 0.000 variable.py:652(dtype)\n", - " 4040 0.023 0.000 0.023 0.000 shape.py:451()\n", - " 41392 0.023 0.000 0.023 0.000 frozendict.py:24(__contains__)\n", - " 4887 0.023 0.000 0.544 0.000 basic.py:201(constant)\n", - " 56560 0.022 0.000 0.022 0.000 multiarray.py:761(dot)\n", - " 11310 0.022 0.000 0.219 0.000 basic.py:528(clone)\n", - " 15 0.022 0.001 0.072 0.005 basic.py:1420(general_toposort)\n", - " 121037 0.021 0.000 0.021 0.000 basic.py:1557()\n", - " 98647 0.021 0.000 0.030 0.000 utils.py:230()\n", - " 22073 0.021 0.000 0.040 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 4455 0.021 0.000 0.123 0.000 core.py:2879(__new__)\n", - " 1140 0.021 0.000 0.021 0.000 {method 'search' of 're.Pattern' objects}\n", - " 25889 0.021 0.000 0.021 0.000 {method 'format' of 'str' objects}\n", - " 34090 0.021 0.000 0.118 0.000 math.py:306(is_inverse_pair)\n", - " 3379 0.021 0.000 0.237 0.000 variable.py:954(__eq__)\n", - " 28443 0.020 0.000 0.056 0.000 utils.py:298(__setattr__)\n", - " 5960 0.020 0.000 0.033 0.000 destroyhandler.py:601(on_change_input)\n", - " 4040 0.020 0.000 0.449 0.000 basic.py:4417(perform)\n", - " 77882 0.020 0.000 0.275 0.000 basic.py:897(ancestors)\n", - " 5159 0.020 0.000 0.042 0.000 type.py:153(filter)\n", - " 14140 0.020 0.000 0.396 0.000 basic.py:4163(_perform)\n", - " 89239 0.020 0.000 0.029 0.000 utils.py:223()\n", - " 5535 0.020 0.000 0.141 0.000 math.py:320(local_func_inv)\n", - " 12120 0.019 0.000 0.076 0.000 subtensor.py:2133(perform)\n", - " 98647 0.019 0.000 0.026 0.000 utils.py:232()\n", - " 285 0.019 0.000 0.021 0.000 {method 'read' of '_io.TextIOWrapper' objects}\n", - " 5694 0.019 0.000 0.040 0.000 shape.py:244(unpack)\n", - " 4897 0.018 0.000 2.535 0.001 fg.py:464(replace)\n", - " 10963 0.018 0.000 0.078 0.000 basic.py:682(__init__)\n", - " 15401 0.018 0.000 0.053 0.000 basic.py:988(as_scalar)\n", - " 2020 0.018 0.000 0.077 0.000 _basic.py:378(_matrix_norm_general)\n", - " 26242 0.018 0.000 2.421 0.000 op.py:1411(fn)\n", - " 6930 0.018 0.000 0.068 0.000 basic.py:529(local_useless_elemwise)\n", - " 16858 0.018 0.000 0.334 0.000 type.py:214(__call__)\n", - " 4042 0.018 0.000 0.153 0.000 fromnumeric.py:3328(prod)\n", - " 47218 0.017 0.000 0.017 0.000 {method 'items' of 'dict' objects}\n", - " 2020 0.017 0.000 0.031 0.000 slinalg.py:640(perform)\n", - " 2020 0.016 0.000 0.046 0.000 sort.py:172(perform)\n", - " 4040 0.016 0.000 0.030 0.000 _linalg.py:148(_commonType)\n", - " 4020 0.016 0.000 0.072 0.000 basic.py:1866(equal_computations)\n", - " 42608 0.016 0.000 0.016 0.000 {method 'update' of 'dict' objects}\n", - " 4040 0.016 0.000 0.170 0.000 basic.py:1993(impl)\n", - " 148962 0.016 0.000 0.016 0.000 {method 'pop' of 'collections.deque' objects}\n", - "14227/601 0.016 0.000 0.121 0.000 dispatcher.py:266(__call__)\n", - " 33261 0.016 0.000 0.016 0.000 type.py:386(__eq__)\n", - " 6191 0.016 0.000 0.052 0.000 math.py:1419(local_useless_elemwise_comparison)\n", - " 65535 0.016 0.000 0.226 0.000 elemwise.py:691()\n", - " 21926 0.016 0.000 0.024 0.000 fg.py:205(add_client)\n", - " 3371 0.015 0.000 0.020 0.000 destroyhandler.py:563(on_prune)\n", - " 5477 0.015 0.000 0.023 0.000 basic.py:1098(__repr__)\n", - " 4887 0.015 0.000 0.107 0.000 basic.py:232(convert)\n", - "6961/6946 0.015 0.000 1.911 0.000 fg.py:304(import_var)\n", - " 4707 0.015 0.000 0.489 0.000 elemwise.py:747(infer_shape)\n", - " 84861 0.015 0.000 0.015 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 4455 0.015 0.000 0.070 0.000 core.py:3050(__array_finalize__)\n", - " 9779 0.015 0.000 0.243 0.000 type.py:126(__call__)\n", - " 2728 0.015 0.000 2.776 0.001 features.py:728(replace_all_validate)\n", - " 2020 0.015 0.000 0.045 0.000 shape.py:442(perform)\n", - " 30494 0.014 0.000 0.014 0.000 fromnumeric.py:2118(shape)\n", - " 2654 0.014 0.000 0.022 0.000 destroyhandler.py:178(_build_droot_impact)\n", - " 7155 0.014 0.000 0.040 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 15 0.014 0.001 0.041 0.003 basic.py:1809(apply_depends_on)\n", - " 78722 0.014 0.000 0.014 0.000 basic.py:756(__eq__)\n", - " 4455 0.014 0.000 0.046 0.000 core.py:5238(sum)\n", - " 6830 0.014 0.000 0.028 0.000 type.py:335(is_super)\n", - "17865/17002 0.014 0.000 0.527 0.000 __init__.py:18(as_tensor_variable)\n", - " 29367 0.014 0.000 0.028 0.000 linecache.py:22(getline)\n", - " 78 0.014 0.000 0.028 0.000 destroyhandler.py:692(orderings)\n", - " 17930 0.014 0.000 0.029 0.000 functools.py:844(dispatch)\n", - " 59520 0.013 0.000 0.014 0.000 {built-in method builtins.next}\n", - "7764/5208 0.013 0.000 1.193 0.000 shape.py:125(get_node_infer_shape)\n", - " 9803 0.013 0.000 0.089 0.000 type.py:186(make_variable)\n", - " 3401/941 0.013 0.000 0.041 0.000 math.py:895(get_num_denum)\n", - " 508 0.013 0.000 0.017 0.000 features.py:955(validate)\n", - " 5461 0.013 0.000 0.013 0.000 basic.py:372(dtype_specs)\n", - " 2020 0.013 0.000 0.099 0.000 nlinalg.py:217(perform)\n", - " 4040 0.013 0.000 0.120 0.000 basic.py:1392(perform)\n", - " 11364 0.013 0.000 0.030 0.000 {built-in method builtins.max}\n", - " 2020 0.013 0.000 0.013 0.000 {built-in method numpy.arange}\n", - " 2020 0.013 0.000 0.238 0.000 tmp6jqq5u7h:1(fgraph_to_python)\n", - " 57571 0.012 0.000 0.012 0.000 {method 'extend' of 'collections.deque' objects}\n", - "3430/1038 0.012 0.000 0.028 0.000 basic.py:1948(compare_nodes)\n", - " 9 0.012 0.001 0.118 0.013 basic.py:1316(cmodule_key_)\n", - " 2020 0.012 0.000 0.158 0.000 nlinalg.py:117(perform)\n", - " 18740 0.012 0.000 0.012 0.000 basic.py:1651()\n", - " 17930 0.012 0.000 0.012 0.000 weakref.py:414(__getitem__)\n", - " 76839 0.011 0.000 0.011 0.000 basic.py:445(index)\n", - " 2577 0.011 0.000 0.064 0.000 elemwise.py:427(local_upcast_elemwise_constant_inputs)\n", - " 8395 0.011 0.000 0.082 0.000 fromnumeric.py:2589(all)\n", - " 43849 0.011 0.000 0.033 0.000 destroyhandler.py:450(refresh_droot_impact)\n", - " 4112 0.011 0.000 0.027 0.000 op.py:220(n_mit_mot_outs)\n", - " 3233 0.011 0.000 0.025 0.000 basic.py:257(local_elemwise_alloc)\n", - " 4438 0.011 0.000 0.029 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 17304 0.011 0.000 0.019 0.000 basic.py:1299(__hash__)\n", - " 290 0.011 0.000 0.011 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 5213 0.011 0.000 0.087 0.000 type.py:138(clone)\n", - " 5960 0.010 0.000 0.137 0.000 basic.py:556(on_change_input)\n", - " 116358 0.010 0.000 0.010 0.000 basic.py:821(owner)\n", - " 611 0.010 0.000 0.087 0.000 basic.py:142(_as_tensor_Sequence)\n", - " 6776 0.010 0.000 0.013 0.000 features.py:419(on_change_input)\n", - " 3/1 0.010 0.003 2.469 2.469 vm.py:1199(make_all)\n", - " 24820 0.010 0.000 0.767 0.000 utils.py:258(__ne__)\n", - " 1140 0.010 0.000 0.033 0.000 _local.py:289(drive)\n", - " 1140 0.010 0.000 0.020 0.000 _local.py:257(_parse_path)\n", - " 974 0.010 0.000 0.042 0.000 elemwise.py:602(prepare_node)\n", - " 12260 0.010 0.000 0.010 0.000 basic.py:4337()\n", - " 4060 0.009 0.000 0.009 0.000 vm.py:318(perform_updates)\n", - " 3378 0.009 0.000 0.105 0.000 basic.py:1249(output_types)\n", - " 34543 0.009 0.000 0.011 0.000 basic.py:620()\n", - " 285 0.009 0.000 0.009 0.000 {method 'split' of 're.Pattern' objects}\n", - " 3 0.009 0.003 0.124 0.041 elemwise.py:620(initialize_fuseable_mappings)\n", - " 4455 0.009 0.000 0.018 0.000 warnings.py:188(_add_filter)\n", - " 8910 0.009 0.000 0.079 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 4435 0.009 0.000 0.305 0.000 basic.py:566(on_import)\n", - " 855 0.009 0.000 0.041 0.000 _local.py:227(__str__)\n", - " 876 0.009 0.000 0.227 0.000 math.py:1183(transform)\n", - " 22073 0.009 0.000 0.012 0.000 copyreg.py:98(__newobj__)\n", - " 622 0.009 0.000 0.056 0.000 blockwise.py:322(infer_shape)\n", - " 43825 0.009 0.000 0.009 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1141 0.008 0.000 0.108 0.000 basic.py:1325(supports_c_code)\n", - " 2020 0.008 0.000 0.179 0.000 tmpbf7ngv9i:1(fgraph_to_python)\n", - " 18391 0.008 0.000 0.017 0.000 fg.py:191(setup_var)\n", - " 5347 0.008 0.000 0.511 0.000 extra_ops.py:1494(broadcast_shape)\n", - " 6906 0.008 0.000 0.020 0.000 basic.py:1606(compute_deps)\n", - " 285 0.008 0.000 0.439 0.002 op.py:338(load_c_code)\n", - " 4455 0.008 0.000 0.008 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 10325 0.008 0.000 0.066 0.000 basic.py:1098(unconditional_constant_folding)\n", - " 29386 0.008 0.000 0.011 0.000 linecache.py:32(getlines)\n", - " 4686 0.008 0.000 0.101 0.000 basic.py:414(upcast)\n", - " 29592 0.008 0.000 0.008 0.000 _dtype.py:24(_kind_name)\n", - " 24234 0.008 0.000 0.011 0.000 basic.py:620()\n", - " 10100 0.008 0.000 0.026 0.000 basic.py:1951(impl)\n", - " 2020 0.008 0.000 0.008 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 15144 0.008 0.000 0.008 0.000 {method 'insert' of 'list' objects}\n", - " 6116 0.008 0.000 0.008 0.000 _basic.py:37(_solve_check)\n", - " 2020 0.008 0.000 0.330 0.000 slinalg.py:996(perform)\n", - " 2020 0.008 0.000 0.023 0.000 fromnumeric.py:1130(argsort)\n", - " 2020 0.007 0.000 0.007 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 3255 0.007 0.000 0.070 0.000 basic.py:1283(transform)\n", - " 27314 0.007 0.000 0.007 0.000 {method 'reverse' of 'list' objects}\n", - " 15385 0.007 0.000 0.096 0.000 shape.py:492(init_r)\n", - " 34 0.007 0.000 0.128 0.004 blas.py:345(_gemm_from_factored_list)\n", - " 2939 0.007 0.000 0.044 0.000 shape.py:221(shape_tuple)\n", - " 2773 0.007 0.000 0.010 0.000 {built-in method _functools.reduce}\n", - " 2020 0.007 0.000 0.113 0.000 slinalg.py:693(perform)\n", - " 4896 0.007 0.000 0.228 0.000 basic.py:585(process_atomic)\n", - " 4455 0.007 0.000 0.011 0.000 core.py:1360(_replace_dtype_fields)\n", - " 17740 0.007 0.000 0.181 0.000 shape.py:353()\n", - " 22324 0.007 0.000 0.007 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 2020 0.007 0.000 0.020 0.000 _ufunc_config.py:440(__enter__)\n", - " 30494 0.007 0.000 0.007 0.000 fromnumeric.py:2114(_shape_dispatcher)\n", - " 29607 0.007 0.000 0.007 0.000 {method 'strip' of 'str' objects}\n", - " 3371 0.007 0.000 0.020 0.000 basic.py:573(on_prune)\n", - " 8972 0.007 0.000 0.011 0.000 :1390(_handle_fromlist)\n", - " 1650 0.007 0.000 0.066 0.000 dispatch.py:142(etuplize_step)\n", - " 27328 0.007 0.000 0.007 0.000 {built-in method sys._getframe}\n", - " 601 0.007 0.000 0.116 0.000 core.py:27(stream_eval)\n", - " 18390 0.007 0.000 0.007 0.000 type.py:297(dtype_specs)\n", - " 32402 0.007 0.000 0.007 0.000 basic.py:774(get_scalar_type)\n", - " 3448 0.007 0.000 0.013 0.000 basic.py:1387(in_sig)\n", - " 6906 0.007 0.000 0.028 0.000 basic.py:1462(_compute_deps_cache_)\n", - " 1608 0.007 0.000 0.143 0.000 basic.py:957(local_useless_switch)\n", - " 2076 0.007 0.000 0.010 0.000 shape_base.py:80(atleast_2d)\n", - " 10401 0.007 0.000 0.079 0.000 basic.py:1155(constant_folding)\n", - " 829 0.006 0.000 0.100 0.000 functools.py:758(_compose_mro)\n", - " 3300 0.006 0.000 0.008 0.000 core.py:143(__init__)\n", - " 2659/124 0.006 0.000 0.427 0.003 builders.py:57(local_traverse)\n", - " 1655 0.006 0.000 0.020 0.000 subtensor.py:105(indices_from_subtensor)\n", - " 671 0.006 0.000 0.025 0.000 math.py:2495(add_calculate)\n", - " 9643 0.006 0.000 0.014 0.000 utils.py:285(__setattr__)\n", - " 18308 0.006 0.000 0.011 0.000 elemwise.py:393()\n", - " 4455 0.006 0.000 0.007 0.000 warnings.py:488(__enter__)\n", - " 1168 0.006 0.000 0.026 0.000 params_type.py:358(__init__)\n", - " 4040 0.006 0.000 0.006 0.000 _linalg.py:198(_assert_stacked_square)\n", - " 5433 0.006 0.000 0.214 0.000 basic.py:974(__init__)\n", - " 2020 0.006 0.000 0.006 0.000 {built-in method numpy._core._multiarray_umath._make_extobj}\n", - " 21694 0.006 0.000 0.012 0.000 type.py:121()\n", - " 31273 0.006 0.000 0.007 0.000 basic.py:1834()\n", - " 548/526 0.006 0.000 0.064 0.000 elemwise.py:348(local_dimshuffle_lift)\n", - " 5983 0.006 0.000 0.007 0.000 frozendict.py:30(__iter__)\n", - " 5960 0.006 0.000 0.027 0.000 features.py:929(on_change_input)\n", - " 13771 0.006 0.000 0.008 0.000 basic.py:110(_as_tensor_Variable)\n", - " 4456 0.006 0.000 0.049 0.000 fromnumeric.py:2477(any)\n", - " 4455 0.006 0.000 0.024 0.000 warnings.py:170(simplefilter)\n", - " 10302 0.006 0.000 0.017 0.000 basic.py:70(make_array)\n", - " 6915 0.005 0.000 0.017 0.000 functools.py:767(is_related)\n", - " 2728 0.005 0.000 0.365 0.000 features.py:635(validate_)\n", - " 9690 0.005 0.000 0.005 0.000 {built-in method sys.intern}\n", - " 8080 0.005 0.000 0.008 0.000 _linalg.py:128(isComplexType)\n", - " 6228 0.005 0.000 0.010 0.000 _basic.py:408()\n", - "9812/8162 0.005 0.000 0.103 0.000 {method 'send' of 'generator' objects}\n", - " 18688 0.005 0.000 0.005 0.000 basic.py:1293(__eq__)\n", - " 4665 0.005 0.000 0.107 0.000 basic.py:1019(upcast_out)\n", - " 2020 0.005 0.000 0.015 0.000 fromnumeric.py:51(_wrapfunc)\n", - " 8080 0.005 0.000 0.005 0.000 {built-in method _operator.index}\n", - " 22324 0.005 0.000 0.012 0.000 :121(__subclasscheck__)\n", - " 611 0.005 0.000 0.046 0.000 basic.py:1886(make_node)\n", - " 5999 0.005 0.000 0.016 0.000 type.py:277(filter_variable)\n", - " 28502 0.005 0.000 0.005 0.000 basic.py:437(owner)\n", - " 2891 0.005 0.000 0.130 0.000 basic.py:529(get_underlying_scalar_constant_value)\n", - " 474 0.005 0.000 0.022 0.000 raise_op.py:71(make_node)\n", - " 1986 0.005 0.000 0.010 0.000 math.py:627(local_expm1)\n", - " 26840 0.005 0.000 0.005 0.000 {built-in method __new__ of type object at 0x00007FFCA4F8EE30}\n", - " 14698 0.005 0.000 0.005 0.000 basic.py:861()\n", - " 4152 0.005 0.000 0.008 0.000 getlimits.py:493(__new__)\n", - " 8238 0.005 0.000 0.006 0.000 op.py:222()\n", - " 2020 0.005 0.000 0.005 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 285 0.005 0.000 0.505 0.002 variable.py:320(dimshuffle)\n", - " 10758 0.005 0.000 0.005 0.000 typing.py:426(inner)\n", - " 285 0.005 0.000 0.452 0.002 elemwise.py:128(__init__)\n", - " 4455 0.005 0.000 0.006 0.000 warnings.py:509(__exit__)\n", - " 770 0.005 0.000 0.082 0.000 math.py:1096(simplify_constants)\n", - " 8927 0.005 0.000 0.005 0.000 core.py:3493(dtype)\n", - " 411 0.005 0.000 0.094 0.000 math.py:2252(local_add_remove_zeros)\n", - " 3495 0.005 0.000 0.032 0.000 shape.py:426()\n", - " 151 0.005 0.000 0.636 0.004 subtensor.py:270(get_canonical_form_slice)\n", - " 829 0.005 0.000 0.106 0.000 basic.py:1178(_find_impl)\n", - " 5769 0.005 0.000 0.006 0.000 type.py:624(c_code_cache_version)\n", - "5519/5393 0.005 0.000 0.014 0.000 {method 'join' of 'str' objects}\n", - " 14152 0.005 0.000 0.006 0.000 basic.py:1840()\n", - " 5980 0.005 0.000 0.006 0.000 :827(items)\n", - "4104/1626 0.005 0.000 0.012 0.000 subtensor.py:129(convert_indices)\n", - " 49 0.004 0.000 0.108 0.002 utils.py:1095(forced_replace)\n", - " 2577 0.004 0.000 0.016 0.000 basic.py:1038(local_merge_switch_same_cond)\n", - " 2958 0.004 0.000 0.216 0.000 utils.py:354(get)\n", - " 15247 0.004 0.000 0.004 0.000 ordered_set.py:17(__iter__)\n", - " 602 0.004 0.000 0.023 0.000 elemwise.py:1100(c_code_cache_version_apply)\n", - " 1012 0.004 0.000 0.210 0.000 variable.py:1107(equals)\n", - " 16313 0.004 0.000 0.006 0.000 extra_ops.py:1543()\n", - " 482 0.004 0.000 0.007 0.000 ipkernel.py:775(_clean_thread_parent_frames)\n", - " 979 0.004 0.000 0.379 0.000 basic.py:2345(apply_cleanup)\n", - " 3304 0.004 0.000 0.006 0.000 type.py:110(parse_bcast_and_shape)\n", - " 4040 0.004 0.000 0.004 0.000 _linalg.py:192(_assert_stacked_2d)\n", - " 4040 0.004 0.000 0.012 0.000 basic.py:4143(py_perform_fn)\n", - "2340/2100 0.004 0.000 0.022 0.000 subtensor.py:1754(_convert)\n", - " 12932 0.004 0.000 0.009 0.000 extra_ops.py:1547()\n", - " 476 0.004 0.000 0.036 0.000 elemwise.py:1324(make_node)\n", - " 8221 0.004 0.000 0.004 0.000 frozendict.py:21(__getitem__)\n", - " 4040 0.004 0.000 0.006 0.000 utils.py:230(to_return_values)\n", - " 18452 0.004 0.000 0.004 0.000 {method 'pop' of 'dict' objects}\n", - " 4455 0.004 0.000 0.004 0.000 core.py:1328(_replace_dtype_fields_recursive)\n", - " 17930 0.004 0.000 0.004 0.000 {built-in method _abc.get_cache_token}\n", - " 4040 0.004 0.000 0.007 0.000 _linalg.py:142(_realType)\n", - " 11226 0.004 0.000 0.014 0.000 basic.py:1100()\n", - " 343 0.004 0.000 0.049 0.000 elemwise.py:186(make_node)\n", - " 3300 0.004 0.000 0.005 0.000 core.py:129(__new__)\n", - " 4455 0.004 0.000 0.020 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 2646 0.004 0.000 0.158 0.000 destroyhandler.py:647(validate)\n", - " 6101 0.004 0.000 0.011 0.000 :897(__iter__)\n", - " 4455 0.004 0.000 0.004 0.000 core.py:1408(getmask)\n", - " 5473 0.004 0.000 0.031 0.000 basic.py:1095(__str__)\n", - " 1475 0.004 0.000 0.015 0.000 basic.py:328(local_fill_sink)\n", - " 695 0.004 0.000 0.064 0.000 type.py:785(tensor)\n", - " 5474 0.004 0.000 0.026 0.000 {built-in method builtins.repr}\n", - " 2585 0.004 0.000 0.179 0.000 variable.py:991(__hash__)\n", - " 1425 0.004 0.000 0.006 0.000 _local.py:117(__init__)\n", - " 2020 0.004 0.000 0.006 0.000 _linalg.py:123(_makearray)\n", - " 4059 0.004 0.000 0.004 0.000 {method 'index' of 'tuple' objects}\n", - " 2020 0.004 0.000 0.008 0.000 _ufunc_config.py:456(__exit__)\n", - " 10620 0.004 0.000 0.004 0.000 {method 'remove' of 'set' objects}\n", - " 4541 0.003 0.000 0.003 0.000 {built-in method numpy.array}\n", - " 5795 0.003 0.000 0.014 0.000 elemwise.py:439()\n", - " 1175 0.003 0.000 0.006 0.000 op.py:501(make_py_thunk)\n", - " 770 0.003 0.000 0.088 0.000 math.py:1045(simplify)\n", - " 3344 0.003 0.000 0.354 0.000 basic.py:179(_as_tensor_numbers)\n", - " 3300 0.003 0.000 0.013 0.000 core.py:142(__subclasscheck__)\n", - " 11348 0.003 0.000 0.003 0.000 fg.py:286()\n", - " 1140 0.003 0.000 0.005 0.000 _local.py:237(_format_parsed_parts)\n", - " 2475 0.003 0.000 0.014 0.000 core.py:342(etuple)\n", - " 14035 0.003 0.000 0.003 0.000 basic.py:638()\n", - " 285 0.003 0.000 0.109 0.000 :702(realpath)\n", - " 1037 0.003 0.000 2.260 0.002 features.py:792(replace_all_validate_remove)\n", - " 490/28 0.003 0.000 0.008 0.000 basic.py:1767(describe)\n", - " 1141 0.003 0.000 0.014 0.000 op.py:57(compute_test_value)\n", - " 285 0.003 0.000 0.156 0.001 op.py:287(get_path)\n", - " 6671 0.003 0.000 0.011 0.000 elemwise.py:1018(local_useless_composite_outputs)\n", - " 2728 0.003 0.000 0.003 0.000 features.py:356(__call__)\n", - " 4455 0.003 0.000 0.014 0.000 core.py:1374(make_mask_descr)\n", - " 1168 0.003 0.000 0.011 0.000 params_type.py:456(generate_struct_name)\n", - " 34305 0.003 0.000 0.003 0.000 typing.py:2371(cast)\n", - " 4040 0.003 0.000 0.003 0.000 basic.py:2943(impl)\n", - " 2020 0.003 0.000 0.003 0.000 basic.py:2051(impl)\n", - " 1274 0.003 0.000 0.020 0.000 math.py:1212(same)\n", - " 9661 0.003 0.000 0.003 0.000 {method 'discard' of 'set' objects}\n", - " 4455 0.003 0.000 0.008 0.000 core.py:3866(filled)\n", - " 2558 0.003 0.000 0.005 0.000 basic.py:1053()\n", - " 2255 0.003 0.000 0.015 0.000 math.py:1213()\n", - " 414 0.003 0.000 0.003 0.000 {built-in method numpy.empty}\n", - " 1425 0.003 0.000 0.009 0.000 _local.py:498(__init__)\n", - " 825 0.003 0.000 0.011 0.000 basic.py:2905(copy_stack_trace)\n", - " 2854 0.003 0.000 0.005 0.000 rewriting.py:105(local_lift_DiracDelta)\n", - " 5630 0.003 0.000 0.008 0.000 basic.py:655(local_cast_cast)\n", - " 2076 0.003 0.000 0.004 0.000 shape_base.py:21(atleast_1d)\n", - " 66 0.003 0.000 0.114 0.002 basic.py:1321(clone_get_equiv)\n", - " 1420 0.003 0.000 0.043 0.000 basic.py:947()\n", - " 40 0.003 0.000 0.004 0.000 types.py:1125(free)\n", - " 10866 0.003 0.000 0.003 0.000 numeric.py:2471(_dtype_cannot_hold_nan)\n", - " 42 0.003 0.000 0.003 0.000 {built-in method nt.stat}\n", - " 10747 0.003 0.000 0.003 0.000 basic.py:1286()\n", - " 17152 0.003 0.000 0.003 0.000 frozendict.py:39(__hash__)\n", - " 3880 0.003 0.000 0.013 0.000 type.py:315(in_same_class)\n", - " 825 0.003 0.000 0.072 0.000 core.py:22(trampoline_eval)\n", - " 4476 0.003 0.000 0.003 0.000 variable.py:1080(signature)\n", - " 4455 0.003 0.000 0.005 0.000 core.py:3771(_get_data)\n", - " 3034 0.003 0.000 0.003 0.000 {built-in method _hashlib.openssl_sha256}\n", - " 951 0.003 0.000 0.011 0.000 basic.py:1081()\n", - " 601 0.003 0.000 0.129 0.000 basic.py:1615(transform)\n", - " 7349 0.003 0.000 0.006 0.000 variable.py:635(ndim)\n", - " 2020 0.003 0.000 0.003 0.000 {method '__array_wrap__' of 'numpy.ndarray' objects}\n", - " 5410 0.003 0.000 0.007 0.000 basic.py:274(dimshuffled_alloc)\n", - " 425/240 0.003 0.000 0.008 0.000 subtensor.py:708(index_vars_to_types)\n", - " 2218 0.003 0.000 0.004 0.000 op.py:617()\n", - " 1855 0.003 0.000 0.159 0.000 fg.py:539(replace_all)\n", - " 216 0.002 0.000 0.071 0.000 basic.py:801(cast)\n", - " 18 0.002 0.000 0.298 0.017 rewriting.py:90(remove_constants_and_unused_inputs_scan)\n", - " 449/323 0.002 0.000 0.059 0.000 blas.py:217(_gemm_canonicalize)\n", - " 1238 0.002 0.000 0.003 0.000 utils.py:5(transitive_get)\n", - " 825 0.002 0.000 0.016 0.000 unify.py:84(cdr_Variable)\n", - " 13365 0.002 0.000 0.002 0.000 {built-in method _warnings._filters_mutated}\n", - " 9533 0.002 0.000 0.002 0.000 type.py:343()\n", - " 4455 0.002 0.000 0.019 0.000 _methods.py:58(_any)\n", - " 3666 0.002 0.000 0.002 0.000 {method 'difference_update' of 'set' objects}\n", - " 855 0.002 0.000 0.009 0.000 _abc.py:130(with_segments)\n", - " 4455 0.002 0.000 0.002 0.000 warnings.py:462(__init__)\n", - " 2870 0.002 0.000 0.009 0.000 core.py:180(_unify_Iterable)\n", - " 70 0.002 0.000 1.341 0.019 pfunc.py:107(rebuild_collect_shared)\n", - " 9 0.002 0.000 6.414 0.713 base_events.py:1954(_run_once)\n", - " 2452 0.002 0.000 0.006 0.000 configparser.py:425(__set__)\n", - " 6172 0.002 0.000 0.002 0.000 _misc.py:181(_datacopied)\n", - " 1200 0.002 0.000 0.003 0.000 configparser.py:306(change_flags)\n", - " 537 0.002 0.000 0.004 0.000 elemwise.py:322(is_dimshuffle_useless)\n", - " 4455 0.002 0.000 0.016 0.000 _methods.py:50(_sum)\n", - " 285 0.002 0.000 0.445 0.002 op.py:300(__init__)\n", - " 137 0.002 0.000 0.021 0.000 subtensor.py:859(make_node)\n", - " 1999 0.002 0.000 0.002 0.000 {built-in method nt._path_splitroot_ex}\n", - " 4656 0.002 0.000 0.040 0.000 shape.py:447()\n", - " 5230 0.002 0.000 0.015 0.000 basic.py:1462()\n", - " 1661 0.002 0.000 0.002 0.000 basic.py:743()\n", - " 611 0.002 0.000 0.005 0.000 basic.py:1883(__init__)\n", - " 1200 0.002 0.000 0.006 0.000 configparser.py:48(__enter__)\n", - " 151 0.002 0.000 0.002 0.000 {method 'sub' of 're.Pattern' objects}\n", - " 2404 0.002 0.000 0.078 0.000 unify.py:202(_unify_Variable_ExpressionTuple)\n", - " 5230 0.002 0.000 0.006 0.000 basic.py:1447()\n", - " 285 0.002 0.000 0.004 0.000 _local.py:148(__truediv__)\n", - " 17682 0.002 0.000 0.002 0.000 features.py:309(on_prune)\n", - " 8/0 0.002 0.000 0.000 {built-in method select.select}\n", - " 1140 0.002 0.000 0.004 0.000 _local.py:277(_raw_path)\n", - " 3636 0.002 0.000 0.003 0.000 elemwise.py:831()\n", - " 2124 0.002 0.000 0.003 0.000 basic.py:1022(expand)\n", - " 82 0.002 0.000 0.047 0.001 blockwise.py:232(_create_dummy_core_node)\n", - " 232 0.002 0.000 0.382 0.002 subtensor.py:950(infer_shape)\n", - " 452 0.002 0.000 0.009 0.000 subtensor.py:275(local_useless_slice)\n", - " 96 0.002 0.000 0.010 0.000 basic.py:4426(c_code_template)\n", - " 3 0.002 0.001 0.002 0.001 {built-in method _io.open_code}\n", - " 1141 0.002 0.000 0.009 0.000 basic.py:477(get_test_value)\n", - " 1390 0.002 0.000 0.037 0.000 basic.py:1024(upcast_out_nobool)\n", - " 18 0.002 0.000 0.010 0.001 socket.py:623(send)\n", - " 1942 0.002 0.000 0.004 0.000 basic.py:1577(compute_deps_cache)\n", - " 800/624 0.002 0.000 0.005 0.000 subtensor.py:194(as_index_literal)\n", - " 1593 0.002 0.000 0.021 0.000 subtensor.py:252(get_idx_list)\n", - " 284 0.002 0.000 0.010 0.000 subtensor.py:940(perform)\n", - " 1425 0.002 0.000 0.003 0.000 _local.py:505(__new__)\n", - " 7701 0.002 0.000 0.002 0.000 fg.py:272()\n", - " 5776 0.002 0.000 0.003 0.000 frozendict.py:33(__len__)\n", - " 764 0.002 0.000 0.003 0.000 blockwise.py:319(batch_ndim)\n", - " 1862 0.002 0.000 0.004 0.000 elemwise.py:465(__str__)\n", - " 6 0.002 0.000 0.199 0.033 elemwise.py:69(apply)\n", - " 1289 0.002 0.000 0.002 0.000 type.py:405(__str__)\n", - " 8395 0.002 0.000 0.002 0.000 fromnumeric.py:2584(_all_dispatcher)\n", - " 3327 0.002 0.000 0.002 0.000 {method 'replace' of 'str' objects}\n", - " 1141 0.002 0.000 0.004 0.000 utils.py:133(get_variable_trace_string)\n", - " 6756 0.002 0.000 0.006 0.000 basic.py:1252()\n", - " 1195 0.002 0.000 0.002 0.000 {method 'split' of 'str' objects}\n", - " 9 0.002 0.000 0.221 0.025 builders.py:86(construct_nominal_fgraph)\n", - " 72 0.002 0.000 0.055 0.001 blockwise.py:278(make_node)\n", - " 3053 0.002 0.000 0.002 0.000 basic.py:634(local_alloc_unary)\n", - " 5776 0.002 0.000 0.002 0.000 basic.py:317(nout)\n", - " 285 0.002 0.000 0.239 0.001 _abc.py:628(read_text)\n", - " 3034 0.002 0.000 0.002 0.000 {method 'hexdigest' of '_hashlib.HASH' objects}\n", - " 2306 0.002 0.000 0.004 0.000 basic.py:1714(on_import)\n", - " 11026 0.002 0.000 0.002 0.000 basic.py:711(index)\n", - " 285 0.002 0.000 0.241 0.001 _local.py:539(read_text)\n", - " 6741 0.002 0.000 0.002 0.000 features.py:363(__init__)\n", - " 4024 0.002 0.000 0.014 0.000 op.py:319(__ne__)\n", - " 1202 0.002 0.000 0.010 0.000 core.py:158(_unify_Var_object)\n", - " 1106 0.002 0.000 0.019 0.000 basic.py:587(get_scalar_constant_value)\n", - " 629 0.002 0.000 0.002 0.000 linalg.py:67(is_matrix_transpose)\n", - " 110/104 0.002 0.000 0.042 0.000 variable.py:457(__getitem__)\n", - " 5042 0.002 0.000 0.002 0.000 variable.py:1064()\n", - " 3252 0.002 0.000 0.013 0.000 subtensor.py:146()\n", - " 4563 0.002 0.000 0.007 0.000 basic.py:1172(local_view_op)\n", - " 1079 0.002 0.000 0.240 0.000 variable.py:125(__sub__)\n", - " 2452 0.002 0.000 0.002 0.000 configparser.py:380(apply)\n", - " 820 0.002 0.000 0.007 0.000 op.py:615(__repr__)\n", - " 2385 0.002 0.000 0.002 0.000 {method 'match' of 're.Pattern' objects}\n", - " 7726 0.002 0.000 0.002 0.000 features.py:820(on_import)\n", - " 2312 0.002 0.000 0.019 0.000 {built-in method nt.fspath}\n", - " 2737 0.002 0.000 0.002 0.000 __init__.py:330(_compile)\n", - " 588 0.002 0.000 0.005 0.000 math.py:1258(__str__)\n", - " 5353 0.002 0.000 0.006 0.000 basic.py:769()\n", - " 75/69 0.002 0.000 0.354 0.005 fg.py:80(__init__)\n", - " 1145 0.002 0.000 0.051 0.000 op.py:108(make_thunk)\n", - " 1042 0.002 0.000 0.006 0.000 subtensor.py:1004(__hash__)\n", - " 570 0.002 0.000 0.020 0.000 :80(isabs)\n", - " 4647 0.002 0.000 0.002 0.000 multiarray.py:383(where)\n", - " 3308 0.002 0.000 0.004 0.000 basic.py:1424(__hash__)\n", - " 3813 0.002 0.000 0.005 0.000 basic.py:733(local_remove_useless_assert)\n", - " 1293 0.002 0.000 0.003 0.000 basic.py:491(__str__)\n", - " 11463 0.001 0.000 0.001 0.000 basic.py:698(owner)\n", - " 4 0.001 0.000 0.012 0.003 fg.py:812(check_integrity)\n", - " 2020 0.001 0.000 0.001 0.000 _ufunc_config.py:430(__init__)\n", - " 825 0.001 0.000 0.004 0.000 core.py:254(__getitem__)\n", - " 948 0.001 0.000 0.002 0.000 math.py:3424(__init__)\n", - " 474 0.001 0.000 0.101 0.000 math.py:3833(all)\n", - " 241 0.001 0.000 0.002 0.000 threading.py:1477(enumerate)\n", - " 2546 0.001 0.000 0.002 0.000 variable.py:1083(unique_value)\n", - " 770 0.001 0.000 0.002 0.000 math.py:1064(simplify_factors)\n", - " 829 0.001 0.000 0.114 0.000 basic.py:1191(get_trackers)\n", - " 5113 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 3422 0.001 0.000 0.002 0.000 ordered_set.py:20(__len__)\n", - " 4042 0.001 0.000 0.001 0.000 fromnumeric.py:3323(_prod_dispatcher)\n", - " 1014 0.001 0.000 0.005 0.000 basic.py:1165(add_tracker)\n", - " 3 0.001 0.000 0.299 0.100 blas.py:447(apply)\n", - " 1175 0.001 0.000 0.050 0.000 op.py:555(make_thunk)\n", - " 2990 0.001 0.000 0.001 0.000 {method 'startswith' of 'str' objects}\n", - " 2385 0.001 0.000 0.005 0.000 __init__.py:164(match)\n", - " 4376 0.001 0.000 0.001 0.000 {built-in method numpy.asanyarray}\n", - " 1200 0.001 0.000 0.005 0.000 configparser.py:60(__exit__)\n", - " 3521 0.001 0.000 0.002 0.000 ordered_set.py:23(add)\n", - " 4040 0.001 0.000 0.001 0.000 _linalg.py:492(_unary_dispatcher)\n", - " 112 0.001 0.000 0.002 0.000 numeric.py:137(ones)\n", - " 4950 0.001 0.000 0.002 0.000 {built-in method _operator.length_hint}\n", - " 4066 0.001 0.000 0.004 0.000 basic.py:1452()\n", - " 412 0.001 0.000 0.004 0.000 math.py:1927(local_add_neg_to_sub)\n", - " 6 0.001 0.000 0.858 0.143 rewriting.py:420(scan_push_out_seq)\n", - " 63/0 0.001 0.000 0.000 gradient.py:1165(access_term_cache)\n", - " 5721 0.001 0.000 0.014 0.000 elemwise.py:751()\n", - " 825 0.001 0.000 0.074 0.000 dispatch.py:109(etuplize)\n", - " 6181 0.001 0.000 0.001 0.000 {built-in method builtins.iter}\n", - " 447 0.001 0.000 0.003 0.000 math.py:3112(infer_shape)\n", - " 323 0.001 0.000 0.003 0.000 inspect.py:919(getfile)\n", - " 304 0.001 0.000 0.001 0.000 {built-in method _winapi.LCMapStringEx}\n", - " 1168 0.001 0.000 0.027 0.000 elemwise.py:121(params_type)\n", - " 4455 0.001 0.000 0.001 0.000 core.py:1870(_check_mask_axis)\n", - " 3504 0.001 0.000 0.003 0.000 params_type.py:462()\n", - " 19 0.001 0.000 0.391 0.021 subtensor.py:769(merge_two_slices)\n", - " 18 0.001 0.000 0.010 0.001 db.py:348(query)\n", - " 3 0.001 0.000 0.002 0.001 utils.py:230(gc_helper)\n", - " 2555 0.001 0.000 0.003 0.000 basic.py:688(merge_signature)\n", - " 1537 0.001 0.000 0.002 0.000 basic.py:938(equivalent_up_to_constant_casting)\n", - " 8055 0.001 0.000 0.001 0.000 basic.py:764(c_code_cache_version)\n", - " 5447 0.001 0.000 0.001 0.000 type.py:265()\n", - " 2495 0.001 0.000 0.002 0.000 basic.py:1302(__str__)\n", - " 1650 0.001 0.000 0.011 0.000 core.py:24(__instancecheck__)\n", - " 4600 0.001 0.000 0.002 0.000 ordered_set.py:14(__contains__)\n", - " 2125 0.001 0.000 0.002 0.000 basic.py:2402(importer)\n", - " 3102 0.001 0.000 0.001 0.000 features.py:959()\n", - " 54 0.001 0.000 0.005 0.000 math.py:2177(local_mul_specialize)\n", - " 6 0.001 0.000 0.107 0.018 rewriting.py:212(scan_push_out_non_seq)\n", - " 9 0.001 0.000 0.015 0.002 basic.py:1709(as_string)\n", - " 688 0.001 0.000 0.004 0.000 subtensor.py:918(movable)\n", - " 17/3 0.001 0.000 2.584 0.861 basic.py:260(apply)\n", - " 56 0.001 0.000 0.001 0.000 _basic.py:53(_find_matrix_structure)\n", - " 474 0.001 0.000 0.097 0.000 math.py:3430(make_node)\n", - " 855 0.001 0.000 0.042 0.000 _local.py:166(__fspath__)\n", - " 702 0.001 0.000 0.002 0.000 :730(remove)\n", - " 1650 0.001 0.000 0.010 0.000 core.py:19(__instancecheck__)\n", - " 264 0.001 0.000 0.398 0.002 subtensor.py:360(local_subtensor_merge)\n", - " 326 0.001 0.000 0.006 0.000 subtensor.py:884(local_IncSubtensor_serialize)\n", - " 11 0.001 0.000 0.011 0.001 op.py:895(make_node)\n", - " 584 0.001 0.000 0.034 0.000 op.py:437(c_code_cache_version)\n", - " 285 0.001 0.000 0.002 0.000 :322(decode)\n", - " 673 0.001 0.000 0.002 0.000 variable.py:10(__instancecheck__)\n", - " 5983 0.001 0.000 0.001 0.000 :850(__init__)\n", - " 70 0.001 0.000 0.013 0.000 math.py:3009(make_node)\n", - " 708 0.001 0.000 0.003 0.000 fg.py:177(add_input)\n", - " 253 0.001 0.000 0.032 0.000 shape.py:208(shape_ir)\n", - " 1687 0.001 0.000 0.001 0.000 threading.py:1110(ident)\n", - " 5097 0.001 0.000 0.001 0.000 basic.py:724()\n", - " 625 0.001 0.000 0.003 0.000 basic.py:150(extract_constants)\n", - " 36 0.001 0.000 0.011 0.000 math.py:1949(local_mul_zero)\n", - " 989 0.001 0.000 0.001 0.000 elemwise.py:248(infer_shape)\n", - " 2 0.001 0.001 0.376 0.188 rewriting.py:1236(scan_save_mem_rewrite)\n", - " 224 0.001 0.000 0.003 0.000 type.py:360(values_eq)\n", - " 8493 0.001 0.000 0.001 0.000 features.py:288(on_import)\n", - " 56 0.001 0.000 0.033 0.001 slinalg.py:284(make_node)\n", - " 1022 0.001 0.000 0.003 0.000 math.py:1910(local_sub_neg_to_add)\n", - " 2929 0.001 0.000 0.001 0.000 {method 'values' of 'dict' objects}\n", - " 287 0.001 0.000 0.002 0.000 :99(join)\n", - " 5469 0.001 0.000 0.001 0.000 elemwise.py:846()\n", - " 2259 0.001 0.000 0.001 0.000 elemwise.py:1116()\n", - " 513 0.001 0.000 0.002 0.000 basic.py:728(__new__)\n", - " 285 0.001 0.000 0.001 0.000 {built-in method nt.getcwd}\n", - " 2 0.001 0.000 0.001 0.000 {built-in method nt.open}\n", - " 1573 0.001 0.000 0.033 0.000 basic.py:1733(output_types)\n", - " 3275 0.001 0.000 0.001 0.000 basic.py:2198(on_import)\n", - " 1956 0.001 0.000 0.001 0.000 ordered_set.py:8(__init__)\n", - " 3191 0.001 0.000 0.033 0.000 shape.py:226()\n", - " 3 0.001 0.000 0.007 0.002 types.py:1223(insert_deepcopy)\n", - " 476 0.001 0.000 0.001 0.000 elemwise.py:1288(_acc_dtype)\n", - " 6673 0.001 0.000 0.001 0.000 features.py:299(on_change_input)\n", - " 5433 0.001 0.000 0.001 0.000 numeric.py:2456(_array_equal_dispatcher)\n", - " 40 0.001 0.000 8.812 0.220 op.py:1646(rval)\n", - " 182 0.001 0.000 0.009 0.000 math.py:134(local_0_dot_x)\n", - " 285 0.001 0.000 0.011 0.000 _local.py:329(parent)\n", - " 625 0.001 0.000 0.004 0.000 basic.py:160()\n", - " 285 0.001 0.000 0.114 0.000 _local.py:664(resolve)\n", - " 1992 0.001 0.000 0.002 0.000 basic.py:1428(output_types)\n", - " 311/309 0.001 0.000 0.343 0.001 fg.py:669(attach_feature)\n", - " 513 0.001 0.000 0.006 0.000 basic.py:748(__init__)\n", - " 474 0.001 0.000 0.002 0.000 math.py:3441(clone)\n", - " 2156 0.001 0.000 0.010 0.000 basic.py:999(vars_between)\n", - " 3053 0.001 0.000 0.003 0.000 elemwise.py:1318(local_useless_2f1grad_loop)\n", - " 10201 0.001 0.000 0.001 0.000 op.py:460(do_constant_folding)\n", - " 1750 0.001 0.000 0.035 0.000 interface.py:226(c_code_cache_version_apply)\n", - " 390 0.001 0.000 0.003 0.000 subtensor.py:1697(__hash__)\n", - " 3020 0.001 0.000 0.001 0.000 {method 'encode' of 'str' objects}\n", - " 18 0.001 0.000 0.452 0.025 op.py:2175(infer_shape)\n", - " 2475 0.001 0.000 0.001 0.000 core.py:270(__len__)\n", - " 101 0.001 0.000 0.002 0.000 math.py:1266(mul_calculate)\n", - " 245 0.001 0.000 0.005 0.000 subtensor.py:442(local_subtensor_remove_broadcastable_index)\n", - " 197 0.001 0.000 0.016 0.000 shape.py:250(make_node)\n", - " 5042 0.001 0.000 0.001 0.000 variable.py:1076()\n", - " 36/3 0.001 0.000 0.013 0.004 db.py:119(__query__)\n", - " 4456 0.001 0.000 0.001 0.000 fromnumeric.py:2472(_any_dispatcher)\n", - " 1141 0.001 0.000 0.109 0.000 elemwise.py:623(elemwise_scalar_op_has_c_code)\n", - " 1650 0.001 0.000 0.002 0.000 dispatch.py:20(_unify_ExpressionTuple)\n", - " 285 0.001 0.000 0.001 0.000 :312(__init__)\n", - " 3192 0.001 0.000 0.001 0.000 basic.py:2295(get_node_rewriters)\n", - " 68 0.001 0.000 0.001 0.000 utils.py:274(check)\n", - " 1650 0.001 0.000 0.001 0.000 unify.py:74(car_Variable)\n", - " 601 0.001 0.000 0.118 0.000 core.py:238(unify)\n", - " 416/268 0.001 0.000 0.050 0.000 math.py:999(merge_num_denum)\n", - " 698 0.001 0.000 0.004 0.000 utils.py:188(hash_from_code)\n", - " 2452 0.001 0.000 0.001 0.000 configparser.py:389(validate)\n", - " 170 0.001 0.000 0.003 0.000 shape.py:467(set_shape_i)\n", - " 952 0.001 0.000 0.001 0.000 elemwise.py:1175(__init__)\n", - " 139 0.001 0.000 0.013 0.000 basic.py:618(make_node)\n", - " 4582 0.001 0.000 0.001 0.000 basic.py:2202(on_change_input)\n", - " 3 0.001 0.000 0.001 0.000 utils.py:40(map_storage)\n", - " 185 0.001 0.000 0.271 0.001 fg.py:169(add_output)\n", - " 138 0.001 0.000 0.003 0.000 math.py:685(local_mul_switch_sink)\n", - " 2433 0.001 0.000 0.117 0.000 elemwise.py:851()\n", - " 41 0.001 0.000 0.002 0.000 basic.py:2298(add_requirements)\n", - " 243 0.001 0.000 0.010 0.000 subtensor.py:641(local_useless_subtensor)\n", - " 636/243 0.001 0.000 0.005 0.000 subtensor.py:815(conv)\n", - " 5744 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 10/1 0.001 0.000 0.000 0.000 events.py:87(_run)\n", - " 41/39 0.001 0.000 0.303 0.008 shape.py:500(on_attach)\n", - " 4058 0.001 0.000 0.001 0.000 basic.py:1722(on_change_input)\n", - " 2587 0.001 0.000 0.001 0.000 dispatch.py:176()\n", - " 825 0.001 0.000 0.003 0.000 core.py:201(car)\n", - " 13 0.001 0.000 0.041 0.003 replace.py:238(vectorize_graph)\n", - " 285 0.001 0.000 0.001 0.000 {built-in method _codecs.utf_8_decode}\n", - " 1862 0.001 0.000 0.001 0.000 {method 'capitalize' of 'str' objects}\n", - " 212 0.001 0.000 0.005 0.000 basic.py:673(make_node)\n", - " 3 0.001 0.000 0.003 0.001 types.py:364(__init__)\n", - " 285 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 262 0.001 0.000 0.004 0.000 basic.py:752(clone)\n", - " 18 0.001 0.000 0.448 0.025 builders.py:29(infer_shape)\n", - " 56 0.001 0.000 0.004 0.000 _basic.py:348(_matrix_norm_diagonal)\n", - " 20 0.001 0.000 0.391 0.020 basic.py:1513(infer_static_shape)\n", - " 300 0.001 0.000 0.001 0.000 basic.py:1829(attach_updater)\n", - " 28 0.001 0.000 0.005 0.000 blas.py:844(make_node)\n", - " 550 0.001 0.000 0.001 0.000 basic.py:852(merge_profile)\n", - " 49 0.001 0.000 0.009 0.000 math.py:2617(local_greedy_distributor)\n", - " 601 0.001 0.000 0.001 0.000 core.py:16(assoc)\n", - " 323 0.001 0.000 0.188 0.001 blas.py:402(_gemm_from_node2)\n", - " 30 0.001 0.000 1.176 0.039 replace.py:56(clone_replace)\n", - " 1030 0.001 0.000 0.002 0.000 rewriting.py:265()\n", - " 1200 0.001 0.000 0.001 0.000 configparser.py:35(__init__)\n", - " 98 0.001 0.000 0.008 0.000 shape.py:718(infer_shape)\n", - " 825 0.001 0.000 0.018 0.000 core.py:248(cdr)\n", - " 737/263 0.001 0.000 0.002 0.000 subtensor.py:694(helper)\n", - " 590 0.001 0.000 0.006 0.000 subtensor.py:318(analyze)\n", - " 2020 0.001 0.000 0.001 0.000 fromnumeric.py:1126(_argsort_dispatcher)\n", - " 112 0.001 0.000 0.002 0.000 _twodim_base_impl.py:245(diag)\n", - " 369 0.001 0.000 0.002 0.000 subtensor_lift.py:591(local_subtensor_make_vector)\n", - " 460 0.001 0.000 0.089 0.000 variable.py:108(__add__)\n", - " 584 0.001 0.000 0.002 0.000 params_type.py:819(c_code_cache_version)\n", - " 626 0.001 0.000 0.001 0.000 frozendict.py:36(__repr__)\n", - " 2319 0.001 0.000 0.001 0.000 {method 'extendleft' of 'collections.deque' objects}\n", - " 193 0.001 0.000 0.001 0.000 __init__.py:599(__init__)\n", - " 243 0.001 0.000 0.009 0.000 subtensor.py:774(get_constant_idx)\n", - " 643 0.001 0.000 0.236 0.000 elemwise.py:688(variables_depend_on)\n", - " 2419 0.001 0.000 0.001 0.000 basic.py:420(__str__)\n", - " 53 0.001 0.000 0.004 0.000 fg.py:762(orderings)\n", - " 434 0.001 0.000 0.003 0.000 linalg.py:234(no_transpose_symmetric)\n", - " 2728 0.001 0.000 0.001 0.000 features.py:824(validate)\n", - " 306 0.001 0.000 0.014 0.000 {built-in method nt._path_normpath}\n", - " 250 0.001 0.000 0.001 0.000 utils.py:137(broadcast_static_dim_lengths)\n", - " 60/0 0.001 0.000 0.000 gradient.py:1487(access_grad_cache)\n", - " 149 0.001 0.000 0.002 0.000 basic.py:1775(do_constant_folding)\n", - " 304 0.001 0.000 0.002 0.000 :50(normcase)\n", - " 18 0.001 0.000 0.006 0.000 basic.py:2231(__init__)\n", - " 540 0.001 0.000 0.002 0.000 variable.py:640(broadcastable)\n", - " 145 0.001 0.000 0.014 0.000 shape.py:72(make_node)\n", - " 20 0.001 0.000 9.577 0.479 types.py:884(__call__)\n", - " 780 0.001 0.000 0.001 0.000 subtensor.py:1698()\n", - " 155/152 0.001 0.000 0.002 0.000 elemwise.py:499(flatten_nested_add_mul)\n", - " 1112 0.001 0.000 0.002 0.000 rewriting.py:473()\n", - " 806 0.001 0.000 0.001 0.000 utils.py:342(discard)\n", - " 292 0.001 0.000 0.001 0.000 basic.py:1632(default_node_formatter)\n", - " 151 0.001 0.000 0.002 0.000 gradient.py:931(_node_to_pattern)\n", - " 3300 0.001 0.000 0.001 0.000 core.py:153()\n", - " 268 0.001 0.000 0.005 0.000 op.py:181(copy_var_format)\n", - " 6 0.001 0.000 0.001 0.000 elemwise.py:681(shallow_clone_defaultdict)\n", - " 257 0.001 0.000 0.006 0.000 utils.py:38(safe_new)\n", - " 1175 0.001 0.000 0.001 0.000 op.py:52(is_thunk_type)\n", - " 204 0.001 0.000 0.002 0.000 ordered_set.py:33(update)\n", - " 361 0.001 0.000 0.023 0.000 subtensor_lift.py:487(local_subtensor_of_alloc)\n", - " 570 0.001 0.000 0.012 0.000 op.py:346()\n", - " 703 0.001 0.000 0.004 0.000 core.py:153(_unify)\n", - " 1202 0.001 0.000 0.001 0.000 variable.py:69(__hash__)\n", - " 1 0.001 0.001 0.460 0.460 op.py:2370(L_op)\n", - " 1650 0.001 0.000 0.001 0.000 core.py:264(__iter__)\n", - " 86 0.001 0.000 0.001 0.000 :835(__eq__)\n", - " 1311 0.001 0.000 0.002 0.000 basic.py:162()\n", - " 285 0.001 0.000 0.207 0.001 _local.py:529(open)\n", - " 61 0.001 0.000 0.002 0.000 subtensor.py:529(local_useless_inc_subtensor)\n", - " 4066 0.000 0.000 0.000 0.000 basic.py:1468()\n", - " 285 0.000 0.000 0.003 0.000 _local.py:245(_from_parsed_parts)\n", - " 755 0.000 0.000 0.001 0.000 basic.py:177(default_output)\n", - " 1315 0.000 0.000 0.001 0.000 basic.py:1889()\n", - " 112 0.000 0.000 0.000 0.000 {method 'diagonal' of 'numpy.ndarray' objects}\n", - " 71/42 0.000 0.000 0.020 0.000 blas.py:172(_beta_L_plus_alpha_M)\n", - " 3504 0.000 0.000 0.000 0.000 params_type.py:380()\n", - " 1875 0.000 0.000 0.003 0.000 variable.py:81(isvar)\n", - " 351 0.000 0.000 0.000 0.000 basic.py:681(perform)\n", - " 1752 0.000 0.000 0.001 0.000 params_type.py:820()\n", - " 49 0.000 0.000 0.005 0.000 utils.py:174(_parse_gufunc_signature)\n", - " 601 0.000 0.000 0.120 0.000 core.py:252(unify_NoMap)\n", - " 1039 0.000 0.000 0.000 0.000 vm.py:1167()\n", - " 212 0.000 0.000 0.006 0.000 basic.py:670(__call__)\n", - " 139 0.000 0.000 0.015 0.000 basic.py:104(_as_tensor_Scalar)\n", - " 2076 0.000 0.000 0.000 0.000 shape_base.py:76(_atleast_2d_dispatcher)\n", - " 9 0.000 0.000 0.353 0.039 op.py:680(__init__)\n", - " 96 0.000 0.000 0.131 0.001 variable.py:204(__radd__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", - " 91 0.000 0.000 0.002 0.000 features.py:684(on_attach)\n", - " 260 0.000 0.000 0.006 0.000 builders.py:139()\n", - " 13 0.000 0.000 0.003 0.000 basic.py:1086(truncated_graph_inputs)\n", - " 91 0.000 0.000 0.110 0.001 fg.py:746(toposort)\n", - " 12 0.000 0.000 0.021 0.002 subtensor.py:2815(make_node)\n", - " 2354 0.000 0.000 0.000 0.000 configparser.py:461(_apply)\n", - " 1424 0.000 0.000 0.043 0.000 basic.py:927(graph_inputs)\n", - " 2076 0.000 0.000 0.000 0.000 shape_base.py:17(_atleast_1d_dispatcher)\n", - " 114 0.000 0.000 0.000 0.000 {built-in method numpy.frompyfunc}\n", - " 317/119 0.000 0.000 0.007 0.000 subtensor.py:152(as_index_constant)\n", - " 232 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 18 0.000 0.000 0.019 0.001 subtensor.py:618(indexed_result_shape)\n", - " 285 0.000 0.000 0.020 0.000 _local.py:406(is_absolute)\n", - " 2181 0.000 0.000 0.000 0.000 basic.py:1718(on_prune)\n", - " 15 0.000 0.000 0.000 0.000 {built-in method builtins.__build_class__}\n", - " 36 0.000 0.000 0.107 0.003 blas.py:685(local_dot22_to_ger_or_gemv)\n", - " 105 0.000 0.000 0.002 0.000 basic.py:1844(variable_depends_on)\n", - " 71 0.000 0.000 0.064 0.001 linalg.py:105(inv_as_solve)\n", - " 2076 0.000 0.000 0.000 0.000 multiarray.py:690(result_type)\n", - " 242 0.000 0.000 0.001 0.000 subtensor_lift.py:169(local_subtensor_of_elemwise)\n", - " 19 0.000 0.000 0.005 0.000 inspect.py:1661(getframeinfo)\n", - " 285 0.000 0.000 0.001 0.000 :146(splitdrive)\n", - " 1039 0.000 0.000 0.000 0.000 vm.py:1255()\n", - " 116 0.000 0.000 0.002 0.000 basic.py:466(local_alloc_sink_dimshuffle)\n", - " 207 0.000 0.000 0.002 0.000 subtensor_lift.py:722(local_subtensor_shape_constant)\n", - " 260 0.000 0.000 0.001 0.000 basic.py:1490()\n", - " 6 0.000 0.000 0.114 0.019 rewriting.py:827(scan_push_out_add)\n", - " 361 0.000 0.000 0.001 0.000 inspect.py:298(ismodule)\n", - " 227 0.000 0.000 0.085 0.000 variable.py:133(__mul__)\n", - " 180 0.000 0.000 0.003 0.000 linalg.py:91(transinv_to_invtrans)\n", - " 11 0.000 0.000 0.016 0.001 basic.py:518(on_attach)\n", - " 3 0.000 0.000 0.634 0.211 elemwise.py:595(apply)\n", - " 191 0.000 0.000 0.003 0.000 subtensor.py:836(as_nontensor_scalar)\n", - " 1203 0.000 0.000 0.000 0.000 {built-in method builtins.setattr}\n", - " 755 0.000 0.000 0.001 0.000 basic.py:307(out)\n", - " 1689 0.000 0.000 0.001 0.000 basic.py:1088(add_requirements)\n", - " 177 0.000 0.000 0.068 0.000 math.py:170(local_lift_transpose_through_dot)\n", - " 601 0.000 0.000 0.000 0.000 math.py:1405(local_elemwise_sub_zeros)\n", - " 54 0.000 0.000 0.001 0.000 math.py:573(local_mul_pow_to_pow_add)\n", - " 5 0.000 0.000 0.608 0.122 elemwise.py:605(find_next_fuseable_subgraph)\n", - " 147 0.000 0.000 0.001 0.000 utils.py:197()\n", - " 119 0.000 0.000 0.007 0.000 blockwise.py:72(local_eager_useless_unbatched_blockwise)\n", - " 825 0.000 0.000 0.003 0.000 dispatch.py:74(rator)\n", - " 43 0.000 0.000 0.005 0.000 blockwise.py:163(__init__)\n", - " 109 0.000 0.000 0.001 0.000 op.py:148(check_broadcast)\n", - " 948 0.000 0.000 0.001 0.000 raise_op.py:92()\n", - " 268 0.000 0.000 0.002 0.000 basic.py:1487(c_code)\n", - " 30 0.000 0.000 0.002 0.000 destroyhandler.py:225(inplace_candidates)\n", - " 141 0.000 0.000 0.010 0.000 type.py:197(make_constant)\n", - " 316 0.000 0.000 0.001 0.000 math.py:1571()\n", - " 6 0.000 0.000 0.068 0.011 functional.py:79(inner)\n", - " 298 0.000 0.000 0.001 0.000 subtensor_lift.py:111(local_subtensor_of_dot)\n", - " 8 0.000 0.000 0.000 0.000 op.py:446(get_oinp_iinp_iout_oout_mappings)\n", - " 107 0.000 0.000 0.004 0.000 math.py:2573(attempt_distribution)\n", - " 40/12 0.000 0.000 0.001 0.000 math.py:3403(perform_sigm_times_exp)\n", - " 143 0.000 0.000 0.001 0.000 fg.py:694(remove_feature)\n", - " 825 0.000 0.000 0.018 0.000 dispatch.py:79(rands)\n", - " 1311 0.000 0.000 0.000 0.000 basic.py:1892()\n", - " 101 0.000 0.000 0.001 0.000 special.py:110(softmax_simplifier)\n", - " 590 0.000 0.000 0.000 0.000 type.py:633(__instancecheck__)\n", - " 933 0.000 0.000 0.001 0.000 utils.py:113(import_func_from_string)\n", - " 403 0.000 0.000 0.001 0.000 utils.py:316(__getitem__)\n", - " 243 0.000 0.000 0.001 0.000 subtensor.py:490(local_subtensor_inc_subtensor)\n", - " 40 0.000 0.000 0.002 0.000 elemwise.py:1395(perform)\n", - " 51/15 0.000 0.000 9.287 0.619 basic.py:110(rewrite)\n", - " 36 0.000 0.000 0.015 0.000 blockwise.py:40(local_useless_unbatched_blockwise)\n", - " 600 0.000 0.000 0.030 0.000 elemwise.py:839()\n", - " 2042 0.000 0.000 0.000 0.000 op.py:847()\n", - " 47 0.000 0.000 0.087 0.002 basic.py:2108(transpose)\n", - " 18 0.000 0.000 0.001 0.000 utils.py:255(__init__)\n", - " 109/84 0.000 0.000 0.000 0.000 basic.py:1790(view_roots)\n", - " 200 0.000 0.000 0.001 0.000 variable.py:458(includes_bool)\n", - " 32 0.000 0.000 0.017 0.001 blas.py:579(local_dot_to_dot22)\n", - " 18 0.000 0.000 0.001 0.000 blockwise.py:256(filter_candidate_pairs)\n", - " 75 0.000 0.000 0.000 0.000 features.py:390(on_attach)\n", - " 2452 0.000 0.000 0.000 0.000 configparser.py:376(mutable)\n", - " 117 0.000 0.000 0.026 0.000 op.py:1251(__eq__)\n", - " 951 0.000 0.000 0.011 0.000 basic.py:1061(applys_between)\n", - " 145 0.000 0.000 0.015 0.000 shape.py:149(shape)\n", - " 27 0.000 0.000 0.001 0.000 basic.py:1222(__init__)\n", - " 222 0.000 0.000 0.001 0.000 utils.py:319(__setitem__)\n", - " 759 0.000 0.000 0.000 0.000 ordered_set.py:26(discard)\n", - " 164 0.000 0.000 0.000 0.000 {method 'setflags' of 'numpy.ndarray' objects}\n", - " 82 0.000 0.000 0.000 0.000 basic.py:1200(get_rewriters)\n", - " 16 0.000 0.000 0.022 0.001 elemwise.py:277(create_inplace_node)\n", - " 18/3 0.000 0.000 0.013 0.004 db.py:410(query)\n", - " 550 0.000 0.000 0.000 0.000 basic.py:2217(merge_dict)\n", - " 283 0.000 0.000 0.002 0.000 subtensor.py:674(get_slice_elements)\n", - " 291 0.000 0.000 0.003 0.000 basic.py:1272()\n", - " 187 0.000 0.000 0.001 0.000 basic.py:1983(add_requirements)\n", - " 137 0.000 0.000 0.005 0.000 subtensor.py:855(__init__)\n", - " 15 0.000 0.000 0.279 0.019 basic.py:1593(make_node)\n", - " 24 0.000 0.000 0.001 0.000 elemwise.py:334(__init__)\n", - " 2 0.000 0.000 0.004 0.002 utils.py:666(fgraph_to_python)\n", - " 315 0.000 0.000 0.001 0.000 subtensor.py:300(undo_scalarization)\n", - " 1136 0.000 0.000 0.003 0.000 elemwise.py:1136(local_inline_composite_constants)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method marshal.loads}\n", - " 598 0.000 0.000 0.000 0.000 variable.py:64(__eq__)\n", - " 285 0.000 0.000 0.002 0.000 _local.py:252(_from_parsed_string)\n", - " 3/1 0.000 0.000 2.472 2.472 types.py:1641(create)\n", - " 112 0.000 0.000 0.001 0.000 fromnumeric.py:1695(diagonal)\n", - " 154 0.000 0.000 0.001 0.000 basic.py:1954(c_code)\n", - " 32 0.000 0.000 0.004 0.000 blas.py:1114(make_node)\n", - " 1116 0.000 0.000 0.000 0.000 {method 'copy' of 'set' objects}\n", - " 601 0.000 0.000 0.000 0.000 unify.py:217()\n", - " 1142 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", - " 1911 0.000 0.000 0.000 0.000 contextlib.py:444(__init__)\n", - " 109 0.000 0.000 0.000 0.000 math.py:109(__getattr__)\n", - " 529 0.000 0.000 0.000 0.000 basic.py:1419(__eq__)\n", - " 10 0.000 0.000 0.171 0.017 utils.py:550(reconstruct_graph)\n", - " 75 0.000 0.000 0.000 0.000 features.py:704(unpickle)\n", - " 37 0.000 0.000 0.014 0.000 blas.py:636(local_gemm_to_gemv)\n", - " 122 0.000 0.000 0.001 0.000 basic.py:441(local_useless_alloc)\n", - " 243 0.000 0.000 0.001 0.000 __init__.py:270(findall)\n", - " 375 0.000 0.000 0.002 0.000 type.py:36(in_same_class)\n", - " 10 0.000 0.000 0.171 0.017 utils.py:589(__init__)\n", - " 3 0.000 0.000 0.009 0.003 features.py:341(on_attach)\n", - " 1911 0.000 0.000 0.000 0.000 contextlib.py:450(__exit__)\n", - " 375 0.000 0.000 0.002 0.000 type.py:53(is_super)\n", - " 241 0.000 0.000 0.001 0.000 subtensor_lift.py:244(local_subtensor_of_reduce)\n", - " 194 0.000 0.000 0.000 0.000 shape.py:1241(local_Shape_i_ground)\n", - " 203 0.000 0.000 0.000 0.000 shape.py:226(__init__)\n", - " 16 0.000 0.000 0.003 0.000 basic.py:1058()\n", - " 149 0.000 0.000 0.005 0.000 elemwise.py:1183(constant_fold_branches_of_add_mul)\n", - " 1192 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 20 0.000 0.000 0.001 0.000 math.py:2047(local_intdiv_by_one)\n", - " 241 0.000 0.000 0.001 0.000 subtensor_lift.py:301(local_subtensor_of_softmax)\n", - " 109 0.000 0.000 0.002 0.000 __init__.py:183(sub)\n", - " 3 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", - " 185 0.000 0.000 0.001 0.000 fg.py:38(make_node)\n", - " 6 0.000 0.000 0.000 0.000 arrayprint.py:987(fillFormat)\n", - " 75/4 0.000 0.000 0.001 0.000 gradient.py:1045(account_for)\n", - " 19 0.000 0.000 0.003 0.000 inspect.py:1052(findsource)\n", - " 21 0.000 0.000 0.001 0.000 utils.py:16(hash_from_ndarray)\n", - " 3 0.000 0.000 0.041 0.014 pfunc.py:480(construct_pfunc_ins_and_outs)\n", - " 12 0.000 0.000 0.013 0.001 blockwise.py:291(create_inplace_node)\n", - " 1140 0.000 0.000 0.000 0.000 _local.py:298(root)\n", - " 456 0.000 0.000 0.000 0.000 elemwise.py:164()\n", - " 162 0.000 0.000 0.000 0.000 basic.py:1227(local_dimshuffle_alloc)\n", - " 11 0.000 0.000 0.006 0.001 elemwise.py:538(_bgrad)\n", - " 3 0.000 0.000 0.133 0.044 rewriting.py:1035(apply)\n", - " 139 0.000 0.000 0.000 0.000 basic.py:243(local_scalar_tensor_scalar)\n", - " 1145 0.000 0.000 0.000 0.000 {method 'copy' of 'list' objects}\n", - " 78 0.000 0.000 0.000 0.000 subtensor.py:1222(local_useless_inc_subtensor_alloc)\n", - " 20 0.000 0.000 0.001 0.000 basic.py:2156(c_code)\n", - " 207 0.000 0.000 0.000 0.000 subtensor_lift.py:676(local_subtensor_of_join)\n", - " 12 0.000 0.000 0.031 0.003 math.py:3046(grad)\n", - " 241 0.000 0.000 0.000 0.000 subtensor_lift.py:438(local_subtensor_of_transpose)\n", - " 2 0.000 0.000 0.009 0.005 elemwise.py:555(elemwise_to_scalar)\n", - " 36 0.000 0.000 0.001 0.000 subtensor.py:582(group_indices)\n", - " 13 0.000 0.000 0.002 0.000 subtensor.py:1708(make_node)\n", - " 258 0.000 0.000 0.004 0.000 pfunc.py:253(clone_inputs)\n", - " 42 0.000 0.000 0.001 0.000 textwrap.py:419(dedent)\n", - " 241 0.000 0.000 0.000 0.000 subtensor_lift.py:364(local_subtensor_of_expand_dims)\n", - " 112 0.000 0.000 0.001 0.000 blas.py:856()\n", - " 23 0.000 0.000 0.000 0.000 slinalg.py:885(inplace_on_inputs)\n", - " 614 0.000 0.000 0.001 0.000 shape.py:479()\n", - " 285 0.000 0.000 0.001 0.000 op.py:349()\n", - " 38 0.000 0.000 0.001 0.000 inspect.py:959(getsourcefile)\n", - " 8 0.000 0.000 0.018 0.002 basic.py:4283(__init__)\n", - " 78 0.000 0.000 0.069 0.001 rewriting.py:69(_split_decomp_and_solve_steps)\n", - " 570 0.000 0.000 0.000 0.000 {built-in method _io.text_encoding}\n", - " 35 0.000 0.000 0.008 0.000 variable.py:657(__dot__)\n", - " 48 0.000 0.000 0.010 0.000 shape.py:1261(local_shape_to_shape_i)\n", - " 202 0.000 0.000 0.000 0.000 blockwise.py:283()\n", - " 2 0.000 0.000 0.014 0.007 ioloop.py:750(_run_callback)\n", - " 35 0.000 0.000 0.007 0.000 math.py:3164(dense_dot)\n", - " 300 0.000 0.000 0.001 0.000 basic.py:1867(detach_updater)\n", - " 34 0.000 0.000 0.000 0.000 slinalg.py:854(__init__)\n", - " 29 0.000 0.000 0.013 0.000 blas.py:929(infer_shape)\n", - " 210 0.000 0.000 0.007 0.000 variable.py:530()\n", - " 21 0.000 0.000 0.000 0.000 dataclasses.py:1599(_replace)\n", - " 1911 0.000 0.000 0.000 0.000 contextlib.py:447(__enter__)\n", - " 345 0.000 0.000 0.000 0.000 elemwise.py:397(local_useless_dimshuffle_makevector)\n", - " 7 0.000 0.000 0.035 0.005 blockwise.py:411(L_op)\n", - " 54 0.000 0.000 0.000 0.000 math.py:531(local_mul_exp_to_exp_add)\n", - " 112 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 15 0.000 0.000 0.000 0.000 :101(_path_join)\n", - " 1140 0.000 0.000 0.000 0.000 _local.py:307(_tail)\n", - " 21 0.000 0.000 0.060 0.003 basic.py:4114(swapaxes)\n", - " 6 0.000 0.000 0.000 0.000 :480(_call_with_frames_removed)\n", - " 2 0.000 0.000 0.001 0.000 op.py:1319(prepare_fgraph)\n", - " 108 0.000 0.000 0.024 0.000 variable.py:179(__floordiv__)\n", - " 22/11 0.000 0.000 0.000 0.000 arrayprint.py:837(recurser)\n", - " 6 0.000 0.000 0.007 0.001 rewriting.py:173(_scan_split_non_sequence_decomposition_and_solve)\n", - " 75 0.000 0.000 0.000 0.000 features.py:610(on_attach)\n", - " 7 0.000 0.000 0.014 0.002 slinalg.py:1024(solve)\n", - " 1762 0.000 0.000 0.000 0.000 dispatch.py:116()\n", - " 12 0.000 0.000 0.001 0.000 blas.py:158(make_node)\n", - " 75 0.000 0.000 0.000 0.000 features.py:406(unpickle)\n", - " 164 0.000 0.000 0.000 0.000 {method 'squeeze' of 'numpy.ndarray' objects}\n", - " 15/3 0.000 0.000 0.322 0.107 basic.py:339(add_requirements)\n", - " 37 0.000 0.000 0.002 0.000 linecache.py:66(checkcache)\n", - " 12 0.000 0.000 0.021 0.002 slinalg.py:894(solve_triangular)\n", - " 12 0.000 0.000 0.002 0.000 blas.py:264(make_node)\n", - " 200 0.000 0.000 0.000 0.000 op.py:1769()\n", - " 48/27 0.000 0.000 0.000 0.000 types.py:74(view_tree_set)\n", - " 649 0.000 0.000 0.000 0.000 basic.py:2205(reset)\n", - " 5 0.000 0.000 0.015 0.003 types.py:172(add_supervisor_to_fgraph)\n", - " 104 0.000 0.000 0.001 0.000 blockwise.py:47()\n", - " 285 0.000 0.000 0.000 0.000 :263(__init__)\n", - " 8/0 0.000 0.000 0.000 selectors.py:310(select)\n", - " 138 0.000 0.000 0.028 0.000 subtensor.py:450(switch_neg_step)\n", - " 428 0.000 0.000 0.000 0.000 basic.py:830(value)\n", - " 8 0.000 0.000 0.008 0.001 basic.py:1219(clone)\n", - " 121 0.000 0.000 0.001 0.000 basic.py:736(_str)\n", - " 915 0.000 0.000 0.000 0.000 basic.py:1092(tracks)\n", - " 1 0.000 0.000 0.001 0.001 basic.py:1636(io_connection_pattern)\n", - " 44 0.000 0.000 0.000 0.000 shape.py:123(c_code_cache_version)\n", - " 243 0.000 0.000 0.002 0.000 basic.py:1863()\n", - " 3/1 0.000 0.000 2.469 2.469 basic.py:238(make_thunk)\n", - " 40/12 0.000 0.000 0.001 0.000 math.py:3236(parse_mul_tree)\n", - " 3 0.000 0.000 9.301 3.100 types.py:1511(__init__)\n", - " 1180 0.000 0.000 0.000 0.000 op.py:481(prepare_node)\n", - " 342 0.000 0.000 0.000 0.000 basic.py:1711(c_code)\n", - " 175 0.000 0.000 0.000 0.000 subtensor_lift.py:557(local_subtensor_SpecifyShape_lift)\n", - " 24 0.000 0.000 0.001 0.000 basic.py:2648(make_node)\n", - " 9 0.000 0.000 0.000 0.000 configparser.py:194(get_config_hash)\n", - " 23 0.000 0.000 0.003 0.000 blas.py:779(local_dot22_to_dot22scalar)\n", - " 39 0.000 0.000 0.003 0.000 basic.py:1268(__str__)\n", - " 19 0.000 0.000 0.001 0.000 inspect.py:1000(getmodule)\n", - " 100 0.000 0.000 0.001 0.000 type.py:127(filter_variable)\n", - " 47/27 0.000 0.000 0.000 0.000 types.py:51(alias_root)\n", - " 60 0.000 0.000 0.000 0.000 basic.py:55(__init__)\n", - " 47 0.000 0.000 0.019 0.000 basic.py:111(alloc_like)\n", - " 3 0.000 0.000 0.006 0.002 vm.py:996(make_vm)\n", - " 56 0.000 0.000 0.000 0.000 math.py:3146(is_neg)\n", - " 58 0.000 0.000 0.001 0.000 subtensor.py:1072(local_incsubtensor_of_zeros)\n", - " 1/0 0.000 0.000 0.000 gradient.py:557(grad)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 315 0.000 0.000 0.003 0.000 subtensor.py:870()\n", - " 342 0.000 0.000 0.000 0.000 inspect.py:302(isclass)\n", - " 10 0.000 0.000 0.001 0.000 op.py:2311(connection_pattern)\n", - " 34 0.000 0.000 0.000 0.000 blas.py:304(_factor_canonicalized)\n", - " 3/1 0.000 0.000 9.399 9.399 types.py:1753(orig_function)\n", - " 250 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 233 0.000 0.000 0.000 0.000 __init__.py:673(update)\n", - " 6 0.000 0.000 0.001 0.000 op.py:614(validate_inner_graph)\n", - " 4 0.000 0.000 0.006 0.001 rewriting.py:2067(apply)\n", - " 24 0.000 0.000 0.000 0.000 elemwise.py:378(__setstate__)\n", - " 474 0.000 0.000 0.000 0.000 math.py:3427(_output_dtype)\n", - " 7 0.000 0.000 0.000 0.000 attrsettr.py:66(_get_attr_opt)\n", - " 6 0.000 0.000 0.003 0.000 subtensor.py:2852(infer_shape)\n", - " 600 0.000 0.000 0.000 0.000 {method 'appendleft' of 'collections.deque' objects}\n", - " 3 0.000 0.000 9.282 3.094 types.py:1448(prepare_fgraph)\n", - " 6 0.000 0.000 0.010 0.002 subtensor.py:2968(vectorize_advanced_subtensor)\n", - " 44 0.000 0.000 0.000 0.000 uncanonicalize.py:125(local_dimshuffle_alloc)\n", - " 78 0.000 0.000 0.070 0.001 rewriting.py:229(reuse_decomposition_multiple_solves)\n", - " 9 0.000 0.000 0.119 0.013 basic.py:1275(cmodule_key_variables)\n", - " 8 0.000 0.000 0.011 0.001 basic.py:4095(_cleanup_graph)\n", - " 65 0.000 0.000 0.036 0.001 replace.py:214(vectorize_node)\n", - " 22 0.000 0.000 0.000 0.000 utils.py:604(get_name_for_object)\n", - " 11 0.000 0.000 0.007 0.001 blockwise.py:559(vectorize_node_fallback)\n", - " 44 0.000 0.000 0.009 0.000 basic.py:4228(__eq__)\n", - " 61 0.000 0.000 0.000 0.000 blockwise.py:544(__str__)\n", - " 1290 0.000 0.000 0.000 0.000 basic.py:84(__eq__)\n", - " 48 0.000 0.000 0.009 0.000 shape.py:497(make_vector_shape)\n", - " 27 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 1 0.000 0.000 0.091 0.091 op.py:2450(compute_all_gradients)\n", - " 10 0.000 0.000 0.001 0.000 math.py:2534(distribute_greedy)\n", - " 442 0.000 0.000 0.000 0.000 op.py:228(n_sit_sot)\n", - " 310 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 6 0.000 0.000 0.035 0.006 slinalg.py:761(_lu_solve)\n", - " 47 0.000 0.000 0.087 0.002 variable.py:235(T)\n", - " 479 0.000 0.000 0.000 0.000 utils.py:225(normalize_reduce_axis)\n", - " 42 0.000 0.000 0.000 0.000 subtensor.py:527(is_basic_idx)\n", - " 21 0.000 0.000 0.061 0.003 basic.py:2132(matrix_transpose)\n", - " 825 0.000 0.000 0.000 0.000 dispatch.py:104(etuplize_fn)\n", - " 10 0.000 0.000 0.002 0.000 sort.py:163(make_node)\n", - " 36 0.000 0.000 0.001 0.000 unify.py:221(_unify_ConstrainedVar_object)\n", - " 2 0.000 0.000 0.000 0.000 socket.py:700(send_multipart)\n", - " 6 0.000 0.000 0.000 0.000 rewriting.py:2333(scan_push_out_dot1)\n", - " 153 0.000 0.000 0.000 0.000 basic.py:1062()\n", - " 43 0.000 0.000 0.000 0.000 slinalg.py:246(__init__)\n", - " 183 0.000 0.000 0.000 0.000 shape.py:1277(local_track_shape_i)\n", - " 40 0.000 0.000 0.000 0.000 io.py:171(__init__)\n", - " 13 0.000 0.000 0.002 0.000 slinalg.py:632(make_node)\n", - " 60 0.000 0.000 0.000 0.000 basic.py:2567(impl)\n", - " 40 0.000 0.000 0.000 0.000 math.py:3103(is_mul)\n", - " 101 0.000 0.000 0.000 0.000 math.py:2297(check_for_x_over_absX)\n", - " 144 0.000 0.000 0.015 0.000 variable.py:268(shape)\n", - " 2 0.000 0.000 0.000 0.000 elemwise.py:874(update_fuseable_mappings_after_fg_replace)\n", - " 44 0.000 0.000 0.000 0.000 uncanonicalize.py:153(local_dimshuffle_subtensor)\n", - " 89 0.000 0.000 0.000 0.000 math.py:199(local_batched_matmul_to_core_matmul)\n", - " 67 0.000 0.000 0.000 0.000 elemwise.py:214(__str__)\n", - " 11 0.000 0.000 0.001 0.000 arrayprint.py:567(_array2string)\n", - " 825 0.000 0.000 0.000 0.000 dispatch.py:115()\n", - " 21 0.000 0.000 0.012 0.001 features.py:425(revert)\n", - " 4 0.000 0.000 0.075 0.019 rewriting.py:2125(scan_merge_inouts)\n", - " 45 0.000 0.000 0.001 0.000 destroyhandler.py:417(has_destroyers)\n", - " 35 0.000 0.000 0.008 0.000 math.py:3140(dot)\n", - " 41 0.000 0.000 0.001 0.000 utils.py:640(unique_name)\n", - " 114/14 0.000 0.000 0.000 0.000 gradient.py:1090(visit)\n", - " 56 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 361 0.000 0.000 0.000 0.000 op.py:224(n_mit_sot)\n", - " 7 0.000 0.000 0.000 0.000 subtensor.py:1036(str_from_indices)\n", - " 28 0.000 0.000 0.062 0.002 op.py:371(L_op)\n", - " 168 0.000 0.000 0.000 0.000 blas.py:847()\n", - " 57 0.000 0.000 0.001 0.000 subtensor.py:1118(local_setsubtensor_of_constants)\n", - " 17 0.000 0.000 0.000 0.000 core.py:458(_check_fill_value)\n", - " 230 0.000 0.000 0.000 0.000 basic.py:2054(c_code)\n", - " 62 0.000 0.000 0.002 0.000 op.py:779(tensorConstructor)\n", - " 4 0.000 0.000 0.062 0.015 fg.py:867(clone_get_equiv)\n", - " 95 0.000 0.000 0.001 0.000 shape.py:872(shape_padleft)\n", - " 284 0.000 0.000 0.000 0.000 basic.py:772(signature)\n", - " 9 0.000 0.000 0.000 0.000 slinalg.py:964(__init__)\n", - " 11 0.000 0.000 0.033 0.003 blas.py:364(item_to_var)\n", - " 21 0.000 0.000 0.000 0.000 {built-in method nt._getfullpathname}\n", - " 22 0.000 0.000 0.003 0.000 basic.py:1104(__call__)\n", - " 30 0.000 0.000 0.000 0.000 replace.py:20(_format_replace)\n", - " 1 0.000 0.000 0.001 0.001 traceback.py:453(_extract_from_extended_frame_gen)\n", - " 34 0.000 0.000 0.004 0.000 blas.py:653(local_gemm_to_ger)\n", - " 122 0.000 0.000 0.000 0.000 basic.py:1181(local_merge_alloc)\n", - " 390 0.000 0.000 0.000 0.000 __init__.py:613(__missing__)\n", - " 50 0.000 0.000 0.011 0.000 variable.py:623(__iter__)\n", - " 1100 0.000 0.000 0.000 0.000 basic.py:854(merge_none_number)\n", - " 56 0.000 0.000 0.000 0.000 math.py:2347()\n", - " 13 0.000 0.000 0.001 0.000 arrayprint.py:550(wrapper)\n", - " 100 0.000 0.000 0.000 0.000 variable.py:522(is_empty_array)\n", - " 11 0.000 0.000 0.001 0.000 arrayprint.py:496(_get_format_function)\n", - " 355 0.000 0.000 0.000 0.000 subtensor.py:877()\n", - " 24 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 3 0.000 0.000 0.001 0.000 db.py:499(query)\n", - " 11 0.000 0.000 0.006 0.001 elemwise.py:512(L_op)\n", - " 57 0.000 0.000 0.001 0.000 math.py:2055(local_zero_div)\n", - " 87 0.000 0.000 0.000 0.000 op.py:1306(__hash__)\n", - " 54 0.000 0.000 0.000 0.000 linecache.py:102(updatecache)\n", - " 78 0.000 0.000 0.000 0.000 linalg.py:353(local_lift_through_linalg)\n", - " 162 0.000 0.000 0.000 0.000 shape.py:1030(local_fuse_expand_dims_reshape)\n", - " 171 0.000 0.000 0.000 0.000 basic.py:1124(__call__)\n", - " 14 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 12 0.000 0.000 0.001 0.000 elemwise.py:258(filter_candidate_pairs)\n", - " 56 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 42 0.000 0.000 0.000 0.000 op.py:421(inner_non_seqs)\n", - " 45 0.000 0.000 0.000 0.000 blas.py:164(_is_real_vector)\n", - " 28 0.000 0.000 0.000 0.000 math.py:3077(is_exp)\n", - " 112 0.000 0.000 0.001 0.000 _methods.py:42(_amax)\n", - " 19 0.000 0.000 0.002 0.000 basic.py:802(__str__)\n", - " 6 0.000 0.000 0.068 0.011 slinalg.py:805(lu_solve)\n", - " 47 0.000 0.000 0.000 0.000 basic.py:1760(output_types)\n", - " 19 0.000 0.000 0.000 0.000 inspect.py:1639(__new__)\n", - " 44 0.000 0.000 0.000 0.000 shape.py:128()\n", - " 87 0.000 0.000 0.000 0.000 :29(__hash__)\n", - " 2 0.000 0.000 2.393 1.197 op.py:1462(make_thunk)\n", - " 41 0.000 0.000 0.005 0.000 variable.py:63(__neg__)\n", - " 24 0.000 0.000 0.000 0.000 utils.py:208(_props_dict)\n", - " 163 0.000 0.000 0.000 0.000 op.py:1220(is_cpu_vector)\n", - " 11 0.000 0.000 0.003 0.000 blas.py:612(local_inplace_gemm)\n", - " 11 0.000 0.000 0.002 0.000 arrayprint.py:605(array2string)\n", - " 33 0.000 0.000 0.010 0.000 destroyhandler.py:364(on_attach)\n", - " 2 0.000 0.000 0.015 0.008 fg.py:860(__repr__)\n", - " 98 0.000 0.000 0.000 0.000 blas.py:463(on_import)\n", - " 11 0.000 0.000 0.000 0.000 arrayprint.py:50(_make_options_dict)\n", - " 19 0.000 0.000 0.001 0.000 inspect.py:1654(_get_code_position)\n", - " 36/3 0.000 0.000 0.013 0.004 db.py:146(query)\n", - " 8 0.000 0.000 0.001 0.000 basic.py:4398(make_node)\n", - " 2 0.000 0.000 0.000 0.000 utils.py:390(compress_outs)\n", - " 35 0.000 0.000 0.012 0.000 features.py:370(__call__)\n", - " 31 0.000 0.000 0.000 0.000 op.py:346(inner_sitsot)\n", - " 177 0.000 0.000 0.000 0.000 :345(__subclasshook__)\n", - " 84 0.000 0.000 0.000 0.000 enum.py:1587(_get_value)\n", - " 5 0.000 0.000 0.000 0.000 basic.py:4330(__str__)\n", - " 78 0.000 0.000 0.000 0.000 blockwise.py:93(local_blockwise_alloc)\n", - " 83 0.000 0.000 0.000 0.000 basic.py:2022(importer)\n", - " 75 0.000 0.000 0.000 0.000 features.py:623(unpickle)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:131(generic_solve_to_solve_triangular)\n", - " 101 0.000 0.000 0.000 0.000 subtensor.py:1532(local_blockwise_advanced_inc_subtensor)\n", - " 4 0.000 0.000 0.004 0.001 basic.py:2883(stack)\n", - " 403 0.000 0.000 0.000 0.000 op.py:1449(inner_inputs)\n", - " 38 0.000 0.000 0.008 0.000 __init__.py:60(get_vector_length)\n", - " 125 0.000 0.000 0.000 0.000 shape.py:88(infer_shape)\n", - " 12 0.000 0.000 0.000 0.000 arrayprint.py:1037()\n", - " 3 0.000 0.000 0.003 0.001 :1093(get_code)\n", - " 50 0.000 0.000 0.000 0.000 shape.py:1164(local_Shape_of_SpecifyShape)\n", - " 602 0.000 0.000 0.000 0.000 basic.py:1307(c_code_cache_version)\n", - " 311 0.000 0.000 0.000 0.000 op.py:931()\n", - " 432 0.000 0.000 0.000 0.000 utils.py:284(get_value)\n", - " 52 0.000 0.000 0.000 0.000 basic.py:1550(c_code)\n", - " 23/20 0.000 0.000 0.006 0.000 elemwise.py:310(apply_local_dimshuffle_lift)\n", - " 18 0.000 0.000 0.000 0.000 math.py:1655(local_sum_prod_all_to_none)\n", - " 193 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 9 0.000 0.000 0.000 0.000 op.py:857(_mitmot_preallocations)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:669(rewrite_inv_diag_to_diag_reciprocal)\n", - " 72 0.000 0.000 0.000 0.000 ordered_set.py:42(difference_update)\n", - " 235 0.000 0.000 0.000 0.000 variable.py:602()\n", - " 56 0.000 0.000 0.000 0.000 subtensor.py:1097(local_incsubtensor_of_zeros_to_setsubtensor)\n", - " 49 0.000 0.000 0.009 0.000 basic.py:4372(fgraph)\n", - " 7 0.000 0.000 0.000 0.000 attrsettr.py:43(__getattr__)\n", - " 17 0.000 0.000 0.001 0.000 math.py:2339(local_abs_merge)\n", - " 2 0.000 0.000 0.125 0.063 rewriting.py:950(attempt_scan_inplace)\n", - " 101 0.000 0.000 0.000 0.000 linalg.py:543(svd_uv_merge)\n", - " 8 0.000 0.000 0.001 0.000 basic.py:4242(__hash__)\n", - " 24/17 0.000 0.000 0.001 0.000 elemwise.py:566(transform)\n", - " 6 0.000 0.000 0.001 0.000 subtensor.py:2121(make_node)\n", - " 40 0.000 0.000 0.000 0.000 elemwise.py:1241(ufunc)\n", - " 35 0.000 0.000 0.000 0.000 subtensor.py:1898(c_code_cache_version)\n", - " 9 0.000 0.000 0.015 0.002 basic.py:1296(toposort)\n", - " 15 0.000 0.000 0.000 0.000 rewriting.py:656(inner_sitsot_only_last_step_used)\n", - " 8 0.000 0.000 0.001 0.000 subtensor.py:976(local_inplace_setsubtensor)\n", - " 249 0.000 0.000 0.000 0.000 db.py:449()\n", - " 16 0.000 0.000 0.010 0.001 replace.py:220(_vectorize_not_needed)\n", - " 5 0.000 0.000 0.000 0.000 arrayprint.py:1282(__init__)\n", - " 12 0.000 0.000 0.002 0.000 arrayprint.py:1685(_array_str_implementation)\n", - " 5 0.000 0.000 0.116 0.023 basic.py:4313(make_node)\n", - " 3 0.000 0.000 0.005 0.002 :1349(_find_and_load)\n", - " 17 0.000 0.000 0.000 0.000 enum.py:1594(__or__)\n", - " 25 0.000 0.000 0.000 0.000 shape.py:1152(local_shape_ground)\n", - " 21 0.000 0.000 0.000 0.000 dataclasses.py:1580(replace)\n", - " 21 0.000 0.000 0.061 0.003 variable.py:239(mT)\n", - " 305 0.000 0.000 0.000 0.000 blas.py:219(scaled)\n", - " 27 0.000 0.000 0.001 0.000 math.py:1785(local_reduce_broadcastable)\n", - " 35 0.000 0.000 0.000 0.000 op.py:367(outer_nitsot)\n", - " 24 0.000 0.000 0.000 0.000 op.py:156(__init__)\n", - " 18 0.000 0.000 0.000 0.000 rewriting.py:917()\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:278(_really_send)\n", - " 114 0.000 0.000 0.000 0.000 inspect.py:966()\n", - " 13 0.000 0.000 0.000 0.000 subtensor.py:1681(__init__)\n", - " 183 0.000 0.000 0.000 0.000 blas.py:260()\n", - " 210 0.000 0.000 0.000 0.000 math.py:3027()\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:2763(as_index_variable)\n", - " 3 0.000 0.000 0.001 0.000 :1240(_find_spec)\n", - " 11 0.000 0.000 0.000 0.000 basic.py:1996(c_code)\n", - " 81 0.000 0.000 0.000 0.000 basic.py:1873()\n", - " 78 0.000 0.000 0.000 0.000 linalg.py:181(batched_vector_b_solve_to_matrix_b_solve)\n", - " 12 0.000 0.000 0.002 0.000 math.py:3536(local_sigm_times_exp)\n", - " 3 0.000 0.000 0.000 0.000 vm.py:279(__init__)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:471(__del__)\n", - " 18 0.000 0.000 0.000 0.000 basic.py:243(__init__)\n", - " 28 0.000 0.000 0.000 0.000 basic.py:2698(output_types_preference)\n", - " 56 0.000 0.000 0.000 0.000 basic.py:1070(same_out_nobool)\n", - " 23 0.000 0.000 0.003 0.000 variable.py:60(__abs__)\n", - " 3 0.000 0.000 0.001 0.000 types.py:1391(check_unused_inputs)\n", - " 19 0.000 0.000 0.000 0.000 inspect.py:988(getabsfile)\n", - " 9 0.000 0.000 0.016 0.002 {method 'run' of '_contextvars.Context' objects}\n", - " 2 0.000 0.000 0.376 0.188 rewriting.py:1795(scan_save_mem_prealloc)\n", - " 30 0.000 0.000 0.000 0.000 op.py:387(inner_shared)\n", - " 29 0.000 0.000 0.003 0.000 {built-in method builtins.abs}\n", - " 42 0.000 0.000 0.000 0.000 {built-in method _collections._count_elements}\n", - " 6 0.000 0.000 0.001 0.000 slinalg.py:653(pivot_to_permutation)\n", - " 9 0.000 0.000 0.247 0.027 basic.py:919(zeros)\n", - " 28 0.000 0.000 0.001 0.000 elemwise.py:543(as_scalar)\n", - " 35 0.000 0.000 0.000 0.000 blas.py:1142(infer_shape)\n", - " 1/0 0.000 0.000 0.000 gradient.py:1130(_populate_grad_dict)\n", - " 31 0.000 0.000 0.000 0.000 slinalg.py:346(_default_b_ndim)\n", - " 11 0.000 0.000 0.000 0.000 arrayprint.py:828(_formatArray)\n", - " 95 0.000 0.000 0.000 0.000 basic.py:1764(multi_index)\n", - " 89 0.000 0.000 0.000 0.000 blockwise.py:230(local_blockwise_of_subtensor)\n", - " 404 0.000 0.000 0.000 0.000 blockwise.py:555(c_code_cache_version)\n", - " 3 0.000 0.000 0.001 0.000 :1624(find_spec)\n", - " 36 0.000 0.000 0.002 0.000 subtensor.py:2822()\n", - " 2 0.000 0.000 0.001 0.000 shape.py:406(make_node)\n", - " 6 0.000 0.000 0.011 0.002 basic.py:4356(make_new_inplace)\n", - " 96 0.000 0.000 0.000 0.000 blas.py:586()\n", - " 3 0.000 0.000 0.000 0.000 vm.py:195(__init__)\n", - " 6 0.000 0.000 0.002 0.000 variable.py:210(__rmul__)\n", - " 185 0.000 0.000 0.000 0.000 fg.py:35(__init__)\n", - " 27 0.000 0.000 0.000 0.000 frozendict.py:17(__init__)\n", - " 20 0.000 0.000 0.000 0.000 fg.py:294(get_output_client)\n", - " 5 0.000 0.000 0.000 0.000 vm.py:310()\n", - " 24 0.000 0.000 0.000 0.000 op.py:161(__setstate__)\n", - " 119 0.000 0.000 0.000 0.000 basic.py:685(infer_shape)\n", - " 25 0.000 0.000 0.001 0.000 variable.py:454(astype)\n", - " 12 0.000 0.000 0.000 0.000 basic.py:1401(add_requirements)\n", - " 34 0.000 0.000 0.000 0.000 traceback.py:342(_set_lines)\n", - " 11 0.000 0.000 0.000 0.000 textwrap.py:470(indent)\n", - " 9 0.000 0.000 0.010 0.001 basic.py:892(zeros_like)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:595(rewrite_inv_inv)\n", - " 2 0.000 0.000 0.001 0.001 utils.py:347(scan_can_remove_outs)\n", - " 155 0.000 0.000 0.000 0.000 basic.py:1210()\n", - " 3 0.000 0.000 0.001 0.000 zmqstream.py:614(_handle_recv)\n", - " 76 0.000 0.000 0.000 0.000 inspect.py:485(istraceback)\n", - " 31 0.000 0.000 0.000 0.000 op.py:434(outer_non_seqs)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:1032(scalar_solve_to_division)\n", - " 118 0.000 0.000 0.000 0.000 {built-in method from_iterable}\n", - " 5 0.000 0.000 0.000 0.000 functools.py:36(update_wrapper)\n", - " 6 0.000 0.000 0.000 0.000 arrayprint.py:1073(__call__)\n", - " 102 0.000 0.000 0.000 0.000 basic.py:1705(__init__)\n", - " 28 0.000 0.000 0.000 0.000 basic.py:1147(same_out_nocomplex)\n", - " 18 0.000 0.000 0.000 0.000 traitlets.py:676(__get__)\n", - " 5 0.000 0.000 0.000 0.000 shape.py:1093(local_useless_specify_shape)\n", - " 150 0.000 0.000 0.000 0.000 features.py:351(__init__)\n", - " 114 0.000 0.000 0.000 0.000 inspect.py:969()\n", - " 4 0.000 0.000 0.001 0.000 subtensor.py:1477(inc_subtensor)\n", - " 94 0.000 0.000 0.000 0.000 op.py:706(get_test_values)\n", - " 54 0.000 0.000 0.000 0.000 math.py:2036(local_mul_to_sqr)\n", - " 3 0.000 0.000 0.000 0.000 :426(_get_module_lock)\n", - " 96 0.000 0.000 0.000 0.000 blas.py:1118()\n", - " 9 0.000 0.000 0.001 0.000 nlinalg.py:112(make_node)\n", - " 7 0.000 0.000 0.000 0.000 basic.py:4150(python_convert)\n", - " 6 0.000 0.000 0.000 0.000 :137(_path_split)\n", - " 3 0.000 0.000 0.000 0.000 socket.py:771(recv_multipart)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:636(rewrite_inv_eye_to_eye)\n", - " 4 0.000 0.000 0.001 0.000 blas_scipy.py:7(use_scipy_ger)\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:727(local_useless_AdvancedSubtensor1)\n", - " 6 0.000 0.000 0.001 0.000 blas.py:620(local_inplace_gemv)\n", - " 102 0.000 0.000 0.000 0.000 basic.py:1726(on_detach)\n", - " 235 0.000 0.000 0.000 0.000 op.py:1453(inner_outputs)\n", - " 38 0.000 0.000 0.000 0.000 enum.py:695(__call__)\n", - " 41 0.000 0.000 0.000 0.000 basic.py:2213(on_detach)\n", - " 2 0.000 0.000 0.002 0.001 utils.py:580(compile_function_src)\n", - " 26 0.000 0.000 0.016 0.001 basic.py:683(add_requirements)\n", - " 27 0.000 0.000 0.000 0.000 basic.py:1870(c_code)\n", - " 70 0.000 0.000 0.000 0.000 pfunc.py:670(iter_over_pairs)\n", - " 93 0.000 0.000 0.000 0.000 :1027(__iter__)\n", - " 45 0.000 0.000 0.000 0.000 configparser.py:209()\n", - " 56 0.000 0.000 0.000 0.000 _methods.py:46(_amin)\n", - " 6 0.000 0.000 0.000 0.000 :513(cache_from_source)\n", - " 3/1 0.000 0.000 9.440 9.440 pfunc.py:359(pfunc)\n", - " 174 0.000 0.000 0.000 0.000 features.py:316(orderings)\n", - " 18 0.000 0.000 0.000 0.000 subtensor.py:611(_non_consecutive_adv_indexing)\n", - " 34 0.000 0.000 0.000 0.000 blas.py:155(_is_real_matrix)\n", - " 112 0.000 0.000 0.000 0.000 multiarray.py:1098(copyto)\n", - " 27 0.000 0.000 0.000 0.000 basic.py:903(local_sum_make_vector)\n", - " 1 0.000 0.000 0.000 0.000 selector_events.py:141(_write_to_self)\n", - " 40 0.000 0.000 0.000 0.000 io.py:59(__init__)\n", - " 78 0.000 0.000 0.000 0.000 blockwise.py:205(local_blockwise_reshape)\n", - " 38 0.000 0.000 0.000 0.000 basic.py:1098()\n", - " 25 0.000 0.000 0.002 0.000 math.py:2869(variadic_add)\n", - " 61 0.000 0.000 0.000 0.000 subtensor.py:567()\n", - " 3 0.000 0.000 0.002 0.001 blockwise.py:344(extract_core_shape_from_infer_shape)\n", - " 72 0.000 0.000 0.000 0.000 blas.py:177()\n", - " 14 0.000 0.000 0.000 0.000 basic.py:4091(__init__)\n", - " 8 0.000 0.000 0.010 0.001 elemwise.py:263(grad)\n", - " 41 0.000 0.000 0.000 0.000 basic.py:2208(on_attach)\n", - " 16 0.000 0.000 0.000 0.000 basic.py:1097(__init__)\n", - " 20 0.000 0.000 0.002 0.000 elemwise.py:1675(vectorize_dimshuffle)\n", - " 76 0.000 0.000 0.000 0.000 inspect.py:495(isframe)\n", - " 3 0.000 0.000 0.003 0.001 :1020(exec_module)\n", - " 9 0.000 0.000 0.000 0.000 rewriting.py:90(find_solve_clients)\n", - " 93 0.000 0.000 0.000 0.000 __init__.py:1259(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 linalg.py:315(local_det_chol)\n", - " 26 0.000 0.000 0.000 0.000 basic.py:419(local_useless_fill)\n", - " 1 0.000 0.000 0.000 0.000 asyncio.py:231(add_callback)\n", - " 9 0.000 0.000 0.000 0.000 basic.py:554(__init__)\n", - " 60 0.000 0.000 0.000 0.000 blas.py:286()\n", - " 58 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", - " 12 0.000 0.000 0.006 0.000 math.py:4151(vectorize_node_dot)\n", - " 33 0.000 0.000 0.000 0.000 destroyhandler.py:326(__init__)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:537(set_result)\n", - " 2 0.000 0.000 0.000 0.000 traitlets.py:3631(set)\n", - " 12 0.000 0.000 0.041 0.003 basic.py:213(schedule)\n", - " 88 0.000 0.000 0.000 0.000 gradient.py:1294()\n", - " 17 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 112 0.000 0.000 0.000 0.000 _twodim_base_impl.py:241(_diag_dispatcher)\n", - " 6 0.000 0.000 0.001 0.000 subtensor.py:211(local_replace_AdvancedSubtensor)\n", - " 24 0.000 0.000 0.006 0.000 extra_ops.py:1562()\n", - " 2 0.000 0.000 0.010 0.005 iostream.py:259(schedule)\n", - " 11 0.000 0.000 0.000 0.000 arrayprint.py:446(_get_formatdict)\n", - " 24 0.000 0.000 0.001 0.000 rewriting.py:2254(map_out)\n", - " 54 0.000 0.000 0.000 0.000 basic.py:1952(infer_shape)\n", - " 21 0.000 0.000 0.000 0.000 basic.py:2732(c_code_cache_version)\n", - " 8 0.000 0.000 0.000 0.000 numeric.py:1386(normalize_axis_tuple)\n", - " 2 0.000 0.000 0.108 0.054 utils.py:225(expand_empty)\n", - " 40 0.000 0.000 0.000 0.000 pfunc.py:660(_pfunc_param_to_in)\n", - " 95 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 8/0 0.000 0.000 0.000 selectors.py:304(_select)\n", - " 4 0.000 0.000 0.000 0.000 encoder.py:205(iterencode)\n", - " 21 0.000 0.000 0.000 0.000 basic.py:1786(__init__)\n", - " 3 0.000 0.000 0.006 0.002 subtensor.py:984(grad)\n", - " 3 0.000 0.000 0.004 0.001 :1304(_find_and_load_unlocked)\n", - " 2 0.000 0.000 0.006 0.003 subtensor.py:2019(grad)\n", - " 72 0.000 0.000 0.000 0.000 blockwise.py:303()\n", - " 3 0.000 0.000 0.004 0.001 :911(_load_unlocked)\n", - " 11 0.000 0.000 0.000 0.000 enum.py:1605(__and__)\n", - " 46 0.000 0.000 0.000 0.000 elemwise.py:506(connection_pattern)\n", - " 92 0.000 0.000 0.000 0.000 op.py:422()\n", - " 6 0.000 0.000 0.000 0.000 arrayprint.py:961(__init__)\n", - " 90 0.000 0.000 0.000 0.000 basic.py:1610(tracks)\n", - " 19 0.000 0.000 0.000 0.000 inspect.py:1748(currentframe)\n", - " 21 0.000 0.000 0.000 0.000 basic.py:1160(__init__)\n", - " 5 0.000 0.000 0.000 0.000 types.py:143(__init__)\n", - " 6 0.000 0.000 0.004 0.001 rewriting.py:1190(_is_default_scan_buffer)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 1 0.000 0.000 0.000 0.000 cvm.py:1()\n", - " 3 0.000 0.000 0.000 0.000 :304(acquire)\n", - " 21 0.000 0.000 0.000 0.000 basic.py:1148()\n", - " 244 0.000 0.000 0.000 0.000 subtensor.py:442(switch_neg_step)\n", - " 45 0.000 0.000 0.000 0.000 basic.py:1916()\n", - " 5/0 0.000 0.000 0.000 {built-in method builtins.exec}\n", - " 38 0.000 0.000 0.000 0.000 subtensor.py:424()\n", - " 24 0.000 0.000 0.000 0.000 rewriting.py:445(add_to_replace)\n", - " 3 0.000 0.000 0.018 0.006 types.py:225(std_fgraph)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:655(write)\n", - " 169 0.000 0.000 0.000 0.000 gradient.py:1183()\n", - " 3 0.000 0.000 0.002 0.001 :1214(get_data)\n", - " 31 0.000 0.000 0.000 0.000 traceback.py:380(walk_stack)\n", - " 1 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 4 0.000 0.000 0.001 0.000 nlinalg.py:203(make_node)\n", - " 69 0.000 0.000 0.000 0.000 op.py:347()\n", - " 21 0.000 0.000 0.000 0.000 :573(abspath)\n", - " 2 0.000 0.000 0.002 0.001 gradient.py:969(_populate_var_to_app_to_idx)\n", - " 4 0.000 0.000 0.000 0.000 basic.py:1964(L_op)\n", - " 108 0.000 0.000 0.000 0.000 basic.py:799(signature)\n", - " 91 0.000 0.000 0.000 0.000 features.py:387(__init__)\n", - " 87 0.000 0.000 0.000 0.000 shape.py:304(infer_shape)\n", - " 57 0.000 0.000 0.000 0.000 inspect.py:386(isfunction)\n", - " 18 0.000 0.000 0.000 0.000 math.py:1887(local_neg_div_neg)\n", - " 5 0.000 0.000 0.000 0.000 basic.py:83(broadcasted_by)\n", - " 57 0.000 0.000 0.000 0.000 inspect.py:306(ismethod)\n", - " 74 0.000 0.000 0.000 0.000 types.py:215()\n", - " 35 0.000 0.000 0.000 0.000 rewriting.py:235(add_to_replace)\n", - " 4 0.000 0.000 0.000 0.000 zmqstream.py:676(_update_handler)\n", - " 57 0.000 0.000 0.000 0.000 inspect.py:509(iscode)\n", - " 6 0.000 0.000 0.000 0.000 utils.py:762(inner_inputs)\n", - " 20 0.000 0.000 0.000 0.000 math.py:765(local_div_switch_sink)\n", - " 6 0.000 0.000 0.001 0.000 subtensor.py:103(transform_take)\n", - " 3 0.000 0.000 0.000 0.000 blas.py:444(add_requirements)\n", - " 169 0.000 0.000 0.000 0.000 gradient.py:1208()\n", - " 6 0.000 0.000 0.068 0.011 rewriting.py:34(solve_decomposed_system)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:263(cholesky_ldotlt)\n", - " 76 0.000 0.000 0.000 0.000 subtensor.py:428()\n", - " 11 0.000 0.000 0.000 0.000 arrayprint.py:801(_extendLine_pretty)\n", - " 105 0.000 0.000 0.000 0.000 features.py:264(on_attach)\n", - " 3 0.000 0.000 0.000 0.000 :372(release)\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:2853(is_bool_index)\n", - " 8 0.000 0.000 0.000 0.000 uncanonicalize.py:44(local_max_to_min)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method numpy._core._multiarray_umath.dragon4_positional}\n", - " 18 0.000 0.000 0.000 0.000 __init__.py:1221(__init__)\n", - " 6 0.000 0.000 0.000 0.000 arrayprint.py:455()\n", - " 2 0.000 0.000 0.000 0.000 utils.py:630(unique_name_generator)\n", - " 4 0.000 0.000 0.062 0.015 fg.py:863(clone)\n", - " 3 0.000 0.000 0.000 0.000 vm.py:337(__init__)\n", - " 21 0.000 0.000 0.000 0.000 dataclasses.py:1326(_is_dataclass_instance)\n", - " 17 0.000 0.000 0.000 0.000 core.py:3509(shape)\n", - " 3 0.000 0.000 0.000 0.000 :833(spec_from_file_location)\n", - " 33 0.000 0.000 0.000 0.000 blockwise.py:405(connection_pattern)\n", - " 2 0.000 0.000 0.001 0.000 iostream.py:276()\n", - " 5 0.000 0.000 0.015 0.003 types.py:150(on_attach)\n", - " 18 0.000 0.000 0.000 0.000 op.py:358(inner_sitsot_outs)\n", - " 9 0.000 0.000 0.000 0.000 basic.py:1291(__init__)\n", - " 34 0.000 0.000 0.000 0.000 traceback.py:371(line)\n", - " 16 0.000 0.000 0.000 0.000 linalg.py:415(_find_diag_from_eye_mul)\n", - " 3 0.000 0.000 0.001 0.000 zmqstream.py:546(_run_callback)\n", - " 21 0.000 0.000 0.001 0.000 variable.py:995(pytensor_hash)\n", - " 3 0.000 0.000 0.006 0.002 extra_ops.py:562(squeeze)\n", - " 36 0.000 0.000 0.000 0.000 subtensor.py:2836()\n", - " 3 0.000 0.000 0.000 0.000 functools.py:544(decorating_function)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:479(rewrite_det_diag_to_prod_diag)\n", - " 56 0.000 0.000 0.000 0.000 basic.py:4447()\n", - " 24 0.000 0.000 0.000 0.000 op.py:354(outer_sitsot)\n", - " 2 0.000 0.000 0.001 0.001 tempfile.py:243(_mkstemp_inner)\n", - " 112 0.000 0.000 0.000 0.000 fromnumeric.py:1691(_diagonal_dispatcher)\n", - " 190 0.000 0.000 0.000 0.000 basic.py:126(add_requirements)\n", - " 3 0.000 0.000 0.000 0.000 :733(_init_module_attrs)\n", - " 22 0.000 0.000 0.000 0.000 math.py:1773(local_useless_reduce)\n", - " 25 0.000 0.000 0.000 0.000 {method 'intersection' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:118(_run_event_pipe_gc)\n", - " 2 0.000 0.000 0.001 0.001 tempfile.py:537(NamedTemporaryFile)\n", - " 24 0.000 0.000 0.000 0.000 rewriting.py:2099(has_duplicates)\n", - " 3 0.000 0.000 0.001 0.000 zmqstream.py:573(_handle_events)\n", - " 3 0.000 0.000 0.009 0.003 math.py:1296(local_neg_to_mul)\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:2974()\n", - " 2 0.000 0.000 0.000 0.000 random.py:458(choices)\n", - " 40 0.000 0.000 0.000 0.000 configdefaults.py:66(_warn_cxx)\n", - " 24 0.000 0.000 0.000 0.000 subtensor.py:2827()\n", - " 2 0.000 0.000 0.001 0.000 slinalg.py:669(make_node)\n", - " 4 0.000 0.000 0.062 0.016 op.py:1457(clone)\n", - " 6 0.000 0.000 0.000 0.000 configdefaults.py:36(_filter_mode)\n", - " 46 0.000 0.000 0.000 0.000 basic.py:1533(check_type)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:904(rewrite_cholesky_diag_to_sqrt_diag)\n", - " 16 0.000 0.000 0.003 0.000 basic.py:1030(orphans_between)\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:999(connection_pattern)\n", - " 11 0.000 0.000 0.000 0.000 arrayprint.py:787(_extendLine)\n", - " 18 0.000 0.000 0.000 0.000 unify.py:64(__hash__)\n", - " 23 0.000 0.000 0.000 0.000 linalg.py:867(rewrite_remove_useless_cholesky)\n", - " 10 0.000 0.000 0.000 0.000 subtensor.py:1369(c_code_cache_version)\n", - " 36 0.000 0.000 0.000 0.000 subtensor.py:653()\n", - " 3 0.000 0.000 0.000 0.000 :782(_compile_bytecode)\n", - " 38 0.000 0.000 0.000 0.000 enum.py:1154(__new__)\n", - " 14 0.000 0.000 0.000 0.000 op.py:314(inner_mitsot)\n", - " 70 0.000 0.000 0.000 0.000 subtensor.py:2004(infer_shape)\n", - " 13 0.000 0.000 0.000 0.000 slinalg.py:301(infer_shape)\n", - " 11 0.000 0.000 0.000 0.000 linalg.py:245(psd_solve_with_chol)\n", - " 66 0.000 0.000 0.000 0.000 basic.py:1554()\n", - " 8 0.000 0.000 0.000 0.000 mode.py:519(get_mode)\n", - " 3 0.000 0.000 0.001 0.000 sort.py:210(argsort)\n", - " 1 0.000 0.000 0.000 0.000 interactiveshell.py:3025(write)\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:1152(local_adv_sub1_adv_inc_sub1)\n", - " 14 0.000 0.000 0.000 0.000 op.py:298(inner_mitmot)\n", - " 18 0.000 0.000 0.000 0.000 base_events.py:766(time)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:489(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 tasks.py:703(sleep)\n", - " 16 0.000 0.000 0.000 0.000 basic.py:2957(c_code)\n", - " 3 0.000 0.000 0.000 0.000 traitlets.py:718(_validate)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:86(__set__)\n", - " 62 0.000 0.000 0.000 0.000 op.py:388()\n", - " 7 0.000 0.000 0.000 0.000 events.py:36(__init__)\n", - " 1 0.000 0.000 0.000 0.000 shape.py:636(make_node)\n", - " 2 0.000 0.000 0.002 0.001 subtensor.py:2066(_sum_grad_over_bcasted_dims)\n", - " 8 0.000 0.000 0.000 0.000 threading.py:1134(is_alive)\n", - " 14 0.000 0.000 0.000 0.000 op.py:383(outer_nitsot_outs)\n", - " 21 0.000 0.000 0.000 0.000 math.py:1717(local_reduce_join)\n", - " 43 0.000 0.000 0.000 0.000 types.py:441()\n", - " 2 0.000 0.000 0.001 0.000 shape.py:542(specify_shape)\n", - " 3 0.000 0.000 0.001 0.000 db.py:519(query)\n", - " 15 0.000 0.000 0.000 0.000 basic.py:1913(c_code)\n", - " 43 0.000 0.000 0.000 0.000 subtensor.py:1732()\n", - " 18 0.000 0.000 0.000 0.000 traitlets.py:629(get)\n", - " 2 0.000 0.000 0.001 0.000 rewriting.py:1990(belongs_to_set)\n", - " 9 0.000 0.000 0.000 0.000 utils.py:212(operand_sig)\n", - " 4 0.000 0.000 0.001 0.000 subtensor.py:1441(set_subtensor)\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:127(_event_pipe_gc)\n", - " 4 0.000 0.000 0.000 0.000 op.py:890(__setstate__)\n", - " 22 0.000 0.000 0.000 0.000 {method 'splitlines' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 __init__.py:1497(debug)\n", - " 36 0.000 0.000 0.000 0.000 rewriting.py:108()\n", - " 3 0.000 0.000 0.000 0.000 :697(_classify_pyc)\n", - " 12 0.000 0.000 0.003 0.000 rewriting.py:1110(select_max)\n", - " 15 0.000 0.000 0.000 0.000 basic.py:1529(c_code)\n", - " 15 0.000 0.000 0.000 0.000 op.py:395(outer_shared)\n", - " 11 0.000 0.000 0.000 0.000 uncanonicalize.py:73(local_alloc_dimshuffle)\n", - " 2 0.000 0.000 0.000 0.000 shape.py:228(default_infer_shape)\n", - " 6 0.000 0.000 0.007 0.001 rewriting.py:237(scan_split_non_sequence_decomposition_and_solve)\n", - " 24 0.000 0.000 0.000 0.000 extra_ops.py:1558()\n", - " 2 0.000 0.000 0.000 0.000 type.py:925(matrix)\n", - " 23 0.000 0.000 0.000 0.000 types.py:618()\n", - " 9 0.000 0.000 0.000 0.000 basic.py:160(__init__)\n", - " 3 0.000 0.000 0.002 0.001 basic.py:4462(expand_dims)\n", - " 20 0.000 0.000 0.000 0.000 basic.py:1550()\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:710(_flush_buffers)\n", - " 7 0.000 0.000 0.000 0.000 basic.py:1701(op_as_string)\n", - " 5 0.000 0.000 0.000 0.000 vm.py:1314(__setstate__)\n", - " 12 0.000 0.000 0.000 0.000 arrayprint.py:1042()\n", - " 1 0.000 0.000 0.001 0.001 slinalg.py:729(lu_factor)\n", - " 4 0.000 0.000 0.000 0.000 zmqstream.py:653(_rebuild_io_state)\n", - " 3 0.000 0.000 0.010 0.003 mode.py:153(add_requirements)\n", - " 42 0.000 0.000 0.000 0.000 op.py:288(inner_seqs)\n", - " 1 0.000 0.000 0.000 0.000 kernelbase.py:302(poll_control_queue)\n", - " 4 0.000 0.000 0.000 0.000 __init__.py:183(dumps)\n", - " 1 0.000 0.000 9.440 9.440 __init__.py:95(function)\n", - " 111 0.000 0.000 0.000 0.000 basic.py:180(add_requirements)\n", - " 2 0.000 0.000 0.000 0.000 mode.py:427(clone)\n", - " 6 0.000 0.000 0.000 0.000 blockwise.py:35(_squeeze_left)\n", - " 19 0.000 0.000 0.000 0.000 math.py:1672(local_reduce_chain)\n", - " 39 0.000 0.000 0.000 0.000 destroyhandler.py:381()\n", - " 4 0.000 0.000 0.001 0.000 blas_scipy.py:13(make_ger_destructive)\n", - " 11 0.000 0.000 0.000 0.000 op.py:405(inner_shared_outs)\n", - " 24 0.000 0.000 0.000 0.000 op.py:333(outer_mitsot)\n", - " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3052(max)\n", - " 40 0.000 0.000 0.000 0.000 types.py:1382(wrap_out)\n", - " 9 0.000 0.000 0.000 0.000 :89(_unpack_uint32)\n", - " 35 0.000 0.000 0.000 0.000 textwrap.py:483()\n", - " 6 0.000 0.000 0.000 0.000 subtensor.py:181(get_advsubtensor_axis)\n", - " 3 0.000 0.000 0.000 0.000 utils.py:208(safe_signature)\n", - " 85 0.000 0.000 0.000 0.000 math.py:3130(__str__)\n", - " 6 0.000 0.000 0.000 0.000 elemwise.py:54(add_requirements)\n", - " 3 0.000 0.000 0.000 0.000 :124(setdefault)\n", - " 1 0.000 0.000 0.002 0.002 shape.py:943(local_reshape_to_dimshuffle)\n", - " 4 0.000 0.000 0.001 0.000 type.py:824(scalar)\n", - " 26 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 12 0.000 0.000 0.000 0.000 basic.py:2941()\n", - " 3 0.000 0.000 0.000 0.000 :806(module_from_spec)\n", - " 4 0.000 0.000 0.000 0.000 tempfile.py:446(cleanup)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:2059(L_op)\n", - " 3 0.000 0.000 0.000 0.000 :1619(_get_spec)\n", - " 41 0.000 0.000 0.000 0.000 types.py:614()\n", - " 3 0.000 0.000 0.013 0.004 mode.py:366(__get_optimizer)\n", - " 13 0.000 0.000 0.003 0.000 gradient.py:1528()\n", - " 3 0.000 0.000 0.001 0.000 :1522(_get_spec)\n", - " 1 0.000 0.000 0.000 0.000 arrayprint.py:1569(_array_repr_implementation)\n", - " 5 0.000 0.000 0.000 0.000 arrayprint.py:454()\n", - " 6 0.000 0.000 0.001 0.000 type.py:349(convert_variable)\n", - " 24 0.000 0.000 0.000 0.000 extra_ops.py:1556()\n", - " 19 0.000 0.000 0.000 0.000 :1()\n", - " 2 0.000 0.000 0.000 0.000 {method 'isoformat' of 'datetime.datetime' objects}\n", - " 24 0.000 0.000 0.000 0.000 math.py:489(local_sumsqr2dot)\n", - " 5 0.000 0.000 0.000 0.000 subtensor.py:1704(__str__)\n", - " 22 0.000 0.000 0.001 0.000 rewriting.py:1118(sanitize)\n", - " 3 0.000 0.000 0.000 0.000 rewriting.py:1823(add_requirements)\n", - " 18 0.000 0.000 0.000 0.000 :139()\n", - " 4 0.000 0.000 0.000 0.000 base_events.py:846(_call_soon)\n", - " 10 0.000 0.000 0.000 0.000 shape.py:633(__str__)\n", - " 29 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 3 0.000 0.000 0.000 0.000 traitlets.py:689(set)\n", - " 8 0.000 0.000 0.000 0.000 basic.py:4438(atleast_Nd)\n", - " 24 0.000 0.000 0.000 0.000 op.py:302(outer_mitmot)\n", - " 9 0.000 0.000 0.000 0.000 utils.py:216()\n", - " 12 0.000 0.000 0.000 0.000 op.py:337(inner_mitsot_outs)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _imp.is_builtin}\n", - " 9 0.000 0.000 0.000 0.000 basic.py:1508(c_code)\n", - " 3 0.000 0.000 0.000 0.000 types.py:536(ValueAttribute)\n", - " 19 0.000 0.000 0.000 0.000 {method 'co_positions' of 'code' objects}\n", - " 3 0.000 0.000 0.000 0.000 base_events.py:775(call_later)\n", - " 1 0.000 0.000 0.000 0.000 blas.py:1211(make_node)\n", - " 2 0.000 0.000 0.000 0.000 {method '__exit__' of 'sqlite3.Connection' objects}\n", - " 2 0.000 0.000 0.000 0.000 shape.py:457(infer_shape)\n", - " 24 0.000 0.000 0.000 0.000 blockwise.py:293()\n", - " 3 0.000 0.000 0.000 0.000 base_events.py:799(call_at)\n", - " 4 0.000 0.000 0.000 0.000 queue.py:115(empty)\n", - " 36 0.000 0.000 0.000 0.000 subtensor.py:669()\n", - " 18 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 basic.py:1290(FakeFunctionGraph)\n", - " 3 0.000 0.000 0.000 0.000 :177(_path_isabs)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:153(__next__)\n", - " 41 0.000 0.000 0.000 0.000 basic.py:2191(__init__)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:4222(prepare_node)\n", - " 12 0.000 0.000 0.000 0.000 elemwise.py:123()\n", - " 3 0.000 0.000 0.000 0.000 rewriting.py:946(add_requirements)\n", - " 1 0.000 0.000 0.000 0.000 session.py:690(serialize)\n", - " 3 0.000 0.000 0.018 0.006 basic.py:373(local_fill_to_alloc)\n", - " 2 0.000 0.000 0.000 0.000 type.py:879(vector)\n", - " 5 0.000 0.000 0.000 0.000 basic.py:4305(__init__)\n", - " 34 0.000 0.000 0.000 0.000 op.py:293(outer_seqs)\n", - " 3 0.000 0.000 0.000 0.000 :232(__init__)\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:20(_showwarnmsg_impl)\n", - " 40 0.000 0.000 0.000 0.000 types.py:1846(convert_function_input)\n", - " 12 0.000 0.000 0.000 0.000 op.py:307(inner_mitmot_outs)\n", - " 29 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 types.py:110(fgraph_updated_vars)\n", - " 3 0.000 0.000 0.006 0.002 variable.py:818(squeeze)\n", - " 3 0.000 0.000 0.000 0.000 :642(_get_cached)\n", - " 4 0.000 0.000 0.000 0.000 type.py:866(_validate_static_shape)\n", - " 3 0.000 0.000 0.000 0.000 functools.py:677(cache)\n", - " 1 0.000 0.000 0.010 0.010 session.py:754(send)\n", - " 1 0.000 0.000 0.010 0.010 iostream.py:616(_flush)\n", - " 40 0.000 0.000 0.000 0.000 basic.py:4324()\n", - " 79 0.000 0.000 0.000 0.000 gradient.py:1250(try_to_copy_if_needed)\n", - " 20 0.000 0.000 0.000 0.000 basic.py:1546()\n", - " 6 0.000 0.000 0.000 0.000 subtensor.py:2014(connection_pattern)\n", - " 4 0.000 0.000 0.000 0.000 encoder.py:183(encode)\n", - " 9 0.000 0.000 0.000 0.000 selector_events.py:740(_process_events)\n", - " 3 0.000 0.000 0.001 0.000 iostream.py:157(_handle_event)\n", - " 24 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 events.py:113(__init__)\n", - " 7 0.000 0.000 0.000 0.000 basic.py:202(__str__)\n", - " 6 0.000 0.000 0.000 0.000 blas_c.py:32(use_c_gemv)\n", - " 18 0.000 0.000 0.000 0.000 unify.py:59(__eq__)\n", - " 32 0.000 0.000 0.000 0.000 shape.py:1160()\n", - " 4 0.000 0.000 0.000 0.000 sort.py:180(infer_shape)\n", - " 28 0.000 0.000 0.000 0.000 rewriting.py:1762()\n", - " 45 0.000 0.000 0.000 0.000 shape.py:784()\n", - " 7 0.000 0.000 0.000 0.000 subtensor.py:161(is_full_slice)\n", - " 6 0.000 0.000 0.000 0.000 math.py:1302(local_sum_prod_of_mul_or_div)\n", - " 2 0.000 0.000 0.002 0.001 math.py:3535(sum)\n", - " 30 0.000 0.000 0.000 0.000 traceback.py:293(__init__)\n", - " 2 0.000 0.000 0.003 0.001 blas.py:129(_as_scalar)\n", - " 19 0.000 0.000 0.000 0.000 utils.py:240(__str__)\n", - " 30 0.000 0.000 0.000 0.000 linecache.py:184(lazycache)\n", - " 8 0.000 0.000 0.000 0.000 op.py:363(outer_sitsot_outs)\n", - " 3 0.000 0.000 0.000 0.000 traitlets.py:727(_cross_validate)\n", - " 71 0.000 0.000 0.000 0.000 shape.py:790(c_code_cache_version)\n", - " 3 0.000 0.000 0.000 0.000 shape.py:759(local_useless_expand_dims_in_reshape)\n", - " 51 0.000 0.000 0.000 0.000 basic.py:4380(do_constant_folding)\n", - " 40 0.000 0.000 0.000 0.000 types.py:1361(wrap_in)\n", - " 15 0.000 0.000 0.000 0.000 basic.py:1727(infer_shape)\n", - " 19 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 2 0.000 0.000 0.000 0.000 events.py:157(cancel)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:516(__exit__)\n", - " 72 0.000 0.000 0.000 0.000 subtensor.py:435(switch_neg_step)\n", - " 3 0.000 0.000 0.000 0.000 :416(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'copy' of '_hashlib.HMAC' objects}\n", - " 42 0.000 0.000 0.000 0.000 basic.py:441(index)\n", - " 4 0.000 0.000 0.000 0.000 linalg.py:970(slogdet_specialization)\n", - " 4 0.000 0.000 0.000 0.000 session.py:92(json_packer)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:2001(__init__)\n", - " 6 0.000 0.000 0.000 0.000 utils.py:786(inner_outputs)\n", - " 9 0.000 0.000 0.000 0.000 op.py:258(n_outer_inputs)\n", - " 3 0.000 0.000 0.000 0.000 :674(_check_name_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 types.py:90(infer_reuse_pattern)\n", - " 18 0.000 0.000 0.000 0.000 unify.py:29(eval_if_etuple)\n", - " 3 0.000 0.000 0.296 0.099 shape.py:732(add_requirements)\n", - " 40 0.000 0.000 0.000 0.000 op.py:359()\n", - " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3190(min)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:762(rewrite_det_blockdiag)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:3025(L_op)\n", - " 16 0.000 0.000 0.000 0.000 {method 'random' of '_random.Random' objects}\n", - " 1 0.000 0.000 0.001 0.001 basic.py:866(ones_like)\n", - " 3 0.000 0.000 0.000 0.000 :74(__new__)\n", - " 3 0.000 0.000 0.000 0.000 functools.py:504(lru_cache)\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:35(_formatwarnmsg_impl)\n", - " 28 0.000 0.000 0.000 0.000 op.py:308()\n", - " 2 0.000 0.000 0.000 0.000 {method 'set_result' of '_asyncio.Future' objects}\n", - " 9 0.000 0.000 0.001 0.000 :145(_path_stat)\n", - " 9 0.000 0.000 0.000 0.000 op.py:271(n_outer_outputs)\n", - " 3 0.000 0.000 0.000 0.000 :445(cb)\n", - " 3 0.000 0.000 9.261 3.087 basic.py:122(__call__)\n", - " 31 0.000 0.000 0.000 0.000 traceback.py:445(extended_frame_gen)\n", - " 2 0.000 0.000 0.001 0.001 tempfile.py:577(opener)\n", - " 2 0.000 0.000 0.000 0.000 subtensor.py:1048(__str__)\n", - " 4 0.000 0.000 0.000 0.000 shape.py:1192(local_specify_shape_lift)\n", - " 2 0.000 0.000 0.000 0.000 shape.py:570()\n", - " 18 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 3 0.000 0.000 0.000 0.000 traitlets.py:708(__set__)\n", - " 36 0.000 0.000 0.000 0.000 configparser.py:206()\n", - " 4 0.000 0.000 0.000 0.000 features.py:701(clone)\n", - " 40 0.000 0.000 0.000 0.000 basic.py:4399()\n", - " 2 0.000 0.000 0.000 0.000 slinalg.py:1008(inplace_on_inputs)\n", - " 3 0.000 0.000 0.000 0.000 :162(__enter__)\n", - " 3 0.000 0.000 0.000 0.000 elemwise.py:542(elemwise_max_operands_fct)\n", - " 3 0.000 0.000 0.000 0.000 :730(_validate_timestamp_pyc)\n", - " 2 0.000 0.000 0.000 0.000 jsonutil.py:107(json_default)\n", - " 45 0.000 0.000 0.000 0.000 subtensor.py:1311(helper_c_code_cache_version)\n", - " 3 0.000 0.000 0.000 0.000 :82(remove)\n", - " 1 0.000 0.000 0.000 0.000 session.py:649(msg)\n", - " 12 0.000 0.000 0.000 0.000 basic.py:1898()\n", - " 20 0.000 0.000 0.000 0.000 utils.py:630()\n", - " 35 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 traceback.py:431(extract)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:2661(L_op)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:2082(output_types)\n", - " 34 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 :420(__exit__)\n", - " 1 0.000 0.000 0.003 0.003 nlinalg.py:122(grad)\n", - " 30 0.000 0.000 0.000 0.000 op.py:299()\n", - " 3 0.000 0.000 0.000 0.000 types.py:578(ContainerAttribute)\n", - " 1 0.000 0.000 0.000 0.000 traitlets.py:1527(_notify_observers)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:1038(upgrade_to_float)\n", - " 4 0.000 0.000 0.000 0.000 math.py:3488(__init__)\n", - " 3 0.000 0.000 0.000 0.000 elemwise.py:552(add_requirements)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:114(_sanitize_params)\n", - " 1 0.000 0.000 0.000 0.000 session.py:675(sign)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:718(_rotate_buffers)\n", - " 3 0.000 0.000 0.000 0.000 :48(_new_module)\n", - " 1 0.000 0.000 0.010 0.010 iostream.py:271(send_multipart)\n", - " 1 0.000 0.000 0.000 0.000 queues.py:225(get)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:833(rewrite_det_kronecker)\n", - " 3 0.000 0.000 0.000 0.000 shape.py:884(local_useless_reshape)\n", - " 2 0.000 0.000 0.000 0.000 base_events.py:457(create_future)\n", - " 15 0.000 0.000 0.000 0.000 utils.py:213()\n", - " 10 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 typing.py:1374(__instancecheck__)\n", - " 2 0.000 0.000 0.000 0.000 type.py:99(filter_inplace)\n", - " 8 0.000 0.000 0.000 0.000 basic.py:4391(output_types)\n", - " 6 0.000 0.000 0.001 0.000 shape.py:409()\n", - " 6 0.000 0.000 0.000 0.000 __init__.py:1764(isEnabledFor)\n", - " 4 0.000 0.000 0.000 0.000 rewriting.py:75(get_root_A)\n", - " 20 0.000 0.000 0.000 0.000 basic.py:1397(infer_shape)\n", - " 20 0.000 0.000 0.000 0.000 basic.py:1487(default_query)\n", - " 12 0.000 0.000 0.000 0.000 blas.py:230(infer_shape)\n", - " 22 0.000 0.000 0.000 0.000 utils.py:312(__init__)\n", - " 9 0.000 0.000 0.000 0.000 elemwise.py:1415(infer_shape)\n", - " 4 0.000 0.000 0.000 0.000 typing.py:1665(__subclasscheck__)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:812(__repr__)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:2526(grad)\n", - " 15 0.000 0.000 0.000 0.000 :491(_verbose_message)\n", - " 3 0.000 0.000 0.000 0.000 vm.py:842(accept)\n", - " 30 0.000 0.000 0.000 0.000 op.py:315()\n", - " 12 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 gradient.py:1559(_float_ones_like)\n", - " 12 0.000 0.000 0.000 0.000 blas.py:304(infer_shape)\n", - " 18 0.000 0.000 0.000 0.000 op.py:2607()\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.BufferedRandom' objects}\n", - " 18 0.000 0.000 0.000 0.000 {built-in method _imp.acquire_lock}\n", - " 3 0.000 0.000 0.000 0.000 :823(keys)\n", - " 1 0.000 0.000 0.000 0.000 traitlets.py:1512(_notify_trait)\n", - " 31 0.000 0.000 0.000 0.000 op.py:2466()\n", - " 1 0.000 0.000 0.000 0.000 session.py:600(msg_id)\n", - " 1 0.000 0.000 0.005 0.005 nlinalg.py:225(grad)\n", - " 6 0.000 0.000 0.000 0.000 functional.py:8(vectorize)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:510(__enter__)\n", - " 6 0.000 0.000 0.000 0.000 math.py:1828(local_opt_alloc)\n", - " 3 0.000 0.000 0.006 0.002 variable.py:777(zeros_like)\n", - " 3 0.000 0.000 0.000 0.000 destroyhandler.py:407(unpickle)\n", - " 9 0.000 0.000 0.000 0.000 basic.py:1826(c_code)\n", - " 63 0.000 0.000 0.000 0.000 basic.py:702(owner)\n", - " 2 0.000 0.000 0.000 0.000 utils.py:245(__str__)\n", - " 2 0.000 0.000 0.000 0.000 features.py:946(on_attach)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:2083()\n", - " 6 0.000 0.000 0.000 0.000 utils.py:219()\n", - " 27 0.000 0.000 0.000 0.000 op.py:406()\n", - " 12 0.000 0.000 0.000 0.000 :1226(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:313(gettempdir)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:2718(c_code)\n", - " 30 0.000 0.000 0.000 0.000 basic.py:1066(same_out)\n", - " 6 0.000 0.000 0.000 0.000 math.py:1389(local_sum_of_neg_to_neg_of_sum)\n", - " 7 0.000 0.000 0.000 0.000 {built-in method numpy.lib.array_utils.normalize_axis_index}\n", - " 3 0.000 0.000 0.001 0.000 :1551(find_spec)\n", - " 3 0.000 0.000 0.000 0.000 :67(_relax_case)\n", - " 2 0.000 0.000 0.000 0.000 threading.py:303(__enter__)\n", - " 24 0.000 0.000 0.000 0.000 basic.py:4325()\n", - " 6 0.000 0.000 0.000 0.000 subtensor.py:2173(infer_shape)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method nt._path_splitroot}\n", - " 18 0.000 0.000 0.000 0.000 {built-in method _imp.release_lock}\n", - " 3 0.000 0.000 0.000 0.000 :1233(path_stats)\n", - " 1 0.000 0.000 0.000 0.000 traitlets.py:2635(validate)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:587(_schedule_in_thread)\n", - " 38 0.000 0.000 0.000 0.000 basic.py:818(clone)\n", - " 8 0.000 0.000 0.000 0.000 basic.py:1770(warn_inplace)\n", - " 28 0.000 0.000 0.000 0.000 op.py:338()\n", - " 21 0.000 0.000 0.000 0.000 op.py:867()\n", - " 1 0.000 0.000 0.000 0.000 session.py:645(msg_header)\n", - " 2 0.000 0.000 0.001 0.001 asyncio.py:206(_handle_events)\n", - " 12 0.000 0.000 0.000 0.000 arrayprint.py:1046()\n", - " 2 0.000 0.000 0.000 0.000 basic.py:181(clone)\n", - " 1 0.000 0.000 0.000 0.000 type.py:419(__repr__)\n", - " 6 0.000 0.000 0.000 0.000 :632(cached)\n", - " 1 0.000 0.000 0.001 0.001 traceback.py:249(extract_stack)\n", - " 2 0.000 0.000 0.000 0.000 futures.py:310(_set_result_unless_cancelled)\n", - " 1 0.000 0.000 0.000 0.000 {method 'hexdigest' of '_hashlib.HMAC' objects}\n", - " 1 0.000 0.000 0.000 0.000 hmac.py:122(copy)\n", - " 2 0.000 0.000 0.000 0.000 traitlets.py:3474(validate)\n", - " 16 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 3 0.000 0.000 0.000 0.000 base_events.py:817(call_soon)\n", - " 2 0.000 0.000 0.002 0.001 variable.py:671(sum)\n", - " 13 0.000 0.000 0.000 0.000 op.py:1386()\n", - " 3 0.000 0.000 0.000 0.000 :164(_path_isfile)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:483(__init__)\n", - " 4 0.000 0.000 0.000 0.000 shape.py:416()\n", - " 3 0.000 0.000 0.000 0.000 :79(__init__)\n", - " 3 0.000 0.000 0.000 0.000 :1500(_path_importer_cache)\n", - " 1 0.000 0.000 0.000 0.000 shape.py:708(grad)\n", - " 2 0.000 0.000 0.004 0.002 math.py:3403(outer)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method nt.getpid}\n", - " 3 0.000 0.000 0.000 0.000 :155(_path_is_mode_type)\n", - " 2 0.000 0.000 0.002 0.001 math.py:328(makeKeepDims)\n", - " 9 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 1 0.000 0.000 0.000 0.000 futures.py:391(_call_set_state)\n", - " 2 0.000 0.000 0.000 0.000 mode.py:309(__init__)\n", - " 3 0.000 0.000 0.000 0.000 mode.py:137(apply)\n", - " 24 0.000 0.000 0.000 0.000 subtensor.py:1000()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 1 0.000 0.000 0.000 0.000 base_events.py:870(call_soon_threadsafe)\n", - " 1 0.000 0.000 0.000 0.000 asyncio.py:216(call_at)\n", - " 20 0.000 0.000 0.000 0.000 io.py:240(__init__)\n", - " 19 0.000 0.000 0.000 0.000 basic.py:4374(infer_shape)\n", - " 2 0.000 0.000 0.000 0.000 math.py:3528(clone)\n", - " 5 0.000 0.000 0.000 0.000 arrayprint.py:1297(__call__)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:874(__neg__)\n", - " 2 0.000 0.000 0.000 0.000 traitlets.py:3624(validate_elements)\n", - " 1 0.000 0.000 0.000 0.000 ioloop.py:604(call_later)\n", - " 1 0.000 0.000 0.000 0.000 arrayprint.py:1495(dtype_is_implied)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:1290(L_op)\n", - " 10 0.000 0.000 0.000 0.000 type.py:873()\n", - " 2 0.000 0.000 0.000 0.000 elemwise.py:1257(_output_dtype)\n", - " 3 0.000 0.000 0.000 0.000 :873(__iter__)\n", - " 12 0.000 0.000 0.000 0.000 arrayprint.py:1047()\n", - " 4 0.000 0.000 0.000 0.000 utils.py:797(outer_outputs)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _imp.find_frozen}\n", - " 4 0.000 0.000 0.000 0.000 {method 'update' of '_hashlib.HMAC' objects}\n", - " 3 0.000 0.000 0.000 0.000 :1128(find_spec)\n", - " 12 0.000 0.000 0.000 0.000 :1222(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 functools.py:66(wraps)\n", - " 4 0.000 0.000 0.000 0.000 zmqstream.py:532(sending)\n", - " 2 0.000 0.000 0.000 0.000 arrayprint.py:1678(_guarded_repr_or_str)\n", - " 1 0.000 0.000 0.001 0.001 rewriting.py:22(decompose_A)\n", - " 18 0.000 0.000 0.000 0.000 rewriting.py:918()\n", - " 7 0.000 0.000 0.000 0.000 op.py:2417(get_inp_idx)\n", - " 4 0.000 0.000 0.000 0.000 utils.py:247()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _heapq.heappush}\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _imp._fix_co_filename}\n", - " 4 0.000 0.000 0.000 0.000 hmac.py:117(update)\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:213(_is_master_process)\n", - " 4 0.000 0.000 0.000 0.000 blas_c.py:15(use_c_ger)\n", - " 3 0.000 0.000 0.001 0.000 variable.py:614(copy)\n", - " 4 0.000 0.000 0.000 0.000 blas.py:1212()\n", - " 1 0.000 0.000 0.000 0.000 session.py:198(utcnow)\n", - " 1 0.000 0.000 0.000 0.000 queues.py:256(get_nowait)\n", - " 2 0.000 0.000 0.000 0.000 elemwise.py:1050(local_careduce_fusion)\n", - " 15 0.000 0.000 0.000 0.000 :15(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 op.py:378(inner_nitsot_outs)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 6 0.000 0.000 0.000 0.000 typing.py:1443(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:497(func_wrapper)\n", - " 2 0.000 0.000 0.000 0.000 traitlets.py:2304(validate)\n", - " 1 0.000 0.000 0.000 0.000 session.py:281(extract_header)\n", - " 1 0.000 0.000 0.001 0.001 variable.py:780(ones_like)\n", - " 11 0.000 0.000 0.000 0.000 rewriting.py:123()\n", - " 3 0.000 0.000 0.000 0.000 :645(parent)\n", - " 1 0.000 0.000 0.000 0.000 math.py:2321(local_abs_lift)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _heapq.heappop}\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:142(rng)\n", - " 2 0.000 0.000 0.000 0.000 ioloop.py:549(time)\n", - " 1 0.000 0.000 0.000 0.000 shape.py:844(reshape)\n", - " 6 0.000 0.000 0.000 0.000 elemwise.py:172()\n", - " 1 0.000 0.000 0.000 0.000 zmqstream.py:684()\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:85(_infer_return_type)\n", - " 3 0.000 0.000 0.000 0.000 :190(_path_abspath)\n", - " 1 0.000 0.000 0.000 0.000 session.py:272(msg_header)\n", - " 8 0.000 0.000 0.000 0.000 __init__.py:308()\n", - " 4 0.000 0.000 0.000 0.000 raise_op.py:68(__hash__)\n", - " 3 0.000 0.000 0.000 0.000 elemwise.py:1215()\n", - " 8 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:505(parent_header)\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:138(_event_pipe)\n", - " 6 0.000 0.000 0.000 0.000 slinalg.py:629(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 8 0.000 0.000 0.000 0.000 {method 'is_done' of '_thread._ThreadHandle' objects}\n", - " 1 0.000 0.000 0.000 0.000 history.py:1016(_writeout_output_cache)\n", - " 2 0.000 0.000 0.000 0.000 :855(fsdecode)\n", - " 3 0.000 0.000 0.000 0.000 __init__.py:101(find_spec)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:577(_schedule_flush)\n", - " 3 0.000 0.000 0.000 0.000 vm.py:908(accept_var_updates)\n", - " 3 0.000 0.000 0.000 0.000 :982(find_spec)\n", - " 1 0.000 0.000 0.000 0.000 contextlib.py:145(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:118(_formatwarnmsg)\n", - " 4 0.000 0.000 0.000 0.000 queue.py:267(_qsize)\n", - " 6 0.000 0.000 0.000 0.000 arrayprint.py:952(_none_or_positive_arg)\n", - " 2 0.000 0.000 0.000 0.000 mode.py:340(__setstate__)\n", - " 9 0.000 0.000 0.000 0.000 elemwise.py:1211()\n", - " 2 0.000 0.000 0.000 0.000 events.py:73(cancel)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:337(_invoke_callbacks)\n", - " 1 0.000 0.000 0.000 0.000 hmac.py:161(hexdigest)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:1247()\n", - " 1 0.000 0.000 0.000 0.000 nlinalg.py:168(matrix_dot)\n", - " 3 0.000 0.000 0.000 0.000 sort.py:17(_parse_sort_args)\n", - " 3 0.000 0.000 0.000 0.000 __init__.py:1256(__len__)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _weakref._remove_dead_weakref}\n", - " 4 0.000 0.000 0.000 0.000 encoder.py:105(__init__)\n", - " 1 0.000 0.000 0.000 0.000 threading.py:428(notify_all)\n", - " 2 0.000 0.000 0.000 0.000 utils.py:330(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'indices' of 'slice' objects}\n", - " 1 0.000 0.000 0.000 0.000 traitlets.py:1523(notify_change)\n", - " 7 0.000 0.000 0.000 0.000 zmqstream.py:528(receiving)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:725(_hooks)\n", - " 1 0.000 0.000 0.003 0.003 math.py:3497(L_op)\n", - " 1 0.000 0.000 0.000 0.000 threading.py:398(notify)\n", - " 3 0.000 0.000 0.000 0.000 linecache.py:48(_getline_from_code)\n", - " 6 0.000 0.000 0.000 0.000 basic.py:170(allow_gc)\n", - " 2 0.000 0.000 0.000 0.000 {method '__enter__' of '_io._IOBase' objects}\n", - " 14 0.000 0.000 0.000 0.000 op.py:316()\n", - " 3 0.000 0.000 0.000 0.000 :173(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 features.py:943(__init__)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:922(__truediv__)\n", - " 5 0.000 0.000 0.000 0.000 elemwise.py:1347()\n", - " 12 0.000 0.000 0.000 0.000 subtensor.py:2015()\n", - " 5 0.000 0.000 0.000 0.000 op.py:1363()\n", - " 3 0.000 0.000 0.000 0.000 :599(__init__)\n", - " 2 0.000 0.000 0.000 0.000 jsonutil.py:38(_ensure_tzinfo)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:1250()\n", - " 8 0.000 0.000 0.000 0.000 types.py:275()\n", - " 8 0.000 0.000 0.000 0.000 nlinalg.py:233(__str__)\n", - " 6 0.000 0.000 0.000 0.000 math.py:892(tracks)\n", - " 1 0.000 0.000 0.000 0.000 shape.py:791(local_reshape_chain)\n", - " 3 0.000 0.000 0.000 0.000 sort.py:160(__init__)\n", - " 3 0.000 0.000 0.000 0.000 linecache.py:57(_getlines_from_code)\n", - " 2 0.000 0.000 0.000 0.000 traitlets.py:3486(validate_elements)\n", - " 2 0.000 0.000 0.000 0.000 raise_op.py:59(__eq__)\n", - " 4 0.000 0.000 0.000 0.000 blas.py:133()\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:97(_showwarnmsg)\n", - " 7 0.000 0.000 0.000 0.000 base_events.py:548(_check_closed)\n", - " 12 0.000 0.000 0.000 0.000 base_events.py:2052(get_debug)\n", - " 4 0.000 0.000 0.000 0.000 rewriting.py:1125(while_scan_merge_subtensor_last_element)\n", - " 8 0.000 0.000 0.000 0.000 basic.py:104()\n", - " 5 0.000 0.000 0.000 0.000 basic.py:629(infer_shape)\n", - " 6 0.000 0.000 0.000 0.000 raise_op.py:170(infer_shape)\n", - " 7 0.000 0.000 0.000 0.000 subtensor.py:2097()\n", - " 2 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedRandom' objects}\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:216(_check_mp_mode)\n", - " 1 0.000 0.000 0.000 0.000 iostream.py:550(_is_master_process)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:919(__mul__)\n", - " 3 0.000 0.000 0.000 0.000 op.py:2440(get_out_idx)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method math.isnan}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 3 0.000 0.000 0.000 0.000 :412(__init__)\n", - " 1 0.000 0.000 0.000 0.000 threading.py:306(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 base_events.py:1939(_add_callback)\n", - " 4 0.000 0.000 0.000 0.000 traceback.py:329(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:691(equals)\n", - " 2 0.000 0.000 0.000 0.000 subtensor_lift.py:193()\n", - " 3 0.000 0.000 0.000 0.000 op.py:1349()\n", - " 10 0.000 0.000 0.000 0.000 utils.py:631()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _asyncio.get_running_loop}\n", - " 1 0.000 0.000 0.000 0.000 threading.py:318(_is_owned)\n", - " 4 0.000 0.000 0.000 0.000 shape.py:705(connection_pattern)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:4383(connection_pattern)\n", - " 3 0.000 0.000 0.000 0.000 blas.py:152(__str__)\n", - " 3 0.000 0.000 0.000 0.000 :1184(__init__)\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:425(__init__)\n", - " 3 0.000 0.000 0.000 0.000 linecache.py:54(_make_key)\n", - " 2 0.000 0.000 0.000 0.000 blas.py:822(__str__)\n", - " 8 0.000 0.000 0.000 0.000 threading.py:605(is_set)\n", - " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3185(_min_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 types.py:472()\n", - " 3 0.000 0.000 0.000 0.000 shape.py:735(apply)\n", - " 1 0.000 0.000 0.000 0.000 op.py:341(outer_mitsot_outs)\n", - " 3 0.000 0.000 0.000 0.000 op.py:2992()\n", - " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 1 0.000 0.000 0.000 0.000 threading.py:312(_release_save)\n", - " 2 0.000 0.000 0.000 0.000 tz.py:74(utcoffset)\n", - " 1 0.000 0.000 0.000 0.000 queues.py:173(qsize)\n", - " 4 0.000 0.000 0.000 0.000 op.py:606(inplace_on_inputs)\n", - " 6 0.000 0.000 0.000 0.000 subtensor.py:895(extract_const)\n", - " 1 0.000 0.000 0.000 0.000 blas.py:1245(infer_shape)\n", - " 3 0.000 0.000 0.000 0.000 {method 'cancelled' of '_asyncio.Future' objects}\n", - " 5 0.000 0.000 0.000 0.000 fromnumeric.py:3047(_max_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 basic.py:1471(tracks)\n", - " 3 0.000 0.000 0.000 0.000 subtensor_lift.py:204()\n", - " 1 0.000 0.000 0.000 0.000 rewriting.py:1102(select_min)\n", - " 1 0.000 0.000 0.000 0.000 slinalg.py:662(__init__)\n", - " 3 0.000 0.000 0.000 0.000 op.py:2993()\n", - " 1 0.000 0.000 0.000 0.000 tmp6jqq5u7h:1()\n", - " 1 0.000 0.000 0.000 0.000 tmpbf7ngv9i:1()\n", - " 3 0.000 0.000 0.000 0.000 :653(has_location)\n", - " 3 0.000 0.000 0.000 0.000 :1209(get_filename)\n", - " 1 0.000 0.000 0.000 0.000 math.py:1621(investigate_if_shape)\n", - " 3 0.000 0.000 0.000 0.000 configparser.py:372(default)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:312(nin)\n", - " 1 0.000 0.000 0.000 0.000 shape.py:628(__init__)\n", - " 1 0.000 0.000 0.000 0.000 slinalg.py:681(infer_shape)\n", - " 3 0.000 0.000 0.000 0.000 rewriting.py:133()\n", - " 5 0.000 0.000 0.000 0.000 op.py:2995()\n", - " 2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 base_events.py:1949(_timer_handle_cancelled)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:440(__init__)\n", - " 1 0.000 0.000 0.000 0.000 slinalg.py:685(inplace_on_inputs)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 3 0.000 0.000 0.000 0.000 :1017(create_module)\n", - " 3 0.000 0.000 0.000 0.000 :158(__init__)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:229(_get_candidate_names)\n", - " 1 0.000 0.000 0.000 0.000 queues.py:322(_consume_expired)\n", - " 1 0.000 0.000 0.000 0.000 blas.py:816()\n", - " 1 0.000 0.000 0.000 0.000 nlinalg.py:230(infer_shape)\n", - " 2 0.000 0.000 0.000 0.000 iostream.py:255(closed)\n", - " 1 0.000 0.000 0.000 0.000 basic.py:762(local_remove_all_assert)\n", - " 2 0.000 0.000 0.000 0.000 shape.py:91(connection_pattern)\n", - " 1 0.000 0.000 0.000 0.000 events.py:129(__lt__)\n", - " 2 0.000 0.000 0.000 0.000 tempfile.py:301(_gettempdir)\n", - " 2 0.000 0.000 0.000 0.000 op.py:2878()\n", - " 1 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 traitlets.py:2558(_validate_bounds)\n", - " 1 0.000 0.000 0.000 0.000 nlinalg.py:161(infer_shape)\n", - " 1 0.000 0.000 0.000 0.000 subtensor_lift.py:213()\n", - " 2 0.000 0.000 0.000 0.000 op.py:379()\n", - " 1 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 base_events.py:752(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 hmac.py:139(_current)\n", - " 1 0.000 0.000 0.000 0.000 displaypub.py:150(is_publishing)\n", - " 1 0.000 0.000 0.000 0.000 history.py:1065(hold)\n", - " 1 0.000 0.000 0.000 0.000 queues.py:59(_set_timeout)\n", - " 1 0.000 0.000 0.000 0.000 utils.py:379()\n", - " 1 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 displayhook.py:118(is_active)" - ] } ], "source": [ - "%%prun\n", "results = benchmark_kalman_gradients(loss, obs_data, a0, P0, T, Z, R, H, Q)" ] }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 29, "id": "a413c8e9", "metadata": {}, "outputs": [ @@ -3139,7 +1091,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.47910417499952024})\n" + "defaultdict(, {'exec_time': 0.11510749500157547})\n" ] } ], @@ -3149,7 +1101,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 30, "id": "d35b98d6", "metadata": {}, "outputs": [ @@ -3168,7 +1120,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 31, "id": "539c18c2", "metadata": {}, "outputs": [ @@ -3176,7 +1128,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'exec_time': 0.585526670049876})\n" + "defaultdict(, {'exec_time': 0.18277070000040113})\n" ] } ], @@ -3186,7 +1138,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "id": "1e633e75", "metadata": {}, "outputs": [], @@ -3196,7 +1148,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "id": "7118dfec", "metadata": {}, "outputs": [ @@ -3204,7 +1156,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "defaultdict(, {'Forward pass': 0.05328435508999973, 'Backprop': 0.013503129919990897})\n" + "defaultdict(, {'Forward pass': 0.016379594999978053, 'Backprop': 0.0034159099999897078})\n" ] } ], @@ -3230,7 +1182,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "id": "fbae0189", "metadata": {}, "outputs": [ @@ -3277,7 +1229,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "id": "c3a114b2", "metadata": {}, "outputs": [ @@ -3297,7 +1249,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": null, "id": "867d5e2f", "metadata": {}, "outputs": [ @@ -3336,7 +1288,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": null, "id": "25f0a57b", "metadata": {}, "outputs": [