X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=osdf%2Foptimizers%2Fpciopt%2Fsolver%2Foptimizer.py;h=9b2e9d90fe358c0bc6a809c611756925619fd024;hb=e1f6d80752920a7ef990134f02abb3db9b5a6232;hp=282553665377dc12bba4adffa8d3f7ed957d73f9;hpb=75f7a15a5a14af434e0e8430fcec880106d64dbf;p=optf%2Fosdf.git diff --git a/osdf/optimizers/pciopt/solver/optimizer.py b/osdf/optimizers/pciopt/solver/optimizer.py index 2825536..9b2e9d9 100644 --- a/osdf/optimizers/pciopt/solver/optimizer.py +++ b/osdf/optimizers/pciopt/solver/optimizer.py @@ -18,18 +18,44 @@ import itertools import os +from collections import defaultdict import pymzn from .pci_utils import get_id BASE_DIR = os.path.dirname(__file__) -MZN_FILE_NAME = os.path.join(BASE_DIR, 'no_conflicts_no_confusion.mzn') -def pci_optimize(network_cell_info, cell_info_list): +def pci_optimize(network_cell_info, cell_info_list, request_json): neighbor_edges = get_neighbor_list(network_cell_info) second_level_edges = get_second_level_neighbor(network_cell_info) + 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) + + return build_pci_solution(dzn_data, ignorable_links, anr_flag) + + +def build_pci_solution(dzn_data, ignorable_links, anr_flag): + mzn_solution = solve(get_mzn_model(anr_flag), dzn_data) + + solution = {'pci': mzn_solution[0]['pci']} + + if anr_flag: + removables = defaultdict(list) + used_ignorables = mzn_solution[0]['used_ignorables'] + index = 0 + for i in ignorable_links: + if used_ignorables[index] > 0: + removables[i[0]].append(i[1]) + index += 1 + solution['removables'] = removables + return solution + + +def build_dzn_data(cell_info_list, ignorable_links, neighbor_edges, second_level_edges, anr_flag): dzn_data = { 'NUM_NODES': len(cell_info_list), 'NUM_PCIS': len(cell_info_list), @@ -38,8 +64,22 @@ def pci_optimize(network_cell_info, cell_info_list): 'NUM_SECOND_LEVEL_NEIGHBORS': len(second_level_edges), 'SECOND_LEVEL_NEIGHBORS': get_list(second_level_edges) } + if anr_flag: + dzn_data['NUM_IGNORABLE_NEIGHBOR_LINKS'] = len(ignorable_links) + dzn_data['IGNORABLE_NEIGHBOR_LINKS'] = get_list(ignorable_links) + return dzn_data + + +def get_mzn_model(anr_flag): + if anr_flag: + mzn_model = os.path.join(BASE_DIR, 'min_confusion_inl.mzn') + else: + mzn_model = os.path.join(BASE_DIR, 'no_conflicts_no_confusion.mzn') + return mzn_model - return solve(dzn_data) + +def is_anr(request_json): + return 'pci-anr' in request_json["requestInfo"]["optimizers"] def get_list(edge_list): @@ -49,8 +89,8 @@ def get_list(edge_list): return sorted(array_list) -def solve(dzn_data): - return pymzn.minizinc(MZN_FILE_NAME, data=dzn_data) +def solve(mzn_model, dzn_data): + return pymzn.minizinc(mzn=mzn_model, data=dzn_data) def get_neighbor_list(network_cell_info): @@ -83,3 +123,15 @@ def build_second_level_list(network_cell_info, cell): for nbr in cell.get('nbr_list', []): second_nbr_list.append(get_id(network_cell_info, nbr['cellId'])) return [list(elem) for elem in list(itertools.combinations(second_nbr_list, 2))] + + +def get_ignorable_links(network_cell_info, request_json): + ignorable_list = set() + anr_input_list = request_json["cellInfo"].get('anrInputList', []) + if anr_input_list: + for anr_info in anr_input_list: + cell_id = get_id(network_cell_info, anr_info['cellId']) + anr_removable = anr_info.get('removeableNeighbors', []) + for anr in anr_removable: + ignorable_list.add((cell_id, get_id(network_cell_info, anr))) + return ignorable_list