Migration Guide: v2.x → v3.0.0
💥 Breaking Changes
Effect System Redesign
Terminology changed and sharing system inverted: effects now "pull" shares.
Concept | Old (v2.x) | New (v3.0.0) |
Time-varying effects | operation | temporal |
Investment effects | invest / investment | periodic |
Share to other effects (operation) | specific_share_to_other_effects_operation | share_from_temporal |
Share to other effects (invest) | specific_share_to_other_effects_invest | share_from_periodic |
PythonCO2 = fx.Effect('CO2', 'kg', 'CO2',
specific_share_to_other_effects_operation={'costs': 0.2})
costs = fx.Effect('costs', '€', 'Total')
PythonCO2 = fx.Effect('CO2', 'kg', 'CO2')
costs = fx.Effect('costs', '€', 'Total',
share_from_temporal={'CO2': 0.2}) # Pull from CO2
No deprecation warning
Move shares to receiving effect and update parameter names throughout your code.
Variable Names
Category | Old (v2.x) | New (v3.0.0) |
Investment | is_invested | invested |
Switching | switch_on | switch|on |
Switching | switch_off | switch|off |
Switching | switch_on_nr | switch|count |
Effects | Effect(invest)|total | Effect(periodic) |
Effects | Effect(operation)|total | Effect(temporal) |
Effects | Effect(operation)|total_per_timestep | Effect(temporal)|per_timestep |
Effects | Effect|total | Effect |
String Labels
What | Old (v2.x) | New (v3.0.0) |
Bus assignment | bus=my_bus (object) | bus='electricity' (string) |
Effect shares | {CO2: 0.2} (object key) | {'CO2': 0.2} (string key) |
FlowSystem & Calculation
Change | Description |
FlowSystem copying | Each Calculation gets its own copy (independent) |
do_modeling() return | Returns Calculation object (access model via .model property) |
Storage arrays | Arrays match timestep count (no extra element) |
Final charge state | Use relative_minimum_final_charge_state / relative_maximum_final_charge_state |
Other Changes
Category | Old (v2.x) | New (v3.0.0) |
System model class | SystemModel | FlowSystemModel |
Element submodel | Model | Submodel |
Logging default | Enabled | Disabled |
Enable logging | (default) | fx.CONFIG.Logging.console = True; fx.CONFIG.apply() |
🗑️ Deprecated Parameters
InvestParameters
Old (v2.x) | New (v3.0.0) |
fix_effects | effects_of_investment |
specific_effects | effects_of_investment_per_size |
divest_effects | effects_of_retirement |
piecewise_effects | piecewise_effects_of_investment |
Effect
Old (v2.x) | New (v3.0.0) |
minimum_investment | minimum_periodic |
maximum_investment | maximum_periodic |
minimum_operation | minimum_temporal |
maximum_operation | maximum_temporal |
minimum_operation_per_hour | minimum_per_hour |
maximum_operation_per_hour | maximum_per_hour |
Components
Old (v2.x) | New (v3.0.0) |
source (parameter) | outputs |
sink (parameter) | inputs |
prevent_simultaneous_sink_and_source | prevent_simultaneous_flow_rates |
TimeSeriesData
Old (v2.x) | New (v3.0.0) |
agg_group | aggregation_group |
agg_weight | aggregation_weight |
Calculation
Old (v2.x) | New (v3.0.0) |
active_timesteps=[0, 1, 2] | Use flow_system.sel() or flow_system.isel() |
✨ New Features
Multi-Period Investments
Pythonperiods = pd.Index(['2020', '2030'])
flow_system = fx.FlowSystem(time=timesteps, periods=periods)
Scenario-Based Optimization
Parameter | Description | Example |
scenarios | Scenario index | pd.Index(['low', 'base', 'high'], name='scenario') |
scenario_weights | Probabilities | [0.2, 0.6, 0.2] |
scenario_independent_sizes | Separate capacities per scenario | True / False (default) |
Pythonflow_system = fx.FlowSystem(
time=timesteps,
scenarios=scenarios,
scenario_weights=[0.2, 0.6, 0.2],
scenario_independent_sizes=True
)
Enhanced I/O
Method | Description |
flow_system.to_netcdf('file.nc') | Save FlowSystem |
fx.FlowSystem.from_netcdf('file.nc') | Load FlowSystem |
flow_system.sel(time=slice(...)) | Select by label |
flow_system.isel(time=slice(...)) | Select by index |
flow_system.resample(time='D') | Resample timeseries |
flow_system.copy() | Deep copy |
results.flow_system | Access from results |
Effects Per Component
Pythoneffects_ds = results.effects_per_component
# Access effect contributions by component
print(effects_ds['total'].sel(effect='costs')) # Total effects
print(effects_ds['temporal'].sel(effect='CO2')) # Temporal effects
print(effects_ds['periodic'].sel(effect='costs')) # Periodic effects
Storage Features
Feature | Parameter | Description |
Balanced storage | balanced=True | Ensures charge_size == discharge_size |
Final state min | relative_minimum_final_charge_state=0.5 | End at least 50% charged |
Final state max | relative_maximum_final_charge_state=0.8 | End at most 80% charged |
🔧 Common Issues
✅ Checklist
Docs • Issues • Changelog
Welcome to flixopt v3.0.0! 🎉