Add a redesign option

redesign True means that network is redesigned using each request
as reference channel. When False it means that the design is made
once and successive propagation use the settings computed with this
design.

Default propogation is without redesign, so that path-request-script
must use the ----redesign-per-request option to behave as before this
commit.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0084185106d14659a846136620cd17791d551a7d
This commit is contained in:
EstherLerouzic
2024-09-08 14:19:22 +02:00
committed by Esther Le Rouzic
parent 30ead40e76
commit 5277ae2005
6 changed files with 27 additions and 7 deletions

View File

@@ -299,6 +299,9 @@ def path_requests_run(args=None):
help='considers that all demands are bidir')
parser.add_argument('-o', '--output', type=Path, metavar=_help_fname_json_csv,
help='Store satisifed requests into a JSON or CSV file')
parser.add_argument('--redesign-per-request', action='store_true', help='Redesign the network at each request'
+ ' computation using the request as the reference channel')
args = parser.parse_args(args if args is not None else sys.argv[1:])
_setup_logging(args)
@@ -321,7 +324,7 @@ def path_requests_run(args=None):
network=network, network_filename=args.topology)
_data = requests_from_json(data, equipment)
oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result = \
planning(network, equipment, data)
planning(network, equipment, data, redesign=args.redesign_per_request)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
sys.exit(1)

View File

@@ -140,10 +140,13 @@ def check_request_path_ids(rqs: List[PathRequest]):
raise ValueError(msg)
def planning(network: DiGraph, equipment: dict, data: dict) \
def planning(network: DiGraph, equipment: dict, data: dict, redesign: bool = False) \
-> Tuple[List[OMS], list, list, List[PathRequest], List[Disjunction], List[ResultElement]]:
"""Run planning
data contain the service dict from json
redesign True means that network is redesign using each request as reference channel
when False it means that the design is made once and successive propagation use the settings
computed with this design.
"""
oms_list = build_oms_list(network, equipment)
rqs = requests_from_json(data, equipment)
@@ -163,7 +166,7 @@ def planning(network: DiGraph, equipment: dict, data: dict) \
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
logger.info('Propagating on selected path')
propagatedpths, reversed_pths, reversed_propagatedpths = \
compute_path_with_disjunction(network, equipment, rqs, pths)
compute_path_with_disjunction(network, equipment, rqs, pths, redesign=redesign)
# Note that deepcopy used in compute_path_with_disjunction returns
# a list of nodes which are not belonging to network (they are copies of the node objects).
# so there can not be propagation on these nodes.

View File

@@ -1071,7 +1071,7 @@ def deduplicate_disjunctions(disjn):
return local_disjn
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist, redesign=False):
"""use a list but a dictionnary might be helpful to find path based on request_id
TODO change all these req, dsjct, res lists into dict !
@@ -1080,6 +1080,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
reversed_path_res_list = []
propagated_reversed_path_res_list = []
total_nb_requests = len(pathreqlist)
if redesign:
LOGGER.warning('Redesign the network for each request channel, '
+ 'using the request channel as the reference channel for the design.')
for i, pathreq in enumerate(pathreqlist):
# use the power specified in requests but might be different from the one
@@ -1097,7 +1101,16 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
# elements to simulate performance, several demands having the same destination
# may use the same transponder for the performance simulation. This is why
# we use deepcopy: to ensure that each propagation is recorded and not overwritten
network_module.design_network(pathreq, network, equipment, set_connector_losses=False, verbose=False)
# reversed path is needed for correct spectrum assignment
if redesign:
# this is the legacy case where network was automatically redesigned using the
# request channel as reference (nb and power used for amplifiers total power out)
reversed_path = []
if pathlist[i]:
reversed_path = find_reversed_path(pathlist[i])
network_nodes_for_redesign = pathlist[i] + reversed_path
network_module.design_network(pathreq, network.subgraph(network_nodes_for_redesign), equipment,
set_connector_losses=False, verbose=False)
total_path = deepcopy(pathlist[i])
msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path if isinstance(e, Roadm)]}'
LOGGER.info(msg)

View File

@@ -118,6 +118,7 @@ INFO gnpy.tools.worker_utils:worker_utils.py The following services have bee
loose-list: []
]
INFO gnpy.tools.worker_utils:worker_utils.py Propagating on selected path
WARNING gnpy.topology.request:request.py Redesign the network for each request channel, using the request channel as the reference channel for the design.
INFO gnpy.topology.request:request.py
request 0
Computing path from trx Lorient_KMA to trx Vannes_KBE

View File

@@ -14,7 +14,7 @@ SRC_ROOT = Path(__file__).parent.parent
('transmission_main_example', None, transmission_main_example, []),
('transmission_saturated', 'logs_transmission_saturated', transmission_main_example,
['tests/data/testTopology_expected.json', 'lannion', 'lorient', '-e', 'tests/data/eqpt_config.json', '--pow', '3']),
('path_requests_run', 'logs_path_request', path_requests_run, ['-v']),
('path_requests_run', 'logs_path_request', path_requests_run, ['--redesign-per-request', '-v']),
('transmission_main_example__raman', None, transmission_main_example,
['gnpy/example-data/raman_edfa_example_network.json', '--sim', 'gnpy/example-data/sim_params.json', '--show-channels', ]),
('openroadm-v4-Stockholm-Gothenburg', None, transmission_main_example,

View File

@@ -232,7 +232,7 @@ def test_json_response_generation(xls_input, expected_response_file):
rqs, dsjn = requests_aggregation(rqs, dsjn)
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
propagatedpths, reversed_pths, reversed_propagatedpths = \
compute_path_with_disjunction(network, equipment, rqs, pths)
compute_path_with_disjunction(network, equipment, rqs, pths, redesign=True)
pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
result = []