Skip to content
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

Switch LTI class and subclasses to use ninputs, noutputs, nstates #515

Merged

Conversation

murrayrm
Copy link
Member

@murrayrm murrayrm commented Jan 20, 2021

This PR changes the LTI class and the StateSpace class (and all derived classes) to use ninputs, noutputs, and nstates as the attributes for storing these properties instead of inputs, outputs, and states. The former names are consistent with what is used in the InputOutputSystem class.

Following the suggestion of @bnavigator in issue #451, getter and setter functions are used for backward compatibility, but with a PendingDeprecationWarning.

Note that this PR will generate some small conflicts with #514. I'll rebase based on which one we merge first. [done]

@murrayrm murrayrm added this to the 0.9.0 milestone Jan 20, 2021
@coveralls
Copy link

coveralls commented Jan 20, 2021

Coverage Status

Coverage decreased (-0.06%) to 87.553% when pulling eb401a9 on murrayrm:input_output_to_ninput_noutput into 1502d38 on python-control:master.

@sawyerbfuller
Copy link
Contributor

Awesome! Looks good to me.

@sawyerbfuller
Copy link
Contributor

One more thing I noticed: there are a few mentions of sys.inputs/outputs in docs in xferfunc.py that should probably be fixed.

@murrayrm murrayrm force-pushed the input_output_to_ninput_noutput branch from 374c82f to 5a4c3ab Compare January 21, 2021 00:53
@murrayrm
Copy link
Member Author

Rebased against master (and apparently fixed up the xferfcn.py docstring, since I can't find sys.inputs in that file anymore).

@sawyerbfuller
Copy link
Contributor

sawyerbfuller commented Jan 21, 2021 via email

Copy link
Contributor

@sawyerbfuller sawyerbfuller left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more comment: was it a deliberate choice to leave init keywords as inputs/outputs rather than ninputs/noutputs, eg in lti.py:

def init(self, inputs=1, outputs=1, dt=None):

@murrayrm murrayrm force-pushed the input_output_to_ninput_noutput branch from d614c01 to f633874 Compare January 23, 2021 18:37
@murrayrm
Copy link
Member Author

was it a deliberate choice to leave init keywords as inputs/outputs rather than ninputs/noutputs,

This matches the syntax we use in the InputOutputSystem class constructor. In that setting (and perhaps later here as well), inputs and outputs can be an integer or a list of strings (which get used for signal names).

@sawyerbfuller
Copy link
Contributor

That makes sense. Thanks!

control/lti.py Outdated
Comment on lines 64 to 67
raise PendingDeprecationWarning(
"The LTI `inputs` attribute will be deprecated in a future "
"release. Use `ninputs` instead.")
return self.ninputs
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This raises an Exception of the class PendingDeprecationWarning and never returns self.inputs.

Python 3.8.6 (default, Nov 09 2020, 12:09:06) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import control
>>> rsys = control.rss(3,3,3)
>>> ninputs = rsys.inputs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ben/src/python-control/control/lti.py", line 64, in inputs
    raise PendingDeprecationWarning(
PendingDeprecationWarning: The LTI `inputs` attribute will be deprecated in a future release.  Use `ninputs` instead.
>>> ninputs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ninputs' is not defined
Suggested change
raise PendingDeprecationWarning(
"The LTI `inputs` attribute will be deprecated in a future "
"release. Use `ninputs` instead.")
return self.ninputs
warn("The LTI `inputs` attribute will be deprecated in a future "
"release. Use `ninputs` instead.",
PendingDeprecationWarning, stacklevel=2)
return self.ninputs

Additionally, either a warning filter needs to be set in order to make the warning visible to end users, or a different category than *DeprecationWarning needs to be used.

filterwarnings('module',
               message=".*LTI.*attribute.*deprecated",
               category=PendingDeprecationWarning)
Python 3.8.6 (default, Nov 09 2020, 12:09:06) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import control; rsys = control.rss(3,3,3); ninputs = rsys.inputs
<stdin>:1: PendingDeprecationWarning: The LTI `inputs` attribute will be deprecated in a future release.  Use `ninputs` instead.
>>> ninputs
3
  • Please add a check using pytest.warns().

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've fixed these up and decide to use DeprecationWarning for now (keep things internal to developers) but in a future release (0.9.x) we should change to FutureWarning, which will make it show up for users as well.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still using raise instead of warn. Now we are at:

This raises an Exception of the class DeprecationWarning and never returns self.inputs.

Python 3.8.6 (default, Nov 09 2020, 12:09:06) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import control; rsys = control.rss(3,3,3); ninputs = rsys.inputs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ben/src/python-control/control/lti.py", line 64, in inputs
    raise DeprecationWarning(
DeprecationWarning: The LTI `inputs` attribute will be deprecated in a future release.  Use `ninputs` instead.
>>> ninputs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ninputs' is not defined
>>> 

Comment on lines 254 to 255
with pytest.raises(DeprecationWarning, match="LTI `inputs`"):
assert sys.inputs == sys.ninputs
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The assert .. == part is never evaluated after sys.ninputs throws the exception.

Copy link
Member Author

@murrayrm murrayrm Jan 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, was working on multiple changes/branches at once and pushed the wrong version. New one was what was intended.

@murrayrm murrayrm force-pushed the input_output_to_ninput_noutput branch 2 times, most recently from bed8990 to ff5fb39 Compare January 24, 2021 18:08
@murrayrm murrayrm force-pushed the input_output_to_ninput_noutput branch from ff5fb39 to eb401a9 Compare January 24, 2021 18:10
@bnavigator bnavigator merged commit eb146a6 into python-control:master Jan 24, 2021
@murrayrm murrayrm deleted the input_output_to_ninput_noutput branch January 31, 2021 00:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants