Skip to content

Commit cd89bf0

Browse files
Expose public API and rename hankel_matrix.py (#46)
* Expose public API in `__init__.py` files * Update modules and scripts to use public API * Rename `hankel_matrix.py` to `hankel_matrix_utils.py` - Rename the module to prevent name conflicts with the `hankel_matrix()` function within it. - Update docs to align with the module rename. This ensures correct docs building with Sphinx and avoids confusion for users.
1 parent d99bb23 commit cd89bf0

40 files changed

+215
-153
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ The project is structured as a Python package, encapsulating the core logic of t
187187
- [`direct_data_driven_mpc/lti_data_driven_mpc_controller.py`](direct_data_driven_mpc/lti_data_driven_mpc_controller.py): Implements a Data-Driven MPC controller for LTI systems in the `LTIDataDrivenMPCController` class. This implementation is based on the **Nominal and Robust Data-Driven MPC schemes** described in [[1]](#1).
188188
- [`direct_data_driven_mpc/nonlinear_data_driven_mpc_controller.py`](direct_data_driven_mpc/nonlinear_data_driven_mpc_controller.py): Implements a Data-Driven MPC controller for nonlinear systems in the `NonlinearDataDrivenMPCController` class. This implementation is based on the **Nonlinear Data-Driven MPC scheme** described in [[2]](#2).
189189

190-
The utility module [`direct_data_driven_mpc/utilities/hankel_matrix.py`](direct_data_driven_mpc/utilities/hankel_matrix.py) is used for constructing Hankel matrices and evaluating whether data sequences are persistently exciting of a given order.
190+
The utility module [`direct_data_driven_mpc/utilities/hankel_matrix_utils.py`](direct_data_driven_mpc/utilities/hankel_matrix_utils.py) is used for constructing Hankel matrices and evaluating whether data sequences are persistently exciting of a given order.
191191

192192
### Model Simulation
193193
The following utility modules have been implemented to simulate LTI and nonlinear systems:

direct_data_driven_mpc/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""
2+
Implementation of data-driven MPC controllers for Linear Time-Invariant (LTI)
3+
and nonlinear systems.
4+
"""
5+
6+
from .lti_data_driven_mpc_controller import (
7+
LTIDataDrivenMPCController,
8+
LTIDataDrivenMPCType,
9+
SlackVarConstraintType,
10+
)
11+
from .nonlinear_data_driven_mpc_controller import (
12+
AlphaRegType,
13+
NonlinearDataDrivenMPCController,
14+
)
15+
16+
__all__ = [
17+
"LTIDataDrivenMPCController",
18+
"LTIDataDrivenMPCType",
19+
"SlackVarConstraintType",
20+
"AlphaRegType",
21+
"NonlinearDataDrivenMPCController",
22+
]

direct_data_driven_mpc/lti_data_driven_mpc_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import cvxpy as cp
44
import numpy as np
55

6-
from direct_data_driven_mpc.utilities.hankel_matrix import (
6+
from direct_data_driven_mpc.utilities import (
77
evaluate_persistent_excitation,
88
hankel_matrix,
99
)

direct_data_driven_mpc/nonlinear_data_driven_mpc_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import cvxpy as cp
44
import numpy as np
55

6-
from direct_data_driven_mpc.utilities.hankel_matrix import (
6+
from direct_data_driven_mpc.utilities import (
77
evaluate_persistent_excitation,
88
hankel_matrix,
99
)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from .hankel_matrix_utils import (
2+
evaluate_persistent_excitation,
3+
hankel_matrix,
4+
)
5+
from .initial_state_estimation import (
6+
calculate_equilibrium_input_from_output,
7+
calculate_equilibrium_output_from_input,
8+
estimate_initial_state,
9+
observability_matrix,
10+
toeplitz_input_output_matrix,
11+
)
12+
from .yaml_config_loading import load_yaml_config_params
13+
14+
__all__ = [
15+
"evaluate_persistent_excitation",
16+
"hankel_matrix",
17+
"calculate_equilibrium_input_from_output",
18+
"calculate_equilibrium_output_from_input",
19+
"estimate_initial_state",
20+
"observability_matrix",
21+
"toeplitz_input_output_matrix",
22+
"load_yaml_config_params",
23+
]
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
Functions and classes for creating data-driven MPC controllers for both Linear
3+
Time-Invariant (LTI) and nonlinear systems, and for simulating their
4+
corresponding control loops.
5+
"""
6+
7+
from .controller_creation import (
8+
create_lti_data_driven_mpc_controller,
9+
create_nonlinear_data_driven_mpc_controller,
10+
)
11+
from .controller_params import (
12+
LTIDataDrivenMPCParams,
13+
NonlinearDataDrivenMPCParams,
14+
get_lti_data_driven_mpc_controller_params,
15+
get_nonlinear_data_driven_mpc_controller_params,
16+
)
17+
from .data_driven_mpc_sim import (
18+
simulate_lti_data_driven_mpc_control_loop,
19+
simulate_nonlinear_data_driven_mpc_control_loop,
20+
)
21+
from .initial_data_generation import (
22+
generate_initial_input_output_data,
23+
randomize_initial_system_state,
24+
simulate_n_input_output_measurements,
25+
)
26+
27+
__all__ = [
28+
"create_lti_data_driven_mpc_controller",
29+
"create_nonlinear_data_driven_mpc_controller",
30+
"LTIDataDrivenMPCParams",
31+
"NonlinearDataDrivenMPCParams",
32+
"get_lti_data_driven_mpc_controller_params",
33+
"get_nonlinear_data_driven_mpc_controller_params",
34+
"simulate_lti_data_driven_mpc_control_loop",
35+
"simulate_nonlinear_data_driven_mpc_control_loop",
36+
"generate_initial_input_output_data",
37+
"randomize_initial_system_state",
38+
"simulate_n_input_output_measurements",
39+
]

direct_data_driven_mpc/utilities/controller/controller_creation.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88

99
import numpy as np
1010

11-
from direct_data_driven_mpc.lti_data_driven_mpc_controller import (
11+
from direct_data_driven_mpc import (
1212
LTIDataDrivenMPCController,
13-
)
14-
from direct_data_driven_mpc.nonlinear_data_driven_mpc_controller import (
1513
NonlinearDataDrivenMPCController,
1614
)
17-
from direct_data_driven_mpc.utilities.controller.controller_params import (
15+
16+
from .controller_params import (
1817
LTIDataDrivenMPCParams,
1918
NonlinearDataDrivenMPCParams,
2019
)

direct_data_driven_mpc/utilities/controller/controller_params.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@
1010

1111
import numpy as np
1212

13-
from direct_data_driven_mpc.lti_data_driven_mpc_controller import (
13+
from direct_data_driven_mpc import (
14+
AlphaRegType,
1415
LTIDataDrivenMPCType,
1516
SlackVarConstraintType,
1617
)
17-
from direct_data_driven_mpc.nonlinear_data_driven_mpc_controller import (
18-
AlphaRegType,
19-
)
20-
from direct_data_driven_mpc.utilities.yaml_config_loading import (
18+
from direct_data_driven_mpc.utilities import (
2119
load_yaml_config_params,
2220
)
2321

direct_data_driven_mpc/utilities/controller/data_driven_mpc_sim.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@
1111
from numpy.random import Generator
1212
from tqdm import tqdm
1313

14-
from direct_data_driven_mpc.lti_data_driven_mpc_controller import (
14+
from direct_data_driven_mpc import (
1515
LTIDataDrivenMPCController,
16-
)
17-
from direct_data_driven_mpc.nonlinear_data_driven_mpc_controller import (
1816
NonlinearDataDrivenMPCController,
1917
)
20-
from direct_data_driven_mpc.utilities.models.lti_model import LTIModel
21-
from direct_data_driven_mpc.utilities.models.nonlinear_model import (
18+
from direct_data_driven_mpc.utilities.models import (
19+
LTIModel,
2220
NonlinearSystem,
2321
)
2422

direct_data_driven_mpc/utilities/controller/initial_data_generation.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import numpy as np
99
from numpy.random import Generator
1010

11-
from direct_data_driven_mpc.utilities.controller.controller_params import (
11+
from direct_data_driven_mpc.utilities.models import (
12+
LTIModel,
13+
NonlinearSystem,
14+
)
15+
16+
from .controller_params import (
1217
DataDrivenMPCParams,
1318
LTIDataDrivenMPCParams,
1419
)
15-
from direct_data_driven_mpc.utilities.models.lti_model import LTIModel
16-
from direct_data_driven_mpc.utilities.models.nonlinear_model import (
17-
NonlinearSystem,
18-
)
1920

2021

2122
def randomize_initial_system_state(

0 commit comments

Comments
 (0)