diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 695a9804..af8f8412 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,40 +1,46 @@
fail_fast: true
repos:
-- repo: local
- hooks:
+ - repo: local
+ hooks:
+ - id: pyink
+ name: pyink
+ entry: poetry run pyink
+ language: system
+ types: [file, python]
+ files: "^smart_control/"
+ exclude: "^smart_control/Dockerfile"
- - id: pyink
- name: pyink
- entry: poetry run pyink
- language: system
- types: [file, python]
- files: '^smart_control/'
- exclude: '^smart_control/Dockerfile'
+ - id: isort
+ name: isort
+ entry: poetry run isort
+ language: system
+ types: [file, python]
+ files: "^smart_control/"
+ exclude: "^smart_control/proto/"
- - id: isort
- name: isort
- entry: poetry run isort
- language: system
- types: [file, python]
- files: '^smart_control/'
- exclude: '^smart_control/proto/'
+ # NOTE: running `pylint` against all files is prohibitively slow
+ # ... so we omit passing the `smart_buildings` directory,
+ # ... which allows pre-commit to run against staged / changed files only
+ - id: pylint
+ name: pylint
+ #entry: pylint --rcfile=.pylintrc --ignore=proto smart_control
+ #entry: pylint --rcfile=.pylintrc --ignore=proto $(git diff --name-only --staged | grep -E '\.py$')
+ entry: pylint --rcfile=.pylintrc --ignore=proto
+ language: system
+ types: [file, python]
+ files: "^smart_control/"
+ exclude: "^smart_control/proto/"
- # NOTE: running `pylint` against all files is prohibitively slow
- # ... so we omit passing the `smart_buildings` directory,
- # ... which allows pre-commit to run against staged / changed files only
- - id: pylint
- name: pylint
- #entry: pylint --rcfile=.pylintrc --ignore=proto smart_control
- #entry: pylint --rcfile=.pylintrc --ignore=proto $(git diff --name-only --staged | grep -E '\.py$')
- entry: pylint --rcfile=.pylintrc --ignore=proto
- language: system
- types: [file, python]
- files: '^smart_control/'
- exclude: '^smart_control/proto/'
+ - id: uml-generator
+ name: Generate UML Diagram
+ entry: make uml
+ language: system
+ files: ^smart_control/.*\.py$
+ stages: [commit]
-# See: https://mdformat.readthedocs.io/en/stable/users/installation_and_usage.html#usage-as-a-pre-commit-hook
-- repo: https://github.com/hukkin/mdformat
- rev: 0.7.22
- hooks:
- - id: mdformat
- exclude: ^docs/api/
+ # See: https://mdformat.readthedocs.io/en/stable/users/installation_and_usage.html#usage-as-a-pre-commit-hook
+ - repo: https://github.com/hukkin/mdformat
+ rev: 0.7.22
+ hooks:
+ - id: mdformat
+ exclude: ^docs/api/
diff --git a/Makefile b/Makefile
index b5905d8f..4dd392e1 100644
--- a/Makefile
+++ b/Makefile
@@ -53,3 +53,12 @@ docs-quiet:
docs-build:
poetry run mkdocs build
+
+#
+# UML Diagram
+#
+uml:
+ @echo "--- Generating UML class diagram ---"
+ pyreverse -o dot -p smart_control smart_control/
+ dot -Tpng classes_smart_control.dot -o docs/images/class_diagram.png
+ rm classes_smart_control.dot packages_smart_control.dot
diff --git a/classes_smart_control.dot b/classes_smart_control.dot
new file mode 100644
index 00000000..82153519
--- /dev/null
+++ b/classes_smart_control.dot
@@ -0,0 +1,238 @@
+digraph "classes_smart_control" {
+rankdir=BT
+charset="utf-8"
+"smart_control.environment.environment.ActionConfig" [color="black", fontcolor="black", label=<{ActionConfig|action_normalizers : Mapping
|get_action_normalizer(setpoint_name: FieldName): Optional[base_normalizer.BaseActionNormalizer]
}>, shape="record", style="solid"];
+"smart_control.utils.bounded_action_normalizer_test.ActionNormalizerTest" [color="black", fontcolor="black", label=<{ActionNormalizerTest|
|test_default_array_spec()
test_default_bounded_action_setpoint_value(agent_action, expected_value)
test_normalized_range_array_spec()
test_normalized_range_bounded_action_setpoint_value(agent_action, expected_value)
test_normalized_range_bounded_agent_setpoint_above()
test_normalized_range_bounded_agent_setpoint_below()
test_normalized_range_bounded_agent_setpoint_value(agent_action, expected_value)
test_normalized_range_setpoint_value_raises_error(min_normalized, max_normalized, agent_action)
test_normalized_range_setpoint_value_shape_raises_error()
}>, shape="record", style="solid"];
+"smart_control.utils.agent_utils_test.AgentUtilsTest" [color="black", fontcolor="black", label=<{AgentUtilsTest|
|test_create_random_walk_collect_error(fixed_policy_array, time_steps_per_random_step, policy_length, random_step_magnitude, upper_bound, lower_bound, err)
test_create_random_walk_collect_script(policy_array, time_steps_per_random_step, policy_length, random_step_magnitude, upper_bound, lower_bound)
}>, shape="record", style="solid"];
+"smart_control.simulator.air_handler.AirHandler" [color="black", fontcolor="black", label=<{AirHandler|air_flow_rate
air_flow_rate : int
ambient_flow_rate
cooling_air_temp_setpoint
cooling_air_temp_setpoint : int
cooling_request_count
fan_differential_pressure
fan_differential_pressure : float
fan_efficiency
fan_efficiency : float
heating_air_temp_setpoint
heating_air_temp_setpoint : int
max_air_flow_rate
outside_air_temperature_sensor
recirculation
recirculation : float
recirculation_flow_rate
supply_fan_speed_percentage
|add_demand(flow_rate: float)
compute_exhaust_fan_energy_rate(): float
compute_fan_power(flow_rate: float, fan_differential_pressure: float, fan_efficiency: float): float
compute_intake_fan_energy_rate(): float
compute_thermal_energy_rate(recirculation_temp: float, ambient_temp: float): float
get_mixed_air_temp(recirculation_temp: float, ambient_temp: float): float
get_supply_air_temp(recirculation_temp: float, ambient_temp: float): float
reset()
reset_demand()
}>, shape="record", style="solid"];
+"smart_control.simulator.air_handler_test.AirHandlerTest" [color="black", fontcolor="black", label=<{AirHandlerTest|cooling_air_temp_setpoint : int
fan_differential_pressure : float
fan_efficiency : float
heating_air_temp_setpoint : int
max_air_flow_rate : int
recirculation : float
|test_action_field_names()
test_actions(new_value, action_name, attribute_name)
test_add_demand()
test_add_demand_above_max()
test_add_demand_raises_value_error()
test_ambient_flow_rate(recirculation, air_flow_rate)
test_compute_exhaust_fan_energy_rate()
test_compute_fan_power(flow_rate, fan_differential_pressure, fan_efficiency)
test_compute_intake_fan_energy_rate()
test_compute_thermal_energy_rate(air_flow_rate, ambient_temp, recirculation_temp)
test_get_mixed_air_temp(recirculation, recirculation_temp, ambient_temp, expected)
test_get_supply_air_temp(recirculation, recirculation_temp, ambient_temp, expected)
test_init()
test_init_default()
test_init_invalid_setpoints()
test_invalid_outside_air_temperature_sensor()
test_observable_field_names()
test_observations(observation_name, attribute_name)
test_observe_cooling_request_count()
test_recirculation_flow_rate(recirculation, air_flow_rate)
test_reset()
test_reset_demand()
test_setters()
test_supply_fan_speed_percentage()
test_valid_outside_air_handler_temperature_sensor(timestamp, expected_temp)
}>, shape="record", style="solid"];
+"smart_control.simulator.smart_device.AttributeInfo" [color="black", fontcolor="black", label=<{AttributeInfo|attribute_name : str
clazz : Type[object]
|}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest.test_get_observation_invalid.BadObservationBuilding" [color="black", fontcolor="black", label=<{BadObservationBuilding|
|request_observations(observation_request: smart_control_building_pb2.ObservationRequest): smart_control_building_pb2.ObservationResponse
}>, shape="record", style="solid"];
+"smart_control.utils.regression_building_utils_test.RegressionBuildingUtilsTest.test_get_zone_reward_infos_invalid.BadSetpointSchedule" [color="black", fontcolor="black", label=<{BadSetpointSchedule|
|get_temperature_window(current_timestamp: pd.Timestamp): tuple[float, float]
}>, shape="record", style="solid"];
+"smart_control.models.base_normalizer.BaseActionNormalizer" [color="black", fontcolor="black", label=<{BaseActionNormalizer|setpoint_max
setpoint_min
|agent_value(setpoint_value: float): float
get_array_spec(name): specs.ArraySpec
setpoint_value(agent_action: np.ndarray): float
}>, shape="record", style="solid"];
+"smart_control.models.base_building.BaseBuilding" [color="black", fontcolor="black", label=<{BaseBuilding|current_timestamp
devices
num_occupants
reward_info
time_step_sec
zones
|is_comfort_mode(current_time: pd.Timestamp): bool
render(path: str): None
request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
request_observations(observation_request: smart_control_building_pb2.ObservationRequest): smart_control_building_pb2.ObservationResponse
request_observations_within_time_interval(observation_request: smart_control_building_pb2.ObservationRequest, start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
reset(): None
wait_time(): None
}>, shape="record", style="solid"];
+"smart_control.simulator.base_convection_simulator.BaseConvectionSimulator" [color="black", fontcolor="black", label=<{BaseConvectionSimulator|
|apply_convection(room_dict: dict[str, MutableSequence[tuple[int, int]]], temp: np.ndarray): None
}>, shape="record", style="solid"];
+"smart_control.models.base_energy_cost.BaseEnergyCost" [color="black", fontcolor="black", label=<{BaseEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor.BaseLearningAlgorithm" [color="black", fontcolor="black", label=<{BaseLearningAlgorithm|
|fit(x_train: np.ndarray, y_train: np.ndarray): None
predict(x_pred: np.ndarray): np.ndarray
}>, shape="record", style="solid"];
+"smart_control.models.base_normalizer.BaseObservationNormalizer" [color="black", fontcolor="black", label=<{BaseObservationNormalizer|
|denormalize(normalized: smart_control_building_pb2.ObservationResponse): smart_control_building_pb2.ObservationResponse
normalize(native: smart_control_building_pb2.ObservationResponse): smart_control_building_pb2.ObservationResponse
}>, shape="record", style="solid"];
+"smart_control.models.base_occupancy.BaseOccupancy" [color="black", fontcolor="black", label=<{BaseOccupancy|
|average_zone_occupancy(zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.utils.reader_lib.BaseReader" [color="black", fontcolor="black", label=<{BaseReader|
|read_action_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ActionResponse]
read_device_infos(): Sequence[smart_control_building_pb2.DeviceInfo]
read_normalization_info(): Mapping[VariableId, smart_control_normalization_pb2.ContinuousVariableInfo]
read_observation_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
read_reward_infos(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_reward_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_zone_infos(): Sequence[smart_control_building_pb2.ZoneInfo]
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.BaseReducedSequence" [color="black", fontcolor="black", label=<{BaseReducedSequence|reduced_sequence : DataFrame
|expand(): pd.DataFrame
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.BaseReducer" [color="black", fontcolor="black", label=<{BaseReducer|
|reduce(observation_sequence: pd.DataFrame): BaseReducedSequence
}>, shape="record", style="solid"];
+"smart_control.models.base_reward_function.BaseRewardFunction" [color="black", fontcolor="black", label=<{BaseRewardFunction|
|compute_reward(reward_info: smart_control_reward_pb2.RewardInfo): smart_control_reward_pb2.RewardResponse
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor.BaseRunCommandPredictor" [color="black", fontcolor="black", label=<{BaseRunCommandPredictor|
|predict(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.SingleActionRequest
}>, shape="record", style="solid"];
+"smart_control.reward.base_setpoint_energy_carbon_reward.BaseSetpointEnergyCarbonRewardFunction" [color="black", fontcolor="black", label=<{BaseSetpointEnergyCarbonRewardFunction|
|compute_reward(reward_info: smart_control_reward_pb2.RewardInfo): smart_control_reward_pb2.RewardResponse
}>, shape="record", style="solid"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test.BaseSetpointEnergyCarbonRewardTest" [color="black", fontcolor="black", label=<{BaseSetpointEnergyCarbonRewardTest|
|test_get_time_delta_sec()
test_get_zone_productivity_reward(heating_setpoint, cooling_setpoint, zone_temp, time_interval_sec, average_occupancy, expected_productivity)
test_sum_electricity_energy_rate()
test_sum_natural_gas_energy_rate()
test_sum_zone_productivities()
}>, shape="record", style="solid"];
+"smart_control.simulator.building.BaseSimulatorBuilding" [color="black", fontcolor="black", label=<{BaseSimulatorBuilding|conductivity
cv_type
density
heat_capacity
|get_zone_average_temps(): Union[Dict[Tuple[int, int], Any], Dict[str, Any]]
reset()
}>, shape="record", style="solid"];
+"smart_control.simulator.weather_controller.BaseWeatherController" [color="black", fontcolor="black", label=<{BaseWeatherController|
|get_current_temp(timestamp: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.utils.writer_lib.BaseWriter" [color="black", fontcolor="black", label=<{BaseWriter|
|write_action_response(action_response: smart_control_building_pb2.ActionResponse, timestamp: pd.Timestamp): None
write_building_image(base64_img: bytes, timestamp: pd.Timestamp): None
write_device_infos(device_infos: Sequence[smart_control_building_pb2.DeviceInfo]): None
write_normalization_info(normalization_info: Mapping[VariableId, smart_control_normalization_pb2.ContinuousVariableInfo]): None
write_observation_response(observation_response: smart_control_building_pb2.ObservationResponse, timestamp: pd.Timestamp): None
write_reward_info(reward_info: smart_control_reward_pb2.RewardInfo, timestamp: pd.Timestamp): None
write_reward_response(reward_response: smart_control_reward_pb2.RewardResponse, timestamp: pd.Timestamp): None
write_zone_infos(zone_infos: Sequence[smart_control_building_pb2.ZoneInfo]): None
}>, shape="record", style="solid"];
+"smart_control.utils.writer_lib.BaseWriterFactory" [color="black", fontcolor="black", label=<{BaseWriterFactory|
|create(output_dir: PathLocation): BaseWriter
}>, shape="record", style="solid"];
+"smart_control.simulator.boiler.Boiler" [color="black", fontcolor="black", label=<{Boiler|heating_request_count
reheat_water_setpoint
reheat_water_setpoint : int
return_water_temperature_sensor
supply_water_setpoint
supply_water_temperature_sensor
|add_demand(flow_rate: float)
compute_pump_power(): float
compute_thermal_dissipation_rate(water_temp: float, outside_temp: float): float
compute_thermal_energy_rate(return_water_temp: float, outside_temp: float): float
reset()
reset_demand(): None
}>, shape="record", style="solid"];
+"smart_control.simulator.boiler_test.BoilerTest" [color="black", fontcolor="black", label=<{BoilerTest|
|get_default_boiler()
test_action_field_names()
test_action_supply_water_setpoint()
test_add_demand()
test_add_demand_raises_value_error()
test_adjust_temperature(setpoint_temperature, actual_temperature, time_difference, heating_rate, cooling_rate, expected_temperature)
test_compute_pump_power(total_flow_rate, water_pump_differential_head, water_pump_efficiency)
test_compute_thermal_dissipation_rate_invalid()
test_compute_thermal_dissipation_rate_valid()
test_compute_thermal_dissipation_rate_zero()
test_compute_thermal_energy_rate(water_temp_setpoint, return_water_temp, outside_temp, total_flow_rate, expected_energy_rate)
test_compute_thermal_energy_rate_heating()
test_compute_thermal_energy_rate_raises_assertion_error()
test_device_id()
test_device_type()
test_init()
test_init_default_id()
test_observable_field_names()
test_observe_heating_request_count()
test_observe_supply_water_setpoint()
test_observe_supply_water_temperature_sensor()
test_reset()
test_reset_demand()
test_set_current_temperature_default(current_temp, setpoint_temp, action_timestamp, observation_timestamp, heating_rate, cooling_rate, expected_temp, expected_energy_rate)
test_setters()
}>, shape="record", style="solid"];
+"smart_control.utils.bounded_action_normalizer.BoundedActionNormalizer" [color="black", fontcolor="black", label=<{BoundedActionNormalizer|setpoint_max
setpoint_min
|agent_value(setpoint_value: float): float
get_array_spec(name): specs.ArraySpec
setpoint_value(agent_action: np.ndarray): float
}>, shape="record", style="solid"];
+"smart_control.simulator.building.Building" [color="black", fontcolor="black", label=<{Building|building_shape : Tuple
conductivity
cv_size_cm : float
cv_type
density
diffusers : ndarray
floor_height_cm : float
heat_capacity
input_q : ndarray
neighbors
room_shape : Tuple
temp : ndarray
|apply_thermal_power_zone(zone_coordinates: Coordinates2D, power: float)
get_zone_average_temps(): Dict[Tuple[int, int], Any]
get_zone_temp_stats(zone_coordinates: Coordinates2D): Tuple[float, float, float]
get_zone_thermal_energy_rate(zone_coordinates: Coordinates2D): float
reset()
}>, shape="record", style="solid"];
+"smart_control.dataset.dataset.BuildingDataset" [color="black", fontcolor="black", label=<{BuildingDataset|actionable_field_counts
actionable_fields
building_dirpath
dataset_id : str
device_infos
device_infos_filepath
device_layout_map
device_layout_map_filepath
devices_df
fields_df
floorplan
floorplan_filepath
floorplan_image_filepath
observable_field_counts
observable_fields
partition_ids : list
tabular_dirpath
zip_filename
zip_filepath
zip_url
zone_infos
zone_infos_filepath
zones_df
|display_floorplan(cmap, show, save, image_filepath: str | None)
download(timeout)
}>, shape="record", style="solid"];
+"smart_control.dataset.partition.BuildingDatasetPartition" [color="black", fontcolor="black", label=<{BuildingDatasetPartition|action_ids
action_ids_map
action_timestamps
action_value_matrix
actions_df
data
data_filepath
ds
metadata
metadata_filepath
observation_ids
observation_ids_map
observation_timestamps
observation_value_matrix
observations_df
partition_dirpath
partition_id : str
reward_ids
reward_ids_map
reward_info_ids
reward_info_ids_map
reward_info_timestamps
reward_info_value_matrix
reward_infos_df
reward_timestamps
reward_value_matrix
rewards_df
|}>, shape="record", style="solid"];
+"smart_control.utils.building_image_generator.BuildingImageGenerator" [color="black", fontcolor="black", label=<{BuildingImageGenerator|
|generate_building_image(observation_response: smart_control_building_pb2.ObservationResponse): bytes
image_to_png_base64(image: Image.Image): bytes
}>, shape="record", style="solid"];
+"smart_control.utils.building_renderer.BuildingRenderer" [color="black", fontcolor="black", label=<{BuildingRenderer|cv_size : int
|get_building_dimensions(): Tuple[int, int]
get_video(file_path: str, temperature_arrays: List[np.ndarray], fps: int, vmin: int, vmax: int, cmap: str, alpha: float, wall_color: str, grid: bool, timestamps: Optional[List[pd.Timestamp]]): None
render(temperature_array: np.ndarray, vmin: int, vmax: int, cmap: str, alpha: float, wall_color: str, grid: bool, ts: Optional[pd.Timestamp], input_q: Optional[np.ndarray], diff_range: float, diff_size: int, colorbar: bool, clip_range: int, center: int): PIL.Image.Image
}>, shape="record", style="solid"];
+"smart_control.simulator.building_test.BuildingTest" [color="black", fontcolor="black", label=<{BuildingTest|
|test_apply_thermal_power_zone()
test_apply_thermal_power_zone_post_refactor()
test_assign_building_exterior_values()
test_assign_building_values_flexible_floor_plan()
test_assign_diffusers_post_refactor()
test_assign_exterior_and_interior_attributes()
test_assign_interior_wall_values()
test_assign_interior_wall_values_flexible_floor_plan()
test_assign_thermal_diffusers(diffuser_spacing, expected_output)
test_building_exterior_values()
test_building_exterior_values_flexible_floor_plan()
test_check_room_sizes_does_not_raise_error(matrix_shape, room_shape)
test_check_room_sizes_raises_error(matrix_shape, room_shape)
test_compare_rectangular_to_floor_plan_based()
test_enlarge_exterior_walls()
test_generate_thermal_diffusers_4x5()
test_generate_thermal_diffusers_6x7()
test_get_zone_average_temps()
test_get_zone_average_temps_post_refactor()
test_get_zone_bounds(zone_coordinates, room_shape, expected)
test_get_zone_temp_stats()
test_get_zone_temp_stats_post_refactor(zone_name, expected_outcome)
test_get_zone_thermal_energy_rate()
test_get_zone_thermal_enery_rate_post_refactor(zone_name, expected_outcome)
test_init_direct_attributes()
test_init_direct_attributes_post_refactor()
test_init_flexible_floor_plan_direct_attributes()
test_init_matrix_shapes()
test_init_matrix_shapes_compare_rect_to_floor_plan_based()
test_init_neighbors()
test_init_neighbors_post_refactor()
test_interior_air_values()
test_interior_air_values_flexible_floor_plan()
test_interior_wall_values()
test_interior_wall_values_flexible_floor_plan()
test_reset()
test_reset_flexible_floor_plan()
test_stochastic_convection_simulator_shuffle_max_dist(p, vals, seed, distance)
test_stochastic_convection_simulator_shuffle_no_max_dist(p, vals, seed)
}>, shape="record", style="solid"];
+"smart_control.simulator.building_utils_test.BuildingUtilsTest" [color="black", fontcolor="black", label=<{BuildingUtilsTest|
|test_add_row_or_column_of_air_raises_error()
test_construct_room_dict()
test_determine_exterior_space()
test_enlarge_component()
test_guarantee_air_padding_in_frame(floor_plan, expected_output)
test_label_exterior_wall_shell(outside_air, expected_exterior_walls)
test_label_interior_walls()
test_process_and_run_connected_components(floor_plan, expected_result)
test_read_floor_plan_from_filepath_does_not_raise_error()
test_read_floor_plan_from_filepath_npy()
test_read_floor_plan_from_filepath_raises_error()
test_run_connected_components(floor_plan, expected_components)
test_set_exterior_space_neg()
}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.CVBoundaryType" [color="black", fontcolor="black", label=<{CVBoundaryType|name
|}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.CVCornerOrientationType" [color="black", fontcolor="black", label=<{CVCornerOrientationType|name
scale_factor : float
|}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.CVEdgeOrientationType" [color="black", fontcolor="black", label=<{CVEdgeOrientationType|horizontal_scale_factor : float
name
vertical_scale_factor : float
|}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.CVPositionType" [color="black", fontcolor="black", label=<{CVPositionType|name
|}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.CVType" [color="black", fontcolor="black", label=<{CVType|boundary : Optional[CVBoundaryType]
corner : Optional[CVCornerOrientationType]
edge : Optional[CVEdgeOrientationType]
horizontal_scale_factor
position
vertical_scale_factor
|}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.observers.composite_observer.CompositeObserver" [color="black", fontcolor="black", label=<{CompositeObserver|
|add_observer(observer: Observer): None
close(): None
remove_observer(observer: Observer): None
reset(): None
}>, shape="record", style="solid"];
+"smart_control.utils.controller_read_write_test.ControllerReadWriteTest" [color="black", fontcolor="black", label=<{ControllerReadWriteTest|
|test_get_episode_data()
test_read_write_action_response()
test_read_write_device_infos()
test_read_write_normalization_info()
test_read_write_observation_response()
test_read_write_reward_info()
test_read_write_reward_response()
test_read_write_zone_infos()
}>, shape="record", style="solid"];
+"smart_control.utils.conversion_utils_test.ConversionUtilsTest" [color="black", fontcolor="black", label=<{ConversionUtilsTest|
|test_fahrenheit_to_kelvin(fahrenheit, kelvin)
test_fahrenheit_to_kelvin_invalid()
test_get_radian_dow(current_time, expected_radian)
test_get_radian_hod(current_time, expected_radian)
test_get_reward_info_energy_use()
test_is_workday_holiday()
test_is_workday_weekend()
test_is_workday_workday()
test_kelvin_to_fahrenheit(fahrenheit, kelvin)
test_kelvin_to_fahrenheit_invalid()
test_normalize_dow()
test_normalize_hod()
test_pandas_proto_timestamp_conversion()
test_zone_id_bad_conversion()
test_zone_id_conversion()
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.policies.schedule_policy.DeviceType" [color="black", fontcolor="black", label=<{DeviceType|name
|}>, shape="record", style="solid"];
+"smart_control.reward.electricity_energy_cost.ElectricityEnergyCost" [color="black", fontcolor="black", label=<{ElectricityEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.reward.electricity_energy_cost_test.ElectricityEnergyCostTest" [color="black", fontcolor="black", label=<{ElectricityEnergyCostTest|
|test_carbon_emisison(start_time, end_time, energy_rate, expected_carbon)
test_cost(start_time, end_time, energy_rate, expected_cost)
test_invalid_carbon_emissions()
test_invalid_weekday_energy_prices()
test_invalid_weekend_energy_prices()
}>, shape="record", style="solid"];
+"smart_control.utils.energy_utils_test.EnergyUtilsTest" [color="black", fontcolor="black", label=<{EnergyUtilsTest|
|test_get_air_conditioning_energy_rate()
test_get_air_volumetric_flowrate()
test_get_compressor_power_thermal(mixed_air_temp, supply_air_temp, volumetric_flow_rate, fan_speed_percentage, eer, fan_heat_temp, expected)
test_get_compressor_power_utilization_invalid(cooling_percentage, count_stages_on, total_stages)
test_get_compressor_power_utilization_valid(design_capacity, cooling_percentage, count_stages_on, total_stages, eer, expected)
test_get_fan_power_invalid()
test_get_fan_power_valid(design_hp, brake_hp, fan_speed_percentage, supply_static_pressure, motor_factor, num_fans, expected)
test_get_humidity_ratio()
test_get_water_heating_energy_rate()
test_get_water_heating_energy_rate_negative()
test_get_water_heating_energy_rate_primary()
test_get_water_heating_energy_rate_primary_secondary_invalid(design_primary_flow_rate, design_secondary_flow_rate)
test_get_water_heating_energy_rate_primary_secondary_valid()
test_get_water_pump_power_invalid()
test_get_water_pump_power_valid(pump_duty_cycle, pump_speed_percantage, brake_horse_power, design_horse_power, motor_factor, num_pumps, expected)
test_get_water_vapor_partial_pressure()
test_get_water_volumetric_flow_rate(design_flow_rate, pump_speed_percentage, num_pumps_on, expected)
}>, shape="record", style="solid"];
+"smart_control.environment.environment.Environment" [color="black", fontcolor="black", label=<{Environment|action_normalizers : dict
building
current_simulation_timestamp
default_policy_values
discount_factor : float
end_timestamp
field_names : list
label
metrics_path : Optional[str]
occupancy_normalization_constant : float
reward_function
start_timestamp
steps_per_episode
|action_spec(): types.NestedArraySpec
observation_spec(): types.NestedArraySpec
render(mode: str): Optional[types.NestedArray]
set_summary_writer(summary_path: str): None
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest" [color="black", fontcolor="black", label=<{EnvironmentTest|
|test_action_spec()
test_comput_actions_regularization_cost_invalid()
test_comput_actions_regularization_cost_valid(action_history, expected)
test_compute_reward()
test_create_action_request()
test_create_action_request_rejected_exception()
test_create_action_request_rejected_no_accepted_status()
test_generate_field_id()
test_get_observation()
test_get_observation_histogram_reducer()
test_get_observation_invalid()
test_init()
test_init_action_spec()
test_init_default()
test_init_device_action_tuples(device_action_tuples, action_names)
test_init_observation_spec(observation_histogram_reducer, expected)
test_init_raises_value_error()
test_init_steps_per_episode()
test_no_replace_observations_missing_past()
test_observation_spec()
test_replace_observations_missing_past()
test_replace_observations_with_past()
test_reset()
test_step()
test_validate_environment(step_interval)
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_flexible_floor_plan_test.FlexibleFloorplanSimulatorTest" [color="black", fontcolor="black", label=<{FlexibleFloorplanSimulatorTest|
|test_finite_differences_timestep_does_not_converge()
test_get_cv_temp_estimate_cell_decrease_from_conduction(cell_coordinates)
test_get_cv_temp_estimate_cell_increase_from_conduction(cell_coordinates)
test_get_cv_temp_estimate_cell_no_change()
test_get_cv_temp_estimate_convection_corner_decreases_faster_than_edge()
test_get_cv_temp_estimate_convection_corner_increases_faster_than_edge()
test_init()
test_reset()
test_reward_info()
test_step_sim_cooling_scenario_vavs_heat()
test_step_sim_heating_scenario_avg_temps_increase()
test_step_sim_heating_scenario_vavs_cools()
test_step_sim_heating_scenario_zone_temperature_speeds()
test_step_sim_increments_current_time()
test_step_sim_sets_boiler_return_water_temperature_sensor()
test_update_temperature_estimates_changes_temperatures()
test_update_temperature_estimates_return_value()
test_weird_building_get_cv_temp_estimate_convection_corner_increases(corner_cv, edge_cv)
}>, shape="record", style="solid"];
+"smart_control.simulator.building.FloorPlanBasedBuilding" [color="black", fontcolor="black", label=<{FloorPlanBasedBuilding|conductivity
cv_size_cm : float
cv_type
density
diffusers : ndarray
floor_height_cm : float
floor_plan : FileInputFloorPlan, NoneType
heat_capacity
input_q : ndarray
len_neighbors : ndarray
neighbors
temp : ndarray
|apply_convection(): None
apply_thermal_power_zone(zone_name: str, power: float)
get_zone_average_temps(): Dict[str, Any]
get_zone_temp_stats(zone_name: str): Tuple[float, float, float]
get_zone_thermal_energy_rate(zone_name: str): float
reset()
}>, shape="record", style="solid"];
+"smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" [color="black", fontcolor="black", label=<{FloorPlanBasedHvac|air_handler
boiler
fill_zone_identifier_exogenously : bool
vavs
zone_infos
|initialize_zone_identifier(zone_identifier: List[str])
is_comfort_mode(current_time: pd.Timestamp): bool
reset()
}>, shape="record", style="solid"];
+"smart_control.simulator.hvac_floorplan_based_test.FloorPlanBasedHvacTest" [color="black", fontcolor="black", label=<{FloorPlanBasedHvacTest|
|setUp()
test_hvac_init_without_zone_identifier()
test_id_comfort_mode()
test_init()
test_reset()
test_vav_device_ids()
}>, shape="record", style="solid"];
+"smart_control.simulator.smart_device_test.SmartDeviceTest.setUp.Heater" [color="black", fontcolor="black", label=<{Heater|heat_setting : float
seconds : int
temperature : float
|}>, shape="record", style="solid"];
+"smart_control.utils.histogram_reducer.HistogramReducer.HistogramReducedSequence" [color="black", fontcolor="black", label=<{HistogramReducedSequence|feature_device_assignments
reduced_sequence : DataFrame
|expand(): pd.DataFrame
}>, shape="record", style="solid"];
+"smart_control.utils.histogram_reducer.HistogramReducer" [color="black", fontcolor="black", label=<{HistogramReducer|histogram_parameters
|reduce(observation_sequence: pd.DataFrame): BaseReducedSequence
}>, shape="record", style="solid"];
+"smart_control.utils.histogram_reducer_test.HistogramReducerTest" [color="black", fontcolor="black", label=<{HistogramReducerTest|
|test_assign_devices_to_bins()
test_get_clipped_histogram_clipped()
test_get_clipped_histogram_not_clipped()
test_histogram_reducer_expand()
test_histogram_reducer_expand_with_update()
test_histogram_reducer_reduce(is_normalized)
test_reassign_bin_count_mismatch()
test_reassign_node_count_mismatch()
test_reassign_nodes()
}>, shape="record", style="solid"];
+"smart_control.simulator.hvac.Hvac" [color="black", fontcolor="black", label=<{Hvac|air_handler
boiler
vavs
zone_infos
|is_comfort_mode(current_time: pd.Timestamp): bool
reset()
}>, shape="record", style="solid"];
+"smart_control.simulator.hvac_test.HvacTest" [color="black", fontcolor="black", label=<{HvacTest|
|test_id_comfort_mode()
test_init()
test_reset()
test_vav_device_ids()
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.IdentityReducer.IdentityReducedSequence" [color="black", fontcolor="black", label=<{IdentityReducedSequence|reduced_sequence : DataFrame
|expand(): pd.DataFrame
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.IdentityReducer" [color="black", fontcolor="black", label=<{IdentityReducer|
|reduce(observation_sequence: pd.DataFrame): BaseReducedSequence
}>, shape="record", style="solid"];
+"smart_control.simulator.stochastic_occupancy.LIGHTSWITCHOccupancy" [color="black", fontcolor="black", label=<{LIGHTSWITCHOccupancy|
|average_zone_occupancy(zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.simulator.stochastic_occupancy_test.LIGHTSWITCHOccupancyTest" [color="black", fontcolor="black", label=<{LIGHTSWITCHOccupancyTest|
|test_average_zone_occupancy_weekday(tz, expected_zone_occupancies)
test_peek(tz)
}>, shape="record", style="solid"];
+"smart_control.simulator.building.MaterialProperties" [color="black", fontcolor="black", label=<{MaterialProperties|conductivity : float
density : float
heat_capacity : float
|}>, shape="record", style="solid"];
+"smart_control.simulator.thermostat.Thermostat.Mode" [color="black", fontcolor="black", label=<{Mode|name
|}>, shape="record", style="solid"];
+"smart_control.reward.natural_gas_energy_cost.NaturalGasEnergyCost" [color="black", fontcolor="black", label=<{NaturalGasEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.reward.natural_gas_energy_cost_test.NaturalGasEnergyCostTest" [color="black", fontcolor="black", label=<{NaturalGasEnergyCostTest|
|test_carbon_emisison()
test_energy_cost(month, expected_cost)
test_invalid_carbon_cost()
test_invalid_carbon_emission()
test_zero_energy_use()
}>, shape="record", style="solid"];
+"smart_control.utils.observation_normalizer_test.ObservationNormalizerTest" [color="black", fontcolor="black", label=<{ObservationNormalizerTest|
|test_denormalize()
test_normalize()
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.observers.base_observer.Observer" [color="black", fontcolor="black", label=<{Observer|
|reset(): None
}>, shape="record", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy.OccupancyStateEnum" [color="black", fontcolor="black", label=<{OccupancyStateEnum|name
|}>, shape="record", style="solid"];
+"smart_control.simulator.stochastic_occupancy.OccupancyStateEnum" [color="black", fontcolor="black", label=<{OccupancyStateEnum|name
|}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.observers.print_status_observer.PrintStatusObserver" [color="black", fontcolor="black", label=<{PrintStatusObserver|
|reset(): None
}>, shape="record", style="solid"];
+"smart_control.utils.controller_reader.ProtoReader" [color="black", fontcolor="black", label=<{ProtoReader|
|read_action_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ActionResponse]
read_device_infos(): Sequence[smart_control_building_pb2.DeviceInfo]
read_normalization_info(): Mapping[reader_lib.VariableId, smart_control_normalization_pb2.ContinuousVariableInfo]
read_observation_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
read_reward_infos(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_reward_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardResponse]
read_zone_infos(): Sequence[smart_control_building_pb2.ZoneInfo]
}>, shape="record", style="solid"];
+"smart_control.utils.controller_writer.ProtoWriter" [color="black", fontcolor="black", label=<{ProtoWriter|
|write_action_response(action_response: smart_control_building_pb2.ActionResponse, timestamp: pd.Timestamp): None
write_building_image(base64_img: bytes, timestamp: pd.Timestamp): None
write_device_infos(device_infos: Sequence[smart_control_building_pb2.DeviceInfo]): None
write_normalization_info(normalization_info: Mapping[writer_lib.VariableId, smart_control_normalization_pb2.ContinuousVariableInfo]): None
write_observation_response(observation_response: smart_control_building_pb2.ObservationResponse, timestamp: pd.Timestamp): None
write_reward_info(reward_info: smart_control_reward_pb2.RewardInfo, timestamp: pd.Timestamp): None
write_reward_response(reward_response: smart_control_reward_pb2.RewardResponse, timestamp: pd.Timestamp): None
write_zone_infos(zone_infos: Sequence[smart_control_building_pb2.ZoneInfo]): None
}>, shape="record", style="solid"];
+"smart_control.utils.controller_writer.ProtoWriterFactory" [color="black", fontcolor="black", label=<{ProtoWriterFactory|
|create(output_dir: writer_lib.PathLocation): ProtoWriter
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor.RandomForestLearningAlgorithm" [color="black", fontcolor="black", label=<{RandomForestLearningAlgorithm|
|fit(x_train: np.ndarray, y_train: np.ndarray): None
predict(x_pred: np.ndarray): np.ndarray
}>, shape="record", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy.RandomizedArrivalDepartureOccupancy" [color="black", fontcolor="black", label=<{RandomizedArrivalDepartureOccupancy|
|average_zone_occupancy(zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy_test.RandomizedArrivalDepartureOccupancyTest" [color="black", fontcolor="black", label=<{RandomizedArrivalDepartureOccupancyTest|
|test_average_zone_occupancy_weekday(tz, expected_zone_occupancies)
test_get_event_probability()
test_peek(tz)
}>, shape="record", style="solid"];
+"smart_control.utils.reader_lib.Readers" [color="black", fontcolor="black", label=<{Readers|readers
|}>, shape="record", style="solid"];
+"smart_control.utils.real_building_temperature_array_generator.RealBuildingTemperatureArrayGenerator" [color="black", fontcolor="black", label=<{RealBuildingTemperatureArrayGenerator|
|get_temperature_array(response: smart_control_building_pb2.ObservationResponse): tuple[np.ndarray, pd.Timestamp]
}>, shape="record", style="solid"];
+"smart_control.utils.reducer_test.ReducerTest" [color="black", fontcolor="black", label=<{ReducerTest|
|test_bad_func_reducer_reduce()
test_empty_stats_funcs()
test_identity_reducer()
test_median_reducer_expand()
test_median_reducer_reduce()
}>, shape="record", style="solid"];
+"smart_control.utils.regression_building_utils_test.RegressionBuildingUtilsTest" [color="black", fontcolor="black", label=<{RegressionBuildingUtilsTest|
|test_action_request_to_action_mapping()
test_create_action_response_not_valid()
test_create_action_response_valid()
test_current_device_observations()
test_expand_time_features()
test_get_action_tuples()
test_get_air_handler_reward_infos()
test_get_boiler_reward_infos()
test_get_device_action_tuples()
test_get_feature_map()
test_get_feature_tuples()
test_get_matching_indices()
test_get_observation_response()
test_get_observation_sequence()
test_get_reward_info_map()
test_get_reward_info_tuples()
test_get_time_feature_names()
test_get_zone_reward_infos_invalid()
test_get_zone_reward_infos_valid()
test_observation_response_to_observation_mapping()
test_split_output_into_observations_and_reward_info_mapping()
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest.test_create_action_request_rejected_exception.RejectionBuilding" [color="black", fontcolor="black", label=<{RejectionBuilding|
|request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
}>, shape="record", style="solid"];
+"smart_control.simulator.rejection_simulator_building.RejectionSimulatorBuilding" [color="black", fontcolor="black", label=<{RejectionSimulatorBuilding|current_timestamp
devices
num_occupants
reward_info
time_step_sec
zones
|is_comfort_mode(current_time: pd.Timestamp): bool
render(path: str): None
request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
request_observations(observation_request: smart_control_building_pb2.ObservationRequest): smart_control_building_pb2.ObservationResponse
request_observations_within_time_interval(observation_request: smart_control_building_pb2.ObservationRequest, start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
reset(): None
wait_time(): None
}>, shape="record", style="solid"];
+"smart_control.simulator.rejection_simulator_building_test.RejectionSimulatorBuildingTest" [color="black", fontcolor="black", label=<{RejectionSimulatorBuildingTest|
|get_sim_building(initial_rejection_count: int): rj_sb_py.RejectionSimulatorBuilding
test_pass_through_properties(property_name: str)
test_request_action_request_multiple_success_with_rejection(initial_rejection_count)
test_request_action_responses_multiple_success_with_rejection(initial_rejection_count)
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.observers.rendering_observer.RenderingObserver" [color="black", fontcolor="black", label=<{RenderingObserver|KELVIN_TO_CELSIUS : float
|reset(): None
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.replay_buffer.replay_buffer.ReplayBufferManager" [color="black", fontcolor="black", label=<{ReplayBufferManager|capacity
checkpoint_dir
data_spec
observer : ReverbAddTrajectoryObserver, NoneType
replay_buffer : ReverbReplayBuffer, NoneType
sequence_length : int
server : NoneType
table_name : str
|clear(): None
close(): None
create_replay_buffer()
get_dataset(batch_size: int, num_steps: Optional[int]): tf.data.Dataset
get_replay_buffer_and_observer(): Tuple[reverb_replay_buffer.ReverbReplayBuffer, reverb_utils.ReverbAddTrajectoryObserver]
load_replay_buffer(): Tuple[reverb_replay_buffer.ReverbReplayBuffer, reverb_utils.ReverbAddTrajectoryObserver]
num_frames(): int
}>, shape="record", style="solid"];
+"smart_control.simulator.weather_controller.ReplayWeatherController" [color="black", fontcolor="black", label=<{ReplayWeatherController|convection_coefficient : float
|get_air_convection_coefficient(timestamp: pd.Timestamp): float
get_current_temp(timestamp: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.replay_buffer.replay_buffer_test.ReverbInstallationTest" [color="black", fontcolor="black", label=<{ReverbInstallationTest|
|test_reverb_installation()
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor.RunCommandPredictor" [color="black", fontcolor="black", label=<{RunCommandPredictor|
|predict(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.SingleActionRequest
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor_test.RunCommandPredictorTest" [color="black", fontcolor="black", label=<{RunCommandPredictorTest|
|test_get_action_timeseries()
test_run_command_predict(d1, d2, expected)
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.policies.schedule_policy.ScheduleEvent" [color="black", fontcolor="black", label=<{ScheduleEvent|device
setpoint_name : str
setpoint_value : Union
start_time
|}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.policies.schedule_policy.SchedulePolicy" [color="black", fontcolor="black", label=<{SchedulePolicy|action_normalizers : dict
action_sequence : List
dow_cos_index : int
dow_sin_index : int
hod_cos_index : int
hod_sin_index : int
local_start_time
norm_mean : float
norm_std : float
weekday_schedule : List
weekend_schedule : List
|}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction" [color="black", fontcolor="black", label=<{SetpointEnergyCarbonRegretFunction|
|compute_reward(reward_info: smart_control_reward_pb2.RewardInfo): smart_control_reward_pb2.RewardResponse
}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_regret_test.SetpointEnergyCarbonRegretTest" [color="black", fontcolor="black", label=<{SetpointEnergyCarbonRegretTest|
|test_compute_reward(zone_air_temperature, average_occupancy, blower_electrical_energy_rate, air_conditioning_electrical_energy_rate, natural_gas_heating_energy_rate, pump_electrical_energy_rate, productivity_weight, energy_cost_weight, carbon_emission_weight, expected_reward, expected_productivity, expected_electrical_energy_cost, expected_natural_gas_cost, expected_carbon_emitted)
}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_reward.SetpointEnergyCarbonRewardFunction" [color="black", fontcolor="black", label=<{SetpointEnergyCarbonRewardFunction|
|compute_reward(reward_info: smart_control_reward_pb2.RewardInfo): smart_control_reward_pb2.RewardResponse
}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_reward_test.SetpointEnergyCarbonRewardTest" [color="black", fontcolor="black", label=<{SetpointEnergyCarbonRewardTest|
|test_compute_reward(zone_air_temperature, average_occupancy, blower_electrical_energy_rate, air_conditioning_electrical_energy_rate, natural_gas_heating_energy_rate, pump_electrical_energy_rate, expected_reward, expected_productivity, expected_electrical_energy_cost, expected_natural_gas_cost, expected_carbon_emitted, expected_carbon_cost)
}>, shape="record", style="solid"];
+"smart_control.simulator.setpoint_schedule.SetpointSchedule" [color="black", fontcolor="black", label=<{SetpointSchedule|comfort_temp_window : Tuple
eco_temp_window : Tuple
evening_start_hour : int
holidays : set, NoneType
morning_start_hour : int
|get_plot_data(start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp): pd.DataFrame
get_temperature_window(current_timestamp: pd.Timestamp): TemperatureWindow
is_comfort_mode(current_timestamp: pd.Timestamp): bool
is_weekend(current_timestamp: pd.Timestamp): bool
}>, shape="record", style="solid"];
+"smart_control.simulator.setpoint_schedule_test.SetpointScheduleTest" [color="black", fontcolor="black", label=<{SetpointScheduleTest|
|test_get_plot_data()
test_get_temperature_window(hour, expected)
test_init()
test_init_default()
test_init_raises_error_evening_before_morning()
test_init_raises_error_invalid_comfort_window()
test_init_raises_error_invalid_eco_window()
test_is_comfort_mode(hour, time_zone, expected)
test_is_weekend(day)
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test_utils.SimpleBuilding" [color="black", fontcolor="black", label=<{SimpleBuilding|current_timestamp
devices
layout : dict
num_occupants
reset_called : bool
reward_info
step_count : int
time_step_sec
values : defaultdict
zones
|is_comfort_mode(current_time: pd.Timestamp): bool
render(path: str): None
request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
request_observations(observation_request: smart_control_building_pb2.ObservationRequest): smart_control_building_pb2.ObservationResponse
request_observations_within_time_interval(observation_request: smart_control_building_pb2.ObservationRequest, start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
reset(): None
wait_time(): None
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test_utils.SimpleRewardFunction" [color="black", fontcolor="black", label=<{SimpleRewardFunction|counter : int
values : list
|compute_reward(reward_info: smart_control_reward_pb2.RewardInfo): smart_control_reward_pb2.RewardResponse
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator.Simulator" [color="black", fontcolor="black", label=<{Simulator|building
current_timestamp
hvac
time_step_sec
|execute_step_sim(): None
finite_differences_timestep(): bool
reset()
reward_info(occupancy_function: BaseOccupancy): RewardInfo
setup_step_sim(): None
step_sim(): None
update_temperature_estimates(temperature_estimates: np.ndarray, ambient_temperature: float, convection_coefficient: float): tuple[np.ndarray, float]
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_building.SimulatorBuilding" [color="black", fontcolor="black", label=<{SimulatorBuilding|current_timestamp
devices
num_occupants
reward_info
simulator : Union[simulator_flexible_floor_plan.SimulatorFlexibleGeometries, simulator_py.Simulator, tf_simulator.TFSimulator]
time_step_sec
zones
|is_comfort_mode(current_time: pd.Timestamp): bool
render(path: str): None
request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
request_observations(observation_request: smart_control_building_pb2.ObservationRequest): smart_control_building_pb2.ObservationResponse
request_observations_within_time_interval(observation_request: smart_control_building_pb2.ObservationRequest, start_timestamp: pd.Timestamp, end_timestamp: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
reset(): None
wait_time(): None
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_building_test.SimulatorBuildingTest" [color="black", fontcolor="black", label=<{SimulatorBuildingTest|
|get_sim_building(initial_rejection_count: int): sb_py.SimulatorBuilding
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_building_test_lib.SimulatorBuildingTestBase" [color="black", fontcolor="black", label=<{SimulatorBuildingTestBase|occupancy
|get_sim_building(initial_rejection_count: int): sb_py.SimulatorBuilding
test_devices()
test_request_action_incorrect_device()
test_request_action_incorrect_setpoint()
test_request_action_single_success(setpoint_name, set_value)
test_request_observation_incorrect_device()
test_request_observation_incorrect_measurement()
test_request_observation_multiple_success()
test_request_observation_single_success(measurement_name, expected_value)
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" [color="black", fontcolor="black", label=<{SimulatorFlexibleGeometries|building
current_timestamp
hvac
time_step_sec
|execute_step_sim(video_filename: Optional[str]): None
get_video(path: str): None
reset()
reward_info(occupancy_function: BaseOccupancy): RewardInfo
}>, shape="record", style="solid"];
+"smart_control.simulator.simulator_test.SimulatorTest" [color="black", fontcolor="black", label=<{SimulatorTest|
|test_finite_differences_timestep_converges_with_warning()
test_finite_differences_timestep_does_not_converge()
test_get_cv_temp_estimate_cell_decrease_from_conduction(cell_coordinates)
test_get_cv_temp_estimate_cell_increase_from_conduction(cell_coordinates)
test_get_cv_temp_estimate_cell_no_change()
test_get_cv_temp_estimate_convection_corner_decreases_faster_than_edge()
test_get_cv_temp_estimate_convection_corner_increases_faster_than_edge()
test_init()
test_reset()
test_reward_info()
test_step_sim_cooling_scenario_vavs_heat()
test_step_sim_heating_scenario_avg_temps_increase()
test_step_sim_heating_scenario_vavs_cools()
test_step_sim_heating_scenario_zone_temperature_speeds()
test_step_sim_increments_current_time()
test_step_sim_sets_boiler_return_water_temperature_sensor()
test_update_temperature_estimates_changes_temperatures()
test_update_temperature_estimates_return_value()
}>, shape="record", style="solid"];
+"smart_control.simulator.smart_device.SmartDevice" [color="black", fontcolor="black", label=<{SmartDevice|
|action_field_names(): Sequence[str]
device_id(): str
device_type(): smart_control_building_pb2.DeviceInfo.DeviceType
get_action_type(field_name: str): Type[object]
get_observable_type(field_name: str): Type[object]
get_observation(observable_field_name: str, observation_timestamp: pd.Timestamp): Any
observable_field_names(): Sequence[str]
set_action(action_field_name: str, value: Any, action_timestamp: pd.Timestamp): None
zone_id(): Optional[str]
}>, shape="record", style="solid"];
+"smart_control.simulator.smart_device_test.SmartDeviceTest" [color="black", fontcolor="black", label=<{SmartDeviceTest|heater_class
|setUp()
test_action_field_names()
test_action_type()
test_declared_action_incorrect_value_type_raises_value_error()
test_declared_action_not_an_attribute_raises_attribute_error()
test_declared_observable_not_an_attribute_raises_attribute_error()
test_device_id()
test_device_type()
test_get_observation()
test_non_declared_action_raises_attribute_error()
test_non_declared_observable_raises_attribute_error()
test_observable_field_names()
test_observable_type()
test_set_action()
test_zone_id()
}>, shape="record", style="solid"];
+"smart_control.utils.observation_normalizer.StandardScoreObservationNormalizer" [color="black", fontcolor="black", label=<{StandardScoreObservationNormalizer|
|denormalize(normalized: smart_control_building_pb2.ObservationResponse): smart_control_building_pb2.ObservationResponse
normalize(native: smart_control_building_pb2.ObservationResponse): smart_control_building_pb2.ObservationResponse
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.StatsReducer.StatsReducedSequence" [color="black", fontcolor="black", label=<{StatsReducedSequence|reduced_sequence : NoneType
|expand(): pd.DataFrame
}>, shape="record", style="solid"];
+"smart_control.utils.reducer.StatsReducer" [color="black", fontcolor="black", label=<{StatsReducer|
|reduce(observation_sequence: pd.DataFrame): BaseReducedSequence
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest.test_create_action_request_rejected_no_accepted_status.StatusRejectionBuilding" [color="black", fontcolor="black", label=<{StatusRejectionBuilding|
|request_action(action_request: smart_control_building_pb2.ActionRequest): smart_control_building_pb2.ActionResponse
}>, shape="record", style="solid"];
+"smart_control.simulator.step_function_occupancy.StepFunctionOccupancy" [color="black", fontcolor="black", label=<{StepFunctionOccupancy|
|average_zone_occupancy(zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp): float
}>, shape="record", style="solid"];
+"smart_control.simulator.step_function_occupancy_test.StepFunctionOccupancyModelTest" [color="black", fontcolor="black", label=<{StepFunctionOccupancyModelTest|
|test_average_zone_occupancy(start_time, end_time, expected_occupancy)
test_invalid_average_zone_occupancy()
test_invalid_average_zone_occupancy_init()
test_split_workday_invalid()
test_split_workday_valid(start_time, end_time, expected_split)
}>, shape="record", style="solid"];
+"smart_control.simulator.stochastic_convection_simulator.StochasticConvectionSimulator" [color="black", fontcolor="black", label=<{StochasticConvectionSimulator|
|apply_convection(room_dict: dict[str, MutableSequence[tuple[int, int]]], temp: np.ndarray): None
}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator.TFSimulator" [color="black", fontcolor="black", label=<{TFSimulator|
|update_temperature_estimates(temperature_estimates: np.ndarray, ambient_temperature: float, convection_coefficient: float): tuple[np.ndarray, float]
}>, shape="record", style="solid"];
+"smart_control.simulator.tf_simulator_test.TFSimulatorTest" [color="black", fontcolor="black", label=<{TFSimulatorTest|
|test_apply_exterior_temps()
test_cv_dimension_tensors()
test_finite_difference_convergence()
test_finite_difference_one_step()
test_get_cv_mapping_boundary()
test_get_cv_mapping_exterior()
test_get_cv_mapping_interior()
test_get_oriented_conductivity_tensors()
test_get_oriented_convection_coefficient_tensors()
test_shift_tensors()
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest.test_validate_environment.TerminatingEnv" [color="black", fontcolor="black", label=<{TerminatingEnv|counter : int
|}>, shape="record", style="solid"];
+"smart_control.dataset.partition_test.TestAllBuildingDatasetPartitions" [color="black", fontcolor="black", label=<{TestAllBuildingDatasetPartitions|
|test_all_partitions(partition_id, actions_shape, actions_range, observations_shape, observations_range, rewards_shape, rewards_range, reward_infos_shape, reward_infos_range)
}>, shape="record", style="solid"];
+"smart_control.dataset.dataset_test.TestBuildingDataset" [color="black", fontcolor="black", label=<{TestBuildingDataset|
|test_actionable_field_counts()
test_actionable_fields()
test_building_validations()
test_dataset_id()
test_device_infos()
test_device_layout_map()
test_devices_df()
test_display_floorplan()
test_download()
test_fields_df()
test_floorplan()
test_observable_field_counts()
test_observable_fields()
test_partition_ids()
test_zone_infos()
test_zones_df()
}>, shape="record", style="solid"];
+"smart_control.dataset.partition_test.TestBuildingDatasetPartition" [color="black", fontcolor="black", label=<{TestBuildingDatasetPartition|
|test_action_ids()
test_action_ids_map()
test_action_timestamps()
test_action_value_matrix()
test_actions_df()
test_observation_ids()
test_observation_ids_map()
test_observation_timestamps()
test_observation_value_matrix()
test_observations_df()
test_partition_data()
test_partition_metadata()
test_partition_validations()
test_reward_ids()
test_reward_ids_map()
test_reward_info_ids()
test_reward_info_ids_map()
test_reward_info_timestamps()
test_reward_info_value_matrix()
test_reward_infos_df()
test_reward_timestamps()
test_reward_value_matrix()
test_rewards_df()
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.utils.config_test.TestConfigPaths" [color="black", fontcolor="black", label=<{TestConfigPaths|
|test_root_dir()
}>, shape="record", style="solid"];
+"smart_control.dataset.dataset_test.TestDataDirectory" [color="black", fontcolor="black", label=<{TestDataDirectory|
|test_data_dir()
}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_reward_test.TestEnergyCost" [color="black", fontcolor="black", label=<{TestEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_regret_test.TestEnergyCost" [color="black", fontcolor="black", label=<{TestEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test.TestEnergyCost" [color="black", fontcolor="black", label=<{TestEnergyCost|
|carbon(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
cost(start_time: pd.Timestamp, end_time: pd.Timestamp, energy_rate: float): float
}>, shape="record", style="solid"];
+"smart_control.utils.regression_building_utils_test.RegressionBuildingUtilsTest.TestOccupancy" [color="black", fontcolor="black", label=<{TestOccupancy|
|average_zone_occupancy(zone_id: str, start_time: pd.Timestamp, end_time: pd.Timestamp)
}>, shape="record", style="solid"];
+"smart_control.utils.histogram_reducer_test.TestReader" [color="black", fontcolor="black", label=<{TestReader|
|read_action_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ActionResponse]
read_device_infos(): Sequence[smart_control_building_pb2.DeviceInfo]
read_normalization_info()
read_observation_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
read_reward_infos(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_reward_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_zone_infos(): Sequence[smart_control_building_pb2.ZoneInfo]
}>, shape="record", style="solid"];
+"smart_control.utils.test_utils.TestReader" [color="black", fontcolor="black", label=<{TestReader|
|read_action_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ActionResponse]
read_device_infos(): Sequence[smart_control_building_pb2.DeviceInfo]
read_normalization_info()
read_observation_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
read_reward_infos(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_reward_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardResponse]
read_zone_infos(): Sequence[smart_control_building_pb2.ZoneInfo]
}>, shape="record", style="solid"];
+"smart_control.utils.run_command_predictor_test.TestReader" [color="black", fontcolor="black", label=<{TestReader|
|read_action_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ActionResponse]
read_device_infos(): Sequence[smart_control_building_pb2.DeviceInfo]
read_normalization_info()
read_observation_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_building_pb2.ObservationResponse]
read_reward_infos(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_reward_responses(start_time: pd.Timestamp, end_time: pd.Timestamp): Sequence[smart_control_reward_pb2.RewardInfo]
read_zone_infos(): Sequence[smart_control_building_pb2.ZoneInfo]
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.utils.data_processing_test.TestTempConversions" [color="black", fontcolor="black", label=<{TestTempConversions|
|test_c_to_k()
test_k_to_c()
}>, shape="record", style="solid"];
+"smart_control.simulator.thermal_diffuser_utils_test.ThermalDiffuserUtilsTest" [color="black", fontcolor="black", label=<{ThermalDiffuserUtilsTest|
|test_determine_random_inds_for_thermal_diffusers(room_generating_func, expected_output)
test_diffuser_allocation_switch(room_generating_func, expected_output)
test_evenly_spaced_inds_from_domain(start, end, expected_output, spacing)
test_rectangularity_test_by_function(room_generating_func, expected_output, threshold)
}>, shape="record", style="solid"];
+"smart_control.simulator.thermostat.Thermostat" [color="black", fontcolor="black", label=<{Thermostat|
|get_setpoint_schedule(): setpoint_schedule.SetpointSchedule
update(zone_temp: float, current_timestamp: pd.Timestamp): 'Thermostat.Mode'
}>, shape="record", style="solid"];
+"smart_control.simulator.thermostat_test.ThermostatTest" [color="black", fontcolor="black", label=<{ThermostatTest|
|test_default_control()
test_eco_mode()
test_eco_transition()
test_init()
test_update_comfort_mode()
}>, shape="record", style="solid"];
+"smart_control.utils.conversion_utils.TimeIntervalEnum" [color="black", fontcolor="black", label=<{TimeIntervalEnum|name
|}>, shape="record", style="solid"];
+"smart_control.simulator.vav.Vav" [color="black", fontcolor="black", label=<{Vav|boiler
damper_setting
damper_setting : float, int
flow_rate_demand
max_air_flow_rate
max_air_flow_rate
reheat_demand
reheat_valve_setting
reheat_valve_setting : float
thermostat
zone_air_temperature
|compute_energy_applied_to_zone(zone_temp: float, supply_air_temp: float, input_water_temp: float): float
compute_reheat_energy_rate(supply_air_temp: float, input_water_temp: float): float
compute_zone_supply_temp(supply_air_temp: float, input_water_temp: float): float
output(zone_temp: float, supply_air_temp: float): Tuple[float, float]
reset()
update(zone_temp: float, current_timestamp: pd.Timestamp, supply_air_temp: float): Tuple[float, float]
update_settings(zone_temp: float, current_timestamp: pd.Timestamp): None
}>, shape="record", style="solid"];
+"smart_control.simulator.vav_test.VavTest" [color="black", fontcolor="black", label=<{VavTest|
|test_action_field_names()
test_action_supply_air_flowrate_setpoint()
test_compute_energy_applied_to_zone(zone_temp, supply_air_temp, input_water_temp, damper_setting, max_air_flow_rate)
test_compute_reheat_energy_rate(reheat_valve_setting, reheat_max_water_flow_rate, input_water_temp, supply_air_temp)
test_compute_zone_supply_temp(reheat_valve_setting, damper_setting, max_air_flow_rate, reheat_max_water_flow_rate, input_water_temp, supply_air_temp)
test_compute_zone_supply_temp_asserts_error()
test_init()
test_init_default()
test_observable_field_names()
test_observations(observation_name, attribute_name)
test_output_does_not_change_settings()
test_setters()
test_setters_raise_error()
test_update_cool(zone_temp, supply_air_temp)
test_update_heat(zone_temp, supply_air_temp)
test_update_off(zone_temp, supply_air_temp)
test_update_settings(current_timestamp, zone_temp, expected_damper_setting, expected_reheat_valve_setting)
test_zone_air_temperature_sensor()
}>, shape="record", style="solid"];
+"smart_control.utils.visual_logger.VisualLogger" [color="black", fontcolor="black", label=<{VisualLogger|
|get_video(file_path: str, fps: int, vmin: int, vmax: int, cmap: str, alpha: float, wall_color: str, grid: bool): None
log(temperature_array: np.ndarray, timestamp: Optional[pd.Timestamp]): None
}>, shape="record", style="solid"];
+"smart_control.simulator.weather_controller.WeatherController" [color="black", fontcolor="black", label=<{WeatherController|convection_coefficient : float
default_high_temp : float
default_low_temp : float
special_days : dict
|get_air_convection_coefficient(timestamp: pd.Timestamp): float
get_current_temp(timestamp: pd.Timestamp): float
seconds_to_rads(seconds_in_day: int): float
}>, shape="record", style="solid"];
+"smart_control.simulator.weather_controller_test.WeatherControllerTest" [color="black", fontcolor="black", label=<{WeatherControllerTest|
|test_default_attributes()
test_get_air_convection_coefficient()
test_get_current_temp(day_of_year, seconds_in_day, expected)
test_init_attributes()
test_init_raises_error_default_temp()
test_init_raises_error_special_day_temp()
test_replay_weather_controller()
test_replay_weather_controller_raises_error_after_range()
test_replay_weather_controller_raises_error_before_range()
test_seconds_to_rad(seconds, expected)
}>, shape="record", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy.ZoneOccupant" [color="black", fontcolor="black", label=<{ZoneOccupant|
|peek(current_time: pd.Timestamp): OccupancyStateEnum
}>, shape="record", style="solid"];
+"smart_control.simulator.stochastic_occupancy.ZoneOccupant" [color="black", fontcolor="black", label=<{ZoneOccupant|
|peek(current_time: pd.Timestamp): OccupancyStateEnum
}>, shape="record", style="solid"];
+"smart_control.reinforcement_learning.agents.networks.sac_networks._TanhNormalProjectionNetworkWrapper" [color="black", fontcolor="black", label=<{_TanhNormalProjectionNetworkWrapper|predefined_outer_rank : int
|call(inputs)
}>, shape="record", style="solid"];
+"smart_control.environment.environment_test.EnvironmentTest.test_create_action_request_rejected_exception.RejectionBuilding" -> "smart_control.environment.environment_test_utils.SimpleBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.environment.environment_test.EnvironmentTest.test_create_action_request_rejected_no_accepted_status.StatusRejectionBuilding" -> "smart_control.environment.environment_test_utils.SimpleBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.environment.environment_test.EnvironmentTest.test_get_observation_invalid.BadObservationBuilding" -> "smart_control.environment.environment_test_utils.SimpleBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.environment.environment_test.EnvironmentTest.test_validate_environment.TerminatingEnv" -> "smart_control.environment.environment.Environment" [arrowhead="empty", arrowtail="none"];
+"smart_control.environment.environment_test_utils.SimpleBuilding" -> "smart_control.models.base_building.BaseBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.environment.environment_test_utils.SimpleRewardFunction" -> "smart_control.models.base_reward_function.BaseRewardFunction" [arrowhead="empty", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.composite_observer.CompositeObserver" -> "smart_control.reinforcement_learning.observers.base_observer.Observer" [arrowhead="empty", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.print_status_observer.PrintStatusObserver" -> "smart_control.reinforcement_learning.observers.base_observer.Observer" [arrowhead="empty", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer.RenderingObserver" -> "smart_control.reinforcement_learning.observers.base_observer.Observer" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward.BaseSetpointEnergyCarbonRewardFunction" -> "smart_control.models.base_reward_function.BaseRewardFunction" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test.TestEnergyCost" -> "smart_control.models.base_energy_cost.BaseEnergyCost" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost.ElectricityEnergyCost" -> "smart_control.models.base_energy_cost.BaseEnergyCost" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost.NaturalGasEnergyCost" -> "smart_control.models.base_energy_cost.BaseEnergyCost" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction" -> "smart_control.reward.base_setpoint_energy_carbon_reward.BaseSetpointEnergyCarbonRewardFunction" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test.TestEnergyCost" -> "smart_control.models.base_energy_cost.BaseEnergyCost" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward.SetpointEnergyCarbonRewardFunction" -> "smart_control.reward.base_setpoint_energy_carbon_reward.BaseSetpointEnergyCarbonRewardFunction" [arrowhead="empty", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test.TestEnergyCost" -> "smart_control.models.base_energy_cost.BaseEnergyCost" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.air_handler.AirHandler" -> "smart_control.simulator.smart_device.SmartDevice" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.boiler.Boiler" -> "smart_control.simulator.smart_device.SmartDevice" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.building.Building" -> "smart_control.simulator.building.BaseSimulatorBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.building.FloorPlanBasedBuilding" -> "smart_control.simulator.building.BaseSimulatorBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy.RandomizedArrivalDepartureOccupancy" -> "smart_control.models.base_occupancy.BaseOccupancy" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building.RejectionSimulatorBuilding" -> "smart_control.models.base_building.BaseBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test.RejectionSimulatorBuildingTest" -> "smart_control.simulator.simulator_building_test_lib.SimulatorBuildingTestBase" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.simulator_building.SimulatorBuilding" -> "smart_control.models.base_building.BaseBuilding" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.simulator_building_test.SimulatorBuildingTest" -> "smart_control.simulator.simulator_building_test_lib.SimulatorBuildingTestBase" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" -> "smart_control.simulator.simulator.Simulator" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.smart_device_test.SmartDeviceTest.setUp.Heater" -> "smart_control.simulator.smart_device.SmartDevice" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy.StepFunctionOccupancy" -> "smart_control.models.base_occupancy.BaseOccupancy" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.stochastic_convection_simulator.StochasticConvectionSimulator" -> "smart_control.simulator.base_convection_simulator.BaseConvectionSimulator" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.stochastic_occupancy.LIGHTSWITCHOccupancy" -> "smart_control.models.base_occupancy.BaseOccupancy" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.tf_simulator.TFSimulator" -> "smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.vav.Vav" -> "smart_control.simulator.smart_device.SmartDevice" [arrowhead="empty", arrowtail="none"];
+"smart_control.simulator.weather_controller.WeatherController" -> "smart_control.simulator.weather_controller.BaseWeatherController" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.bounded_action_normalizer.BoundedActionNormalizer" -> "smart_control.models.base_normalizer.BaseActionNormalizer" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.controller_reader.ProtoReader" -> "smart_control.utils.reader_lib.BaseReader" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.controller_writer.ProtoWriter" -> "smart_control.utils.writer_lib.BaseWriter" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.controller_writer.ProtoWriterFactory" -> "smart_control.utils.writer_lib.BaseWriterFactory" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.histogram_reducer.HistogramReducer" -> "smart_control.utils.reducer.BaseReducer" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.histogram_reducer.HistogramReducer.HistogramReducedSequence" -> "smart_control.utils.reducer.BaseReducedSequence" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test.TestReader" -> "smart_control.utils.reader_lib.BaseReader" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.observation_normalizer.StandardScoreObservationNormalizer" -> "smart_control.models.base_normalizer.BaseObservationNormalizer" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.reducer.IdentityReducer" -> "smart_control.utils.reducer.BaseReducer" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.reducer.IdentityReducer.IdentityReducedSequence" -> "smart_control.utils.reducer.BaseReducedSequence" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.reducer.StatsReducer" -> "smart_control.utils.reducer.BaseReducer" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.reducer.StatsReducer.StatsReducedSequence" -> "smart_control.utils.reducer.BaseReducedSequence" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test.RegressionBuildingUtilsTest.TestOccupancy" -> "smart_control.models.base_occupancy.BaseOccupancy" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test.RegressionBuildingUtilsTest.test_get_zone_reward_infos_invalid.BadSetpointSchedule" -> "smart_control.simulator.setpoint_schedule.SetpointSchedule" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.run_command_predictor.RandomForestLearningAlgorithm" -> "smart_control.utils.run_command_predictor.BaseLearningAlgorithm" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.run_command_predictor.RunCommandPredictor" -> "smart_control.utils.run_command_predictor.BaseRunCommandPredictor" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test.TestReader" -> "smart_control.utils.reader_lib.BaseReader" [arrowhead="empty", arrowtail="none"];
+"smart_control.utils.test_utils.TestReader" -> "smart_control.utils.reader_lib.BaseReader" [arrowhead="empty", arrowtail="none"];
+"smart_control.reinforcement_learning.policies.schedule_policy.DeviceType" -> "smart_control.reinforcement_learning.policies.schedule_policy.ScheduleEvent" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="device", style="solid"];
+"smart_control.simulator.air_handler.AirHandler" -> "smart_control.simulator.hvac_floorplan_based_test.FloorPlanBasedHvacTest" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_global_handler", style="solid"];
+"smart_control.simulator.boiler.Boiler" -> "smart_control.simulator.hvac_floorplan_based_test.FloorPlanBasedHvacTest" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_global_boiler", style="solid"];
+"smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" -> "smart_control.simulator.hvac_floorplan_based_test.FloorPlanBasedHvacTest" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_hvac", style="solid"];
+"smart_control.simulator.setpoint_schedule.SetpointSchedule" -> "smart_control.simulator.hvac_floorplan_based_test.FloorPlanBasedHvacTest" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_global_setpoint_schedule", style="solid"];
+"smart_control.simulator.step_function_occupancy.StepFunctionOccupancy" -> "smart_control.simulator.simulator_building_test_lib.SimulatorBuildingTestBase" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="occupancy", style="solid"];
+"smart_control.simulator.stochastic_convection_simulator.StochasticConvectionSimulator" -> "smart_control.simulator.building.FloorPlanBasedBuilding" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_convection_simulator", style="solid"];
+"smart_control.simulator.stochastic_convection_simulator.StochasticConvectionSimulator" -> "smart_control.simulator.building.FloorPlanBasedBuilding" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_convection_simulator", style="solid"];
+"smart_control.utils.visual_logger.VisualLogger" -> "smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="_log_and_plotter", style="solid"];
+"smart_control.dataset.dataset.BuildingDataset" -> "smart_control.dataset.partition.BuildingDatasetPartition" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="ds", style="solid"];
+"smart_control.models.base_building.BaseBuilding" -> "smart_control.environment.environment.Environment" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="building", style="solid"];
+"smart_control.models.base_building.BaseBuilding" -> "smart_control.simulator.rejection_simulator_building.RejectionSimulatorBuilding" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_base_building", style="solid"];
+"smart_control.models.base_energy_cost.BaseEnergyCost" -> "smart_control.reward.setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_electricity_energy_cost", style="solid"];
+"smart_control.models.base_energy_cost.BaseEnergyCost" -> "smart_control.reward.setpoint_energy_carbon_regret.SetpointEnergyCarbonRegretFunction" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_natural_gas_energy_cost", style="solid"];
+"smart_control.models.base_energy_cost.BaseEnergyCost" -> "smart_control.reward.setpoint_energy_carbon_reward.SetpointEnergyCarbonRewardFunction" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_electricity_energy_cost", style="solid"];
+"smart_control.models.base_energy_cost.BaseEnergyCost" -> "smart_control.reward.setpoint_energy_carbon_reward.SetpointEnergyCarbonRewardFunction" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_natural_gas_energy_cost", style="solid"];
+"smart_control.models.base_normalizer.BaseObservationNormalizer" -> "smart_control.environment.environment.Environment" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_observation_normalizer", style="solid"];
+"smart_control.models.base_occupancy.BaseOccupancy" -> "smart_control.simulator.simulator_building.SimulatorBuilding" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_occupancy", style="solid"];
+"smart_control.models.base_reward_function.BaseRewardFunction" -> "smart_control.environment.environment.Environment" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="reward_function", style="solid"];
+"smart_control.simulator.air_handler.AirHandler" -> "smart_control.simulator.hvac.Hvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_air_handler", style="solid"];
+"smart_control.simulator.air_handler.AirHandler" -> "smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_air_handler", style="solid"];
+"smart_control.simulator.boiler.Boiler" -> "smart_control.simulator.hvac.Hvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_boiler", style="solid"];
+"smart_control.simulator.boiler.Boiler" -> "smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_boiler", style="solid"];
+"smart_control.simulator.boiler.Boiler" -> "smart_control.simulator.vav.Vav" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_boiler", style="solid"];
+"smart_control.simulator.building.Building" -> "smart_control.simulator.simulator.Simulator" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="building", style="solid"];
+"smart_control.simulator.building.FloorPlanBasedBuilding" -> "smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="building", style="solid"];
+"smart_control.simulator.hvac.Hvac" -> "smart_control.simulator.simulator.Simulator" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_hvac", style="solid"];
+"smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" -> "smart_control.simulator.simulator_flexible_floor_plan.SimulatorFlexibleGeometries" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_hvac", style="solid"];
+"smart_control.simulator.setpoint_schedule.SetpointSchedule" -> "smart_control.simulator.hvac.Hvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_schedule", style="solid"];
+"smart_control.simulator.setpoint_schedule.SetpointSchedule" -> "smart_control.simulator.hvac_floorplan_based.FloorPlanBasedHvac" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_schedule", style="solid"];
+"smart_control.simulator.setpoint_schedule.SetpointSchedule" -> "smart_control.simulator.thermostat.Thermostat" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_setpoint_schedule", style="solid"];
+"smart_control.simulator.smart_device_test.SmartDeviceTest.setUp.Heater" -> "smart_control.simulator.smart_device_test.SmartDeviceTest" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="heater_class", style="solid"];
+"smart_control.simulator.tf_simulator.CVPositionType" -> "smart_control.simulator.tf_simulator.CVType" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="position", style="solid"];
+"smart_control.simulator.thermostat.Thermostat" -> "smart_control.simulator.vav.Vav" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_init_thermostat", style="solid"];
+"smart_control.simulator.weather_controller.WeatherController" -> "smart_control.simulator.simulator.Simulator" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_weather_controller", style="solid"];
+"smart_control.utils.building_renderer.BuildingRenderer" -> "smart_control.utils.visual_logger.VisualLogger" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_renderer", style="solid"];
+"smart_control.utils.run_command_predictor.BaseLearningAlgorithm" -> "smart_control.utils.run_command_predictor.RunCommandPredictor" [arrowhead="odiamond", arrowtail="none", fontcolor="green", label="_learning_algo", style="solid"];
+}
diff --git a/docs/images/class_diagram.png b/docs/images/class_diagram.png
new file mode 100644
index 00000000..c4fd79b7
Binary files /dev/null and b/docs/images/class_diagram.png differ
diff --git a/docs/index.md b/docs/index.md
index f949fbc2..94c14ba6 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -8,3 +8,9 @@ efficiency, operational costs, and occupant comfort.
This project is an open source collaboration between Google and partner
organizations in academia and industry.
+
+## Code Architecture
+
+To help understand the connections between classes, the following UML class diagram is automatically generated from the source code.
+
+
diff --git a/docs/setup.md b/docs/setup.md
index bda63099..728c66e5 100644
--- a/docs/setup.md
+++ b/docs/setup.md
@@ -11,6 +11,7 @@ This project requires the following system dependencies:
- [Protocol Buffer Compiler](https://grpc.io/docs/protoc-installation/)
(`v 3.21.12`)
- [FFmpeg](https://ffmpeg.org/) (`v 7.1.1`)
+- [Graphviz](https://graphviz.org/download/) (for generating documentation diagrams)
- Python (`>=3.10.12 and <3.12`)
## Repository Setup
diff --git a/packages_smart_control.dot b/packages_smart_control.dot
new file mode 100644
index 00000000..5d0ad22f
--- /dev/null
+++ b/packages_smart_control.dot
@@ -0,0 +1,648 @@
+digraph "packages_smart_control" {
+rankdir=BT
+charset="utf-8"
+"smart_control" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.conftest" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.dataset" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.dataset_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.partition" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.partition_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.environment" [color="black", label=, shape="box", style="solid"];
+"smart_control.environment.environment" [color="black", label=, shape="box", style="solid"];
+"smart_control.environment.environment_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.environment.environment_test_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.models" [color="black", label=, shape="box", style="solid"];
+"smart_control.models.base_building" [color="black", label=, shape="box", style="solid"];
+"smart_control.models.base_energy_cost" [color="black", label=, shape="box", style="solid"];
+"smart_control.models.base_normalizer" [color="black", label=, shape="box", style="solid"];
+"smart_control.models.base_occupancy" [color="black", label=, shape="box", style="solid"];
+"smart_control.models.base_reward_function" [color="black", label=, shape="box", style="solid"];
+"smart_control.proto" [color="black", label=, shape="box", style="solid"];
+"smart_control.proto.smart_control_building_pb2" [color="black", label=, shape="box", style="solid"];
+"smart_control.proto.smart_control_normalization_pb2" [color="black", label=, shape="box", style="solid"];
+"smart_control.proto.smart_control_reward_pb2" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.agents" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.agents.networks" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.agents.networks.sac_networks" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.agents.sac_agent" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.observers" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.observers.base_observer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.observers.composite_observer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.observers.print_status_observer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.observers.rendering_observer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.policies" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.policies.schedule_policy" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.replay_buffer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.replay_buffer.replay_buffer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.replay_buffer.replay_buffer_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.scripts" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.scripts.train" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.config" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.config_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.constants" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.data_processing" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.data_processing_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.environment" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.metrics" [color="black", label=, shape="box", style="solid"];
+"smart_control.reinforcement_learning.utils.time_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.electricity_energy_cost" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.electricity_energy_cost_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.natural_gas_energy_cost" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.natural_gas_energy_cost_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_regret" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_reward" [color="black", label=, shape="box", style="solid"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.air_handler" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.air_handler_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.base_convection_simulator" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.boiler" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.boiler_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.building" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.building_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.building_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.building_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.constants" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.hvac" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.hvac_floorplan_based" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.hvac_floorplan_based_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.hvac_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.randomized_arrival_departure_occupancy_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.rejection_simulator_building" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.rejection_simulator_building_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.setpoint_schedule" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.setpoint_schedule_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_building" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_building_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_building_test_lib" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_flexible_floor_plan" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.simulator_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.smart_device" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.smart_device_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.step_function_occupancy" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.step_function_occupancy_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.stochastic_convection_simulator" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.stochastic_occupancy" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.stochastic_occupancy_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.tf_simulator" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.tf_simulator_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.thermal_diffuser_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.thermal_diffuser_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.thermostat" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.thermostat_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.vav" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.vav_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.weather_controller" [color="black", label=, shape="box", style="solid"];
+"smart_control.simulator.weather_controller_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.agent_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.agent_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.bounded_action_normalizer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.bounded_action_normalizer_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.building_image_generator" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.building_renderer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.constants" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.controller_read_write_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.controller_reader" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.controller_writer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.conversion_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.conversion_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.energy_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.energy_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.environment_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.histogram_reducer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.histogram_reducer_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.observation_normalizer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.observation_normalizer_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.plot_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.reader_lib" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.real_building_temperature_array_generator" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.reducer" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.reducer_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.regression_building_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.regression_building_utils_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.run_command_predictor" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.run_command_predictor_test" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.test_utils" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.visual_logger" [color="black", label=, shape="box", style="solid"];
+"smart_control.utils.writer_lib" [color="black", label=, shape="box", style="solid"];
+"smart_control.dataset.conftest" -> "smart_control.dataset.dataset" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.conftest" -> "smart_control.dataset.partition" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.dataset" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.dataset_test" -> "smart_control.dataset.conftest" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.dataset_test" -> "smart_control.dataset.dataset" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.partition" -> "smart_control.dataset.dataset" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.partition_test" -> "smart_control.dataset.conftest" [arrowhead="open", arrowtail="none"];
+"smart_control.dataset.partition_test" -> "smart_control.dataset.partition" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.models" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.models.base_building" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.models.base_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.models.base_reward_function" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.building_image_generator" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.histogram_reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.plot_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.regression_building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.run_command_predictor" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment" -> "smart_control.utils.writer_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.environment.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.environment.environment_test_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.models" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.models.base_building" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.models.base_reward_function" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils.bounded_action_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils.histogram_reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils.observation_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test" -> "smart_control.utils.test_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.models" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.models.base_building" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.models.base_reward_function" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.environment.environment_test_utils" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_building" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_building" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_building" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_normalizer" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_normalizer" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_reward_function" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.models.base_reward_function" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.agents.sac_agent" -> "smart_control.reinforcement_learning.agents.networks.sac_networks" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.composite_observer" -> "smart_control.reinforcement_learning.observers.base_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.print_status_observer" -> "smart_control.reinforcement_learning.observers.base_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.print_status_observer" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.environment.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.reinforcement_learning.observers.base_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.reinforcement_learning.utils.config" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.reinforcement_learning.utils.data_processing" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.observers.rendering_observer" -> "smart_control.utils.building_renderer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.policies.schedule_policy" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.policies.schedule_policy" -> "smart_control.reinforcement_learning.utils.time_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.observers.composite_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.observers.print_status_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.policies.schedule_policy" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.replay_buffer.replay_buffer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.utils.config" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.populate_starter_buffer" -> "smart_control.reinforcement_learning.utils.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.agents.sac_agent" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.observers.composite_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.observers.print_status_observer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.replay_buffer.replay_buffer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.utils.config" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.scripts.train" -> "smart_control.reinforcement_learning.utils.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.reward.electricity_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.reward.natural_gas_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.reward.setpoint_energy_carbon_regret" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.randomized_arrival_departure_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.simulator_building" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.stochastic_convection_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.tf_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.controller_reader" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.controller_writer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.environment_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.histogram_reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config" -> "smart_control.utils.observation_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.config_test" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.data_processing" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.data_processing" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.data_processing" -> "smart_control.utils.controller_reader" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.data_processing" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.data_processing_test" -> "smart_control.reinforcement_learning.utils.data_processing" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.environment" -> "smart_control.environment.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.environment" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reinforcement_learning.utils.metrics" -> "smart_control.reinforcement_learning.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" -> "smart_control.models.base_reward_function" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.reward.base_setpoint_energy_carbon_reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.base_setpoint_energy_carbon_reward_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost_test" -> "smart_control.reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.electricity_energy_cost_test" -> "smart_control.reward.electricity_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost_test" -> "smart_control.reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost_test" -> "smart_control.reward.natural_gas_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.natural_gas_energy_cost_test" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.reward.base_setpoint_energy_carbon_reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.reward.setpoint_energy_carbon_regret" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_regret_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.reward.base_setpoint_energy_carbon_reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.models.base_energy_cost" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.reward.setpoint_energy_carbon_reward" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.reward.setpoint_energy_carbon_reward_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.simulator.smart_device" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler_test" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.air_handler_test" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.simulator.smart_device" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.boiler_test" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building" -> "smart_control.simulator.base_convection_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building" -> "smart_control.simulator.building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building" -> "smart_control.simulator.thermal_diffuser_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_test" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_test" -> "smart_control.simulator.building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_test" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_test" -> "smart_control.simulator.stochastic_convection_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_utils" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_utils" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_utils_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.building_utils_test" -> "smart_control.simulator.building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.constants" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator.thermostat" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.simulator.vav" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.thermostat" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.simulator.vav" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_floorplan_based_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.simulator.hvac" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.hvac_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.randomized_arrival_departure_occupancy_test" -> "smart_control.simulator.randomized_arrival_departure_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building" -> "smart_control.models.base_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.simulator.rejection_simulator_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.simulator.simulator_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.rejection_simulator_building_test" -> "smart_control.simulator.simulator_building_test_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.setpoint_schedule_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.setpoint_schedule_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.simulator.hvac" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.models.base_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.simulator.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.simulator.simulator_flexible_floor_plan" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.simulator.smart_device" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.simulator.tf_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test" -> "smart_control.simulator.simulator_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test" -> "smart_control.simulator.simulator_building_test_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.hvac" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.simulator_building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.step_function_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_building_test_lib" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.utils.building_renderer" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan" -> "smart_control.utils.visual_logger" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.simulator_flexible_floor_plan" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.step_function_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_flexible_floor_plan_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.hvac" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.step_function_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.simulator_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.smart_device_test" -> "smart_control.simulator.smart_device" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.step_function_occupancy_test" -> "smart_control.simulator.step_function_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_convection_simulator" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_convection_simulator" -> "smart_control.simulator.base_convection_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_occupancy" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_occupancy" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_occupancy" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.stochastic_occupancy_test" -> "smart_control.simulator.stochastic_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator" -> "smart_control.simulator.simulator_flexible_floor_plan" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.air_handler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.building" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.hvac_floorplan_based" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.tf_simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.tf_simulator_test" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermal_diffuser_utils" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermal_diffuser_utils" -> "smart_control.simulator.building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermal_diffuser_utils_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermal_diffuser_utils_test" -> "smart_control.simulator.thermal_diffuser_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermostat" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermostat" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermostat_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermostat_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.thermostat_test" -> "smart_control.simulator.thermostat" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.simulator.smart_device" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.simulator.thermostat" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.simulator.boiler" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.simulator.thermostat" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.simulator.vav" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.vav_test" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller_test" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.simulator.weather_controller_test" -> "smart_control.simulator.weather_controller" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.agent_utils_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.agent_utils_test" -> "smart_control.utils.agent_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.bounded_action_normalizer" -> "smart_control.models" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.bounded_action_normalizer" -> "smart_control.models.base_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.bounded_action_normalizer_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.bounded_action_normalizer_test" -> "smart_control.utils.bounded_action_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_image_generator" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_image_generator" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_image_generator" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_image_generator" -> "smart_control.utils.building_renderer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_image_generator" -> "smart_control.utils.real_building_temperature_array_generator" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_renderer" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_renderer" -> "smart_control.simulator.building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.building_renderer" -> "smart_control.simulator.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.utils.controller_reader" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.utils.controller_writer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_read_write_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_reader" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.controller_writer" -> "smart_control.utils.writer_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.conversion_utils_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.energy_utils" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.energy_utils" -> "smart_control.utils.constants" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.energy_utils_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.energy_utils_test" -> "smart_control.utils.energy_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.environment_utils" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.environment_utils" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.environment_utils" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.environment_utils" -> "smart_control.utils.bounded_action_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer" -> "smart_control.utils.reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.utils.histogram_reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.histogram_reducer_test" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer" -> "smart_control.models" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer" -> "smart_control.models.base_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer_test" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.observation_normalizer_test" -> "smart_control.utils.observation_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reader_lib" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reader_lib" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reader_lib" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reader_lib" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.real_building_temperature_array_generator" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.real_building_temperature_array_generator" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.real_building_temperature_array_generator" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.real_building_temperature_array_generator" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reducer_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.reducer_test" -> "smart_control.utils.reducer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.models.base_occupancy" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.regression_building_utils_test" -> "smart_control.utils.regression_building_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.run_command_predictor_test" -> "smart_control.utils.run_command_predictor" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.environment.environment" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.simulator" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.simulator.setpoint_schedule" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.utils.bounded_action_normalizer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.utils.conversion_utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.test_utils" -> "smart_control.utils.reader_lib" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.visual_logger" -> "smart_control.utils" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.visual_logger" -> "smart_control.utils.building_renderer" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.writer_lib" -> "smart_control.proto" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.writer_lib" -> "smart_control.proto.smart_control_building_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.writer_lib" -> "smart_control.proto.smart_control_normalization_pb2" [arrowhead="open", arrowtail="none"];
+"smart_control.utils.writer_lib" -> "smart_control.proto.smart_control_reward_pb2" [arrowhead="open", arrowtail="none"];
+}
diff --git a/smart_control/simulator/stochastic_occupancy.py b/smart_control/simulator/stochastic_occupancy.py
index b270d897..f1b29c5e 100644
--- a/smart_control/simulator/stochastic_occupancy.py
+++ b/smart_control/simulator/stochastic_occupancy.py
@@ -54,13 +54,22 @@ def __init__(
random_state: np.random.RandomState,
time_zone: Union[datetime.tzinfo, str] = "UTC",
):
- assert (
+ # Validate that the time bounds are in chronological order
+ if not (
earliest_expected_arrival_hour
< latest_expected_arrival_hour
< earliest_expected_departure_hour
< latest_expected_departure_hour
- )
- assert lunch_start_hour < lunch_end_hour
+ ):
+ raise ValueError(
+ "Time bounds must be in chronological order i.e., "
+ "expected arrival/departure hours must be strictly increasing:" "earliest_expected_arrival_hour < latest_expected_arrival_hour "
+ "< earliest_expected_departure_hour < latest_expected_departure_hour."
+ )
+
+ # Validate lunch time bounds
+ if lunch_start_hour >= lunch_end_hour:
+ raise ValueError("lunch_start_hour must be before lunch_end_hour.")
self._earliest_expected_arrival_hour = earliest_expected_arrival_hour
self._latest_expected_arrival_hour = latest_expected_arrival_hour