location: torch\distributions\kl.py

`combined_batch_shape = torch._C._infer_size(other._unbroadcasted_scale_tril.shape[:-2], self._unbroadcasted_scale_tril.shape[:-2])`

location: torch\distributions\kl.py

`combined_batch_shape = torch._C._infer_size(other._unbroadcasted_scale_tril.shape[:-2], self._unbroadcasted_scale_tril.shape[:-2])`

This internal method seems to be used to compute the size needed to expand the tensors as described in the comment:

```
# Expands term2 according to
# inv(qcov) @ pcov = inv(q_tril @ q_tril.T) @ (pW @ pW.T + pD)
```

May I ask what is the difference between this internal method and the internal method of expanding the tensor size of the MultivariateNormal distribution?

like `torch.distributions.multivariate_normal.MultivariateNormal.expand()`

Thank you very much!

`_infer_size`

expects `torch.Size`

objects as its input and will also output a `torch.Size`

object which can then be used for further shape processing of tensors.

`torch.distributions.multivariate_normal.MultivariateNormal.expand`

is defined as:

Returns a new distribution instance (or populates an existing instance

provided by a derived class) with batch dimensions expanded to

`batch_shape`

. This method calls :class:`~torch.Tensor.expand`

on

the distribution’s parameters. As such, this does not allocate new

memory for the expanded distribution instance. Additionally,

this does not repeat any args checking or parameter broadcasting in

`__init__.py`

, when an instance is first created.

Thank you for your answer, I seem to understand the difference between the two, I am trying to use my own defined method to achieve the effect achieved by the _infer_size() method.

Thank you very much for your help!