Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Impl a lifetime-relaxed broadcast for ArrayView #1219

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Commits on Oct 14, 2022

  1. Move upcast broadcast helper to dimension mod

    This will allow upcast to be reused in other functions, such as the
    upcoming ArrayView::broadcast_ref.
    roblabla committed Oct 14, 2022
    Configuration menu
    Copy the full SHA
    e797a77 View commit details
    Browse the repository at this point in the history
  2. Impl a lifetime-relaxed broadcast for ArrayView

    ArrayView::broadcast has a lifetime that depends on &self instead of its
    internal buffer. This prevents writing some types of functions in an
    allocation-free way. For instance, take the numpy `meshgrid` function:
    It could be implemented like so:
    
    ```rust
    fn meshgrid_2d<'a, 'b>(coords_x: ArrayView1<'a, X>, coords_y: ArrayView1<'b, X>) -> (ArrayView2<'a, X>, ArrayView2<'b, X>) {
        let x_len = coords_x.shape()[0];
        let y_len = coords_y.shape()[0];
    
        let coords_x_s = coords_x.into_shape((1, y_len)).unwrap();
        let coords_x_b = coords_x_s.broadcast((x_len, y_len)).unwrap();
        let coords_y_s = coords_y.into_shape((x_len, 1)).unwrap();
        let coords_y_b = coords_y_s.broadcast((x_len, y_len)).unwrap();
    
        (coords_x_b, coords_y_b)
    }
    ```
    
    Unfortunately, this doesn't work, because `coords_x_b` is bound to the
    lifetime of `coord_x_s`, instead of being bound to 'a.
    
    This commit introduces a new function, broadcast_ref, that does just
    that.
    roblabla committed Oct 14, 2022
    Configuration menu
    Copy the full SHA
    28e887e View commit details
    Browse the repository at this point in the history