Source code for spinn_front_end_common.interface.interface_functions.energy_provenance_reporter

# Copyright (c) 2017 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re
from spinn_front_end_common.interface.provenance import ProvenanceWriter

#: The simple properties of PowerUsed object to be reported
_BASIC_PROPERTIES = (
    # Counts
    "num_chips", "num_cores", "num_fpgas", "num_frames",
    # Times (in seconds)
    "total_time_secs", "booted_time_secs", "mapping_time_secs",
    "data_gen_time_secs", "loading_time_secs", "exec_time_secs",
    "saving_time_secs",
    # Energies (in Joules)
    "total_energy_joules", "baseline_joules",
    "fpga_total_energy_joules", "fpga_exec_energy_joules",
    "packet_joules", "mapping_joules", "data_gen_joules",
    "loading_joules", "chip_energy_joules", "saving_joules")
#: The main provenance key we use
_PROV_KEY = "power_provenance"


[docs]def energy_provenance_reporter(power_used): """ Converts the power usage information into provenance data. :param PowerUsed power_used: The computed basic power consumption information """ with ProvenanceWriter() as db: for prop in _BASIC_PROPERTIES: db.insert_power( __prop_name(prop), getattr(power_used, prop)) for x, y, p in power_used.active_cores: db.insert_core( x, y, p, "Energy (Joules)", power_used.get_core_active_energy_joules(x, y, p)) for x, y in power_used.active_routers: db.insert_router( x, y, "Energy (Joules)", power_used.get_router_active_energy_joules(x, y))
def __prop_name(name): name = name.capitalize() name = re.sub(r"_time_secs$", r" time (seconds)", name) return re.sub(r"(_energy)?_joules", r" energy (Joules)", name) def __router_name(x, y): return f"router@{x},{y} energy (Joules)"