diff options
author | Vikas Varma <vikas.varma@att.com> | 2020-09-18 19:33:06 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2020-09-18 19:33:06 +0000 |
commit | f9b3575cae2b521ba8c6b6b30b15c89bd8a1cb48 (patch) | |
tree | 96ad4aebcb7cb459dac02c43de37e9a15509991c /apps | |
parent | a55cbabaef4975d5007363e59d4560cb30a855e3 (diff) | |
parent | 716ad1f32fc10181d2826d1f345f5a8b81bd0106 (diff) |
Merge "Add ML based optimization to PCI opt"
Diffstat (limited to 'apps')
-rw-r--r-- | apps/pci/optimizers/solver/ml_model.py | 69 | ||||
-rw-r--r-- | apps/pci/optimizers/solver/optimizer.py | 20 |
2 files changed, 85 insertions, 4 deletions
diff --git a/apps/pci/optimizers/solver/ml_model.py b/apps/pci/optimizers/solver/ml_model.py new file mode 100644 index 0000000..3e12387 --- /dev/null +++ b/apps/pci/optimizers/solver/ml_model.py @@ -0,0 +1,69 @@ +# ------------------------------------------------------------------------- +# Copyright (C) 2020 Wipro Limited. +# +# 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. +# +# ------------------------------------------------------------------------- +# + +from osdf.adapters.dcae import des +from osdf.adapters.dcae.des import DESException +from osdf.config.base import osdf_config +from osdf.logging.osdf_logging import error_log + + +class MlModel(object): + def __init__(self): + self.config = osdf_config.core['PCI'] + + def get_additional_inputs(self, dzn_data, network_cell_info): + """Add/update additional info to the existing models. + + The method returns nothing. Instead, it modifies the dzn_data + :params: dzn_data: map with data for the optimization + """ + self.compute_ml_model(dzn_data, network_cell_info) + + def compute_ml_model(self, dzn_data, network_cell_info): + average_ho_threshold = self.config['ML']['average_ho_threshold'] + latest_ho_threshold = self.config['ML']['latest_ho_threshold'] + + fixed_cells = set() + for cell in network_cell_info['cell_list']: + cell_id = cell['cell_id'] + average_ho, latest_ho = self.get_ho_details(cell['cell_id']) + if average_ho > average_ho_threshold or latest_ho > latest_ho_threshold: + fixed_cells.add(cell_id) + + fixed_cells.update(dzn_data.get('PCI_UNCHANGEABLE_CELLS', [])) + dzn_data['PCI_UNCHANGEABLE_CELLS'] = list(fixed_cells) + + def get_ho_details(self, cell_id): + service_id = self.config['DES']['service_id'] + request_data = self.config['DES']['filter'] + request_data['cell_id'] = cell_id + try: + result = des.extract_data(service_id, request_data) + except DESException as e: + error_log.error("Error while calling DES {}".format(e)) + return 0, 0 + + if not result: + return 0, 0 + + ho_list = [] + for pm_data in result: + ho = sum([int(meas['hashMap']['InterEnbOutAtt_X2HO']) for meas in pm_data['additionalMeasurements']]) + ho_list.append(ho) + + return sum(ho_list) / len(ho_list), ho_list[0] diff --git a/apps/pci/optimizers/solver/optimizer.py b/apps/pci/optimizers/solver/optimizer.py index 940f9f7..13298ed 100644 --- a/apps/pci/optimizers/solver/optimizer.py +++ b/apps/pci/optimizers/solver/optimizer.py @@ -1,5 +1,6 @@ # ------------------------------------------------------------------------- # Copyright (c) 2018 AT&T Intellectual Property +# Copyright (C) 2020 Wipro Limited. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,17 +17,21 @@ # ------------------------------------------------------------------------- # +from collections import defaultdict import itertools import os -from collections import defaultdict import pymzn -from .pci_utils import get_id,mapping +from apps.pci.optimizers.solver.ml_model import MlModel +from apps.pci.optimizers.solver.pci_utils import get_id +from apps.pci.optimizers.solver.pci_utils import mapping +from osdf.config.base import osdf_config BASE_DIR = os.path.dirname(__file__) cell_id_mapping = dict() id_cell_mapping = dict() + def pci_optimize(network_cell_info, cell_info_list, request_json): global cell_id_mapping, id_cell_mapping cell_id_mapping, id_cell_mapping = mapping(network_cell_info) @@ -37,10 +42,16 @@ def pci_optimize(network_cell_info, cell_info_list, request_json): ignorable_links = get_ignorable_links(network_cell_info, request_json) anr_flag = is_anr(request_json) - dzn_data = build_dzn_data(cell_info_list, ignorable_links, neighbor_edges, second_level_edges, anr_flag, original_pcis, unchangeable_pcis) + dzn_data = build_dzn_data(cell_info_list, ignorable_links, neighbor_edges, second_level_edges, anr_flag, + original_pcis, unchangeable_pcis) + + ml_enabled = osdf_config.core['PCI']['ml_enabled'] + if ml_enabled: + MlModel().get_additional_inputs(dzn_data, network_cell_info) return build_pci_solution(dzn_data, ignorable_links, anr_flag) + def get_ids_of_fixed_pci_cells(fixed_pci_list): fixed_pci_ids = set() for cell in fixed_pci_list: @@ -83,7 +94,8 @@ def build_pci_solution(dzn_data, ignorable_links, anr_flag): return solution -def build_dzn_data(cell_info_list, ignorable_links, neighbor_edges, second_level_edges, anr_flag,original_pcis, unchangeable_pcis): +def build_dzn_data(cell_info_list, ignorable_links, neighbor_edges, second_level_edges, anr_flag, original_pcis, + unchangeable_pcis): dzn_data = { 'NUM_NODES': len(cell_info_list), 'NUM_PCIS': len(cell_info_list), |