Building Intelligent Environments for a Sustainable Future
Type this URL into your browser:
bit.ly/ie26tut4
Postdoctoral Researcher · Machine Learning Group, ULB · Ph.D. 2026
Research focus: multivariate time series — causal inference, forecasting, anomaly detection, and Digital Twins.
Founded in 2004 by Prof. Gianluca Bontempi, is currently co-headed by him and Prof. Tom Lenaerts. MLG targets machine learning and behavioral intelligence research on time series analysis, big data mining, causal inference, network inference, decision-making models and behavioral analysis
The EDITS project (Enhancing DIgital TwinS with scalable and interpretable AI) — funded by WEL-T
| 14:00 - 14:20 | Theory: The Digital Twin Architecture |
| 14:20 - 14:50 | Hands-on 1: The Physical Twin (Data Generation) |
| 14:50 - 15:00 | 10 minutes break |
| 15:00 - 15:20 | Hands-on 2: The Digital Brain (Machine Learning) |
| 15:20 - 16:00 | Hands-on 3: Closing the Loop (Optimization) |
A Virtual Power Plant (VPP) is a cloud-based distributed power plant that aggregates the capacities of heterogeneous distributed energy resources (DERs) — solar panels, wind turbines, battery storage, and flexible loads — and coordinates them as a single, dispatchable unit visible to the grid operator.
Components
What the DT does
Sensing (Physical → Digital)
Actuating (Digital → Physical)
Both arrows active → true Digital Twin,
not
just a shadow or a model.
We get weather data and use specialized libraries that convert this weather data into energy profiles for solar panels and wind turbines.
🌐 Weather Data Input
Temperature, irradiance, wind speed, humidity, cloud cover, etc. from weather stations or forecasts.
⚙️ Specialized Libraries
pvlib (solar), windpowerlib (wind), and others that model physics & efficiency.
⚡ Energy Profile Output
Predicted power output (kW/MW) for each asset at each time step—ready for optimization.
The sun's energy reaching a surface splits into three components that pvlib needs separately.
☀️ GHI — Global Horizontal Irradiance
Total solar radiation on a flat horizontal surface. GHI = DNI·cos(θ) + DHI. The "headline" number from weather stations.
🔆 DNI — Direct Normal Irradiance
Radiation arriving directly from the sun's disk, measured on a surface always perpendicular to it. Dominant on clear days. Strongly affected by tilt & azimuth.
🌫️ DHI — Diffuse Horizontal Irradiance
Scattered radiation from the rest of the sky dome (clouds, atmosphere). Does not depend on panel orientation — you always receive it.
Why all three? A tilted panel sees a different mix of direct, diffuse, and ground-reflected light. pvlib needs all three to compute what actually hits your panel.
pvlib strings together a pipeline of physical models. Each step converts one quantity into the next:
The columns ghi, dni,
dhi, temp_air, wind_speed are the exact inputs steps
1–3 consume — that's why the names are mandatory.
Module
Inverter & Racking
Wind power follows a cubic law — small speed changes have a huge impact.
Key physics
What we model
Build a realistic load profile and dynamic price signal for downstream prediction.
Predictive Modeling for the Digital Twin
Supported by the WEL Research Institute (WEL-T) - EDITS Project
Standard ML models require independent rows to predict a target.
maxlags Parameter (d)
shift(1)).
shift(-1)) introduces future data into
the current training row.Condensing historical windows into compact statistical summaries.
center=False).
Injecting domain-specific physical and temporal structures into the model.
Linear features like Hour (0–23) hide temporal proximity (hour 23
and hour 0 are close, but numerically far).
We map these inputs to a 2D coordinate space using sine and cosine
transformations:
Hour_Sin = sin(2π·h/24), Hour_Cos = cos(2π·h/24)
Adding lags and rolling windows to every exogenous signal causes feature count
to balloon quickly.
We selectively include current physical drivers (like Global Horizontal
Irradiance, ghi) without lagging them, keeping the feature space
compact.
Evaluating models without violating the direction of time.
Evaluating predictive skill relative to trivial averages.
NMSE = MSE / Var(y_true)
Normalizing by the variance of the target ground truth converts the error into a relative, scale-independent metric.
1 - NMSE represents the
Coefficient of Determination ($R^2$).Extending predictions across multiple variables and long-term planning horizons.
Standard models predict only one step ahead ($t+1$). For multi-step horizons (e.g., $t+24$ for battery scheduling), we feed the predicted value at $t+1$ back into the lag array to predict $t+2$, iterating step-by-step.
Because recursive forecasting uses predicted values as inputs for subsequent timesteps, any error introduced early in the chain propagates and compounds as the forecast horizon expands.
The same principle as buying low and selling high — applied to electricity.
Setting up the search space before we visualize it
The Mathematical Setup
x = Power bought (Costs $2/kW)y = Power sold (Earns $5/kW)
Z = 5y - 2x
x ≤ 6 and y ≤ 6y ≤ x + 2 (SOC)x ≥ 0, y ≥ 0The Optimization Logic
Key fact: because the objective is linear, the optimum always sits at a corner of this shape.
prob += ...),
then translates them into a standard mathematical format.prob.solve() calls CBC, waits for it to finish, and reads
the
result back into your Python variables via .varValue.pulp.LpStatus[status] tells you what CBC reported:
Optimal, Infeasible, or Unbounded.
prob += pulp.lpSum([P_buy[t]*price_buy_f[t] - P_sell[t]*price_sell_f[t] for t in times])
prob += (pv_f[t] + wind_f[t] + P_buy[t] + P_discharge[t] == demand_f[t] + P_sell[t] + P_charge[t])
prob += (SoC[t] == SoC[t-1] + (P_charge[t] * eta) - (P_discharge[t] / eta))
For slides; code; and paper