{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":389461512,"defaultBranch":"main","name":"diffrax","ownerLogin":"patrick-kidger","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2021-07-25T23:42:12.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/33688385?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1717338415.0","currentOid":""},"activityList":{"items":[{"before":"27c58d5a8decf780daea7590e3c1a83533d75ff5","after":null,"ref":"refs/heads/fix-wrapped-closure","pushedAt":"2024-06-02T14:26:55.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"}},{"before":"0a59c9dbd34f580efb3505386f38ce9fcedb120b","after":"c6cc85c92b0e14e24092830584d0397a1990d091","ref":"refs/heads/main","pushedAt":"2024-06-02T14:26:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed spurious failure of test/test_adjoint.py::test_implicit","shortMessageHtmlLink":"Fixed spurious failure of test/test_adjoint.py::test_implicit"}},{"before":null,"after":"27c58d5a8decf780daea7590e3c1a83533d75ff5","ref":"refs/heads/fix-wrapped-closure","pushedAt":"2024-05-31T06:35:39.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed spurious failure of test/test_adjoint.py::test_implicit","shortMessageHtmlLink":"Fixed spurious failure of test/test_adjoint.py::test_implicit"}},{"before":"80d1f34f7608629246600831f9397eb6fc5973a3","after":"0a59c9dbd34f580efb3505386f38ce9fcedb120b","ref":"refs/heads/main","pushedAt":"2024-05-21T21:55:22.000Z","pushType":"pr_merge","commitsCount":2,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"fixed the SPaRK naming","shortMessageHtmlLink":"fixed the SPaRK naming"}},{"before":null,"after":"1470707de30c1b252ac787308fc65900eb9d0d73","ref":"refs/heads/387-tweaks","pushedAt":"2024-05-19T18:57:38.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Adjustments to #387 (events):\n\n- Semantic change: boolean events now trigger when they become truthy (before they occurred when they swap being falsy<->truthy). Note that this required twiddling around a few things as previously it was impossible for an event to trigger on the first step; now they can.\n- Semantic change: event functions now have the signature `(t, y, args *, terms, solver, **etc)` for consistency with vector fields and with `SaveAt(fn=...)`.\n- Feature: now backward-compatible with the old discrete terminating events.\n- Feature: added `diffrax.steady_state_event`.\n- Bugfix: the final `t` and `y` from an event are now saved in the correct index of `ts` and `ys`, rather than just always being saved at index `-1`.\n- Bugfix: at one point `args` referred to the `args` coming from a root find rather than the overall `diffeqsolve`.\n- Bugfix: the current `state.tprev` was used instead of the previous state's `tnext`. (These are usually but not always the same -- in particular when around jumps.)\n- Bugfix: added some checks when the condition function of an event does not return a bool/float scalar.\n- Performance: includes a fastpath for skipping the rootfind if no events are triggered.\n- Performance: now avoiding tracing for the shape of `dense_info` twice when using adaptive step size controllers alongside events.\n- Performance: avoided quadratic loop for figuring out what was the first event to trigger.\n- Chore: added support for the possibility of the final root find (for the time of the event) failing.\n- Chore: removed some dead code (`_bool_event_gradient`).\n- Chore: removed references in the docs to the old `discrete_terminating_event`.\n\nIn addition, some drive-bys:\n\n- Fixed warnings about pending deprecations `jnp.clip(..., a_min=..., a_max=...)`.\n- Had `aux_stats` (in `_integrate.py`) forward to the overall output statistics. In practice this is empty but it's worth doing for the future.","shortMessageHtmlLink":"Adjustments to #387 (events):"}},{"before":"5bc3e07e6059a71029e67e6e9df77b2d4fe2afcf","after":"80d1f34f7608629246600831f9397eb6fc5973a3","ref":"refs/heads/main","pushedAt":"2024-05-19T13:07:41.000Z","pushType":"pr_merge","commitsCount":15,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Improved Levy area documentation","shortMessageHtmlLink":"Improved Levy area documentation"}},{"before":"daed558d73395e76c1ce14c811efea209505592c","after":"6abbd3be8e2a2b89bf9cd4f14c1a22fd8d45f820","ref":"refs/heads/dev","pushedAt":"2024-05-19T02:17:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Improved Levy area documentation","shortMessageHtmlLink":"Improved Levy area documentation"}},{"before":"3791d6d5e552a38a8623c5bf5749474a0766609d","after":null,"ref":"refs/heads/parametric-tweaks","pushedAt":"2024-05-19T01:41:40.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"}},{"before":"4cb24756e0dd22f5b8b2214f2e183a0be313a07c","after":"daed558d73395e76c1ce14c811efea209505592c","ref":"refs/heads/dev","pushedAt":"2024-05-18T15:58:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Bump version","shortMessageHtmlLink":"Bump version"}},{"before":"c4deca413c04a86a92d072be2ec220c3f9df35c4","after":"4cb24756e0dd22f5b8b2214f2e183a0be313a07c","ref":"refs/heads/dev","pushedAt":"2024-05-13T18:29:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Enable implicit solvers for complex inputs (#411)\n\n* Enable implicit solvers for complex inputs\n\n* change version\n\n* make pyright happy","shortMessageHtmlLink":"Enable implicit solvers for complex inputs (#411)"}},{"before":"a998093ff738565dda2a1c8400ef208a784fdde7","after":"c4deca413c04a86a92d072be2ec220c3f9df35c4","ref":"refs/heads/dev","pushedAt":"2024-05-04T12:03:44.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Enable more complex tests, fix related errors (#392)\n\n* Fix complex tests\r\n\r\n* Fix more complex tests\r\n\r\n* New sde related fixes\r\n\r\n* New sde related fixes","shortMessageHtmlLink":"Enable more complex tests, fix related errors (#392)"}},{"before":"9b5d30520fa27946a75405b4da74bb5ef529c670","after":null,"ref":"refs/heads/fixed-progress","pushedAt":"2024-05-04T11:58:33.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"}},{"before":"ac28ce47c065464350273fae6c2e31f9120f7061","after":"a998093ff738565dda2a1c8400ef208a784fdde7","ref":"refs/heads/dev","pushedAt":"2024-05-04T11:58:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed progress meters with `jax.grad`","shortMessageHtmlLink":"Fixed progress meters with jax.grad"}},{"before":"97ce9b01b089988f377d229e57a3f310962015d8","after":"ac28ce47c065464350273fae6c2e31f9120f7061","ref":"refs/heads/dev","pushedAt":"2024-05-04T11:46:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"fixed brownian_tree_times.py (#410)","shortMessageHtmlLink":"fixed brownian_tree_times.py (#410)"}},{"before":"55d3c0f8993bc3dfe880f25c478f29a5ea73d8d3","after":"97ce9b01b089988f377d229e57a3f310962015d8","ref":"refs/heads/dev","pushedAt":"2024-04-27T19:51:11.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Doc tweaks for SRK. (#409)","shortMessageHtmlLink":"Doc tweaks for SRK. (#409)"}},{"before":"865c4d8e9af5d1baa65654e4c846fa3d8ac955d4","after":"9b5d30520fa27946a75405b4da74bb5ef529c670","ref":"refs/heads/fixed-progress","pushedAt":"2024-04-27T10:31:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed progress meters with `jax.grad`","shortMessageHtmlLink":"Fixed progress meters with jax.grad"}},{"before":"51457104e3fdd494f13bbb8583e1658843e4d8ad","after":"865c4d8e9af5d1baa65654e4c846fa3d8ac955d4","ref":"refs/heads/fixed-progress","pushedAt":"2024-04-27T10:30:14.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed TextProgressMeter sometimes printing 100% twice.","shortMessageHtmlLink":"Fixed TextProgressMeter sometimes printing 100% twice."}},{"before":null,"after":"d7d1d7e8e281b40ea3105686b9d8020eff9de6fa","ref":"refs/heads/srk-tweaks2","pushedAt":"2024-04-27T09:29:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Doc tweaks for SRK.","shortMessageHtmlLink":"Doc tweaks for SRK."}},{"before":"41c58a683ee4a96cc6998e21ab167bb2cdeb3c83","after":"55d3c0f8993bc3dfe880f25c478f29a5ea73d8d3","ref":"refs/heads/dev","pushedAt":"2024-04-27T09:24:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Everything SRK related squashed on top of diffrax/dev (#344)","shortMessageHtmlLink":"Everything SRK related squashed on top of diffrax/dev (#344)"}},{"before":"322852ae546c54a06a63e75e54126896d096cbbb","after":"41c58a683ee4a96cc6998e21ab167bb2cdeb3c83","ref":"refs/heads/dev","pushedAt":"2024-04-22T19:52:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"PID for complex dtype fixes (#391)\n\n* Fix complex casting and types issues\r\n\r\n* Dependency version","shortMessageHtmlLink":"PID for complex dtype fixes (#391)"}},{"before":"09cadab6a252f1f615631aaee0872a2c6756a6fa","after":"322852ae546c54a06a63e75e54126896d096cbbb","ref":"refs/heads/dev","pushedAt":"2024-04-21T20:25:51.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Create py.typed","shortMessageHtmlLink":"Create py.typed"}},{"before":"34cbe5c68f89b5fc47543787f724489dc026a309","after":"09cadab6a252f1f615631aaee0872a2c6756a6fa","ref":"refs/heads/dev","pushedAt":"2024-04-21T19:56:21.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixup test_term static type checking\n\n- set reportUnnecessaryTypeIgnoreComment=true, as required by the\nstatic type \"tests\" in `test_term`;\n\n- remove now redundant, commented out, beatype based tests in\n`test_term`;\n\n- remove all unnecessary type ignore comments from across the\ncodebase.","shortMessageHtmlLink":"Fixup test_term static type checking"}},{"before":"76a94412cf833f3700b2d3662742d702864955eb","after":"34cbe5c68f89b5fc47543787f724489dc026a309","ref":"refs/heads/dev","pushedAt":"2024-04-20T09:27:43.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Parametric control types (#364)\n\n* Added parametric control types\r\n\r\n* Demo of AbstractTerm change\r\n\r\n* Correct initial parametric control type implementation.\r\n\r\n* Parametric AbstractTerm initial implementation.\r\n\r\n* Update tests and fix hinting\r\n\r\n* Implement review comments.\r\n\r\n* Add parametric control check to integrator.\r\n\r\n* Update and test parametric control check\r\n\r\n* Introduce new LevyArea types\r\n\r\n* Updated Brownian path LevyArea types\r\n\r\n* Replace Union types in isinstance checks\r\n\r\n* Remove rogue comment\r\n\r\n* Revert _brownian_arch to single assignment\r\n\r\n* Revert _evaluate_leaf key splitting\r\n\r\n* Rename variables in test_term\r\n\r\n* Update isinstance and issubclass checks\r\n\r\n* Safer handling in _denormalise_bm_inc\r\n\r\n* Fix style in integrate control type check\r\n\r\n* Add draft vector_field typing\r\n\r\n* Add draft vector_field typing\r\n\r\n* Fix term test\r\n\r\n* Revert extemporaneous modifications in _tree\r\n\r\n* Rename TimeLevyArea to BrownianIncrement and simplify diff\r\n\r\n* Rename AbstractLevyReturn to AbstractBrownianReturn\r\n\r\n* Rename _LevyArea to _BrownianReturn\r\n\r\n* Enhance _term_compatiblity checks\r\n\r\n* Fix merge issues\r\n\r\n* Bump pre-commit and fix type hints\r\n\r\n* Clean up from self-review\r\n\r\n* Explicitly add typeguard to deps\r\n\r\n* Bump ruff config to new syntax\r\n\r\n* Parameterised terms: fixed term compatibility + spurious pyright errors\r\n\r\nPhew, this ended up being a complicated one!\r\n\r\nLet's start with the easy stuff:\r\n- Disabled spurious pyright errors due to incompatible between pyright and `eqx.AbstractVar`.\r\n- Now using ruff.lint and pinned exact typeguard version.\r\n\r\nNow on to the hard stuff:\r\n- Fixed term compatibibility missing some edge cases.\r\n\r\nEdge cases? What edge cases? Well, what we had before was basically predicated around doing\r\n```python\r\nvf, contr = get_args(term_cls)\r\n```\r\nrecalling that we may have e.g. `term_cls = AbstractTerm[SomeVectorField, SomeControl]`. So far so simple: get the arguments of a subscripted generic, no big deal.\r\n\r\nWhat this failed to account for is that we may also have subclasses of this generic, e.g. `term_cls = ODETerm[SomeVectorField]`, such that some of the type variables have already been filled in when defining it:\r\n```python\r\nclass ODETerm(AbstractTerm[_VF, RealScaleLike]): ...\r\n```\r\nso in this case, `get_args(term_cls)` simply returns a 1-tuple of `(SomeVectorField,)`. Oh no! Somehow we have to traverse both the filled-in type variables (to find that one of our type variables is `SomeVectorField` due to subscripting) *and* the type hierarchy (to figure out that the other type variable was filled in during the definition).\r\n\r\nOnce again, for clarity: given a subscriptable base class `AbstractTerm[_VF, _Control]` and some arbitrary possible-subscripted subclass, we need to find the values of `_VF` and `_Control`, regardless of whehther they have been passed in via subscripting the final class (and are `get_args`-able) or have been filled in during subclassing (and require traversing pseudo-type-hierarchies of `__orig_bases__`).\r\n\r\nAny sane implementation would simply... not bother. There is no way that the hassle of figuring this out was going to be worth the small amount of type safety this brings...\r\n\r\nSo anyway, after a few hours working on this *far* past the point I should be going to sleep, this problem this is now solved. This PR introduces a new `get_args_of` function, called as `get_args_of(superclass, subclass, error_msg_if_necessary)`. This acts analogous to `get_args`, but instead of looking up both parameters (the type variables we want filled in) and the arguments (the values those type variables have been filled in with) on the same class, it looks up the parameters on the superclass, and their filled-in-values on the subclass. Pure madness.\r\n\r\n(I'm also tagging @leycec here because this is exactly the kind of insane typing hackery that he seems to really enjoy.)\r\n\r\nDoes anyone else remember the days when this was a package primarily concerned about solving differential equations?\r\n\r\n---------\r\n\r\nCo-authored-by: Patrick Kidger <33688385+patrick-kidger@users.noreply.github.com>","shortMessageHtmlLink":"Parametric control types (#364)"}},{"before":"fa91aa126f06a77545cdc6d9ed53dca5b41297ff","after":"5bc3e07e6059a71029e67e6e9df77b2d4fe2afcf","ref":"refs/heads/main","pushedAt":"2024-04-20T09:27:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Updated ecosystem again","shortMessageHtmlLink":"Updated ecosystem again"}},{"before":"89980d07338c0f26ed8174fb62102431ac63521b","after":"76a94412cf833f3700b2d3662742d702864955eb","ref":"refs/heads/dev","pushedAt":"2024-04-20T09:16:34.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Parametric control types (#364)\n\n* Added parametric control types\r\n\r\n* Demo of AbstractTerm change\r\n\r\n* Correct initial parametric control type implementation.\r\n\r\n* Parametric AbstractTerm initial implementation.\r\n\r\n* Update tests and fix hinting\r\n\r\n* Implement review comments.\r\n\r\n* Add parametric control check to integrator.\r\n\r\n* Update and test parametric control check\r\n\r\n* Introduce new LevyArea types\r\n\r\n* Updated Brownian path LevyArea types\r\n\r\n* Replace Union types in isinstance checks\r\n\r\n* Remove rogue comment\r\n\r\n* Revert _brownian_arch to single assignment\r\n\r\n* Revert _evaluate_leaf key splitting\r\n\r\n* Rename variables in test_term\r\n\r\n* Update isinstance and issubclass checks\r\n\r\n* Safer handling in _denormalise_bm_inc\r\n\r\n* Fix style in integrate control type check\r\n\r\n* Add draft vector_field typing\r\n\r\n* Add draft vector_field typing\r\n\r\n* Fix term test\r\n\r\n* Revert extemporaneous modifications in _tree\r\n\r\n* Rename TimeLevyArea to BrownianIncrement and simplify diff\r\n\r\n* Rename AbstractLevyReturn to AbstractBrownianReturn\r\n\r\n* Rename _LevyArea to _BrownianReturn\r\n\r\n* Enhance _term_compatiblity checks\r\n\r\n* Fix merge issues\r\n\r\n* Bump pre-commit and fix type hints\r\n\r\n* Clean up from self-review\r\n\r\n* Explicitly add typeguard to deps\r\n\r\n* Bump ruff config to new syntax\r\n\r\n* Parameterised terms: fixed term compatibility + spurious pyright errors\r\n\r\nPhew, this ended up being a complicated one!\r\n\r\nLet's start with the easy stuff:\r\n- Disabled spurious pyright errors due to incompatible between pyright and `eqx.AbstractVar`.\r\n- Now using ruff.lint and pinned exact typeguard version.\r\n\r\nNow on to the hard stuff:\r\n- Fixed term compatibibility missing some edge cases.\r\n\r\nEdge cases? What edge cases? Well, what we had before was basically predicated around doing\r\n```python\r\nvf, contr = get_args(term_cls)\r\n```\r\nrecalling that we may have e.g. `term_cls = AbstractTerm[SomeVectorField, SomeControl]`. So far so simple: get the arguments of a subscripted generic, no big deal.\r\n\r\nWhat this failed to account for is that we may also have subclasses of this generic, e.g. `term_cls = ODETerm[SomeVectorField]`, such that some of the type variables have already been filled in when defining it:\r\n```python\r\nclass ODETerm(AbstractTerm[_VF, RealScaleLike]): ...\r\n```\r\nso in this case, `get_args(term_cls)` simply returns a 1-tuple of `(SomeVectorField,)`. Oh no! Somehow we have to traverse both the filled-in type variables (to find that one of our type variables is `SomeVectorField` due to subscripting) *and* the type hierarchy (to figure out that the other type variable was filled in during the definition).\r\n\r\nOnce again, for clarity: given a subscriptable base class `AbstractTerm[_VF, _Control]` and some arbitrary possible-subscripted subclass, we need to find the values of `_VF` and `_Control`, regardless of whehther they have been passed in via subscripting the final class (and are `get_args`-able) or have been filled in during subclassing (and require traversing pseudo-type-hierarchies of `__orig_bases__`).\r\n\r\nAny sane implementation would simply... not bother. There is no way that the hassle of figuring this out was going to be worth the small amount of type safety this brings...\r\n\r\nSo anyway, after a few hours working on this *far* past the point I should be going to sleep, this problem this is now solved. This PR introduces a new `get_args_of` function, called as `get_args_of(superclass, subclass, error_msg_if_necessary)`. This acts analogous to `get_args`, but instead of looking up both parameters (the type variables we want filled in) and the arguments (the values those type variables have been filled in with) on the same class, it looks up the parameters on the superclass, and their filled-in-values on the subclass. Pure madness.\r\n\r\n(I'm also tagging @leycec here because this is exactly the kind of insane typing hackery that he seems to really enjoy.)\r\n\r\nDoes anyone else remember the days when this was a package primarily concerned about solving differential equations?\r\n\r\n---------\r\n\r\nCo-authored-by: Patrick Kidger <33688385+patrick-kidger@users.noreply.github.com>","shortMessageHtmlLink":"Parametric control types (#364)"}},{"before":"eff5f60f6aab3c71a724defe35877a474becb679","after":"fa91aa126f06a77545cdc6d9ed53dca5b41297ff","ref":"refs/heads/main","pushedAt":"2024-04-20T09:16:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Updated ecosystem list","shortMessageHtmlLink":"Updated ecosystem list"}},{"before":"38a40e7fba6cffcb7e8f65a1ab3a6a9ababacaac","after":"eff5f60f6aab3c71a724defe35877a474becb679","ref":"refs/heads/main","pushedAt":"2024-04-18T19:45:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fix DenseInfo type (#400)","shortMessageHtmlLink":"Fix DenseInfo type (#400)"}},{"before":"84bc493fdafef7b20483b947a2c9236540b3dadd","after":"51457104e3fdd494f13bbb8583e1658843e4d8ad","ref":"refs/heads/fixed-progress","pushedAt":"2024-04-14T12:04:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixed tqdm not outputting under vmap; added tqmd tests","shortMessageHtmlLink":"Fixed tqdm not outputting under vmap; added tqmd tests"}},{"before":null,"after":"84bc493fdafef7b20483b947a2c9236540b3dadd","ref":"refs/heads/fixed-progress","pushedAt":"2024-04-09T22:07:01.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"},"commit":{"message":"Fixes #396.\n\nThis PR makes it so that both the `TextProgressMeter` and the `TqdmProgressMeter` both work through the progress bar manager. In particular this means that we will not get any printout on the backward pass for the `TextProgressMeter` (as its `meter_idx` is deleted during `close`, called at the end of the forward pass), whereas previously we would get a binomial printout as the backward pass worked through its recursive checkpointing. This means we now have consistency with `TqdmProgressMeter`, for which there is less of a clear way for any providing any possible out during the backward pass.\n\n(I'd be open to changing the above -- adding options for printout during backpropagation -- but this would probably be fairly tricky. I could see it requiring defining a new primitive, called at the start of integration, for closing the \"backward bar\", whilst still remaining JVP-compatible.)\n\nIn addition, we now have a `try`/`except` around the bar lookup during `step`. This means we do not raise an error when the bar does not exist during backpropagation.\n\nDepends on https://github.com/patrick-kidger/equinox/pull/697.","shortMessageHtmlLink":"Fixes #396."}},{"before":"7b86dd471dae3e08c0a5c5191838e529f38465cd","after":null,"ref":"refs/heads/srk-tweaks","pushedAt":"2024-04-02T16:05:38.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"patrick-kidger","name":"Patrick Kidger","path":"/patrick-kidger","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33688385?s=80&v=4"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEWjYqvgA","startCursor":null,"endCursor":null}},"title":"Activity ยท patrick-kidger/diffrax"}