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! 🎉