# Copyright 2020 Huawei Technologies Co., Ltd # # 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 # # http://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. # ============================================================================ """The Compose Proposals.""" from collections import OrderedDict from mindinsight.profiler.common.log import logger from mindinsight.profiler.common.util import get_options from mindinsight.profiler.proposer.proposer_factory import ProposerFactory class ComposeProposal: """Get the proposals from multiple different proposers.""" def __init__(self, profiling_path, device_id, type_list=None): self.profiling_path = profiling_path self.device_id = device_id self.compose_proposer_type_list = type_list # Postfix of category label, used for UI to identify the label as category label. self.type_label_postfix = "-proposer_type_label" def get_proposal(self, options=None): """ Get compose proposals. Args: options (dict): options for composed proposal. - compose_proposal_result: execution results of the already running proposers. - step_trace: include optional parameters for step trace,The dictionary key is iter_interval used to get the analyser options for iteration interval time. Returns: dict, the proposals from multiple different proposers. Examples: >>> type_list = ['common', 'step_trace'] >>> condition = {"filter_condition": {'mode': "proc", "proc_name": "iteration_interval"}} >>> options = {'step_trace': {"iter_interval": condition}} >>> cp = ComposeProposal(self.profiling_dir, self.device_id, type_list) >>> result_proposal = cp.get_proposal(options=options) """ logger.info("The ComposeProposal is running") options = get_options(options) logger.debug("The 'options' is %s", str(options)) # The flag whether to write category label. type_label_flag = options.get("type_label_flag", True) compose_proposal_result = OrderedDict() logger.debug("The 'compose_proposer_type_list' is %s", str(self.compose_proposer_type_list)) for proposer_type in self.compose_proposer_type_list: proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_path, self.device_id) if proposer is None: continue # Write the result of proposals to option for other proposer to get. options["compose_proposal_result"] = compose_proposal_result result = proposer.analyze(options) # Insert category label. if result and type_label_flag: proposer_type_label = proposer_type + "-type_label" # Get the name of the category label, the default is the same as the proposer type. type_label_name = options.get(proposer_type_label, proposer_type) # Add postfix to category label name type_proposal_label = type_label_name + self.type_label_postfix compose_proposal_result[type_proposal_label] = None # Merge results to the proposals dictionary. compose_proposal_result.update(result) elif result and not type_label_flag: # Merge results to the proposals dictionary. compose_proposal_result.update(result) logger.debug("The 'compose_proposal_result' is %s", str(compose_proposal_result)) return compose_proposal_result