Skip to content

'fix_inputs' crashes when reshaping output #11360

Description

@mcara

Description

I am trying to simulate a situation when fix_inputs is applied to a slightly convoluted model (inputs-to-outputs is remapped). Created model works for simple scalar inputs but fails for numpy.ndarray data.

Steps to Reproduce

In [1]: from astropy.modeling import models
   ...: import numpy as np
   ...: m = models.Identity(3) | models.Mapping((2, 1, 0))
   ...: m.bounding_box = ((0, 100), (0, 200), (0, 50))
   ...: mf = models.fix_inputs(m, {2: 22})
   ...: t = mf | models.Mapping((2, 1), n_inputs=3)
   ...: print(mf(1, 2))  # works: (22, 2, 1)
   ...: print(t(1, 2))  # works: (1, 2)
   ...: print(t(np.ones((3, 5)), np.ones((3, 5))))  # fails
(22.0, 2.0, 1.0)
(1.0, 2.0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-71292af2df6f> in <module>
      7 print(mf(1, 2))  # works: (22, 2, 1)
      8 print(t(1, 2))  # works: (1, 2)
----> 9 print(t(np.ones((3, 5)), np.ones((3, 5))))  # fails

.../lib/python3.8/site-packages/astropy/modeling/core.py in __call__(self, *args, **kw)
   2818             return outputs
   2819         else:
-> 2820             return self._evaluate(*args, **kw)
   2821
   2822     def _evaluate(self, *args, **kw):

.../lib/python3.8/site-packages/astropy/modeling/core.py in _evaluate(self, *args, **kw)
   2824         if op != 'fix_inputs':
   2825             if op != '&':
-> 2826                 leftval = self.left(*args, **kw)
   2827                 if op != '|':
   2828                     rightval = self.right(*args, **kw)

.../lib/python3.8/site-packages/astropy/modeling/core.py in __call__(self, *args, **kw)
   2818             return outputs
   2819         else:
-> 2820             return self._evaluate(*args, **kw)
   2821
   2822     def _evaluate(self, *args, **kw):

.../lib/python3.8/site-packages/astropy/modeling/core.py in _evaluate(self, *args, **kw)
   2882             for ind, val in subargs:
   2883                 newargs.insert(ind, val)
-> 2884             return self.left(*newargs, **kw)
   2885
   2886     @property

.../lib/python3.8/site-packages/astropy/modeling/core.py in __call__(self, *args, **kw)
   2818             return outputs
   2819         else:
-> 2820             return self._evaluate(*args, **kw)
   2821
   2822     def _evaluate(self, *args, **kw):

.../lib/python3.8/site-packages/astropy/modeling/core.py in _evaluate(self, *args, **kw)
   2839             elif op == '|':
   2840                 if isinstance(leftval, tuple):
-> 2841                     return self.right(*leftval, **kw)
   2842                 else:
   2843                     return self.right(leftval, **kw)

.../lib/python3.8/site-packages/astropy/modeling/core.py in __call__(self, *args, **kwargs)
    917         new_args, kwargs = self._get_renamed_inputs_as_positional(*args, **kwargs)
    918
--> 919         return generic_call(self, *new_args, **kwargs)
    920
    921     def _get_renamed_inputs_as_positional(self, *args, **kwargs):

.../lib/python3.8/site-packages/astropy/modeling/core.py in generic_call(self, *inputs, **kwargs)
   4123         if self.n_outputs == 1:
   4124             outputs = (outputs,)
-> 4125     outputs = self.prepare_outputs(format_info, *outputs, **kwargs)
   4126
   4127     outputs = self._process_output_units(inputs, outputs)

.../lib/python3.8/site-packages/astropy/modeling/core.py in prepare_outputs(self, format_info, *outputs, **kwargs)
   1779
   1780         if len(self) == 1:
-> 1781             return _prepare_outputs_single_model(outputs, format_info)
   1782         else:
   1783             return _prepare_outputs_model_set(self, outputs, format_info, model_set_axis)

.../lib/python3.8/site-packages/astropy/modeling/core.py in _prepare_outputs_single_model(outputs, format_info)
   3903                 outputs[idx] = output.item()
   3904             else:
-> 3905                 outputs[idx] = output.reshape(broadcast_shape)
   3906
   3907     return tuple(outputs)

ValueError: cannot reshape array of size 1 into shape (3,5)

I do not think this code should be failing: it produces (maps) correct inputs to correct outputs for scalar inputs but fails for array inputs.

System Details

macOS-10.15.7-x86_64-i386-64bit
Python 3.8.5 (default, Sep  4 2020, 02:22:02)
[Clang 10.0.0 ]
Numpy 1.20.1
astropy 4.2
Scipy 1.6.0
Matplotlib 3.3.4

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions