Clean up named tensor `propagate_names` API (#29239)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/29239
There were a few main changes, summarized below.
Rename `propagate_names`
----------------------------------------------
There are two main APIs now, `propagate_names_if_nonempty(Tensor&,
ArrayRef<Dimname>)` and `propagate_names(Tensor&, ArrayRef<Dimname>)`
The former propagates names if they are not empty and the latter
unconditionally tries to propagate names.
`names` can be empty if name inference did not occur (see the next
section).
Removed usages of `optional` in name inference
----------------------------------------------
Previously, we used `optional<ArrayRef<Dimname>>` and
`optional<vector<Dimname>>`. `nullopt` represens that no name inference
happened.
The problem with this is that these types are not implicitly convertible
to each other and dealing with them is painful as a result (users have
to manually unwrap `optional<vector>` and convert to
`optional<arrayref>`.
To fix this, I rewrote most named inference functions to use an empty array as an
indicator value:
- If an array is empty, then no name inference occured
- If an array is not empty, then name inference occured.
Removed `vector<Dimname>&&` overloads
----------------------------------------------
These were originally meant for efficiency: instead of copying a vector
of names we could move it directly inside the tensor and replace the old
names. However, looking around the code base, we do copies for
`IntArrayRef` for sizes and strides instead of optimizing them, so the
perf gain is probably not critical. I removed `vector<Dimname>&&` overloads
to stop optimizing prematurely.
Furthermore, one potential design for a faster named inference api is
to construct names directly on a tensor's names object; in this design
there is also no `vector<Dimname>&&` overload.
Plans
----------------------------------------------
After this PR I'll keep attempting to cleaning up `propagate_names`
functions. There are a lot of `propagate_names_for_{blah}` functions
that exist that probably don't need to.
Test Plan: - `python test/test_namedtensor.py -v`
Differential Revision: D18350090
Pulled By: zou3519
fbshipit-source-id: eb5dd6cbd2d4f1838431db5edbdb207204c5791d