Zip and azip! behavior related to inputted NdProducers

オープン
#453 コメント 7 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
25/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
rust
領域
data

調査の方向性

Start by compiling the two azip! examples from the issue and compare the inferred dimensions of lanes(Axis(0)) with axis_iter(Axis(0)). Then inspect Zip, azip!, and IntoNdProducer behavior to determine whether the mismatch is an implementation bug or an intentional constraint; done means establishing and documenting the expected behavior, with a regression test if a bug is confirmed.

索引モデルが issue の本文から書いたものです。

説明

good first issue

Based on trying to help in Issue #452 , I found some interesting behavior regarding either Zip or azip!. I've given examples down below

    let a = arr3(&[[[ 0,  1,  2],
                [ 3,  4,  5]],
               [[ 6,  7,  8],
                [ 9, 10, 11]]]);
    let inner0 = a.lanes(Axis(0));

    let trial = arr1(&[0,0,0,0,0,0]);
    let tr_iter = trial.axis_iter(Axis(0));

    //The below will error out when compiling.
    azip!(ref output (inner0), ref trial (tr_iter) in {println!("{:?}, {:?}",output, trial); });

The compiler returns the following error:

error[E0271]: type mismatch resolving `<ndarray::iter::AxisIter<'_, {integer}, ndarray::Dim<[usize; 0]>> as ndarray::IntoNdProducer>::Dim == ndarray::Dim<[usize; 2]>`
   --> src/main.rs:141:5
    |
141 |     azip!(ref output (inner0), ref trial (tr_iter) in {println!("{:?}, {:?}",output, trial); });
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected an array with a fixed size of 1 elements, found one with 2 elements
    |
    = note: expected type `ndarray::Dim<[usize; 1]>`
               found type `ndarray::Dim<[usize; 2]>`
    = note: this error originates in a macro outside of the current crate

error[E0599]: no method named `apply` found for type `ndarray::Zip<(ndarray::iter::Lanes<'_, {integer}, ndarray::Dim<[usize; 2]>>, ndarray::iter::AxisIter<'_, {integer}, ndarray::Dim<[usize; 0]>>), ndarray::Dim<[usize; 2]>>` in the current scope
   --> src/main.rs:141:5
    |
141 |     azip!(ref output (inner0), ref trial (tr_iter) in {println!("{:?}, {:?}",output, trial); });
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: this error originates in a macro outside of the current crate

However, if I were to roll what inner0 outputs directly, I can get it to work no problem as seen below:

    let trial = arr1(&[0,0,0,0,0,0]);
    let tr_iter = trial.axis_iter(Axis(0));

    let b = arr2(&[[0,1,2,3,4,5],[6,7,8,9,10,11]]);
    let b_iter = b.axis_iter(Axis(1));
    //The compiler is perfectly okay with this code.
    azip!(ref output (b_iter), ref trial (tr_iter) in {println!("{:?}, {:?}",output, trial); });

I feel that either method should work, since we contain the same number of "items" to iterate over in each version. So, I was curious if this is simply an error/bug in the code or is there a design choice behind one method failing to compile and the other one working.

主要言語
Rust
スター
4.3k
フォーク
391
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

rust-ndarray/ndarray のほかの issue

rust-ndarray/ndarray の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。