Related discussion: https://github.com/firedrakeproject/firedrake/discussions/2743 - [ ] Modify `assign.py` `MultiFunction` to permit assigning more complex expressions (e.g. division, conj) still using numpy operations. - [ ] Modify `ad_annotate_assign` to dispatch to interpolate if a "fast path" (i.e. only weighted sums) approach is not valid. - [ ] (Maybe) Move contents of `assign.py` into `assemble.py` to reflect that assignment is just "assemble then apply". It might make sense to make `assemble` into a subpackage with modules for forms, expressions and maybe interpolation.