|
23 | 23 | }, |
24 | 24 | { |
25 | 25 | "cell_type": "code", |
26 | | - "execution_count": 20, |
| 26 | + "execution_count": 1, |
27 | 27 | "id": "50f420c4", |
28 | 28 | "metadata": {}, |
29 | 29 | "outputs": [], |
|
37 | 37 | }, |
38 | 38 | { |
39 | 39 | "cell_type": "code", |
40 | | - "execution_count": 29, |
| 40 | + "execution_count": 8, |
41 | 41 | "id": "1567a968-7a03-4dda-ac6d-2dfbecbde882", |
42 | 42 | "metadata": {}, |
43 | 43 | "outputs": [], |
|
81 | 81 | " with raises(ValueError):\n", |
82 | 82 | " _ = havok.r\n", |
83 | 83 | "\n", |
84 | | - "def test_snapshots_1():\n", |
| 84 | + "def test_hankel_1():\n", |
85 | 85 | " \"\"\"\n", |
86 | 86 | " Test\n", |
87 | 87 | " \"\"\"\n", |
88 | | - " dummy_data = np.array([1, 2, 3, 4])\n", |
89 | | - " dummy_time = np.array([1, 2, 3, 4])\n", |
90 | | - "\n", |
91 | | - " # havok = HAVOK(svd_rank=-1, delays=1).fit(dummy_data, dummy_time)\n", |
92 | | - " # assert_equal(\n", |
93 | | - " # havok.ho_snapshots, np.array([[1, 2, 3, 4],])\n", |
94 | | - " # )\n", |
95 | | - " havok = HAVOK(svd_rank=-1, delays=2).fit(dummy_data, dummy_time)\n", |
96 | | - " assert_equal(\n", |
97 | | - " havok.ho_snapshots, np.array([[1, 2, 3], [2, 3, 4]])\n", |
98 | | - " )\n", |
99 | | - " havok = HAVOK(svd_rank=-1, delays=3).fit(dummy_data, dummy_time)\n", |
100 | | - " assert_equal(\n", |
101 | | - " havok.ho_snapshots, np.array([[1, 2], [2, 3], [3, 4]])\n", |
102 | | - " )\n", |
103 | | - " havok = HAVOK(svd_rank=-1, delays=4).fit(dummy_data, dummy_time)\n", |
104 | | - " assert_equal(\n", |
105 | | - " havok.ho_snapshots, np.array([[1,], [2,], [3,], [4,]])\n", |
106 | | - " )\n", |
| 88 | + " dummy_data = np.array([[1, 2, 3, 4]])\n", |
| 89 | + "\n", |
| 90 | + " havok = HAVOK(delays=1)\n", |
| 91 | + " assert_equal(havok.hankel(dummy_data), np.array([[1, 2, 3, 4],]))\n", |
| 92 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 93 | + "\n", |
| 94 | + " havok = HAVOK(delays=2)\n", |
| 95 | + " assert_equal(havok.hankel(dummy_data), np.array([[1, 2, 3], [2, 3, 4]]))\n", |
| 96 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 97 | + "\n", |
| 98 | + " havok = HAVOK(delays=3)\n", |
| 99 | + " assert_equal(havok.hankel(dummy_data), np.array([[1, 2], [2, 3], [3, 4]]))\n", |
| 100 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 101 | + "\n", |
| 102 | + " havok = HAVOK(delays=4)\n", |
| 103 | + " assert_equal(havok.hankel(dummy_data), np.array([[1,], [2,], [3,], [4,]]))\n", |
| 104 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 105 | + "\n", |
| 106 | + " with raises(ValueError):\n", |
| 107 | + " havok = HAVOK(delays=5)\n", |
| 108 | + " havok.hankel(dummy_data)\n", |
| 109 | + "\n", |
| 110 | + "def test_hankel_2():\n", |
| 111 | + " \"\"\"\n", |
| 112 | + " Test\n", |
| 113 | + " \"\"\"\n", |
| 114 | + " dummy_data = np.array([[1, 2, 3], [4, 5, 6]])\n", |
| 115 | + " H2 = np.array([[1, 2], [4, 5], [2, 3], [5, 6]])\n", |
| 116 | + " H3 = np.array([[1, 4, 2, 5, 3, 6]]).T\n", |
| 117 | + "\n", |
| 118 | + " havok = HAVOK(delays=1)\n", |
| 119 | + " assert_equal(havok.hankel(dummy_data), dummy_data)\n", |
| 120 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 121 | + "\n", |
| 122 | + " havok = HAVOK(delays=2)\n", |
| 123 | + " assert_equal(havok.hankel(dummy_data), H2)\n", |
| 124 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 125 | + "\n", |
| 126 | + " havok = HAVOK(delays=3)\n", |
| 127 | + " assert_equal(havok.hankel(dummy_data), H3)\n", |
| 128 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 129 | + "\n", |
| 130 | + " with raises(ValueError):\n", |
| 131 | + " havok = HAVOK(delays=4)\n", |
| 132 | + " havok.hankel(dummy_data)\n", |
| 133 | + "\n", |
| 134 | + "def test_hankel_3():\n", |
| 135 | + " \"\"\"\n", |
| 136 | + " Test\n", |
| 137 | + " \"\"\"\n", |
| 138 | + " dummy_data = np.array([[1, 2, 3, 4, 5, 6]])\n", |
| 139 | + " H2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])\n", |
| 140 | + " H3 = np.array([[1, 2], [3, 4], [5, 6]])\n", |
| 141 | + "\n", |
| 142 | + " # If only 1 delay is requested, the lag won't matter.\n", |
| 143 | + " havok = HAVOK(delays=1, lag=2)\n", |
| 144 | + " assert_equal(havok.hankel(dummy_data), dummy_data)\n", |
| 145 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 146 | + "\n", |
| 147 | + " havok = HAVOK(delays=2, lag=2)\n", |
| 148 | + " assert_equal(havok.hankel(dummy_data), H2)\n", |
| 149 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 150 | + "\n", |
| 151 | + " havok = HAVOK(delays=3, lag=3)\n", |
| 152 | + " assert_equal(havok.hankel(dummy_data), H3)\n", |
| 153 | + " assert_equal(havok.dehankel(havok.hankel(dummy_data)), dummy_data)\n", |
| 154 | + "\n", |
107 | 155 | " with raises(ValueError):\n", |
108 | | - " havok = HAVOK(svd_rank=-1, delays=5).fit(dummy_data, dummy_time)" |
| 156 | + " havok = HAVOK(delays=2, lag=2)\n", |
| 157 | + " havok.hankel(dummy_data)" |
109 | 158 | ] |
110 | 159 | }, |
111 | 160 | { |
112 | 161 | "cell_type": "code", |
113 | | - "execution_count": 30, |
| 162 | + "execution_count": 9, |
114 | 163 | "id": "5e5a0b0b-68c0-44b6-982b-83e11400d4f6", |
115 | 164 | "metadata": {}, |
116 | 165 | "outputs": [ |
117 | 166 | { |
118 | | - "ename": "IndexError", |
119 | | - "evalue": "index 2 is out of bounds for axis 1 with size 2", |
| 167 | + "ename": "AssertionError", |
| 168 | + "evalue": "\nArrays are not equal\n\n(shapes (1, 5), (1, 6) mismatch)\n x: array([[1., 2., 3., 4., 6.]])\n y: array([[1, 2, 3, 4, 5, 6]])", |
120 | 169 | "output_type": "error", |
121 | 170 | "traceback": [ |
122 | 171 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
123 | | - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", |
124 | | - "Cell \u001b[0;32mIn[30], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m test_error_fitted()\n\u001b[0;32m----> 2\u001b[0m \u001b[43mtest_snapshots_1\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", |
125 | | - "Cell \u001b[0;32mIn[29], line 55\u001b[0m, in \u001b[0;36mtest_snapshots_1\u001b[0;34m()\u001b[0m\n\u001b[1;32m 51\u001b[0m havok \u001b[38;5;241m=\u001b[39m HAVOK(svd_rank\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, delays\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\u001b[38;5;241m.\u001b[39mfit(dummy_data, dummy_time)\n\u001b[1;32m 52\u001b[0m assert_equal(\n\u001b[1;32m 53\u001b[0m havok\u001b[38;5;241m.\u001b[39mho_snapshots, np\u001b[38;5;241m.\u001b[39marray([[\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m3\u001b[39m], [\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m4\u001b[39m]])\n\u001b[1;32m 54\u001b[0m )\n\u001b[0;32m---> 55\u001b[0m havok \u001b[38;5;241m=\u001b[39m \u001b[43mHAVOK\u001b[49m\u001b[43m(\u001b[49m\u001b[43msvd_rank\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdelays\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdummy_data\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdummy_time\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 56\u001b[0m assert_equal(\n\u001b[1;32m 57\u001b[0m havok\u001b[38;5;241m.\u001b[39mho_snapshots, np\u001b[38;5;241m.\u001b[39marray([[\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m], [\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m3\u001b[39m], [\u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m4\u001b[39m]])\n\u001b[1;32m 58\u001b[0m )\n\u001b[1;32m 59\u001b[0m havok \u001b[38;5;241m=\u001b[39m HAVOK(svd_rank\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, delays\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m)\u001b[38;5;241m.\u001b[39mfit(dummy_data, dummy_time)\n", |
126 | | - "File \u001b[0;32m~/Desktop/PyDMD/PyDMD/pydmd/havok.py:348\u001b[0m, in \u001b[0;36mHAVOK.fit\u001b[0;34m(self, X, t)\u001b[0m\n\u001b[1;32m 346\u001b[0m U, s, V \u001b[38;5;241m=\u001b[39m compute_svd(hankel_matrix, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_svd_rank)\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_r \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(s)\n\u001b[0;32m--> 348\u001b[0m V_dot \u001b[38;5;241m=\u001b[39m \u001b[43mdifferentiate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mV\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mT\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdt\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mT\n\u001b[1;32m 350\u001b[0m \u001b[38;5;66;03m# Generate an error if too few HAVOK embeddings are being used.\u001b[39;00m\n\u001b[1;32m 351\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_r \u001b[38;5;241m<\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_chaos \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m:\n", |
127 | | - "File \u001b[0;32m~/Desktop/PyDMD/PyDMD/pydmd/utils.py:238\u001b[0m, in \u001b[0;36mdifferentiate\u001b[0;34m(X, dt)\u001b[0m\n\u001b[1;32m 236\u001b[0m X_prime \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mempty(X\u001b[38;5;241m.\u001b[39mshape)\n\u001b[1;32m 237\u001b[0m X_prime[:, \u001b[38;5;241m1\u001b[39m:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m=\u001b[39m (X[:, \u001b[38;5;241m2\u001b[39m:] \u001b[38;5;241m-\u001b[39m X[:, :\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m]) \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m dt)\n\u001b[0;32m--> 238\u001b[0m X_prime[:, \u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m=\u001b[39m (\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m3\u001b[39m \u001b[38;5;241m*\u001b[39m X[:, \u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m4\u001b[39m \u001b[38;5;241m*\u001b[39m X[:, \u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m-\u001b[39m \u001b[43mX\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m) \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m dt)\n\u001b[1;32m 239\u001b[0m X_prime[:, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m=\u001b[39m (\u001b[38;5;241m3\u001b[39m \u001b[38;5;241m*\u001b[39m X[:, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m4\u001b[39m \u001b[38;5;241m*\u001b[39m X[:, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m+\u001b[39m X[:, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m3\u001b[39m]) \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m dt)\n\u001b[1;32m 240\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39msqueeze(X_prime)\n", |
128 | | - "\u001b[0;31mIndexError\u001b[0m: index 2 is out of bounds for axis 1 with size 2" |
| 172 | + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", |
| 173 | + "Cell \u001b[0;32mIn[9], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m test_hankel_1()\n\u001b[1;32m 3\u001b[0m test_hankel_2()\n\u001b[0;32m----> 4\u001b[0m \u001b[43mtest_hankel_3\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", |
| 174 | + "Cell \u001b[0;32mIn[8], line 105\u001b[0m, in \u001b[0;36mtest_hankel_3\u001b[0;34m()\u001b[0m\n\u001b[1;32m 103\u001b[0m havok \u001b[38;5;241m=\u001b[39m HAVOK(delays\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m, lag\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 104\u001b[0m assert_equal(havok\u001b[38;5;241m.\u001b[39mhankel(dummy_data), H2)\n\u001b[0;32m--> 105\u001b[0m \u001b[43massert_equal\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhavok\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdehankel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhavok\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhankel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdummy_data\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdummy_data\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 107\u001b[0m havok \u001b[38;5;241m=\u001b[39m HAVOK(delays\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m3\u001b[39m, lag\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m3\u001b[39m)\n\u001b[1;32m 108\u001b[0m assert_equal(havok\u001b[38;5;241m.\u001b[39mhankel(dummy_data), H3)\n", |
| 175 | + " \u001b[0;31m[... skipping hidden 2 frame]\u001b[0m\n", |
| 176 | + "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/contextlib.py:81\u001b[0m, in \u001b[0;36mContextDecorator.__call__.<locals>.inner\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minner\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds):\n\u001b[1;32m 80\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_recreate_cm():\n\u001b[0;32m---> 81\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", |
| 177 | + "File \u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/numpy/testing/_private/utils.py:713\u001b[0m, in \u001b[0;36massert_array_compare\u001b[0;34m(comparison, x, y, err_msg, verbose, header, precision, equal_nan, equal_inf, strict)\u001b[0m\n\u001b[1;32m 707\u001b[0m reason \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m(dtypes \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00my\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m mismatch)\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 708\u001b[0m msg \u001b[38;5;241m=\u001b[39m build_err_msg([x, y],\n\u001b[1;32m 709\u001b[0m err_msg\n\u001b[1;32m 710\u001b[0m \u001b[38;5;241m+\u001b[39m reason,\n\u001b[1;32m 711\u001b[0m verbose\u001b[38;5;241m=\u001b[39mverbose, header\u001b[38;5;241m=\u001b[39mheader,\n\u001b[1;32m 712\u001b[0m names\u001b[38;5;241m=\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m), precision\u001b[38;5;241m=\u001b[39mprecision)\n\u001b[0;32m--> 713\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAssertionError\u001b[39;00m(msg)\n\u001b[1;32m 715\u001b[0m flagged \u001b[38;5;241m=\u001b[39m bool_(\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 716\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m isnumber(x) \u001b[38;5;129;01mand\u001b[39;00m isnumber(y):\n", |
| 178 | + "\u001b[0;31mAssertionError\u001b[0m: \nArrays are not equal\n\n(shapes (1, 5), (1, 6) mismatch)\n x: array([[1., 2., 3., 4., 6.]])\n y: array([[1, 2, 3, 4, 5, 6]])" |
129 | 179 | ] |
130 | 180 | } |
131 | 181 | ], |
132 | 182 | "source": [ |
133 | 183 | "test_error_fitted()\n", |
134 | | - "test_snapshots_1()" |
| 184 | + "test_hankel_1()\n", |
| 185 | + "test_hankel_2()\n", |
| 186 | + "test_hankel_3()" |
135 | 187 | ] |
136 | 188 | }, |
137 | 189 | { |
|
0 commit comments