-
Notifications
You must be signed in to change notification settings - Fork 360
Add a trait to tie together compile-time and runtime number of dimensions #1575
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
Conversation
nilgoyette
commented
Jan 12, 2026
I would really love some input and feedback about what language we should be using; especially from people for whom English is not their first / primary language.
Moi! I'm one of those :) As a long-time programmer, I like dimension and dimensionality. This being said, I do know what rank means and it's certainly a good work if we're going to work with matrices. The problem that I see it that the complete definition of rank (at least according to google AI) is
The rank of a matrix is the maximum number of linearly independent rows or columns it has, representing the dimension of the vector space spanned by its rows (row space) or columns (column space).
(Emphasis mine) If this definition is right (and I think it is), then I don't think rank is a good name. A mathematician using ndarray might think that rank() returns/calculates the actual mathematical rank. IIUC, a 3x3 matrix of zeros has a rank equal to 1, no?
akern40
commented
Jan 13, 2026
Yes, rank does have that meaning! I have been considering swapping our use of Rank to be the name of the generic type currently called NDim, and making NDim the name of the associated type of the trait. I'd also change the trait name from Ranked to Dimensioned, and change the function name from rank to ndim. Thoughts?
Uh oh!
There was an error while loading. Please reload this page.
This is the next PR to address #1506. In the previous PR (#1568) we established a trait for capturing the "dimensionality" or "rank" of an array at the type level. This PR is focused on providing a bridge from type-level dimensionality to runtime dimensionality, which we do through the new
Rankedtrait.First, a note on language: we now have three words / phrases to refer to the same thing: number of dimensions, dimensionality, and rank. That's ok, they're all accurate, but I'm worried it will be confusing as time goes on. Similarly, in #1568, we decided on using
Rankas the name of the associated type that tells you the compile-time number of dimensions. However, the function that has traditionally provided the number of dimensions isndim. So we have a slight vocabulary problem. I would really love some input and feedback about what language we should be using; especially from people for whom English is not their first / primary language.The
Rankedtrait is pretty simple: require an associated type (Rank) that carries compile-time dimensionality, and a functionfn rank(&self) -> usizethat tells the user runtime dimensionality. Thesrc/layout/ranked.rsfile contains the definition, implementations, and blanket implementations. There are likely some/many types in the library or outside of it that I forgot to implementRankedfor, but I'm sure we'll find them as time goes on.I've also removed the
Rankassociated type onDimensionand madeRankeda supertrait ofDimension. I think this is the best way to do this, but it does mean that I've had to remove the"unstable"feature flag we had introduced. Since this code isn't merging to main yet, I think that's fine.