Skip to content

Commit

Permalink
Style: Switch from Black to Ruff Format
Browse files Browse the repository at this point in the history
This makes the pre-commit hooks faster still, and leverages the extra
capabilities of a dependency we already have anyway.

Note that we bump the version of Ruff as well, and update the
pyproject.toml to use the recommended "lint.ignore" instead of just
"ignore".
  • Loading branch information
jackvreeken committed Feb 4, 2025
1 parent c217ce5 commit a8ee3b0
Show file tree
Hide file tree
Showing 57 changed files with 144 additions and 97 deletions.
8 changes: 2 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,9 @@ exclude: |
versioneer.py
)$
repos:
# Using this mirror lets us use mypyc-compiled black, which is about 2x faster
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.9.1
hooks:
- id: black
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.3
rev: v0.9.4
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
5 changes: 3 additions & 2 deletions examples/channel_wave_damping/src/example_local_control.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
from steady_state_initialization_mixin import SteadyStateInitializationMixin
from step_size_parameter_mixin import StepSizeParameterMixin

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
from rtctools.optimization.csv_mixin import CSVMixin
from rtctools.optimization.homotopy_mixin import HomotopyMixin
from rtctools.optimization.modelica_mixin import ModelicaMixin
from rtctools.util import run_optimization_problem
from steady_state_initialization_mixin import SteadyStateInitializationMixin
from step_size_parameter_mixin import StepSizeParameterMixin


