| import gymnasium as gym |
| import sinergym |
| import pandas as pd |
| import numpy as np |
| import os |
| import sinergym |
| import json |
| import sys |
| from unihvac.find_files import ( |
| detect_paths, |
| find_manifest, |
| find_building_and_weather_from_manifest, |
| ) |
| from unihvac.tables import ( |
| print_monthly_tables_extra, |
| print_monthly_tables_split, |
| ) |
| from unihvac.rollout import run_rollout_to_df |
|
|
|
|
| |
| |
| pd.set_option("display.max_columns", None) |
| pd.set_option("display.width", 240) |
| pd.set_option("display.max_colwidth", 32) |
| pd.set_option("display.float_format", lambda x: f"{x:,.2f}") |
| |
|
|
| |
| |
| |
| TARGET_LOCATION = "Atlanta" |
| TARGET_THERMAL = "default" |
| TARGET_OCCUPANCY = "standard" |
|
|
| |
| HEATING_SP = 21.0 |
| COOLING_SP = 24.0 |
|
|
| |
| POLICY_TYPE = "dt" |
|
|
|
|
| |
| |
| |
| paths = detect_paths(outputs_dirname="baseline_results") |
| manifest_path = find_manifest(paths, building="OfficeSmall", prefer_patched=True) |
| output_root = str(paths.outputs_root) |
| os.makedirs(output_root, exist_ok=True) |
| TIME_STEP_HOURS = 900.0 / 3600.0 |
|
|
| |
| |
| |
| hot_actuators = { |
| "Htg_Core": ("Zone Temperature Control", "Heating Setpoint", "CORE_ZN"), |
| "Clg_Core": ("Zone Temperature Control", "Cooling Setpoint", "CORE_ZN"), |
| "Htg_P1": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_1"), |
| "Clg_P1": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_1"), |
| "Htg_P2": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_2"), |
| "Clg_P2": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_2"), |
| "Htg_P3": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_3"), |
| "Clg_P3": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_3"), |
| "Htg_P4": ("Zone Temperature Control", "Heating Setpoint", "PERIMETER_ZN_4"), |
| "Clg_P4": ("Zone Temperature Control", "Cooling Setpoint", "PERIMETER_ZN_4"), |
| } |
|
|
| hot_variables = { |
| "outdoor_temp": ("Site Outdoor Air DryBulb Temperature", "Environment"), |
| "core_temp": ("Zone Air Temperature", "Core_ZN"), |
| "perim1_temp": ("Zone Air Temperature", "Perimeter_ZN_1"), |
| "perim2_temp": ("Zone Air Temperature", "Perimeter_ZN_2"), |
| "perim3_temp": ("Zone Air Temperature", "Perimeter_ZN_3"), |
| "perim4_temp": ("Zone Air Temperature", "Perimeter_ZN_4"), |
| "elec_power": ("Facility Total HVAC Electricity Demand Rate", "Whole Building"), |
| "core_occ_count": ("Zone People Occupant Count", "CORE_ZN"), |
| "perim1_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_1"), |
| "perim2_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_2"), |
| "perim3_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_3"), |
| "perim4_occ_count": ("Zone People Occupant Count", "PERIMETER_ZN_4"), |
|
|
| "outdoor_dewpoint": ("Site Outdoor Air Dewpoint Temperature", "Environment"), |
| "outdoor_wetbulb": ("Site Outdoor Air Wetbulb Temperature", "Environment"), |
|
|
| "core_rh": ("Zone Air Relative Humidity", "CORE_ZN"), |
| "perim1_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_1"), |
| "perim2_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_2"), |
| "perim3_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_3"), |
| "perim4_rh": ("Zone Air Relative Humidity", "PERIMETER_ZN_4"), |
|
|
| "core_ash55_notcomfortable_summer": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer Clothes Not Comfortable Time", "CORE_ZN"), |
| "core_ash55_notcomfortable_winter": ("Zone Thermal Comfort ASHRAE 55 Simple Model Winter Clothes Not Comfortable Time", "CORE_ZN"), |
| "core_ash55_notcomfortable_any": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer or Winter Clothes Not Comfortable Time", "CORE_ZN"), |
|
|
| "p1_ash55_notcomfortable_any": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer or Winter Clothes Not Comfortable Time", "PERIMETER_ZN_1"), |
| "p2_ash55_notcomfortable_any": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer or Winter Clothes Not Comfortable Time", "PERIMETER_ZN_2"), |
| "p3_ash55_notcomfortable_any": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer or Winter Clothes Not Comfortable Time", "PERIMETER_ZN_3"), |
| "p4_ash55_notcomfortable_any": ("Zone Thermal Comfort ASHRAE 55 Simple Model Summer or Winter Clothes Not Comfortable Time", "PERIMETER_ZN_4"), |
| } |
|
|
|
|
| class BaselineReward: |
| def __init__(self, *args, **kwargs): |
| pass |
| def __call__(self, obs_dict): |
| return 0.0, {} |
|
|
|
|
| def run_eval_for_location(location, building_path, weather_path): |
| print("\n" + "=" * 80) |
| print(f"Running eval for location: {location}") |
| print(f" Building: {building_path}") |
| print(f" Weather: {weather_path}") |
| print(f" Policy: {POLICY_TYPE}") |
| print("=" * 80) |
|
|
| out_dir = os.path.join(output_root, location) |
| os.makedirs(out_dir, exist_ok=True) |
|
|
| |
| if POLICY_TYPE == "dt": |
| RUN_DIR = "Trajectories_code/run_007" |
| policy = make_policy( |
| "dt", |
| ckpt_path=os.path.join(RUN_DIR, "ckpt_10.pt"), |
| model_config_path=os.path.join(RUN_DIR, "model_config.json"), |
| norm_stats_path="Trajectories_code/traj_results/norm_stats.npz", |
| context_len=24, |
| max_tokens_per_step=64, |
| ) |
| else: |
| policy = make_policy("rbc", heating_sp=HEATING_SP, cooling_sp=COOLING_SP) |
|
|
| policy.reset() |
|
|
| def policy_fn(obs, info, step): |
| if step == 0: |
| print("OBS TYPE:", type(obs), "SHAPE:", getattr(obs, "shape", None)) |
| if isinstance(obs, dict): |
| print("OBS KEYS SAMPLE:", list(obs.keys())[:10]) |
| action, _, _ = policy.act(obs, info, step) |
| return action |
|
|
| df = run_rollout_to_df( |
| building_path=str(building_path), |
| weather_path=str(weather_path), |
| variables=hot_variables, |
| actuators=hot_actuators, |
| policy_fn=policy_fn, |
| location=location, |
| timestep_hours=TIME_STEP_HOURS, |
| heating_sp=HEATING_SP, |
| cooling_sp=COOLING_SP, |
| reward=BaselineReward, |
| max_steps=None, |
| verbose=True, |
| ) |
|
|
| print("setpoint_htg min/max:", df["setpoint_htg"].min(), df["setpoint_htg"].max()) |
| print("setpoint_clg min/max:", df["setpoint_clg"].min(), df["setpoint_clg"].max()) |
| print("comfort_violation min/mean/max:", df["comfort_violation_degCh"].min(), |
| df["comfort_violation_degCh"].mean(), df["comfort_violation_degCh"].max()) |
|
|
| print_monthly_tables_extra(df, location) |
| print_monthly_tables_split(df, location, time_step_hours=TIME_STEP_HOURS) |
|
|
| df.to_csv(os.path.join(out_dir, "eval_timeseries.csv"), index=False) |
|
|
| return df |
|
|
|
|
| if __name__ == "__main__": |
| bpath, wpath = find_building_and_weather_from_manifest( |
| manifest_path, |
| location=TARGET_LOCATION, |
| occupancy=TARGET_OCCUPANCY, |
| thermal=TARGET_THERMAL, |
| require_patched=True, |
| ) |
|
|
| print("USING BUILDING FILE:", bpath) |
| run_eval_for_location(TARGET_LOCATION, str(bpath), str(wpath)) |
|
|