class ExampleLocalControl(
Expand Down
5 changes: 3 additions & 2 deletions examples/channel_wave_damping/src/example_optimization.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from example_local_control import ExampleLocalControl
from steady_state_initialization_mixin import SteadyStateInitializationMixin
from step_size_parameter_mixin import StepSizeParameterMixin

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand All @@ -7,8 +10,6 @@
from rtctools.optimization.homotopy_mixin import HomotopyMixin
from rtctools.optimization.modelica_mixin import ModelicaMixin
from rtctools.util import run_optimization_problem
from steady_state_initialization_mixin import SteadyStateInitializationMixin
from step_size_parameter_mixin import StepSizeParameterMixin


class TargetLevelGoal(Goal):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.optimization_problem import OptimizationProblem


Expand Down
1 change: 1 addition & 0 deletions examples/ensemble/src/example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
1 change: 1 addition & 0 deletions examples/goal_programming/src/example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
1 change: 1 addition & 0 deletions examples/integrator_delay/src/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
The examples use the same model and result in the same output.
"""

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
1 change: 1 addition & 0 deletions examples/lookup_table/src/example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
1 change: 1 addition & 0 deletions examples/mixed_integer/src/example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
1 change: 1 addition & 0 deletions examples/pumped_hydropower_system/src/example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import numpy as np

from rtctools.optimization.collocated_integrated_optimization_problem import (
CollocatedIntegratedOptimizationProblem,
)
Expand Down
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ exclude = '''
'''

[tool.ruff]
ignore = [
lint.ignore = [
"B904", # Fix someday: raising exceptions within except
]
line-length = 100
select = [
lint.select = [
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"E", # default / pycodestyle
"F", # default / pyflakes
"I", # isort
"W", # pycodestyle

]
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
RTC-Tools is the Deltares toolbox for control and optimization of water systems.
"""

import sys

from setuptools import find_packages, setup
Expand Down
31 changes: 16 additions & 15 deletions src/rtctools/data/netcdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,20 +401,21 @@ def create_variables(self, variable_names: List[str], ensemble_size: int) -> Non
"""
assert len(set(variable_names)) == len(variable_names)

assert (
self.__time_dim is not None
), "First call write_times to ensure the time dimension has been created."
assert (
self.__station_dim is not None
), "First call write_station_data to ensure the station dimension has been created"
assert self.__time_dim is not None, (
"First call write_times to ensure the time dimension has been created."
)
assert self.__station_dim is not None, (
"First call write_station_data to ensure the station dimension has been created"
)
assert (
self.__station_id_to_index_mapping is not None
) # should also be created in write_station_data

if ensemble_size > 1:
assert (
self.__ensemble_member_dim is not None
), "First call write_ensemble_data to ensure the realization dimension has been created"
assert self.__ensemble_member_dim is not None, (
"First call write_ensemble_data to ensure "
"the realization dimension has been created"
)

for variable_name in variable_names:
self.__dataset.createVariable(
Expand Down Expand Up @@ -446,15 +447,15 @@ def write_output_values(
:param values: The values that are to be written to the file
:param ensemble_size: the number of members in the ensemble
"""
assert (
self.__station_id_to_index_mapping is not None
), "First call write_station_data and create_variables."
assert self.__station_id_to_index_mapping is not None, (
"First call write_station_data and create_variables."
)

station_index = self.__station_id_to_index_mapping[station_id]
if ensemble_size > 1:
self.__dataset.variables[variable_name][
:, station_index, ensemble_member_index
] = values
self.__dataset.variables[variable_name][:, station_index, ensemble_member_index] = (
values
)
else:
self.__dataset.variables[variable_name][:, station_index] = values

Expand Down
7 changes: 5 additions & 2 deletions src/rtctools/data/pi.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,11 @@ def __iter__(self):

parameters = group.findall("pi:parameter", ns)
for parameter in parameters:
yield location_id, model_id, parameter.attrib["id"], self.__parse_parameter(
parameter
yield (
location_id,
model_id,
parameter.attrib["id"],
self.__parse_parameter(parameter),
)


Expand Down
6 changes: 3 additions & 3 deletions src/rtctools/data/rtc.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ def __init__(self, folder):
logger.error(message)
raise Exception(message)
else:
self.__location_parameter_ids[
internal_id
] = self.__pi_location_parameter_id(pi_timeseries, "fews")
self.__location_parameter_ids[internal_id] = (
self.__pi_location_parameter_id(pi_timeseries, "fews")
)
self.__variable_map[external_id] = internal_id

for k in ["import", "export"]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1028,8 +1028,8 @@ def _interpolate_constant_inputs(variables, raw_constant_inputs):
+ len(self.dae_variables["constant_inputs"])
]
constant_inputs_1 = accumulated_U[
2 * len(collocated_variables)
+ len(self.dae_variables["constant_inputs"]) : 2 * len(collocated_variables)
2 * len(collocated_variables) + len(self.dae_variables["constant_inputs"]) : 2
* len(collocated_variables)
+ 2 * len(self.dae_variables["constant_inputs"])
]

Expand Down Expand Up @@ -1803,9 +1803,9 @@ def _interpolate_constant_inputs(variables, raw_constant_inputs):
# Cast delay from DM to np.array
delay = delay.toarray().flatten()

assert np.all(
np.isfinite(delay)
), "Delay duration must be resolvable to real values at transcribe()"
assert np.all(np.isfinite(delay)), (
"Delay duration must be resolvable to real values at transcribe()"
)

out_times = np.concatenate([history_times, collocation_times])
out_values = ca.veccat(
Expand Down Expand Up @@ -2869,8 +2869,7 @@ def constr_to_str(i):

# Check coefficient matrix
logger.info(
"Sanity check on objective and constraints Jacobian matrix"
"/constant coefficients values"
"Sanity check on objective and constraints Jacobian matrix/constant coefficients values"
)

in_var = nlp["x"]
Expand Down
7 changes: 4 additions & 3 deletions src/rtctools/optimization/csv_lookup_table_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def domain(self) -> Tuple:
"This lookup table was not instantiated with tck metadata. \
Domain/Range information is unavailable."
)
if type(t) == tuple and len(t) == 2:
if isinstance(t, tuple) and len(t) == 2:
raise NotImplementedError(
"Domain/Range information is not yet implemented for 2D LookupTables"
)
Expand Down Expand Up @@ -298,8 +298,9 @@ def get_property(prop_name):
def check_lookup_table(lookup_table):
if lookup_table in self.__lookup_tables:
raise Exception(
"Cannot add lookup table {},"
"since there is already one with this name.".format(lookup_table)
"Cannot add lookup table {},since there is already one with this name.".format(
lookup_table
)
)

# Read CSV files
Expand Down
5 changes: 3 additions & 2 deletions src/rtctools/optimization/goal_programming_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,9 @@ def __goal_hard_constraint(
if goal.has_target_bounds:
# We use a violation variable formulation, with the violation
# variables epsilon bounded between 0 and 1.
m, M = np.full_like(epsilon, -np.inf, dtype=np.float64), np.full_like(
epsilon, np.inf, dtype=np.float64
m, M = (
np.full_like(epsilon, -np.inf, dtype=np.float64),
np.full_like(epsilon, np.inf, dtype=np.float64),
)

# A function range does not have to be specified for critical
Expand Down
7 changes: 4 additions & 3 deletions src/rtctools/optimization/goal_programming_mixin_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ def __init__(
):
assert isinstance(m, (float, np.ndarray, Timeseries))
assert isinstance(M, (float, np.ndarray, Timeseries))
assert type(m) == type(M)
assert type(m) is type(M)

# NumPy arrays only allowed for vector goals
if isinstance(m, np.ndarray):
Expand Down Expand Up @@ -982,8 +982,9 @@ def _gp_goal_hard_constraint(
if goal.has_target_bounds:
# We use a violation variable formulation, with the violation
# variables epsilon bounded between 0 and 1.
m, M = np.full_like(epsilon, -np.inf, dtype=np.float64), np.full_like(
epsilon, np.inf, dtype=np.float64
m, M = (
np.full_like(epsilon, -np.inf, dtype=np.float64),
np.full_like(epsilon, np.inf, dtype=np.float64),
)

# A function range does not have to be specified for critical
Expand Down
4 changes: 2 additions & 2 deletions src/rtctools/optimization/modelica_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ def bounds(self):
try:
(m, M) = bounds[sym_name]
except KeyError:
if self.__python_types.get(sym_name, float) == bool:
if self.__python_types.get(sym_name, float) is bool:
(m, M) = (0, 1)
else:
(m, M) = (-np.inf, np.inf)
Expand Down Expand Up @@ -401,7 +401,7 @@ def seed(self, ensemble_member):
return seed

def variable_is_discrete(self, variable):
return self.__python_types.get(variable, float) != float
return self.__python_types.get(variable, float) is not float

@property
@cached
Expand Down
6 changes: 3 additions & 3 deletions src/rtctools/optimization/pi_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,8 @@ def set_unit(self, variable: str, unit: str):
:param variable: Time series ID.
:param unit: Unit.
"""
assert hasattr(
self, "_PIMixin__timeseries_import"
), "set_unit can only be called after read() in pre() has finished."
assert hasattr(self, "_PIMixin__timeseries_import"), (
"set_unit can only be called after read() in pre() has finished."
)
self.__timeseries_import.set_unit(variable, unit, 0)
self.__timeseries_export.set_unit(variable, unit, 0)
6 changes: 3 additions & 3 deletions src/rtctools/simulation/pi_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,8 @@ def set_unit(self, variable: str, unit: str):
:param variable: Time series ID.
:param unit: Unit.
"""
assert hasattr(
self, "_PIMixin__timeseries_import"
), "set_unit can only be called after read() in pre() has finished."
assert hasattr(self, "_PIMixin__timeseries_import"), (
"set_unit can only be called after read() in pre() has finished."
)
self.__timeseries_import.set_unit(variable, unit, 0)
self.__timeseries_export.set_unit(variable, unit, 0)
11 changes: 6 additions & 5 deletions src/rtctools/simulation/simulation_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,8 +493,9 @@ def initialize(self, config_file=None):
self.set_var(var_name, numeric_start_val)
except KeyError:
logger.warning(
"Initialize: {} not found in state vector. "
"Initial value of {} not set.".format(var_name, numeric_start_val)
"Initialize: {} not found in state vector. Initial value of {} not set.".format(
var_name, numeric_start_val
)
)

# Add a residual for the difference between the state and its starting expression
Expand Down Expand Up @@ -1060,9 +1061,9 @@ def set_time_step(self, dt):
:param dt: Timestep size of the simulation.
"""
if self._dt_is_fixed:
assert math.isclose(
self.__dt, dt
), "Timestep size dt is marked as constant and cannot be changed."
assert math.isclose(self.__dt, dt), (
"Timestep size dt is marked as constant and cannot be changed."
)
else:
self.__dt = dt

Expand Down
1 change: 1 addition & 0 deletions tests/data/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from unittest import TestCase

import numpy as np

import rtctools.data.pi as pi
import rtctools.data.rtc as rtc

Expand Down
3 changes: 2 additions & 1 deletion tests/data/test_interpolate.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from unittest import TestCase

import numpy as np
from casadi import SX, Function, linspace

import rtctools.data.interpolation.bspline1d
import rtctools.data.interpolation.bspline2d
from casadi import SX, Function, linspace


class TestBSpline1DFit(TestCase):
Expand Down
Loading

0 comments on commit a8ee3b0

Please sign in to comment.