mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-11-03 19:47:46 +00:00 
			
		
		
		
	Compare commits
	
		
			85 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					c35104c184 | ||
| 
						 | 
					7b1354ee24 | ||
| 
						 | 
					39d3f0f483 | ||
| 
						 | 
					bbe9ef7356 | ||
| 
						 | 
					42a8f018cd | ||
| 
						 | 
					29f5dd1dc4 | ||
| 
						 | 
					03da959724 | ||
| 
						 | 
					f621ca6fe7 | ||
| 
						 | 
					24f4503020 | ||
| 
						 | 
					520c3615e4 | ||
| 
						 | 
					548626a9f2 | ||
| 
						 | 
					7a26833a5a | ||
| 
						 | 
					c2f6f9c6a0 | ||
| 
						 | 
					64a91256fc | ||
| 
						 | 
					bdcffc2a5e | ||
| 
						 | 
					c384af8062 | ||
| 
						 | 
					0813332adc | ||
| 
						 | 
					22fe9ead55 | ||
| 
						 | 
					920ac30aa5 | ||
| 
						 | 
					ac8fd770ab | ||
| 
						 | 
					5277ae2005 | ||
| 
						 | 
					30ead40e76 | ||
| 
						 | 
					ae858b911a | ||
| 
						 | 
					0d236fd31e | ||
| 
						 | 
					9a84e29433 | ||
| 
						 | 
					143f63170e | ||
| 
						 | 
					b2d7f883a1 | ||
| 
						 | 
					73dbdf3042 | ||
| 
						 | 
					4a071c53d7 | ||
| 
						 | 
					dcde64a8db | ||
| 
						 | 
					38cc0e3cc5 | ||
| 
						 | 
					fb70413784 | ||
| 
						 | 
					87e10c240e | ||
| 
						 | 
					43c1085be6 | ||
| 
						 | 
					4ace60bea2 | ||
| 
						 | 
					f950a6aee8 | ||
| 
						 | 
					fb4195c775 | ||
| 
						 | 
					29f42666e5 | ||
| 
						 | 
					9bf7f336e3 | ||
| 
						 | 
					eed6564f11 | ||
| 
						 | 
					fbb2f2c587 | ||
| 
						 | 
					44040c4d06 | ||
| 
						 | 
					ee9af69558 | ||
| 
						 | 
					ce21609fec | ||
| 
						 | 
					a1289e6a9b | ||
| 
						 | 
					138115e1d7 | ||
| 
						 | 
					ed41305f55 | ||
| 
						 | 
					9736f7c032 | ||
| 
						 | 
					be7ae35db3 | ||
| 
						 | 
					2b4a4ab72c | ||
| 
						 | 
					426c88432d | ||
| 
						 | 
					2a800b781f | ||
| 
						 | 
					8d1d3677ed | ||
| 
						 | 
					5b6f8c60cf | ||
| 
						 | 
					3a733b1fd5 | ||
| 
						 | 
					2d68b94a46 | ||
| 
						 | 
					bc71823bd0 | ||
| 
						 | 
					5481b93728 | ||
| 
						 | 
					05e301182d | ||
| 
						 | 
					47c89626e3 | ||
| 
						 | 
					7a032a63b5 | ||
| 
						 | 
					f195d5f496 | ||
| 
						 | 
					56569f866f | ||
| 
						 | 
					bf1f293043 | ||
| 
						 | 
					d7c1a6b75e | ||
| 
						 | 
					c69c2a3af2 | ||
| 
						 | 
					fb29d72906 | ||
| 
						 | 
					30a06da6b1 | ||
| 
						 | 
					139c8cc1e7 | ||
| 
						 | 
					7034d4c686 | ||
| 
						 | 
					10164495b9 | ||
| 
						 | 
					87211b35e9 | ||
| 
						 | 
					e9f9ddb4d6 | ||
| 
						 | 
					8ea13bb4d6 | ||
| 
						 | 
					b45829d2df | ||
| 
						 | 
					6ac3a517cf | ||
| 
						 | 
					2f2920a716 | ||
| 
						 | 
					07fd89351b | ||
| 
						 | 
					7c60b000b5 | ||
| 
						 | 
					537eb017b5 | ||
| 
						 | 
					9c514e8086 | ||
| 
						 | 
					78efb6c650 | ||
| 
						 | 
					3510d59250 | ||
| 
						 | 
					41d9d156a6 | ||
| 
						 | 
					e9d5e748e4 | 
							
								
								
									
										8
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							@@ -14,7 +14,7 @@ jobs:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - uses: fedora-python/tox-github-action@v0.4
 | 
			
		||||
      - uses: fedora-python/tox-github-action@v37.0
 | 
			
		||||
        with:
 | 
			
		||||
          tox_env: ${{ matrix.tox_env }}
 | 
			
		||||
          dnf_install: ${{ matrix.dnf_install }}
 | 
			
		||||
@@ -106,8 +106,7 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python_version }}
 | 
			
		||||
      - run: |
 | 
			
		||||
          pip install -r tests/requirements.txt
 | 
			
		||||
          pip install --editable .
 | 
			
		||||
          pip install --editable .[tests]
 | 
			
		||||
          pytest -vv
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
@@ -136,8 +135,7 @@ jobs:
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: ${{ matrix.python_version }}
 | 
			
		||||
      - run: |
 | 
			
		||||
          pip install -r tests/requirements.txt
 | 
			
		||||
          pip install --editable .
 | 
			
		||||
          pip install --editable .[tests]
 | 
			
		||||
          pytest -vv
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,17 @@
 | 
			
		||||
version: 2
 | 
			
		||||
build:
 | 
			
		||||
    image: latest
 | 
			
		||||
  os: ubuntu-22.04
 | 
			
		||||
  tools:
 | 
			
		||||
    python: "3.12"
 | 
			
		||||
  apt_packages:
 | 
			
		||||
    - graphviz
 | 
			
		||||
 | 
			
		||||
python:
 | 
			
		||||
    version: 3.8
 | 
			
		||||
requirements_file: docs/requirements.txt
 | 
			
		||||
  install:
 | 
			
		||||
    - method: pip
 | 
			
		||||
      path: .
 | 
			
		||||
      extra_requirements:
 | 
			
		||||
        - docs
 | 
			
		||||
 | 
			
		||||
sphinx:
 | 
			
		||||
  configuration: docs/conf.py
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ Read our [documentation](https://gnpy.readthedocs.io/), learn from the demos, an
 | 
			
		||||
 | 
			
		||||
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
GNPy can do much more, including acting as a Path Computation Engine, tracking bandwidth requests, or advising the SDN controller about a best possible path through a large DWDM network.
 | 
			
		||||
Learn more about this [in the documentation](https://gnpy.readthedocs.io/), or give it a [try online at `gnpy.app`](https://gnpy.app/):
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								docs/conf.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								docs/conf.py
									
									
									
									
									
								
							@@ -65,7 +65,7 @@ author = 'Telecom Infra Project - OOPT PSE Group'
 | 
			
		||||
#
 | 
			
		||||
# This is also used if you do content translation via gettext catalogs.
 | 
			
		||||
# Usually you set "language" from the command line for these cases.
 | 
			
		||||
language = None
 | 
			
		||||
language = 'en'
 | 
			
		||||
 | 
			
		||||
# List of patterns, relative to source directory, that match files and
 | 
			
		||||
# directories to ignore when looking for source files.
 | 
			
		||||
@@ -84,18 +84,11 @@ todo_include_todos = False
 | 
			
		||||
# The theme to use for HTML and HTML Help pages.  See the documentation for
 | 
			
		||||
# a list of builtin themes.
 | 
			
		||||
#
 | 
			
		||||
on_rtd = os.environ.get('READTHEDOCS') == 'True'
 | 
			
		||||
if on_rtd:
 | 
			
		||||
    html_theme = 'default'
 | 
			
		||||
    html_theme_options = {
 | 
			
		||||
        'logo_only': True,
 | 
			
		||||
    }
 | 
			
		||||
else:
 | 
			
		||||
    html_theme = 'alabaster'
 | 
			
		||||
    html_theme_options = {
 | 
			
		||||
        'logo': 'images/GNPy-logo.png',
 | 
			
		||||
        'logo_name': False,
 | 
			
		||||
    }
 | 
			
		||||
html_theme = 'alabaster'
 | 
			
		||||
html_theme_options = {
 | 
			
		||||
    'logo': 'images/GNPy-logo.png',
 | 
			
		||||
    'logo_name': False,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html_logo = 'images/GNPy-logo.png'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -91,7 +91,8 @@ Advanced Specification
 | 
			
		||||
**********************
 | 
			
		||||
 | 
			
		||||
The amplifier performance can be further described in terms of gain ripple, NF ripple, and the dynamic gain tilt.
 | 
			
		||||
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency.
 | 
			
		||||
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency. Note that in this advanced
 | 
			
		||||
specification tilt is defined vs frequency while tilt_target specified in EDFA instances is defined vs wavelength.
 | 
			
		||||
 | 
			
		||||
.. _extending-raman:
 | 
			
		||||
 | 
			
		||||
@@ -119,38 +120,32 @@ A *mode* usually refers to a particular performance point that is defined by a c
 | 
			
		||||
 | 
			
		||||
The following data are required for each mode:
 | 
			
		||||
 | 
			
		||||
``bit-rate``
 | 
			
		||||
  Data bit rate, in :math:`\text{Gbits}\times s^{-1}`.
 | 
			
		||||
``baud-rate``
 | 
			
		||||
  Symbol modulation rate, in :math:`\text{Gbaud}`.
 | 
			
		||||
``required-osnr``
 | 
			
		||||
  Minimal allowed OSNR for the receiver.
 | 
			
		||||
``bit_rate``
 | 
			
		||||
  Data bit rate, in :math:`\text{bits}\times s^{-1}`.
 | 
			
		||||
``baud_rate``
 | 
			
		||||
  Symbol modulation rate, in :math:`\text{baud}`.
 | 
			
		||||
``OSNR``
 | 
			
		||||
  Minimal required OSNR for the receiver. In :math:`\text{dB}`
 | 
			
		||||
``tx-osnr``
 | 
			
		||||
  Initial OSNR at the transmitter's output.
 | 
			
		||||
``grid-spacing``
 | 
			
		||||
  Initial OSNR at the transmitter's output. In :math:`\text{dB}`
 | 
			
		||||
``min-spacing``
 | 
			
		||||
  Minimal grid spacing, i.e., an effective channel spectral bandwidth.
 | 
			
		||||
  In :math:`\text{Hz}`.
 | 
			
		||||
``tx-roll-off``
 | 
			
		||||
``roll-off``
 | 
			
		||||
  Roll-off parameter (:math:`\beta`) of the TX pulse shaping filter.
 | 
			
		||||
  This assumes a raised-cosine filter.
 | 
			
		||||
``rx-power-min`` and ``rx-power-max``
 | 
			
		||||
  The allowed range of power at the receiver.
 | 
			
		||||
  (work in progress) The allowed range of power at the receiver.
 | 
			
		||||
  In :math:`\text{dBm}`.
 | 
			
		||||
``cd-max``
 | 
			
		||||
  Maximal allowed Chromatic Dispersion (CD).
 | 
			
		||||
  In :math:`\text{ps}/\text{nm}`.
 | 
			
		||||
``pmd-max``
 | 
			
		||||
  Maximal allowed Polarization Mode Dispersion (PMD).
 | 
			
		||||
  In :math:`\text{ps}`.
 | 
			
		||||
``cd-penalty``
 | 
			
		||||
  *Work-in-progress.*
 | 
			
		||||
  Describes the increase of the requires GSNR as the :abbr:`CD (Chromatic Dispersion)` deteriorates.
 | 
			
		||||
``dgd-penalty``
 | 
			
		||||
  *Work-in-progress.*
 | 
			
		||||
  Describes the increase of the requires GSNR as the :abbr:`DGD (Differential Group Delay)` deteriorates.
 | 
			
		||||
``pmd-penalty``
 | 
			
		||||
  *Work-in-progress.*
 | 
			
		||||
  Describes the increase of the requires GSNR as the :abbr:`PMD (Polarization Mode Dispersion)` deteriorates.
 | 
			
		||||
``penalties``
 | 
			
		||||
  Impairments such as Chromatic Dispersion (CD), Polarization Mode Dispersion (PMD), and Polarization Dispersion Loss (PDL)
 | 
			
		||||
  result in penalties at the receiver. The receiver's ability to handle these impairments can be defined for each mode as
 | 
			
		||||
  a list of {impairment: in defined units, 'penalty_value' in dB} (see `transceiver section here <json.rst#_transceiver>`).
 | 
			
		||||
  Maximum allowed CD, maximum allowed PMD, and maximum allowed PDL should be listed there with corresponding penalties.
 | 
			
		||||
  Impairments experienced during propagation are linearly interpolated between given points to obtain the corresponding penalty.
 | 
			
		||||
  The accumulated penalties are subtracted from the path GSNR before comparing with the minimum required OSNR.
 | 
			
		||||
  Impairments: PMD in :math:`\text{ps}`, CD in :math:`\text{ps/nm}`, PDL in :math:`\text{dB}`, penalty_value in :math:`\text{dB}`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GNPy does not directly track the FEC performance, so the type of chosen FEC is likely indicated in the *name* of the selected transponder mode alone.
 | 
			
		||||
 | 
			
		||||
@@ -168,6 +163,7 @@ The set of parameters for each ROADM model therefore includes:
 | 
			
		||||
  Per-channel target TX power towards the egress amplifier.
 | 
			
		||||
  Within GNPy, a ROADM is expected to attenuate any signal that enters the ROADM node to this level.
 | 
			
		||||
  This can be overridden on a per-link in the network topology.
 | 
			
		||||
  Targets can be set using power or power spectral density (see `roadm section here <json.rst#__roadm>`)
 | 
			
		||||
``pmd``
 | 
			
		||||
  Polarization mode dispersion (PMD) penalty of the express path.
 | 
			
		||||
  In :math:`\text{ps}`.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								docs/images/gnpy-transmission-example.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docs/images/gnpy-transmission-example.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 After Width: | Height: | Size: 478 KiB  | 
@@ -17,6 +17,7 @@ in real-world mesh optical networks. It is based on the Gaussian Noise Model.
 | 
			
		||||
   about-project
 | 
			
		||||
   model
 | 
			
		||||
   gnpy-api
 | 
			
		||||
   release-notes
 | 
			
		||||
 | 
			
		||||
Indices and tables
 | 
			
		||||
==================
 | 
			
		||||
 
 | 
			
		||||
@@ -14,28 +14,29 @@ fully-functional programs.
 | 
			
		||||
    specific, delineated use cases to drive requirements for future
 | 
			
		||||
    development.*
 | 
			
		||||
 | 
			
		||||
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
 | 
			
		||||
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power,
 | 
			
		||||
or to run a planning script to check SNR of several services:
 | 
			
		||||
 | 
			
		||||
.. image:: https://telecominfraproject.github.io/oopt-gnpy/docs/images/transmission_main_example.svg
 | 
			
		||||
.. image:: images/gnpy-transmission-example.svg
 | 
			
		||||
   :width: 100%
 | 
			
		||||
   :align: left
 | 
			
		||||
   :alt: Running a simple simulation example
 | 
			
		||||
 | 
			
		||||
By default, this script operates on a single span network defined in
 | 
			
		||||
`gnpy/example-data/edfa_example_network.json <gnpy/example-data/edfa_example_network.json>`_
 | 
			
		||||
By default, the gnpy-transmission-example script operates on a single span network defined in
 | 
			
		||||
`gnpy/example-data/edfa_example_network.json <../gnpy/example-data/edfa_example_network.json>`_
 | 
			
		||||
 | 
			
		||||
You can specify a different network at the command line as follows. For
 | 
			
		||||
example, to use the CORONET Global network defined in
 | 
			
		||||
`gnpy/example-data/CORONET_Global_Topology.json <gnpy/example-data/CORONET_Global_Topology.json>`_:
 | 
			
		||||
`gnpy/example-data/CORONET_Global_Topology.json <../gnpy/example-data/CORONET_Global_Topology.json>`_:
 | 
			
		||||
 | 
			
		||||
.. code-block:: shell-session
 | 
			
		||||
 | 
			
		||||
    $ gnpy-transmission-example $(gnpy-example-data)/CORONET_Global_Topology.json
 | 
			
		||||
 | 
			
		||||
It is also possible to use an Excel file input (for example
 | 
			
		||||
`gnpy/example-data/CORONET_Global_Topology.xls <gnpy/example-data/CORONET_Global_Topology.xls>`_).
 | 
			
		||||
`gnpy/example-data/CORONET_Global_Topology.xls <../gnpy/example-data/CORONET_Global_Topology.xls>`_).
 | 
			
		||||
The Excel file will be processed into a JSON file with the same prefix.
 | 
			
		||||
Further details about the Excel data structure are available `in the documentation <docs/excel.rst>`__.
 | 
			
		||||
Further details about the Excel data structure are available `in the documentation <excel.rst>`__.
 | 
			
		||||
 | 
			
		||||
The main transmission example will calculate the average signal OSNR and SNR
 | 
			
		||||
across network elements (transceiver, ROADMs, fibers, and amplifiers)
 | 
			
		||||
@@ -56,10 +57,10 @@ interference noise.
 | 
			
		||||
Further Instructions for Use
 | 
			
		||||
----------------------------
 | 
			
		||||
 | 
			
		||||
Simulations are driven by a set of `JSON <docs/json.rst>`__ or `XLS <docs/excel.rst>`__ files.
 | 
			
		||||
Simulations are driven by a set of `JSON <json.rst>`__ or `XLS <excel.rst>`__ files.
 | 
			
		||||
 | 
			
		||||
The ``gnpy-transmission-example`` script propagates a spectrum of channels at 32 Gbaud, 50 GHz spacing and 0 dBm/channel. 
 | 
			
		||||
Launch power can be overridden by using the ``--power`` argument.
 | 
			
		||||
Launch power in fiber spans can be overridden by using the ``--power`` argument.
 | 
			
		||||
Spectrum information is not yet parametrized but can be modified directly in the ``eqpt_config.json`` (via the ``SpectralInformation`` -SI- structure) to accommodate any baud rate or spacing.
 | 
			
		||||
The number of channel is computed based on ``spacing`` and ``f_min``, ``f_max`` values.
 | 
			
		||||
 | 
			
		||||
@@ -71,8 +72,8 @@ An experimental support for Raman amplification is available:
 | 
			
		||||
       $(gnpy-example-data)/raman_edfa_example_network.json \
 | 
			
		||||
       --sim $(gnpy-example-data)/sim_params.json --show-channels
 | 
			
		||||
 | 
			
		||||
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <gnpy/example-data/raman_edfa_example_network.json>`_.
 | 
			
		||||
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <gnpy/example-data/sim_params.json>`_.
 | 
			
		||||
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <../gnpy/example-data/raman_edfa_example_network.json>`_.
 | 
			
		||||
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <../gnpy/example-data/sim_params.json>`_.
 | 
			
		||||
 | 
			
		||||
Use ``gnpy-path-request`` to request several paths at once:
 | 
			
		||||
 | 
			
		||||
@@ -82,7 +83,7 @@ Use ``gnpy-path-request`` to request several paths at once:
 | 
			
		||||
     $ gnpy-path-request -o output_file.json \
 | 
			
		||||
       meshTopologyExampleV2.xls meshTopologyExampleV2_services.json
 | 
			
		||||
 | 
			
		||||
This program operates on a network topology (`JSON <docs/json.rst>`__ or `Excel <docs/excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
 | 
			
		||||
This program operates on a network topology (`JSON <json.rst>`__ or `Excel <excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
 | 
			
		||||
The service requests and reply formats are based on the `draft-ietf-teas-yang-path-computation-01 <https://tools.ietf.org/html/draft-ietf-teas-yang-path-computation-01>`__ with custom extensions (e.g., for transponder modes).
 | 
			
		||||
An example of the JSON input is provided in file `service-template.json`, while results are shown in `path_result_template.json`.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										974
									
								
								docs/json.rst
									
									
									
									
									
								
							
							
						
						
									
										974
									
								
								docs/json.rst
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										463
									
								
								docs/release-notes.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										463
									
								
								docs/release-notes.rst
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,463 @@
 | 
			
		||||
.. _release-notes:
 | 
			
		||||
 | 
			
		||||
Release change log
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
Each release introduces some changes and new features.
 | 
			
		||||
 | 
			
		||||
(prepare text for next release)
 | 
			
		||||
 | 
			
		||||
v2.11
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
**New feature**
 | 
			
		||||
 | 
			
		||||
A new type_def for amplifiers has been introduced: multi_band. This allows the definition of a
 | 
			
		||||
multiband amplifier site composed of several amplifiers per band (a typical application is C+L transmission). The
 | 
			
		||||
release also includes autodesign for links (Optical Multiplex Section, OMS) composed of multi_band amplifiers.
 | 
			
		||||
Multi_band autodesign includes basic tilt and tilt_target calculation when the Raman flag is enabled with the
 | 
			
		||||
--sim-params option. The spectrum is demultiplexed before propagation in the amplifier and multiplexed in the output
 | 
			
		||||
fiber at the amplifier output.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
In the library:
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_C",
 | 
			
		||||
            "f_min": 191.225e12,
 | 
			
		||||
            "f_max": 196.125e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_L",
 | 
			
		||||
            "f_min": 186.5e12,
 | 
			
		||||
            "f_max": 190.1e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_medium_gain_C",
 | 
			
		||||
                "std_medium_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
In the network topology:
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
          "uid": "east edfa in Site_A to Site_B",
 | 
			
		||||
          "type": "Multiband_amplifier",
 | 
			
		||||
          "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
          "amplifiers": [{
 | 
			
		||||
                  "type_variety": "std_medium_gain_C",
 | 
			
		||||
                  "operational": {
 | 
			
		||||
                      "gain_target": 22.55,
 | 
			
		||||
                      "delta_p": 0.9,
 | 
			
		||||
                      "out_voa": 3.0,
 | 
			
		||||
                      "tilt_target": 0.0
 | 
			
		||||
                  }
 | 
			
		||||
              }, {
 | 
			
		||||
                  "type_variety": "std_medium_gain_L",
 | 
			
		||||
                  "operational": {
 | 
			
		||||
                      "gain_target": 21,
 | 
			
		||||
                      "delta_p": 3.0,
 | 
			
		||||
                      "out_voa": 3.0,
 | 
			
		||||
                      "tilt_target": 0.0
 | 
			
		||||
                  }
 | 
			
		||||
              }
 | 
			
		||||
          ]
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
**Network design**
 | 
			
		||||
 | 
			
		||||
Optionally, users can define a design target per OMS (single or multi-band), with specific frequency ranges.
 | 
			
		||||
Default design bands are defined in the SI.
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
          "uid": "roadm Site_A",
 | 
			
		||||
          "type": "Roadm",
 | 
			
		||||
          "params": {
 | 
			
		||||
              "target_pch_out_db": -20,
 | 
			
		||||
              "design_bands": [{"f_min": 191.3e12, "f_max": 195.1e12}]
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
It is possible to define a set of bands in the SI block instead of a single Spectrum Information.
 | 
			
		||||
In this case type_variety must be used.
 | 
			
		||||
Each set defines a reference channel used for design functions and autodesign.
 | 
			
		||||
 | 
			
		||||
The default design settings for the path-request-run script have been modified.
 | 
			
		||||
Now, design is performed once for the reference channel defined in the SI block of the eqpt_config,
 | 
			
		||||
and requests are propagated based on this design.
 | 
			
		||||
The --redesign-per-request option can be used to restore previous behaviour
 | 
			
		||||
(design using request channel types).
 | 
			
		||||
 | 
			
		||||
The autodesign function has been updated to insert multiband booster, preamp or inline amplifiers based on the OMS
 | 
			
		||||
nature. If nothing is stated (no amplifier defined in the OMS, no design_bands attribute in the ROADM), then
 | 
			
		||||
it uses single band Edfas.
 | 
			
		||||
 | 
			
		||||
**Propagation**
 | 
			
		||||
 | 
			
		||||
Only carriers within the amplifier bandwidth are propagated, improving system coherence. This more rigorous checking
 | 
			
		||||
of the spectrum to be propagated and the amplifier bandwidth may lead to changes in the total number of channels
 | 
			
		||||
compared to previous releases. The range can be adjusted by changing the values of ``f_min`` and ``f_max``
 | 
			
		||||
in the amplifier library.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
``f_min`` and ``f_max`` represent the boundary frequencies of the amplification bandwidth (the entire channel must fit
 | 
			
		||||
within this range).
 | 
			
		||||
In the example below, a signal center frequency of 190.05THz with a 50GHz width cannot fit within the amplifier band.
 | 
			
		||||
Note that this has a different meaning in the SI or Transceiver blocks, where ``f_min`` and ``f_max`` refers to the
 | 
			
		||||
minimum / maximum values of the carrier center frequency.
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
          "type_variety": "std_booster_L",
 | 
			
		||||
          "f_min": 186.55e12,
 | 
			
		||||
          "f_max": 190.05e12,
 | 
			
		||||
          "type_def": "fixed_gain",
 | 
			
		||||
          "gain_flatmax": 21,
 | 
			
		||||
          "gain_min": 20,
 | 
			
		||||
          "p_max": 21,
 | 
			
		||||
          "nf0": 5,
 | 
			
		||||
          "allowed_for_design": false
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**Display**
 | 
			
		||||
 | 
			
		||||
The CLI output for the transmission_main_example now displays the channels used for design and simulation,
 | 
			
		||||
as well as the tilt target of amplifiers.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: text
 | 
			
		||||
 | 
			
		||||
    Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                                spacing = 50.00GHz
 | 
			
		||||
                                nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
    Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                          spacing = 50.00GHz,
 | 
			
		||||
                          transceiver output power = 0.00dBm,
 | 
			
		||||
                          nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
The CLI output displays the settings of each amplifier:
 | 
			
		||||
 | 
			
		||||
  .. code-block:: text
 | 
			
		||||
 | 
			
		||||
    Multiband_amplifier east edfa in Site_A to Site_B
 | 
			
		||||
      type_variety:           std_medium_gain_multiband
 | 
			
		||||
      type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L
 | 
			
		||||
      effective gain(dB):     20.90                effective gain(dB):     22.19
 | 
			
		||||
      (before att_in and before output VOA)        (before att_in and before output VOA)
 | 
			
		||||
      tilt-target(dB)         0.00                 tilt-target(dB)         0.00
 | 
			
		||||
      noise figure (dB):      6.38                 noise figure (dB):      6.19
 | 
			
		||||
      (including att_in)                           (including att_in)
 | 
			
		||||
      pad att_in (dB):        0.00                 pad att_in (dB):        0.00
 | 
			
		||||
      Power In (dBm):         -1.08                Power In (dBm):         -1.49
 | 
			
		||||
      Power Out (dBm):        19.83                Power Out (dBm):        20.71
 | 
			
		||||
      Delta_P (dB):           0.90                 Delta_P (dB):           2.19
 | 
			
		||||
      target pch (dBm):       0.90                 target pch (dBm):       3.00
 | 
			
		||||
      actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.80
 | 
			
		||||
      output VOA (dB):        3.00                 output VOA (dB):        3.00
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**New feature**
 | 
			
		||||
 | 
			
		||||
The preturbative Raman and the approximated GGN models are introduced for a faster evaluation of the Raman and
 | 
			
		||||
Kerr effects, respectively.
 | 
			
		||||
These implementation are intended to reduce the computational effort required by multiband transmission scenarios.
 | 
			
		||||
 | 
			
		||||
Both the novel models have been validated with exstensive simulations
 | 
			
		||||
(see `arXiv:2304.11756 <https://arxiv.org/abs/2304.11756>`_ for the new Raman model and
 | 
			
		||||
`jlt:9741324 <https://eeexplore.ieee.org/document/9741324>`_ for the new NLI model).
 | 
			
		||||
Additionally, they have been experimentally validated in a laboratory setup composed of commertial equipment
 | 
			
		||||
(see `icton:10648172 <https://eeexplore.ieee.org/document/10648172>`_).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
v2.10
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
ROADM impairments can be defined per degree and roadm-path type (add, drop or express).
 | 
			
		||||
Minimum loss when crossing a ROADM is no more 0 dB. It can be set per ROADM degree with roadm-path-impairments.
 | 
			
		||||
 | 
			
		||||
The transceiver output power, which was previously set using the same parameter as the input span power (power_dbm),
 | 
			
		||||
can now be set using a different parameter. It can be set as:
 | 
			
		||||
 | 
			
		||||
  - for all channels, with tx_power_dbm using SI similarly to tx_osnr (gnpy-transmission-example script)
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      "SI": [{
 | 
			
		||||
              "f_min": 191.35e12,
 | 
			
		||||
              "baud_rate": 32e9,
 | 
			
		||||
              "f_max": 196.1e12,
 | 
			
		||||
              "spacing": 50e9,
 | 
			
		||||
              "power_dbm": 3,
 | 
			
		||||
              "power_range_db": [0, 0, 1],
 | 
			
		||||
              "roll_off": 0.15,
 | 
			
		||||
              "tx_osnr": 40,
 | 
			
		||||
              "tx_power_dbm": -10,
 | 
			
		||||
              "sys_margins": 2
 | 
			
		||||
          }
 | 
			
		||||
      ]
 | 
			
		||||
 | 
			
		||||
  - for certain channels, using -spectrum option and tx_channel_power_dbm option (gnpy-transmission-example script).
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
        "spectrum": [
 | 
			
		||||
          {
 | 
			
		||||
            "f_min": 191.35e12,
 | 
			
		||||
            "f_max":193.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "f_min": 193.15e12,
 | 
			
		||||
            "f_max":193.15e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "tx_power_dbm": -10
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "f_min": 193.2e12,
 | 
			
		||||
            "f_max":195.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
  - per service using the additional parameter ``tx_power`` which similarly to ``power`` should be defined in Watt (gnpy-path-request script)
 | 
			
		||||
 | 
			
		||||
    .. code-block:: json
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
        "path-request": [
 | 
			
		||||
          {
 | 
			
		||||
            "request-id": "0",
 | 
			
		||||
            "source": "trx SITE1",
 | 
			
		||||
            "destination": "trx SITE2",
 | 
			
		||||
            "src-tp-id": "trx SITE1",
 | 
			
		||||
            "dst-tp-id": "trx SITE2",
 | 
			
		||||
            "bidirectional": false,
 | 
			
		||||
            "path-constraints": {
 | 
			
		||||
              "te-bandwidth": {
 | 
			
		||||
                "technology": "flexi-grid",
 | 
			
		||||
                "trx_type": "Voyager",
 | 
			
		||||
                "trx_mode": "mode 1",
 | 
			
		||||
                "spacing": 50000000000.0,
 | 
			
		||||
                "path_bandwidth": 100000000000.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "request-id": "0 with tx_power",
 | 
			
		||||
            "source": "trx SITE1",
 | 
			
		||||
            "destination": "trx SITE2",
 | 
			
		||||
            "src-tp-id": "trx SITE1",
 | 
			
		||||
            "dst-tp-id": "trx SITE2",
 | 
			
		||||
            "bidirectional": false,
 | 
			
		||||
            "path-constraints": {
 | 
			
		||||
              "te-bandwidth": {
 | 
			
		||||
                "technology": "flexi-grid",
 | 
			
		||||
                "trx_type": "Voyager",
 | 
			
		||||
                "trx_mode": "mode 1",
 | 
			
		||||
                "tx_power": 0.0001,
 | 
			
		||||
                "spacing": 50000000000.0,
 | 
			
		||||
                "path_bandwidth": 100000000000.0
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
v2.9
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
The revision introduces a major refactor that separates design and propagation. Most of these changes have no impact
 | 
			
		||||
on the user experience, except the following ones:
 | 
			
		||||
 | 
			
		||||
**Network design - amplifiers**: amplifier saturation is checked during design in all cases, even if type_variety is
 | 
			
		||||
set; amplifier gain is no more computed on the fly but only at design phase.
 | 
			
		||||
 | 
			
		||||
Before, the design did not consider amplifier power saturation during design if amplifier type_variety was stated.
 | 
			
		||||
With this revision, the saturation is always applied:
 | 
			
		||||
If design is made for a per channel power that leads to saturation, the target are properly reduced and the design
 | 
			
		||||
is freezed. So that when a new simulation is performed on the same network for lower levels of power per channel
 | 
			
		||||
the same gain target is applied. Before these were recomputed, changing the gain targets, so the simulation was
 | 
			
		||||
not considering the exact same working points for amplifiers in case of saturation.
 | 
			
		||||
 | 
			
		||||
Note that this case (working with saturation settings) is not recommended.
 | 
			
		||||
 | 
			
		||||
The gain of amplifiers was estimated on the fly also in case of RamanFiber preceding elements. The refactor now
 | 
			
		||||
requires that an estimation of Raman gain of the RamanFiber is done during design to properly compute a gain target.
 | 
			
		||||
The Raman gain is estimated at design for every RamanFiber span and also during propagation instead of being only
 | 
			
		||||
estimated at propagation stage for those Raman Fiber spans concerned with the transmission. The auto-design is more
 | 
			
		||||
accurate for unpropagated spans, but this results in an increase overall computation time.
 | 
			
		||||
This will be improved in the future.
 | 
			
		||||
 | 
			
		||||
**Network design - ROADMs**: ROADM target power settings are verified during design.
 | 
			
		||||
 | 
			
		||||
Design checks that expected power coming from every directions ingress from a ROADM are consistent with output power
 | 
			
		||||
targets. The checks only considers the adjacent previous hop. If the expected power at the input of this ROADM is
 | 
			
		||||
lower than the target power on the out-degree of the ROADM, a warning is displayed, and user is asked to review the
 | 
			
		||||
input network to avoid this situation. This does not change the design or propagation behaviour.
 | 
			
		||||
 | 
			
		||||
**Propagation**: amplifier gain target is no more recomputed during propagation. It is now possible to freeze
 | 
			
		||||
the design and propagate without automatic changes.
 | 
			
		||||
 | 
			
		||||
In previous release, gain was recomputed during propagation based on an hypothetical reference noiseless channel
 | 
			
		||||
propagation. It was not possible to «freeze» the autodesign, and propagate without recomputing the gain target
 | 
			
		||||
of amplifiers.
 | 
			
		||||
With this new release, the design is freezed, so that it is possible to compare performances on same basis.
 | 
			
		||||
 | 
			
		||||
**Display**: "effective pch (dbm)" is removed. Display contains the target pch which is the target power per channel
 | 
			
		||||
in dBm, computed based on reference channel used for design and the amplifier delta_p in dB (and before out VOA
 | 
			
		||||
contribution). Note that "actual pch out (dBm)" is the actual propagated total power per channel averaged per spectrum
 | 
			
		||||
band definition at the output of the amplifier element, including noises and out VOA contribution.
 | 
			
		||||
 | 
			
		||||
v2.8
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
**Spectrum assignment**: requests can now support multiple slots.
 | 
			
		||||
The definition in service file supports multiple assignments (unchanged syntax):
 | 
			
		||||
 | 
			
		||||
  .. code-block:: json
 | 
			
		||||
 | 
			
		||||
          "effective-freq-slot": [
 | 
			
		||||
            {
 | 
			
		||||
              "N": 0,
 | 
			
		||||
              "M": 4
 | 
			
		||||
            }, {
 | 
			
		||||
              "N": 50,
 | 
			
		||||
              "M": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
 | 
			
		||||
But in results, label-hop is now a list of slots and center frequency index:
 | 
			
		||||
 | 
			
		||||
  .. code-block:: json
 | 
			
		||||
 | 
			
		||||
          {
 | 
			
		||||
            "path-route-object": {
 | 
			
		||||
              "index": 4,
 | 
			
		||||
              "label-hop": [
 | 
			
		||||
                {
 | 
			
		||||
                  "N": 0,
 | 
			
		||||
                  "M": 4
 | 
			
		||||
                }, {
 | 
			
		||||
                  "N": 50,
 | 
			
		||||
                  "M": 4
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
 | 
			
		||||
instead of 
 | 
			
		||||
 | 
			
		||||
  .. code-block:: json
 | 
			
		||||
 | 
			
		||||
          {
 | 
			
		||||
            "path-route-object": {
 | 
			
		||||
              "index": 4,
 | 
			
		||||
              "label-hop": {
 | 
			
		||||
                "N": 0,
 | 
			
		||||
                "M": 4
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**change in display**: only warnings are displayed ; information are disabled and needs the -v (verbose)
 | 
			
		||||
option to be displayed on standard output.
 | 
			
		||||
 | 
			
		||||
**frequency scaling**: A more accurate description of fiber parameters is implemented, including frequency scaling of
 | 
			
		||||
chromatic dispersion, effective area, Raman gain coefficient, and nonlinear coefficient.
 | 
			
		||||
 | 
			
		||||
In particular:
 | 
			
		||||
 | 
			
		||||
1. Chromatic dispersion can be defined with ``'dispersion'`` and ``'dispersion_slope'``, as in previous versions, or
 | 
			
		||||
with ``'dispersion_per_frequency'``; the latter must be defined as a dictionary with two keys, ``'value'`` and
 | 
			
		||||
``'frequency'`` and it has higher priority than the entries ``'dispersion'`` and ``'dispersion_slope'``.
 | 
			
		||||
Essential change: In previous versions, when it was not provided the ``'dispersion_slope'`` was calculated in an
 | 
			
		||||
involute manner to get a vanishing beta3 , and this was a mere artifact for NLI evaluation purposes (namely to evaluate
 | 
			
		||||
beta2 and beta3, not for total dispersion accumulation). Now, the evaluation of beta2 and beta3 is performed explicitly
 | 
			
		||||
in the element.py module.
 | 
			
		||||
 | 
			
		||||
2. The effective area is provided as a scalar value evaluated at the Fiber reference frequency and properly scaled
 | 
			
		||||
considering the Fiber refractive indices n1 and n2, and the core radius. These quantities are assumed to be fixed and
 | 
			
		||||
are hard coded in the parameters.py module. Essential change: The effective area is always scaled along the frequency.
 | 
			
		||||
 | 
			
		||||
3. The Raman gain coefficient is properly scaled considering the overlapping of fiber effective area values scaled at
 | 
			
		||||
the interacting frequencies. Essential change: In previous version the Raman gain coefficient depends only on
 | 
			
		||||
the frequency offset.
 | 
			
		||||
 | 
			
		||||
4. The nonlinear coefficient ``'gamma'`` is properly scaled considering the refractive index n2 and the scaling
 | 
			
		||||
effective area.  Essential change: As the effective area, the nonlinear coefficient is always scaled along the
 | 
			
		||||
frequency.
 | 
			
		||||
 | 
			
		||||
**power offset**: Power equalization now enables defining a power offset in transceiver library to represent
 | 
			
		||||
the deviation from the general equalisation strategy defined in ROADMs.
 | 
			
		||||
 | 
			
		||||
  .. code-block:: json
 | 
			
		||||
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "100G",
 | 
			
		||||
                    "baud_rate": 32.0e9,
 | 
			
		||||
                    "tx_osnr": 35.0,
 | 
			
		||||
                    "min_spacing": 50.0e9,
 | 
			
		||||
                    "cost": 1,
 | 
			
		||||
                    "OSNR": 10.0,
 | 
			
		||||
                    "bit_rate": 100.0e9,
 | 
			
		||||
                    "roll_off": 0.2,
 | 
			
		||||
                    "equalization_offset_db": 0.0
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "200G",
 | 
			
		||||
                    "baud_rate": 64.0e9,
 | 
			
		||||
                    "tx_osnr": 35.0,
 | 
			
		||||
                    "min_spacing": 75.0e9,
 | 
			
		||||
                    "cost": 1,
 | 
			
		||||
                    "OSNR": 13.0,
 | 
			
		||||
                    "bit_rate": 200.0e9,
 | 
			
		||||
                    "roll_off": 0.2,
 | 
			
		||||
                    "equalization_offset_db": 1.76
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
v2.7
 | 
			
		||||
----
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
alabaster>=0.7.12,<1
 | 
			
		||||
docutils>=0.17.1,<1
 | 
			
		||||
myst-parser>=0.16.1,<1
 | 
			
		||||
Pygments>=2.11.2,<3
 | 
			
		||||
rstcheck
 | 
			
		||||
Sphinx>=4.4.0,<5
 | 
			
		||||
sphinxcontrib-bibtex>=2.4.1,<3
 | 
			
		||||
@@ -5,12 +5,12 @@
 | 
			
		||||
gnpy.core.elements
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
Standard network elements which propagate optical spectrum
 | 
			
		||||
Standard network elements which propagate optical spectrum.
 | 
			
		||||
 | 
			
		||||
A network element is a Python callable. It takes a :class:`.info.SpectralInformation`
 | 
			
		||||
object and returns a copy with appropriate fields affected. This structure
 | 
			
		||||
represents spectral information that is "propogated" by this network element.
 | 
			
		||||
Network elements must have only a local "view" of the network and propogate
 | 
			
		||||
represents spectral information that is "propagated" by this network element.
 | 
			
		||||
Network elements must have only a local "view" of the network and propagate
 | 
			
		||||
:class:`.info.SpectralInformation` using only this information. They should be independent and
 | 
			
		||||
self-contained.
 | 
			
		||||
 | 
			
		||||
@@ -20,19 +20,22 @@ unique identifier and a printable name, and provide the :py:meth:`__call__` meth
 | 
			
		||||
instance as a result.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\
 | 
			
		||||
    squeeze, zeros, append, flip, outer, ndarray
 | 
			
		||||
    squeeze, zeros, outer, ndarray
 | 
			
		||||
from scipy.constants import h, c
 | 
			
		||||
from scipy.interpolate import interp1d
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
from typing import Union
 | 
			
		||||
from typing import Union, List
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
import warnings
 | 
			
		||||
 | 
			
		||||
from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \
 | 
			
		||||
    watt2dbm, psd2powerdbm
 | 
			
		||||
from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational
 | 
			
		||||
    watt2dbm, psd2powerdbm, calculate_absolute_min_or_zero, nice_column_str
 | 
			
		||||
from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational, \
 | 
			
		||||
    MultiBandParams, RoadmPath, RoadmImpairment, TransceiverParams, find_band_name, FrequencyBand
 | 
			
		||||
from gnpy.core.science_utils import NliSolver, RamanSolver
 | 
			
		||||
from gnpy.core.info import SpectralInformation, ReferenceCarrier
 | 
			
		||||
from gnpy.core.info import SpectralInformation, muxed_spectral_information, demuxed_spectral_information
 | 
			
		||||
from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -79,8 +82,20 @@ class _Node:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Transceiver(_Node):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
    def __init__(self, *args, params=None, **kwargs):
 | 
			
		||||
        if not params:
 | 
			
		||||
            params = {}
 | 
			
		||||
        try:
 | 
			
		||||
            with warnings.catch_warnings(record=True) as caught_warnings:
 | 
			
		||||
                super().__init__(*args, params=TransceiverParams(**params), **kwargs)
 | 
			
		||||
                if caught_warnings:
 | 
			
		||||
                    msg = f'In Transceiver {kwargs["uid"]}: {caught_warnings[0].message}'
 | 
			
		||||
                    _logger.warning(msg)
 | 
			
		||||
        except ParametersError as e:
 | 
			
		||||
            msg = f'Config error in {kwargs["uid"]}: {e}'
 | 
			
		||||
            _logger.critical(msg)
 | 
			
		||||
            raise ParametersError(msg) from e
 | 
			
		||||
 | 
			
		||||
        self.osnr_ase_01nm = None
 | 
			
		||||
        self.osnr_ase = None
 | 
			
		||||
        self.osnr_nli = None
 | 
			
		||||
@@ -94,6 +109,9 @@ class Transceiver(_Node):
 | 
			
		||||
        self.penalties = {}
 | 
			
		||||
        self.total_penalty = 0
 | 
			
		||||
        self.propagated_labels = [""]
 | 
			
		||||
        self.tx_power = None
 | 
			
		||||
        self.design_bands = self.params.design_bands
 | 
			
		||||
        self.per_degree_design_bands = self.params.per_degree_design_bands
 | 
			
		||||
 | 
			
		||||
    def _calc_cd(self, spectral_info):
 | 
			
		||||
        """Updates the Transceiver property with the CD of the received channels. CD in ps/nm.
 | 
			
		||||
@@ -155,7 +173,8 @@ class Transceiver(_Node):
 | 
			
		||||
        # use raw_values so that the added SNR penalties are not cumulated
 | 
			
		||||
        snr_added = 0
 | 
			
		||||
        for s in args:
 | 
			
		||||
            snr_added += db2lin(-s)
 | 
			
		||||
            if s is not None:
 | 
			
		||||
                snr_added += db2lin(-s)
 | 
			
		||||
        snr_added = -lin2db(snr_added)
 | 
			
		||||
        self.osnr_ase = snr_sum(self.raw_osnr_ase, self.baud_rate, snr_added)
 | 
			
		||||
        self.snr = snr_sum(self.raw_snr, self.baud_rate, snr_added)
 | 
			
		||||
@@ -192,6 +211,7 @@ class Transceiver(_Node):
 | 
			
		||||
        osnr_ase = per_label_average(self.osnr_ase, self.propagated_labels)
 | 
			
		||||
        osnr_ase_01nm = per_label_average(self.osnr_ase_01nm, self.propagated_labels)
 | 
			
		||||
        snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels)
 | 
			
		||||
        tx_power_dbm = per_label_average(watt2dbm(self.tx_power), self.propagated_labels)
 | 
			
		||||
        cd = mean(self.chromatic_dispersion)
 | 
			
		||||
        pmd = mean(self.pmd)
 | 
			
		||||
        pdl = mean(self.pdl)
 | 
			
		||||
@@ -205,7 +225,8 @@ class Transceiver(_Node):
 | 
			
		||||
                            f'  CD (ps/nm):                {cd:.2f}',
 | 
			
		||||
                            f'  PMD (ps):                  {pmd:.2f}',
 | 
			
		||||
                            f'  PDL (dB):                  {pdl:.2f}',
 | 
			
		||||
                            f'  Latency (ms):              {latency:.2f}'])
 | 
			
		||||
                            f'  Latency (ms):              {latency:.2f}',
 | 
			
		||||
                            f'  Actual pch out (dBm):      {pretty_summary_print(tx_power_dbm)}'])
 | 
			
		||||
 | 
			
		||||
        cd_penalty = self.penalties.get('chromatic_dispersion')
 | 
			
		||||
        if cd_penalty is not None:
 | 
			
		||||
@@ -220,6 +241,7 @@ class Transceiver(_Node):
 | 
			
		||||
        return result
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info):
 | 
			
		||||
        self.tx_power = spectral_info.tx_power
 | 
			
		||||
        self._calc_snr(spectral_info)
 | 
			
		||||
        self._calc_cd(spectral_info)
 | 
			
		||||
        self._calc_pmd(spectral_info)
 | 
			
		||||
@@ -233,7 +255,11 @@ class Roadm(_Node):
 | 
			
		||||
        if not params:
 | 
			
		||||
            params = {}
 | 
			
		||||
        try:
 | 
			
		||||
            super().__init__(*args, params=RoadmParams(**params), **kwargs)
 | 
			
		||||
            with warnings.catch_warnings(record=True) as caught_warnings:
 | 
			
		||||
                super().__init__(*args, params=RoadmParams(**params), **kwargs)
 | 
			
		||||
                if caught_warnings:
 | 
			
		||||
                    msg = f'In ROADM {kwargs["uid"]}: {caught_warnings[0].message}'
 | 
			
		||||
                    _logger.warning(msg)
 | 
			
		||||
        except ParametersError as e:
 | 
			
		||||
            msg = f'Config error in {kwargs["uid"]}: {e}'
 | 
			
		||||
            raise ParametersError(msg) from e
 | 
			
		||||
@@ -242,6 +268,7 @@ class Roadm(_Node):
 | 
			
		||||
        # on the path, since it depends on the equalization definition on the degree.
 | 
			
		||||
        self.ref_pch_out_dbm = None
 | 
			
		||||
        self.loss = 0  # auto-design interest
 | 
			
		||||
        self.loss_pch_db = None
 | 
			
		||||
 | 
			
		||||
        # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for
 | 
			
		||||
        # different carriers. The ref_effective_loss records the loss for a reference carrier.
 | 
			
		||||
@@ -258,6 +285,21 @@ class Roadm(_Node):
 | 
			
		||||
        self.per_degree_pch_out_dbm = self.params.per_degree_pch_out_db
 | 
			
		||||
        self.per_degree_pch_psd = self.params.per_degree_pch_psd
 | 
			
		||||
        self.per_degree_pch_psw = self.params.per_degree_pch_psw
 | 
			
		||||
        self.ref_pch_in_dbm = {}
 | 
			
		||||
        self.ref_carrier = None
 | 
			
		||||
        # Define the nature of from-to internal connection: express-path, drop-path, add-path
 | 
			
		||||
        # roadm_paths contains a list of RoadmPath object for each path crossing the ROADM
 | 
			
		||||
        self.roadm_paths = []
 | 
			
		||||
        # roadm_path_impairments contains a dictionnary of impairments profiles corresponding to type_variety
 | 
			
		||||
        # first listed add, drop an express constitute the default
 | 
			
		||||
        self.roadm_path_impairments = self.params.roadm_path_impairments
 | 
			
		||||
        # per degree definitions, in case some degrees have particular deviations with respect to default.
 | 
			
		||||
        self.per_degree_impairments = {f'{i["from_degree"]}-{i["to_degree"]}': {"from_degree": i["from_degree"],
 | 
			
		||||
                                                                                "to_degree": i["to_degree"],
 | 
			
		||||
                                                                                "impairment_id": i["impairment_id"]}
 | 
			
		||||
                                       for i in self.params.per_degree_impairments}
 | 
			
		||||
        self.design_bands = deepcopy(self.params.design_bands)
 | 
			
		||||
        self.per_degree_design_bands = deepcopy(self.params.per_degree_design_bands)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
@@ -272,9 +314,10 @@ class Roadm(_Node):
 | 
			
		||||
        to_json = {
 | 
			
		||||
            'uid': self.uid,
 | 
			
		||||
            'type': type(self).__name__,
 | 
			
		||||
            'type_variety': self.type_variety,
 | 
			
		||||
            'params': {
 | 
			
		||||
                equalisation: value,
 | 
			
		||||
                'restrictions': self.restrictions,
 | 
			
		||||
                'restrictions': self.restrictions
 | 
			
		||||
            },
 | 
			
		||||
            'metadata': {
 | 
			
		||||
                'location': self.metadata['location']._asdict()
 | 
			
		||||
@@ -287,6 +330,14 @@ class Roadm(_Node):
 | 
			
		||||
            to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd
 | 
			
		||||
        if self.per_degree_pch_psw:
 | 
			
		||||
            to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw
 | 
			
		||||
        if self.per_degree_impairments:
 | 
			
		||||
            to_json['per_degree_impairments'] = list(self.per_degree_impairments.values())
 | 
			
		||||
 | 
			
		||||
        if self.params.design_bands is not None:
 | 
			
		||||
            if len(self.params.design_bands) > 1:
 | 
			
		||||
                to_json['params']['design_bands'] = self.params.design_bands
 | 
			
		||||
        if self.params.per_degree_design_bands:
 | 
			
		||||
            to_json['params']['per_degree_design_bands'] = self.params.per_degree_design_bands
 | 
			
		||||
        return to_json
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
@@ -297,13 +348,15 @@ class Roadm(_Node):
 | 
			
		||||
            return f'{type(self).__name__} {self.uid}'
 | 
			
		||||
 | 
			
		||||
        total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
 | 
			
		||||
        total_loss = pretty_summary_print(per_label_average(self.loss_pch_db, self.propagated_labels))
 | 
			
		||||
        return '\n'.join([f'{type(self).__name__} {self.uid}',
 | 
			
		||||
                          f'  effective loss (dB):     {self.ref_effective_loss:.2f}',
 | 
			
		||||
                          f'  reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
 | 
			
		||||
                          f'  actual pch out (dBm):    {total_pch}'])
 | 
			
		||||
                          f'  Type_variety:            {self.type_variety}',
 | 
			
		||||
                          f'  Reference loss (dB):     {self.ref_effective_loss:.2f}',
 | 
			
		||||
                          f'  Actual loss (dB):        {total_loss}',
 | 
			
		||||
                          f'  Reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
 | 
			
		||||
                          f'  Actual pch out (dBm):    {total_pch}'])
 | 
			
		||||
 | 
			
		||||
    def get_roadm_target_power(self, ref_carrier: ReferenceCarrier = None,
 | 
			
		||||
                               spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
 | 
			
		||||
    def get_roadm_target_power(self, spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
 | 
			
		||||
        """Computes the power in dBm for a reference carrier or for a spectral information.
 | 
			
		||||
        power is computed based on equalization target.
 | 
			
		||||
        if spectral_info baud_rate is baud_rate = [32e9, 42e9, 64e9, 42e9, 32e9], and
 | 
			
		||||
@@ -325,22 +378,22 @@ class Roadm(_Node):
 | 
			
		||||
            if self.target_pch_out_dbm is not None:
 | 
			
		||||
                return self.target_pch_out_dbm
 | 
			
		||||
            if self.target_psd_out_mWperGHz is not None:
 | 
			
		||||
                return psd2powerdbm(self.target_psd_out_mWperGHz, ref_carrier.baud_rate)
 | 
			
		||||
                return psd2powerdbm(self.target_psd_out_mWperGHz, self.ref_carrier.baud_rate)
 | 
			
		||||
            if self.target_out_mWperSlotWidth is not None:
 | 
			
		||||
                return psd2powerdbm(self.target_out_mWperSlotWidth, ref_carrier.slot_width)
 | 
			
		||||
                return psd2powerdbm(self.target_out_mWperSlotWidth, self.ref_carrier.slot_width)
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def get_per_degree_ref_power(self, degree, ref_carrier):
 | 
			
		||||
    def get_per_degree_ref_power(self, degree):
 | 
			
		||||
        """Get the target power in dBm out of ROADM degree for the reference bandwidth
 | 
			
		||||
        If no equalization is defined on this degree use the ROADM level one.
 | 
			
		||||
        """
 | 
			
		||||
        if degree in self.per_degree_pch_out_dbm:
 | 
			
		||||
            return self.per_degree_pch_out_dbm[degree]
 | 
			
		||||
        elif degree in self.per_degree_pch_psd:
 | 
			
		||||
            return psd2powerdbm(self.per_degree_pch_psd[degree], ref_carrier.baud_rate)
 | 
			
		||||
            return psd2powerdbm(self.per_degree_pch_psd[degree], self.ref_carrier.baud_rate)
 | 
			
		||||
        elif degree in self.per_degree_pch_psw:
 | 
			
		||||
            return psd2powerdbm(self.per_degree_pch_psw[degree], ref_carrier.slot_width)
 | 
			
		||||
        return self.get_roadm_target_power(ref_carrier)
 | 
			
		||||
            return psd2powerdbm(self.per_degree_pch_psw[degree], self.ref_carrier.slot_width)
 | 
			
		||||
        return self.get_roadm_target_power()
 | 
			
		||||
 | 
			
		||||
    def get_per_degree_power(self, degree, spectral_info):
 | 
			
		||||
        """Get the target power in dBm out of ROADM degree for the spectral information
 | 
			
		||||
@@ -354,34 +407,43 @@ class Roadm(_Node):
 | 
			
		||||
            return psd2powerdbm(self.per_degree_pch_psw[degree], spectral_info.slot_width)
 | 
			
		||||
        return self.get_roadm_target_power(spectral_info=spectral_info)
 | 
			
		||||
 | 
			
		||||
    def propagate(self, spectral_info, degree):
 | 
			
		||||
    def propagate(self, spectral_info, degree, from_degree):
 | 
			
		||||
        """Equalization targets are read from topology file if defined and completed with default
 | 
			
		||||
        definition of the library.
 | 
			
		||||
        If the input power is lower than the target one, use the input power instead because
 | 
			
		||||
        a ROADM doesn't amplify, it can only attenuate.
 | 
			
		||||
        There is no difference for add or express : the same target is applied. For the moment
 | 
			
		||||
        propagates operates with spectral info carriers all having the same source or destination.
 | 
			
		||||
        If the input power is lower than the target one, use the input power minus the ROADM loss
 | 
			
		||||
        if is exists, because a ROADM doesn't amplify, it can only attenuate.
 | 
			
		||||
        There is no difference for add or express : the same target is applied.
 | 
			
		||||
        For the moment propagate operates with spectral info carriers all having the same source or destination.
 | 
			
		||||
        """
 | 
			
		||||
        # TODO maybe add a minimum loss for the ROADM
 | 
			
		||||
 | 
			
		||||
        # record input powers to compute the actual loss at the end of the process
 | 
			
		||||
        input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
        # apply min ROADM loss if it exists
 | 
			
		||||
        roadm_maxloss_db = self.get_impairment('roadm-maxloss', spectral_info.frequency, from_degree, degree)
 | 
			
		||||
        spectral_info.apply_attenuation_db(roadm_maxloss_db)
 | 
			
		||||
        # records the total power after applying minimum loss
 | 
			
		||||
        net_input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
        # find the target power for the reference carrier
 | 
			
		||||
        ref_per_degree_pch = self.get_per_degree_ref_power(degree, spectral_info.pref.ref_carrier)
 | 
			
		||||
        ref_per_degree_pch = self.get_per_degree_ref_power(degree)
 | 
			
		||||
        # find the target powers for each signal carrier
 | 
			
		||||
        per_degree_pch = self.get_per_degree_power(degree, spectral_info=spectral_info)
 | 
			
		||||
 | 
			
		||||
        # Definition of ref_pch_out_dbm for the reference channel:
 | 
			
		||||
        # Depending on propagation upstream from this ROADM, the input power (p_spani) might be smaller than
 | 
			
		||||
        # Depending on propagation upstream from this ROADM, the input power might be smaller than
 | 
			
		||||
        # the target power out configured for this ROADM degree's egress. Since ROADM does not amplify,
 | 
			
		||||
        # the power out of the ROADM for the ref channel is the min value between target power and input power.
 | 
			
		||||
        # (TODO add a minimum loss for the ROADM crossing)
 | 
			
		||||
        self.ref_pch_out_dbm = min(spectral_info.pref.p_spani, ref_per_degree_pch)
 | 
			
		||||
        ref_pch_in_dbm = self.ref_pch_in_dbm[from_degree]
 | 
			
		||||
        # Calculate the output power for the reference channel (only for visualization)
 | 
			
		||||
        self.ref_pch_out_dbm = min(ref_pch_in_dbm - max(roadm_maxloss_db), ref_per_degree_pch)
 | 
			
		||||
 | 
			
		||||
        # Definition of effective_loss:
 | 
			
		||||
        # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for
 | 
			
		||||
        # different carriers. effective_loss records the loss for the reference carrier.
 | 
			
		||||
        self.ref_effective_loss = spectral_info.pref.p_spani - self.ref_pch_out_dbm
 | 
			
		||||
        input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase
 | 
			
		||||
        # Calculate the effective loss for the reference channel
 | 
			
		||||
        self.ref_effective_loss = ref_pch_in_dbm - self.ref_pch_out_dbm
 | 
			
		||||
 | 
			
		||||
        # Calculate the target power per channel according to the equalization policy
 | 
			
		||||
        target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
 | 
			
		||||
        # Computation of the per channel target power according to equalization policy
 | 
			
		||||
        # Computation of the correction according to equalization policy
 | 
			
		||||
        # If target_power_per_channel has some channels power above input power, then the whole target is reduced.
 | 
			
		||||
        # For example, if user specifies delta_pdb_per_channel:
 | 
			
		||||
        # freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM,
 | 
			
		||||
@@ -396,28 +458,118 @@ class Roadm(_Node):
 | 
			
		||||
        # that had the min power.
 | 
			
		||||
        # This change corresponds to a discussion held during coders call. Please look at this document for
 | 
			
		||||
        # a reference: https://telecominfraproject.atlassian.net/wiki/spaces/OOPT/pages/669679645/PSE+Meeting+Minutes
 | 
			
		||||
        correction = (abs(watt2dbm(input_power) - target_power_per_channel)
 | 
			
		||||
                      - (watt2dbm(input_power) - target_power_per_channel)) / 2
 | 
			
		||||
        correction = calculate_absolute_min_or_zero(net_input_power_dbm - target_power_per_channel)
 | 
			
		||||
        new_target = target_power_per_channel - correction
 | 
			
		||||
        delta_power = watt2dbm(input_power) - new_target
 | 
			
		||||
        delta_power = net_input_power_dbm - new_target
 | 
			
		||||
 | 
			
		||||
        spectral_info.apply_attenuation_db(delta_power)
 | 
			
		||||
        spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2)
 | 
			
		||||
        spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2)
 | 
			
		||||
 | 
			
		||||
        # Update the PMD information
 | 
			
		||||
        pmd_impairment = self.get_impairment('roadm-pmd', spectral_info.frequency, from_degree, degree)
 | 
			
		||||
        spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + pmd_impairment ** 2)
 | 
			
		||||
 | 
			
		||||
        # Update the PMD information
 | 
			
		||||
        pdl_impairment = self.get_impairment('roadm-pdl', spectral_info.frequency, from_degree, degree)
 | 
			
		||||
        spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + pdl_impairment ** 2)
 | 
			
		||||
 | 
			
		||||
        # Update the per channel power with the result of propagation
 | 
			
		||||
        self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
 | 
			
		||||
        # Update the loss per channel and the labels
 | 
			
		||||
        self.loss_pch_db = input_power_dbm - self.pch_out_dbm
 | 
			
		||||
        self.propagated_labels = spectral_info.label
 | 
			
		||||
 | 
			
		||||
    def update_pref(self, spectral_info):
 | 
			
		||||
        """Update Reference power
 | 
			
		||||
    def set_roadm_paths(self, from_degree, to_degree, path_type, impairment_id=None):
 | 
			
		||||
        """set internal path type: express, drop or add with corresponding impairment
 | 
			
		||||
 | 
			
		||||
        This modifies the spectral info in-place. Only the `pref` is updated with new p_spani,
 | 
			
		||||
        while p_span0 is not changed.
 | 
			
		||||
        If no impairment id is defined, then use the first profile that matches the path_type in the
 | 
			
		||||
        profile dictionnary.
 | 
			
		||||
        """
 | 
			
		||||
        spectral_info.pref = spectral_info.pref._replace(p_spani=self.ref_pch_out_dbm)
 | 
			
		||||
        # initialize impairment with params.pmd, params.cd
 | 
			
		||||
        # if more detailed parameters are available for the Roadm, the use them instead
 | 
			
		||||
        roadm_global_impairment = {
 | 
			
		||||
            'impairment': [{
 | 
			
		||||
                'roadm-pmd': self.params.pmd,
 | 
			
		||||
                'roadm-pdl': self.params.pdl,
 | 
			
		||||
                'frequency-range': {
 | 
			
		||||
                    'lower-frequency': None,
 | 
			
		||||
                    'upper-frequency': None
 | 
			
		||||
                }}]}
 | 
			
		||||
        if path_type in ['add', 'drop']:
 | 
			
		||||
            # without detailed imparments, we assume that add OSNR contribution is the same as drop contribution
 | 
			
		||||
            # add_drop_osnr_db = - 10log10(1/add_osnr + 1/drop_osnr) with add_osnr = drop_osnr
 | 
			
		||||
            # = add_osnr_db + 10log10(2)
 | 
			
		||||
            roadm_global_impairment['impairment'][0]['roadm-osnr'] = self.params.add_drop_osnr + lin2db(2)
 | 
			
		||||
        impairment = RoadmImpairment(roadm_global_impairment)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info, degree):
 | 
			
		||||
        self.propagate(spectral_info, degree=degree)
 | 
			
		||||
        self.update_pref(spectral_info)
 | 
			
		||||
        if impairment_id is None:
 | 
			
		||||
            # get the first item in the type variety that matches the path_type
 | 
			
		||||
            for path_impairment_id, path_impairment in self.roadm_path_impairments.items():
 | 
			
		||||
                if path_impairment.path_type == path_type:
 | 
			
		||||
                    impairment = path_impairment
 | 
			
		||||
                    impairment_id = path_impairment_id
 | 
			
		||||
                    break
 | 
			
		||||
            # at this point, path_type is not part of roadm_path_impairment, impairment and impairment_id are None
 | 
			
		||||
        else:
 | 
			
		||||
            if impairment_id in self.roadm_path_impairments:
 | 
			
		||||
                impairment = self.roadm_path_impairments[impairment_id]
 | 
			
		||||
            else:
 | 
			
		||||
                msg = f'ROADM {self.uid}: impairment profile id {impairment_id} is not defined in library'
 | 
			
		||||
                raise NetworkTopologyError(msg)
 | 
			
		||||
        # print(from_degree, to_degree, path_type)
 | 
			
		||||
        self.roadm_paths.append(RoadmPath(from_degree=from_degree, to_degree=to_degree, path_type=path_type,
 | 
			
		||||
                                          impairment_id=impairment_id, impairment=impairment))
 | 
			
		||||
 | 
			
		||||
    def get_roadm_path(self, from_degree, to_degree):
 | 
			
		||||
        """Get internal path type impairment"""
 | 
			
		||||
        for roadm_path in self.roadm_paths:
 | 
			
		||||
            if roadm_path.from_degree == from_degree and roadm_path.to_degree == to_degree:
 | 
			
		||||
                return roadm_path
 | 
			
		||||
        msg = f'Could not find from_degree-to_degree {from_degree}-{to_degree} path in ROADM {self.uid}'
 | 
			
		||||
        raise NetworkTopologyError(msg)
 | 
			
		||||
 | 
			
		||||
    def get_per_degree_impairment_id(self, from_degree, to_degree):
 | 
			
		||||
        """returns the id of the impairment if the degrees are in the per_degree tab"""
 | 
			
		||||
        if f'{from_degree}-{to_degree}' in self.per_degree_impairments.keys():
 | 
			
		||||
            return self.per_degree_impairments[f'{from_degree}-{to_degree}']["impairment_id"]
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def get_path_type_per_id(self, impairment_id):
 | 
			
		||||
        """returns the path_type of the impairment if the is is defined"""
 | 
			
		||||
        if impairment_id in self.roadm_path_impairments.keys():
 | 
			
		||||
            return self.roadm_path_impairments[impairment_id].path_type
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def get_impairment(self, impairment: str, frequency_array: array, from_degree: str, degree: str) \
 | 
			
		||||
            -> array:
 | 
			
		||||
        """
 | 
			
		||||
        Retrieves the specified impairment values for the given frequency array.
 | 
			
		||||
 | 
			
		||||
        Parameters:
 | 
			
		||||
            impairment (str): The type of impairment to retrieve (roadm-pmd, roamd-maxloss...).
 | 
			
		||||
            frequency_array (array): The frequencies at which to check for impairments.
 | 
			
		||||
            from_degree (str): The ingress degree for the roadm internal path.
 | 
			
		||||
            degree (str): The egress degree for the roadm internal path.
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            array: An array of impairment values for the specified frequencies.
 | 
			
		||||
        """
 | 
			
		||||
        result = []
 | 
			
		||||
        impairment_per_band = self.get_roadm_path(from_degree, degree).impairment.impairments
 | 
			
		||||
        for frequency in frequency_array:
 | 
			
		||||
            for item in impairment_per_band:
 | 
			
		||||
                f_min = item['frequency-range']['lower-frequency']
 | 
			
		||||
                f_max = item['frequency-range']['upper-frequency']
 | 
			
		||||
                if (f_min is None or f_min <= frequency <= f_max):
 | 
			
		||||
                    item[impairment] = item.get(impairment, RoadmImpairment.default_values[impairment])
 | 
			
		||||
                    if item[impairment] is not None:
 | 
			
		||||
                        result.append(item[impairment])
 | 
			
		||||
                        break  # Stop searching after the first match for this frequency
 | 
			
		||||
        if result:
 | 
			
		||||
            return array(result)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info, degree, from_degree):
 | 
			
		||||
        self.propagate(spectral_info, degree=degree, from_degree=from_degree)
 | 
			
		||||
        return spectral_info
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -451,13 +603,8 @@ class Fused(_Node):
 | 
			
		||||
    def propagate(self, spectral_info):
 | 
			
		||||
        spectral_info.apply_attenuation_db(self.loss)
 | 
			
		||||
 | 
			
		||||
    def update_pref(self, spectral_info):
 | 
			
		||||
        spectral_info.pref = spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
 | 
			
		||||
                                                         p_spani=spectral_info.pref.p_spani - self.loss)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info):
 | 
			
		||||
        self.propagate(spectral_info)
 | 
			
		||||
        self.update_pref(spectral_info)
 | 
			
		||||
        return spectral_info
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -482,6 +629,7 @@ class Fiber(_Node):
 | 
			
		||||
                                       f"({1e-3 * self.params.length} km), boundaries excluded.")
 | 
			
		||||
        self.lumped_losses = db2lin(- lumped_losses_power)  # [linear units]
 | 
			
		||||
        self.z_lumped_losses = array(z_lumped_losses) * 1e3  # [m]
 | 
			
		||||
        self.ref_pch_in_dbm = None
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
@@ -527,10 +675,17 @@ class Fiber(_Node):
 | 
			
		||||
            interpolation = interp1d(ref_frequency, parameter)(spectrum_frequency)
 | 
			
		||||
            return interpolation
 | 
			
		||||
        except ValueError:
 | 
			
		||||
            try:
 | 
			
		||||
                start = spectrum_frequency[0]
 | 
			
		||||
                stop = spectrum_frequency[-1]
 | 
			
		||||
            except IndexError:
 | 
			
		||||
                # when frequency is a 0-dimensionnal array
 | 
			
		||||
                start = spectrum_frequency
 | 
			
		||||
                stop = spectrum_frequency
 | 
			
		||||
            raise SpectrumError('The spectrum bandwidth exceeds the frequency interval used to define the fiber '
 | 
			
		||||
                                f'{name} in "{type(self).__name__} {self.uid}".'
 | 
			
		||||
                                f'\nSpectrum f_min-f_max: {round(spectrum_frequency[0] * 1e-12, 2)}-'
 | 
			
		||||
                                f'{round(spectrum_frequency[-1] * 1e-12, 2)}'
 | 
			
		||||
                                f'\nSpectrum f_min-f_max: {round(start * 1e-12, 2)}-'
 | 
			
		||||
                                f'{round(stop * 1e-12, 2)}'
 | 
			
		||||
                                f'\n{name} f_min-f_max: {round(ref_frequency[0] * 1e-12, 2)}-'
 | 
			
		||||
                                f'{round(ref_frequency[-1] * 1e-12, 2)}')
 | 
			
		||||
 | 
			
		||||
@@ -675,21 +830,16 @@ class Fiber(_Node):
 | 
			
		||||
        self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
        self.propagated_labels = spectral_info.label
 | 
			
		||||
 | 
			
		||||
    def update_pref(self, spectral_info):
 | 
			
		||||
        # in case of Raman, the resulting loss of the fiber is not equivalent to self.loss
 | 
			
		||||
        # because of Raman gain. In order to correctly update pref, we need the resulting loss:
 | 
			
		||||
        # power_out - power_in. We use the total signal power (sum on all channels) to compute
 | 
			
		||||
        # this loss, because pref is a noiseless reference.
 | 
			
		||||
        loss = round(lin2db(self._psig_in / sum(spectral_info.signal)), 2)
 | 
			
		||||
        self.pch_out_db = spectral_info.pref.p_spani - loss
 | 
			
		||||
        spectral_info.pref = spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
 | 
			
		||||
                                                         p_spani=self.pch_out_db)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info):
 | 
			
		||||
        # _psig_in records the total signal power of the spectral information before propagation.
 | 
			
		||||
        self._psig_in = sum(spectral_info.signal)
 | 
			
		||||
        self.propagate(spectral_info)
 | 
			
		||||
        self.update_pref(spectral_info)
 | 
			
		||||
        # In case of Raman, the resulting loss of the fiber is not equivalent to self.loss
 | 
			
		||||
        # because of Raman gain. The resulting loss is:
 | 
			
		||||
        # power_out - power_in. We use the total signal power (sum on all channels) to compute
 | 
			
		||||
        # this loss.
 | 
			
		||||
        loss = round(lin2db(self._psig_in / sum(spectral_info.signal)), 2)
 | 
			
		||||
        self.pch_out_db = self.ref_pch_in_dbm - loss
 | 
			
		||||
        return spectral_info
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -717,11 +867,16 @@ class RamanFiber(Fiber):
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return dict(super().to_json, operational=self.operational)
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return super().__str__() + f'\n  reference gain (dB):         {round(self.estimated_gain, 2)}' \
 | 
			
		||||
            + f'\n  actual gain (dB):            {round(self.actual_raman_gain, 2)}'
 | 
			
		||||
 | 
			
		||||
    def propagate(self, spectral_info: SpectralInformation):
 | 
			
		||||
        """Modifies the spectral information computing the attenuation, the non-linear interference generation,
 | 
			
		||||
        the CD and PMD accumulation.
 | 
			
		||||
        """
 | 
			
		||||
        # apply the attenuation due to the input connector loss
 | 
			
		||||
        pin = watt2dbm(sum(spectral_info.signal))
 | 
			
		||||
        attenuation_in_db = self.params.con_in + self.params.att_in
 | 
			
		||||
        spectral_info.apply_attenuation_db(attenuation_in_db)
 | 
			
		||||
 | 
			
		||||
@@ -751,6 +906,8 @@ class RamanFiber(Fiber):
 | 
			
		||||
        spectral_info.apply_attenuation_db(attenuation_out_db)
 | 
			
		||||
        self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
        self.propagated_labels = spectral_info.label
 | 
			
		||||
        pout = watt2dbm(sum(spectral_info.signal))
 | 
			
		||||
        self.actual_raman_gain = self.loss + pout - pin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Edfa(_Node):
 | 
			
		||||
@@ -761,7 +918,7 @@ class Edfa(_Node):
 | 
			
		||||
            operational = {}
 | 
			
		||||
        self.variety_list = kwargs.pop('variety_list', None)
 | 
			
		||||
        super().__init__(*args, params=EdfaParams(**params), operational=EdfaOperational(**operational), **kwargs)
 | 
			
		||||
        self.interpol_dgt = None  # interpolated dynamic gain tilt
 | 
			
		||||
        self.interpol_dgt = None  # interpolated dynamic gain tilt defined per frequency on amp band
 | 
			
		||||
        self.interpol_gain_ripple = None  # gain ripple
 | 
			
		||||
        self.interpol_nf_ripple = None  # nf_ripple
 | 
			
		||||
        self.channel_freq = None  # SI channel frequencies
 | 
			
		||||
@@ -771,31 +928,41 @@ class Edfa(_Node):
 | 
			
		||||
        self.pin_db = None
 | 
			
		||||
        self.nch = None
 | 
			
		||||
        self.pout_db = None
 | 
			
		||||
        self.target_pch_out_db = None
 | 
			
		||||
        self.target_pch_out_dbm = None
 | 
			
		||||
        self.effective_pch_out_db = None
 | 
			
		||||
        self.passive = False
 | 
			
		||||
        self.att_in = None
 | 
			
		||||
        self.effective_gain = self.operational.gain_target
 | 
			
		||||
        self.delta_p = self.operational.delta_p  # delta P with Pref (power swwep) in power mode
 | 
			
		||||
        self.tilt_target = self.operational.tilt_target
 | 
			
		||||
        # self.operational.delta_p is defined by user for reference channel
 | 
			
		||||
        # self.delta_p is set with self.operational.delta_p, but it may be changed during design:
 | 
			
		||||
        # - if operational.delta_p is None, self.delta_p is computed at design phase
 | 
			
		||||
        # - if operational.delta_p can not be applied because of saturation, self.delta_p is recomputed
 | 
			
		||||
        # - if power_mode is False, then it is set to None
 | 
			
		||||
        self.delta_p = self.operational.delta_p
 | 
			
		||||
        # self._delta_p contains computed delta_p during design even if power_mode is False
 | 
			
		||||
        self._delta_p = None
 | 
			
		||||
        self.tilt_target = self.operational.tilt_target  # defined per lambda on the amp band
 | 
			
		||||
        self.out_voa = self.operational.out_voa
 | 
			
		||||
        self.propagated_labels = [""]
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return {'uid': self.uid,
 | 
			
		||||
                'type': type(self).__name__,
 | 
			
		||||
                'type_variety': self.params.type_variety,
 | 
			
		||||
                'operational': {
 | 
			
		||||
                    'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
 | 
			
		||||
                    'delta_p': self.delta_p,
 | 
			
		||||
                    'tilt_target': self.tilt_target,
 | 
			
		||||
                    'out_voa': self.out_voa
 | 
			
		||||
                },
 | 
			
		||||
                'metadata': {
 | 
			
		||||
                    'location': self.metadata['location']._asdict()
 | 
			
		||||
                }
 | 
			
		||||
                }
 | 
			
		||||
        _to_json = {
 | 
			
		||||
            'uid': self.uid,
 | 
			
		||||
            'type': type(self).__name__,
 | 
			
		||||
            'type_variety': self.params.type_variety,
 | 
			
		||||
            'operational': {
 | 
			
		||||
                'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
 | 
			
		||||
                'delta_p': self.delta_p,
 | 
			
		||||
                'tilt_target': round(self.tilt_target, 5) if self.tilt_target is not None else None,
 | 
			
		||||
                # defined per lambda on the amp band
 | 
			
		||||
                'out_voa': self.out_voa
 | 
			
		||||
            },
 | 
			
		||||
            'metadata': {
 | 
			
		||||
                'location': self.metadata['location']._asdict()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return _to_json
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return (f'{type(self).__name__}(uid={self.uid!r}, '
 | 
			
		||||
@@ -817,15 +984,17 @@ class Edfa(_Node):
 | 
			
		||||
        return '\n'.join([f'{type(self).__name__} {self.uid}',
 | 
			
		||||
                          f'  type_variety:           {self.params.type_variety}',
 | 
			
		||||
                          f'  effective gain(dB):     {self.effective_gain:.2f}',
 | 
			
		||||
                          f'  (before att_in and before output VOA)',
 | 
			
		||||
                          '  (before att_in and before output VOA)',
 | 
			
		||||
                          f'  tilt-target(dB)         {self.tilt_target:.2f}',
 | 
			
		||||
                          f'  noise figure (dB):      {nf:.2f}',
 | 
			
		||||
                          f'  (including att_in)',
 | 
			
		||||
                          f'  pad att_in (dB):        {self.att_in:.2f}',
 | 
			
		||||
                          f'  Power In (dBm):         {self.pin_db:.2f}',
 | 
			
		||||
                          f'  Power Out (dBm):        {self.pout_db:.2f}',
 | 
			
		||||
                          f'  Delta_P (dB):           ' + (f'{self.delta_p:.2f}' if self.delta_p is not None else 'None'),
 | 
			
		||||
                          f'  target pch (dBm):       ' + (f'{self.target_pch_out_db:.2f}' if self.target_pch_out_db is not None else 'None'),
 | 
			
		||||
                          f'  effective pch (dBm):    {self.effective_pch_out_db:.2f}',
 | 
			
		||||
                          '  Delta_P (dB):           ' + (f'{self.delta_p:.2f}'
 | 
			
		||||
                                                          if self.delta_p is not None else 'None'),
 | 
			
		||||
                          '  target pch (dBm):       ' + (f'{self.target_pch_out_dbm:.2f}'
 | 
			
		||||
                                                          if self.target_pch_out_dbm is not None else 'None'),
 | 
			
		||||
                          f'  actual pch out (dBm):   {total_pch}',
 | 
			
		||||
                          f'  output VOA (dB):        {self.out_voa:.2f}'])
 | 
			
		||||
 | 
			
		||||
@@ -853,20 +1022,12 @@ class Edfa(_Node):
 | 
			
		||||
        # For now, with homogeneous spectrum, we can calculate it as the difference between neighbouring channels.
 | 
			
		||||
        self.slot_width = self.channel_freq[1] - self.channel_freq[0]
 | 
			
		||||
 | 
			
		||||
        """in power mode: delta_p is defined and can be used to calculate the power target
 | 
			
		||||
        This power target is used calculate the amplifier gain"""
 | 
			
		||||
        pref = spectral_info.pref
 | 
			
		||||
        if self.delta_p is not None:
 | 
			
		||||
            self.target_pch_out_db = round(self.delta_p + pref.p_span0, 2)
 | 
			
		||||
            self.effective_gain = self.target_pch_out_db - pref.p_spani
 | 
			
		||||
 | 
			
		||||
        """check power saturation and correct effective gain & power accordingly:"""
 | 
			
		||||
        # Compute the saturation accounting for actual power at the input of the amp
 | 
			
		||||
        self.effective_gain = min(
 | 
			
		||||
            self.effective_gain,
 | 
			
		||||
            self.params.p_max - self.pin_db
 | 
			
		||||
        )
 | 
			
		||||
        self.effective_pch_out_db = round(pref.p_spani + self.effective_gain, 2)
 | 
			
		||||
 | 
			
		||||
        """check power saturation and correct target_gain accordingly:"""
 | 
			
		||||
        self.nf = self._calc_nf()
 | 
			
		||||
@@ -1026,7 +1187,7 @@ class Edfa(_Node):
 | 
			
		||||
        p = polyfit(self.channel_freq, self.interpol_dgt, 1)
 | 
			
		||||
        dgt_slope = p[0]
 | 
			
		||||
 | 
			
		||||
        # Calculate the target slope
 | 
			
		||||
        # Calculate the target slope defined per frequency on the amp band
 | 
			
		||||
        targ_slope = -self.tilt_target / (self.params.f_max - self.params.f_min)
 | 
			
		||||
 | 
			
		||||
        # first estimate of DGT scaling
 | 
			
		||||
@@ -1102,12 +1263,127 @@ class Edfa(_Node):
 | 
			
		||||
        self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
 | 
			
		||||
        self.propagated_labels = spectral_info.label
 | 
			
		||||
 | 
			
		||||
    def update_pref(self, spectral_info):
 | 
			
		||||
        spectral_info.pref = \
 | 
			
		||||
            spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0,
 | 
			
		||||
                                        p_spani=spectral_info.pref.p_spani + self.effective_gain - self.out_voa)
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info):
 | 
			
		||||
        self.propagate(spectral_info)
 | 
			
		||||
        self.update_pref(spectral_info)
 | 
			
		||||
        return spectral_info
 | 
			
		||||
        # filter out carriers outside the amplifier band
 | 
			
		||||
        band = next(b for b in self.params.bands)
 | 
			
		||||
        spectral_info = demuxed_spectral_information(spectral_info, band)
 | 
			
		||||
        if spectral_info.carriers:
 | 
			
		||||
            self.propagate(spectral_info)
 | 
			
		||||
            return spectral_info
 | 
			
		||||
        raise ValueError(f'Amp {self.uid} Defined propagation band does not match amplifiers band.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Multiband_amplifier(_Node):
 | 
			
		||||
    """Represents a multiband amplifier that manages multiple amplifiers across different frequency bands.
 | 
			
		||||
 | 
			
		||||
    This class allows for the initialization and management of amplifiers, each associated with a specific
 | 
			
		||||
    frequency band. It provides methods for signal propagation through the amplifiers and for exporting
 | 
			
		||||
    to JSON format.
 | 
			
		||||
 | 
			
		||||
    param: amplifiers: list of dict. A list of dictionaries, each containing parameters for setting an
 | 
			
		||||
    individual amplifier.
 | 
			
		||||
    param: params : dict. A dictionary of parameters for the multiband amplifier, which must include
 | 
			
		||||
    necessary configuration settings.
 | 
			
		||||
    param: args, kwargs: Additional positional and keyword arguments passed to the parent class `_Node`.
 | 
			
		||||
 | 
			
		||||
    Attributes:
 | 
			
		||||
    -----------
 | 
			
		||||
    variety_list : A list of varieties associated with the amplifier.
 | 
			
		||||
    amplifiers : A dictionary mapping band names to their corresponding amplifier instances.
 | 
			
		||||
 | 
			
		||||
    Methods:
 | 
			
		||||
    --------
 | 
			
		||||
    __call__(spectral_info):
 | 
			
		||||
    Propagates the input spectral information through each amplifier and returns the multiplexed spectrum.
 | 
			
		||||
 | 
			
		||||
    to_json:
 | 
			
		||||
    Converts the amplifier's state to a JSON-compatible dictionary.
 | 
			
		||||
 | 
			
		||||
    __repr__():
 | 
			
		||||
    Returns a string representation of the multiband amplifier instance.
 | 
			
		||||
 | 
			
		||||
    __str__():
 | 
			
		||||
    Returns a formatted string representation of the multiband amplifier and its amplifiers.
 | 
			
		||||
 | 
			
		||||
    Raises:
 | 
			
		||||
    -------
 | 
			
		||||
    ParametersError: If there are conflicting amplifier definitions for the same frequency band during initialization.
 | 
			
		||||
 | 
			
		||||
    ValueError: If the input spectral information does not match any defined amplifier bands during propagation.
 | 
			
		||||
    """
 | 
			
		||||
    # separate the top level type_variety from kwargs to avoid having multiple type_varieties on each element processing
 | 
			
		||||
    def __init__(self, *args, amplifiers: List[dict], params: dict, **kwargs):
 | 
			
		||||
        self.variety_list = kwargs.pop('variety_list', None)
 | 
			
		||||
        try:
 | 
			
		||||
            super().__init__(params=MultiBandParams(**params), **kwargs)
 | 
			
		||||
        except ParametersError as e:
 | 
			
		||||
            raise ParametersError(f'{kwargs["uid"]}: {e}')
 | 
			
		||||
        self.amplifiers = {}
 | 
			
		||||
        if 'type_variety' in kwargs:
 | 
			
		||||
            kwargs.pop('type_variety')
 | 
			
		||||
        self.passive = False
 | 
			
		||||
        for amp_dict in amplifiers:
 | 
			
		||||
            # amplifiers dict uses default names as key to represent the band
 | 
			
		||||
            amp = Edfa(**amp_dict, **kwargs)
 | 
			
		||||
            band = next(b for b in amp.params.bands)
 | 
			
		||||
            band_name = find_band_name(FrequencyBand(f_min=band["f_min"], f_max=band["f_max"]))
 | 
			
		||||
            if band_name not in self.amplifiers.keys() and band not in self.params.bands:
 | 
			
		||||
                self.params.bands.append(band)
 | 
			
		||||
                self.amplifiers[band_name] = amp
 | 
			
		||||
            elif band_name not in self.amplifiers.keys() and band in self.params.bands:
 | 
			
		||||
                self.amplifiers[band_name] = amp
 | 
			
		||||
            else:
 | 
			
		||||
                raise ParametersError(f'{kwargs["uid"]}: has more than one amp defined for the same band')
 | 
			
		||||
 | 
			
		||||
    def __call__(self, spectral_info: SpectralInformation):
 | 
			
		||||
        """propagates in each amp and returns the muxed spectrum
 | 
			
		||||
        """
 | 
			
		||||
        out_si = []
 | 
			
		||||
        for _, amp in self.amplifiers.items():
 | 
			
		||||
            si = demuxed_spectral_information(spectral_info, amp.params.bands[0])
 | 
			
		||||
            # if spectral_info frequencies are outside amp band, si is None
 | 
			
		||||
            if si:
 | 
			
		||||
                si = amp(si)
 | 
			
		||||
                out_si.append(si)
 | 
			
		||||
        if not out_si:
 | 
			
		||||
            raise ValueError('Defined propagation band does not match amplifiers band.')
 | 
			
		||||
        return muxed_spectral_information(out_si)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return {'uid': self.uid,
 | 
			
		||||
                'type': type(self).__name__,
 | 
			
		||||
                'type_variety': self.type_variety,
 | 
			
		||||
                'amplifiers': [{
 | 
			
		||||
                    'type_variety': amp.type_variety,
 | 
			
		||||
                    'operational': {
 | 
			
		||||
                        'gain_target': round(amp.effective_gain, 6),
 | 
			
		||||
                        'delta_p': amp.delta_p,
 | 
			
		||||
                        'tilt_target': amp.tilt_target,
 | 
			
		||||
                        'out_voa': amp.out_voa
 | 
			
		||||
                    }} for amp in self.amplifiers.values()
 | 
			
		||||
                ],
 | 
			
		||||
                'metadata': {
 | 
			
		||||
                    'location': self.metadata['location']._asdict()
 | 
			
		||||
                }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return (f'{type(self).__name__}(uid={self.uid!r}, '
 | 
			
		||||
                f'type_variety={self.type_variety!r}, ')
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        amp_str = [f'{type(self).__name__} {self.uid}',
 | 
			
		||||
                   f'  type_variety:           {self.type_variety}']
 | 
			
		||||
        multi_str_data = []
 | 
			
		||||
        max_width = 0
 | 
			
		||||
        for amp in self.amplifiers.values():
 | 
			
		||||
            lines = amp.__str__().split('\n')
 | 
			
		||||
            # start at index 1 to remove uid from each amp list of strings
 | 
			
		||||
            # records only if amp is used ie si has frequencies in amp) otherwise there is no other string than the uid
 | 
			
		||||
            if len(lines) > 1:
 | 
			
		||||
                max_width = max(max_width, max([len(line) for line in lines[1:]]))
 | 
			
		||||
                multi_str_data.append(lines[1:])
 | 
			
		||||
        # multi_str_data contains lines with each amp str, instead we want to print per column: transpose the string
 | 
			
		||||
        transposed_data = list(map(list, zip(*multi_str_data)))
 | 
			
		||||
        return '\n'.join(amp_str) + '\n' + nice_column_str(data=transposed_data, max_length=max_width + 2, padding=3)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,71 +7,126 @@ gnpy.core.equipment
 | 
			
		||||
 | 
			
		||||
This module contains functionality for specifying equipment.
 | 
			
		||||
"""
 | 
			
		||||
from collections import defaultdict
 | 
			
		||||
from functools import reduce
 | 
			
		||||
from typing import List
 | 
			
		||||
 | 
			
		||||
from gnpy.core.utils import automatic_nch, db2lin
 | 
			
		||||
from gnpy.core.exceptions import EquipmentConfigError
 | 
			
		||||
from gnpy.core.exceptions import EquipmentConfigError, ConfigurationError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=False):
 | 
			
		||||
    """return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)"""
 | 
			
		||||
    """return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)
 | 
			
		||||
 | 
			
		||||
    if the type or mode do no match an existing transceiver in the library, then the function
 | 
			
		||||
    raises an error if error_message is True else returns a default mode based on equipment['SI']['default']
 | 
			
		||||
    If trx_mode is None (but type is valid), it returns an undetermined mode whatever the error message:
 | 
			
		||||
    this is a special case for automatic mode selection.
 | 
			
		||||
    """
 | 
			
		||||
    trx_params = {}
 | 
			
		||||
    default_si_data = equipment['SI']['default']
 | 
			
		||||
    # default transponder characteristics
 | 
			
		||||
    # mainly used with transmission_main_example.py
 | 
			
		||||
    default_trx_params = {
 | 
			
		||||
        'f_min': default_si_data.f_min,
 | 
			
		||||
        'f_max': default_si_data.f_max,
 | 
			
		||||
        'baud_rate': default_si_data.baud_rate,
 | 
			
		||||
        'spacing': default_si_data.spacing,
 | 
			
		||||
        'OSNR': None,
 | 
			
		||||
        'penalties': {},
 | 
			
		||||
        'bit_rate': None,
 | 
			
		||||
        'cost': None,
 | 
			
		||||
        'roll_off': default_si_data.roll_off,
 | 
			
		||||
        'tx_osnr': default_si_data.tx_osnr,
 | 
			
		||||
        'min_spacing': None,
 | 
			
		||||
        'equalization_offset_db': 0
 | 
			
		||||
    }
 | 
			
		||||
    # Undetermined transponder characteristics
 | 
			
		||||
    # mainly used with path_request_run.py for the automatic mode computation case
 | 
			
		||||
    undetermined_trx_params = {
 | 
			
		||||
        "format": "undetermined",
 | 
			
		||||
        "baud_rate": None,
 | 
			
		||||
        "OSNR": None,
 | 
			
		||||
        "penalties": None,
 | 
			
		||||
        "bit_rate": None,
 | 
			
		||||
        "roll_off": None,
 | 
			
		||||
        "tx_osnr": None,
 | 
			
		||||
        "min_spacing": None,
 | 
			
		||||
        "cost": None,
 | 
			
		||||
        "equalization_offset_db": 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        trxs = equipment['Transceiver']
 | 
			
		||||
        # if called from path_requests_run.py, trx_mode is filled with None when not specified by user
 | 
			
		||||
        # if called from transmission_main.py, trx_mode is ''
 | 
			
		||||
        if trx_mode is not None:
 | 
			
		||||
            mode_params = next(mode for trx in trxs
 | 
			
		||||
                               if trx == trx_type_variety
 | 
			
		||||
                               for mode in trxs[trx].mode
 | 
			
		||||
                               if mode['format'] == trx_mode)
 | 
			
		||||
            trx_params = {**mode_params}
 | 
			
		||||
            # sanity check: spacing baudrate must be smaller than min spacing
 | 
			
		||||
    trxs = equipment['Transceiver']
 | 
			
		||||
    if trx_type_variety in trxs:
 | 
			
		||||
        modes = {mode['format']: mode for mode in trxs[trx_type_variety].mode}
 | 
			
		||||
        trx_frequencies = {'f_min': trxs[trx_type_variety].frequency['min'],
 | 
			
		||||
                           'f_max': trxs[trx_type_variety].frequency['max']}
 | 
			
		||||
        if trx_mode in modes:
 | 
			
		||||
            # if called from transmission_main.py, trx_mode is ''
 | 
			
		||||
            trx_params = {**modes[trx_mode], **trx_frequencies}
 | 
			
		||||
            if trx_params['baud_rate'] > trx_params['min_spacing']:
 | 
			
		||||
                raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}"'
 | 
			
		||||
                                           + f' mode "{trx_params["format"]}" has baud rate'
 | 
			
		||||
                                           + f' {trx_params["baud_rate"] * 1e-9:.3f} GHz greater than min_spacing'
 | 
			
		||||
                                           + f' {trx_params["min_spacing"] * 1e-9:.3f}.')
 | 
			
		||||
                # sanity check: baudrate must be smaller than min spacing
 | 
			
		||||
                raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}" '
 | 
			
		||||
                                           + f'mode "{trx_params["format"]}" has baud rate '
 | 
			
		||||
                                           + f'{trx_params["baud_rate"] * 1e-9:.2f} GHz greater than min_spacing '
 | 
			
		||||
                                           + f'{trx_params["min_spacing"] * 1e-9:.2f}.')
 | 
			
		||||
            trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
 | 
			
		||||
        else:
 | 
			
		||||
            mode_params = {"format": "undetermined",
 | 
			
		||||
                           "baud_rate": None,
 | 
			
		||||
                           "OSNR": None,
 | 
			
		||||
                           "penalties": None,
 | 
			
		||||
                           "bit_rate": None,
 | 
			
		||||
                           "roll_off": None,
 | 
			
		||||
                           "tx_osnr": None,
 | 
			
		||||
                           "min_spacing": None,
 | 
			
		||||
                           "cost": None,
 | 
			
		||||
                           "equalization_offset_db": 0}
 | 
			
		||||
            trx_params = {**mode_params}
 | 
			
		||||
        trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
 | 
			
		||||
        trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
 | 
			
		||||
 | 
			
		||||
        # TODO: novel automatic feature maybe unwanted if spacing is specified
 | 
			
		||||
        # trx_params['spacing'] = _automatic_spacing(trx_params['baud_rate'])
 | 
			
		||||
        # temp = trx_params['spacing']
 | 
			
		||||
        # print(f'spacing {temp}')
 | 
			
		||||
    except StopIteration:
 | 
			
		||||
        if error_message:
 | 
			
		||||
            raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" in equipment library')
 | 
			
		||||
        else:
 | 
			
		||||
            # default transponder charcteristics
 | 
			
		||||
            # mainly used with transmission_main_example.py
 | 
			
		||||
            trx_params['f_min'] = default_si_data.f_min
 | 
			
		||||
            trx_params['f_max'] = default_si_data.f_max
 | 
			
		||||
            trx_params['baud_rate'] = default_si_data.baud_rate
 | 
			
		||||
            trx_params['spacing'] = default_si_data.spacing
 | 
			
		||||
            trx_params['OSNR'] = None
 | 
			
		||||
            trx_params['penalties'] = {}
 | 
			
		||||
            trx_params['bit_rate'] = None
 | 
			
		||||
            trx_params['cost'] = None
 | 
			
		||||
            trx_params['roll_off'] = default_si_data.roll_off
 | 
			
		||||
            trx_params['tx_osnr'] = default_si_data.tx_osnr
 | 
			
		||||
            trx_params['min_spacing'] = None
 | 
			
		||||
            trx_params['equalization_offset_db'] = 0
 | 
			
		||||
 | 
			
		||||
    trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3
 | 
			
		||||
            return trx_params
 | 
			
		||||
        if trx_mode is None:
 | 
			
		||||
            # if called from path_requests_run.py, trx_mode is filled with None when not specified by user
 | 
			
		||||
            trx_params = {**undetermined_trx_params, **trx_frequencies}
 | 
			
		||||
            return trx_params
 | 
			
		||||
    if trx_type_variety in trxs and error_message:
 | 
			
		||||
        raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" '
 | 
			
		||||
                                   + 'in equipment library')
 | 
			
		||||
    if error_message:
 | 
			
		||||
        raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" in equipment library')
 | 
			
		||||
 | 
			
		||||
    trx_params = {**default_trx_params}
 | 
			
		||||
    return trx_params
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_type_variety(amps: List[str], equipment: dict) -> str:
 | 
			
		||||
    """Returns the multiband type_variety associated with a list of single band type_varieties
 | 
			
		||||
    Args:
 | 
			
		||||
    amps (List[str]): A list of single band type_varieties.
 | 
			
		||||
    equipment (dict): A dictionary containing equipment information.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
    str: an amplifier type variety
 | 
			
		||||
    """
 | 
			
		||||
    listes = find_type_varieties(amps, equipment)
 | 
			
		||||
 | 
			
		||||
    _found_type = list(reduce(lambda x, y: set(x) & set(y), listes))
 | 
			
		||||
    # Given a list of single band amplifiers, find the multiband amplifier whose multi_band group
 | 
			
		||||
    # matches. For example, if amps list contains ["a1_LBAND", "a2_CBAND"], with a1.multi_band = [a1_LBAND, a1_CBAND]
 | 
			
		||||
    # and a2.multi_band = [a1_LBAND, a2_CBAND], then:
 | 
			
		||||
    # possible_type_varieties = {"a1_LBAND": ["a1", "a2"], "a2_CBAND": ["a2"]}
 | 
			
		||||
    # listes = [["a1", "a2"],  ["a2"]]
 | 
			
		||||
    # and _found_type = [a2]
 | 
			
		||||
    if not _found_type:
 | 
			
		||||
        msg = f'{amps} amps do not belong to the same amp type {listes}'
 | 
			
		||||
        raise ConfigurationError(msg)
 | 
			
		||||
    return _found_type[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_type_varieties(amps: List[str], equipment: dict) -> List[List[str]]:
 | 
			
		||||
    """Returns the multiband list of type_varieties associated with a list of single band type_varieties
 | 
			
		||||
    Args:
 | 
			
		||||
    amps (List[str]): A list of single band type_varieties.
 | 
			
		||||
    equipment (dict): A dictionary containing equipment information.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
    List[List[str]]: A list of lists containing the multiband type_varieties
 | 
			
		||||
    associated with each single band type_variety.
 | 
			
		||||
    """
 | 
			
		||||
    possible_type_varieties = defaultdict(list)
 | 
			
		||||
    for amp_name, amp in equipment['Edfa'].items():
 | 
			
		||||
        if amp.multi_band is not None:
 | 
			
		||||
            for elem in amp.multi_band:
 | 
			
		||||
                # possible_type_varieties stores the list of multiband amp names that list this elem as
 | 
			
		||||
                # a possible amplifier of the multiband group. For example, if "std_medium_gain_multiband"
 | 
			
		||||
                # and "std_medium_gain_multiband_new" contain "std_medium_gain_C" in their "multi_band" list, then:
 | 
			
		||||
                # possible_type_varieties["std_medium_gain_C"] =
 | 
			
		||||
                # ["std_medium_gain_multiband", "std_medium_gain_multiband_new"]
 | 
			
		||||
                possible_type_varieties[elem].append(amp_name)
 | 
			
		||||
    return [possible_type_varieties[a] for a in amps]
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ This module contains classes for modelling :class:`SpectralInformation`.
 | 
			
		||||
from __future__ import annotations
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
from collections.abc import Iterable
 | 
			
		||||
from typing import Union
 | 
			
		||||
from typing import Union, List
 | 
			
		||||
from dataclasses import dataclass
 | 
			
		||||
from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray
 | 
			
		||||
 | 
			
		||||
@@ -45,15 +45,6 @@ class Channel(
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Pref(namedtuple('Pref', 'p_span0, p_spani, ref_carrier')):
 | 
			
		||||
    """noiseless reference power in dBm:
 | 
			
		||||
 | 
			
		||||
    p_span0: inital target carrier power for a reference channel defined by user
 | 
			
		||||
    p_spani: carrier power after element i for a reference channel defined by user
 | 
			
		||||
    ref_carrier records the baud rate of the reference channel
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SpectralInformation(object):
 | 
			
		||||
    """Class containing the parameters of the entire WDM comb.
 | 
			
		||||
 | 
			
		||||
@@ -61,7 +52,7 @@ class SpectralInformation(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, frequency: array, baud_rate: array, slot_width: array, signal: array, nli: array, ase: array,
 | 
			
		||||
                 roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
 | 
			
		||||
                 delta_pdb_per_channel: array, tx_osnr: array, ref_power: Pref, label: array):
 | 
			
		||||
                 delta_pdb_per_channel: array, tx_osnr: array, tx_power: array, label: array):
 | 
			
		||||
        indices = argsort(frequency)
 | 
			
		||||
        self._frequency = frequency[indices]
 | 
			
		||||
        self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
 | 
			
		||||
@@ -89,18 +80,9 @@ class SpectralInformation(object):
 | 
			
		||||
        self._latency = latency[indices]
 | 
			
		||||
        self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
 | 
			
		||||
        self._tx_osnr = tx_osnr[indices]
 | 
			
		||||
        self._pref = ref_power
 | 
			
		||||
        self._tx_power = tx_power[indices]
 | 
			
		||||
        self._label = label[indices]
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def pref(self):
 | 
			
		||||
        """Instance of gnpy.info.Pref"""
 | 
			
		||||
        return self._pref
 | 
			
		||||
 | 
			
		||||
    @pref.setter
 | 
			
		||||
    def pref(self, pref: Pref):
 | 
			
		||||
        self._pref = pref
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def frequency(self):
 | 
			
		||||
        return self._frequency
 | 
			
		||||
@@ -207,6 +189,14 @@ class SpectralInformation(object):
 | 
			
		||||
    def tx_osnr(self, tx_osnr):
 | 
			
		||||
        self._tx_osnr = tx_osnr
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def tx_power(self):
 | 
			
		||||
        return self._tx_power
 | 
			
		||||
 | 
			
		||||
    @tx_power.setter
 | 
			
		||||
    def tx_power(self, tx_power):
 | 
			
		||||
        self._tx_power = tx_power
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def channel_number(self):
 | 
			
		||||
        return self._channel_number
 | 
			
		||||
@@ -237,12 +227,6 @@ class SpectralInformation(object):
 | 
			
		||||
 | 
			
		||||
    def __add__(self, other: SpectralInformation):
 | 
			
		||||
        try:
 | 
			
		||||
            # Note that pref.p_spanx from "self" and "other" must be identical for a given simulation (correspond to the
 | 
			
		||||
            # the simulation setup):
 | 
			
		||||
            # - for a given simulation there is only one design (one p_span0),
 | 
			
		||||
            # - and p_spani is the propagation result of p_span0 so there should not be different p_spani either.
 | 
			
		||||
            if (self.pref.p_span0 != other.pref.p_span0) or (self.pref.p_spani != other.pref.p_spani):
 | 
			
		||||
                raise SpectrumError('reference powers of the spectrum are not identical')
 | 
			
		||||
            return SpectralInformation(frequency=append(self.frequency, other.frequency),
 | 
			
		||||
                                       slot_width=append(self.slot_width, other.slot_width),
 | 
			
		||||
                                       signal=append(self.signal, other.signal), nli=append(self.nli, other.nli),
 | 
			
		||||
@@ -257,13 +241,12 @@ class SpectralInformation(object):
 | 
			
		||||
                                       delta_pdb_per_channel=append(self.delta_pdb_per_channel,
 | 
			
		||||
                                                                    other.delta_pdb_per_channel),
 | 
			
		||||
                                       tx_osnr=append(self.tx_osnr, other.tx_osnr),
 | 
			
		||||
                                       ref_power=Pref(self.pref.p_span0, self.pref.p_spani, self.pref.ref_carrier),
 | 
			
		||||
                                       tx_power=append(self.tx_power, other.tx_power),
 | 
			
		||||
                                       label=append(self.label, other.label))
 | 
			
		||||
        except SpectrumError:
 | 
			
		||||
            raise SpectrumError('Spectra cannot be summed: channels overlapping.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _replace(self, carriers, pref):
 | 
			
		||||
    def _replace(self, carriers):
 | 
			
		||||
        self.chromatic_dispersion = array([c.chromatic_dispersion for c in carriers])
 | 
			
		||||
        self.pmd = array([c.pmd for c in carriers])
 | 
			
		||||
        self.pdl = array([c.pdl for c in carriers])
 | 
			
		||||
@@ -271,7 +254,6 @@ class SpectralInformation(object):
 | 
			
		||||
        self.signal = array([c.power.signal for c in carriers])
 | 
			
		||||
        self.nli = array([c.power.nli for c in carriers])
 | 
			
		||||
        self.ase = array([c.power.ase for c in carriers])
 | 
			
		||||
        self.pref = pref
 | 
			
		||||
        return self
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -279,6 +261,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
 | 
			
		||||
                                          signal: Union[float, ndarray, Iterable],
 | 
			
		||||
                                          baud_rate: Union[float, ndarray, Iterable],
 | 
			
		||||
                                          tx_osnr: Union[float, ndarray, Iterable],
 | 
			
		||||
                                          tx_power: Union[float, ndarray, Iterable] = None,
 | 
			
		||||
                                          delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
 | 
			
		||||
                                          slot_width: Union[float, ndarray, Iterable] = None,
 | 
			
		||||
                                          roll_off: Union[float, ndarray, Iterable] = 0.,
 | 
			
		||||
@@ -286,7 +269,6 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
 | 
			
		||||
                                          pmd: Union[float, ndarray, Iterable] = 0.,
 | 
			
		||||
                                          pdl: Union[float, ndarray, Iterable] = 0.,
 | 
			
		||||
                                          latency: Union[float, ndarray, Iterable] = 0.,
 | 
			
		||||
                                          ref_power: Pref = None,
 | 
			
		||||
                                          label: Union[str, ndarray, Iterable] = None):
 | 
			
		||||
    """This is just a wrapper around the SpectralInformation.__init__() that simplifies the creation of
 | 
			
		||||
    a non-uniform spectral information with NLI and ASE powers set to zero."""
 | 
			
		||||
@@ -306,6 +288,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
 | 
			
		||||
        ase = zeros(number_of_channels)
 | 
			
		||||
        delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
 | 
			
		||||
        tx_osnr = full(number_of_channels, tx_osnr)
 | 
			
		||||
        tx_power = full(number_of_channels, tx_power)
 | 
			
		||||
        label = full(number_of_channels, label)
 | 
			
		||||
        return SpectralInformation(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                   signal=signal, nli=nli, ase=ase,
 | 
			
		||||
@@ -313,8 +296,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
 | 
			
		||||
                                   chromatic_dispersion=chromatic_dispersion,
 | 
			
		||||
                                   pmd=pmd, pdl=pdl, latency=latency,
 | 
			
		||||
                                   delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                   tx_osnr=tx_osnr,
 | 
			
		||||
                                   ref_power=ref_power, label=label)
 | 
			
		||||
                                   tx_osnr=tx_osnr, tx_power=tx_power, label=label)
 | 
			
		||||
    except ValueError as e:
 | 
			
		||||
        if 'could not broadcast' in str(e):
 | 
			
		||||
            raise SpectrumError('Dimension mismatch in input fields.')
 | 
			
		||||
@@ -322,55 +304,96 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
 | 
			
		||||
            raise
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing, tx_osnr, delta_pdb=0,
 | 
			
		||||
                                      ref_carrier=None):
 | 
			
		||||
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, spacing, tx_osnr, tx_power,
 | 
			
		||||
                                      delta_pdb=0):
 | 
			
		||||
    """Creates a fixed slot width spectral information with flat power.
 | 
			
		||||
    all arguments are scalar values"""
 | 
			
		||||
    number_of_channels = automatic_nch(f_min, f_max, spacing)
 | 
			
		||||
    frequency = [(f_min + spacing * i) for i in range(1, number_of_channels + 1)]
 | 
			
		||||
    p_span0 = watt2dbm(power)
 | 
			
		||||
    p_spani = watt2dbm(power)
 | 
			
		||||
    delta_pdb_per_channel = delta_pdb * ones(number_of_channels)
 | 
			
		||||
    label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)]
 | 
			
		||||
    return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate,
 | 
			
		||||
    return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=tx_power, baud_rate=baud_rate,
 | 
			
		||||
                                                 roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                                 tx_osnr=tx_osnr,
 | 
			
		||||
                                                 ref_power=Pref(p_span0=p_span0, p_spani=p_spani,
 | 
			
		||||
                                                                ref_carrier=ref_carrier),
 | 
			
		||||
                                                 label=label)
 | 
			
		||||
                                                 tx_osnr=tx_osnr, tx_power=tx_power, label=label)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], power: float,
 | 
			
		||||
                                     ref_carrier: ReferenceCarrier) -> SpectralInformation:
 | 
			
		||||
def is_in_band(frequency: float, band: dict) -> bool:
 | 
			
		||||
    """band has {"f_min": value, "f_max": value} format
 | 
			
		||||
    """
 | 
			
		||||
    if frequency >= band['f_min'] and frequency <= band['f_max']:
 | 
			
		||||
        return True
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def demuxed_spectral_information(input_si: SpectralInformation, band: dict) -> SpectralInformation:
 | 
			
		||||
    """extract a si based on band
 | 
			
		||||
    """
 | 
			
		||||
    filtered_indices = [i for i, f in enumerate(input_si.frequency)
 | 
			
		||||
                        if is_in_band(f - input_si.slot_width[i] / 2, band)
 | 
			
		||||
                        and is_in_band(f + input_si.slot_width[i] / 2, band)]
 | 
			
		||||
    if filtered_indices:
 | 
			
		||||
        frequency = input_si.frequency[filtered_indices]
 | 
			
		||||
        baud_rate = input_si.baud_rate[filtered_indices]
 | 
			
		||||
        slot_width = input_si.slot_width[filtered_indices]
 | 
			
		||||
        signal = input_si.signal[filtered_indices]
 | 
			
		||||
        nli = input_si.nli[filtered_indices]
 | 
			
		||||
        ase = input_si.ase[filtered_indices]
 | 
			
		||||
        roll_off = input_si.roll_off[filtered_indices]
 | 
			
		||||
        chromatic_dispersion = input_si.chromatic_dispersion[filtered_indices]
 | 
			
		||||
        pmd = input_si.pmd[filtered_indices]
 | 
			
		||||
        pdl = input_si.pdl[filtered_indices]
 | 
			
		||||
        latency = input_si.latency[filtered_indices]
 | 
			
		||||
        delta_pdb_per_channel = input_si.delta_pdb_per_channel[filtered_indices]
 | 
			
		||||
        tx_osnr = input_si.tx_osnr[filtered_indices]
 | 
			
		||||
        tx_power = input_si.tx_power[filtered_indices]
 | 
			
		||||
        label = input_si.label[filtered_indices]
 | 
			
		||||
 | 
			
		||||
        return SpectralInformation(frequency=frequency, baud_rate=baud_rate, slot_width=slot_width, signal=signal,
 | 
			
		||||
                                   nli=nli, ase=ase, roll_off=roll_off, chromatic_dispersion=chromatic_dispersion,
 | 
			
		||||
                                   pmd=pmd, pdl=pdl, latency=latency, delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                   tx_osnr=tx_osnr, tx_power=tx_power, label=label)
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def muxed_spectral_information(input_si_list: List[SpectralInformation]) -> SpectralInformation:
 | 
			
		||||
    """return the assembled spectrum
 | 
			
		||||
    """
 | 
			
		||||
    if input_si_list and len(input_si_list) > 1:
 | 
			
		||||
        si = input_si_list[0] + muxed_spectral_information(input_si_list[1:])
 | 
			
		||||
        return si
 | 
			
		||||
    elif input_si_list and len(input_si_list) == 1:
 | 
			
		||||
        return input_si_list[0]
 | 
			
		||||
    else:
 | 
			
		||||
        raise ValueError('liste vide')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier],
 | 
			
		||||
                                     power: float) -> SpectralInformation:
 | 
			
		||||
    """Initial spectrum is a dict with key = carrier frequency, and value a Carrier object.
 | 
			
		||||
    :param initial_spectrum: indexed by frequency in Hz, with power offset (delta_pdb), baudrate, slot width,
 | 
			
		||||
    tx_osnr and roll off.
 | 
			
		||||
    tx_osnr, tx_power and roll off.
 | 
			
		||||
    :param power: power of the request
 | 
			
		||||
    :param ref_carrier: reference carrier (baudrate) used for the reference channel
 | 
			
		||||
    """
 | 
			
		||||
    frequency = list(initial_spectrum.keys())
 | 
			
		||||
    signal = [power * db2lin(c.delta_pdb) for c in initial_spectrum.values()]
 | 
			
		||||
    signal = [c.tx_power for c in initial_spectrum.values()]
 | 
			
		||||
    roll_off = [c.roll_off for c in initial_spectrum.values()]
 | 
			
		||||
    baud_rate = [c.baud_rate for c in initial_spectrum.values()]
 | 
			
		||||
    delta_pdb_per_channel = [c.delta_pdb for c in initial_spectrum.values()]
 | 
			
		||||
    slot_width = [c.slot_width for c in initial_spectrum.values()]
 | 
			
		||||
    tx_osnr = [c.tx_osnr for c in initial_spectrum.values()]
 | 
			
		||||
    tx_power = [c.tx_power for c in initial_spectrum.values()]
 | 
			
		||||
    label = [c.label for c in initial_spectrum.values()]
 | 
			
		||||
    p_span0 = watt2dbm(power)
 | 
			
		||||
    p_spani = watt2dbm(power)
 | 
			
		||||
    return create_arbitrary_spectral_information(frequency=frequency, signal=signal, baud_rate=baud_rate,
 | 
			
		||||
                                                 slot_width=slot_width, roll_off=roll_off,
 | 
			
		||||
                                                 delta_pdb_per_channel=delta_pdb_per_channel, tx_osnr=tx_osnr,
 | 
			
		||||
                                                 ref_power=Pref(p_span0=p_span0, p_spani=p_spani,
 | 
			
		||||
                                                                ref_carrier=ref_carrier),
 | 
			
		||||
                                                 label=label)
 | 
			
		||||
                                                 tx_power=tx_power, label=label)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class Carrier:
 | 
			
		||||
    """One channel in the initial mixed-type spectrum definition, each type being defined by
 | 
			
		||||
    its delta_pdb (power offset with respect to reference power), baud rate, slot_width, roll_off
 | 
			
		||||
    and tx_osnr. delta_pdb offset is applied to target power out of Roadm.
 | 
			
		||||
    tx_power, and tx_osnr. delta_pdb offset is applied to target power out of Roadm.
 | 
			
		||||
    Label is used to group carriers which belong to the same partition when printing results.
 | 
			
		||||
    """
 | 
			
		||||
    delta_pdb: float
 | 
			
		||||
@@ -378,6 +401,7 @@ class Carrier:
 | 
			
		||||
    slot_width: float
 | 
			
		||||
    roll_off: float
 | 
			
		||||
    tx_osnr: float
 | 
			
		||||
    tx_power: float
 | 
			
		||||
    label: str
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -387,7 +411,7 @@ class ReferenceCarrier:
 | 
			
		||||
    constant power spectral density (PSD) equalization is set. Reference channel is the type that has been defined
 | 
			
		||||
    in SI block and used for the initial design of the network.
 | 
			
		||||
    Computing the power out of ROADM for the reference channel is required to correctly compute the loss
 | 
			
		||||
    experienced by p_span_i in Roadm element.
 | 
			
		||||
    experienced by reference channel in Roadm element.
 | 
			
		||||
 | 
			
		||||
    Baud rate is required to find the target power in constant PSD: power = PSD_target * baud_rate.
 | 
			
		||||
    For example, if target PSD is 3.125e4mW/GHz and reference carrier type a 32 GBaud channel then
 | 
			
		||||
@@ -398,7 +422,7 @@ class ReferenceCarrier:
 | 
			
		||||
    For example, if target PSW is 2e4mW/GHz and reference carrier type a 32 GBaud channel in a 50GHz slot width then
 | 
			
		||||
    output power should be -20 dBm and for a 64 GBaud channel  in a 75 GHz slot width, power target would be -18.24 dBm.
 | 
			
		||||
 | 
			
		||||
    Other attributes (like slot_width or roll-off) may be added there for future equalization purpose.
 | 
			
		||||
    Other attributes (like roll-off) may be added there for future equalization purpose.
 | 
			
		||||
    """
 | 
			
		||||
    baud_rate: float
 | 
			
		||||
    slot_width: float
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1521
									
								
								gnpy/core/network.py
									
									
									
									
									
								
							
							
						
						
									
										1521
									
								
								gnpy/core/network.py
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -8,7 +8,8 @@ gnpy.core.parameters
 | 
			
		||||
This module contains all parameters to configure standard network elements.
 | 
			
		||||
"""
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from dataclasses import dataclass
 | 
			
		||||
from scipy.constants import c, pi
 | 
			
		||||
from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full
 | 
			
		||||
 | 
			
		||||
@@ -35,32 +36,54 @@ class PumpParams(Parameters):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RamanParams(Parameters):
 | 
			
		||||
    def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50):
 | 
			
		||||
    def __init__(self, flag=False, method='perturbative', order=2, result_spatial_resolution=10e3,
 | 
			
		||||
                 solver_spatial_resolution=10e3):
 | 
			
		||||
        """Simulation parameters used within the Raman Solver
 | 
			
		||||
 | 
			
		||||
        :params flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position
 | 
			
		||||
        :params method: Raman solver method
 | 
			
		||||
        :params order: solution order for perturbative method
 | 
			
		||||
        :params result_spatial_resolution: spatial resolution of the evaluated Raman power profile
 | 
			
		||||
        :params solver_spatial_resolution: spatial step for the iterative solution of the first order ode
 | 
			
		||||
        """
 | 
			
		||||
        self.flag = flag
 | 
			
		||||
        self.method = method
 | 
			
		||||
        self.order = order
 | 
			
		||||
        self.result_spatial_resolution = result_spatial_resolution  # [m]
 | 
			
		||||
        self.solver_spatial_resolution = solver_spatial_resolution  # [m]
 | 
			
		||||
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return {"flag": self.flag,
 | 
			
		||||
                "method": self.method,
 | 
			
		||||
                "order": self.order,
 | 
			
		||||
                "result_spatial_resolution": self.result_spatial_resolution,
 | 
			
		||||
                "solver_spatial_resolution": self.solver_spatial_resolution}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NLIParams(Parameters):
 | 
			
		||||
    def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1,
 | 
			
		||||
                 computed_channels=None):
 | 
			
		||||
    def __init__(self, method='gn_model_analytic', dispersion_tolerance=4, phase_shift_tolerance=0.1,
 | 
			
		||||
                 computed_channels=None, computed_number_of_channels=None):
 | 
			
		||||
        """Simulation parameters used within the Nli Solver
 | 
			
		||||
 | 
			
		||||
        :params method: formula for NLI calculation
 | 
			
		||||
        :params dispersion_tolerance: tuning parameter for ggn model solution
 | 
			
		||||
        :params phase_shift_tolerance: tuning parameter for ggn model solution
 | 
			
		||||
        :params computed_channels: the NLI is evaluated for these channels and extrapolated for the others
 | 
			
		||||
        :params computed_number_of_channels: the NLI is evaluated for this number of channels equally distributed
 | 
			
		||||
        in the spectrum and extrapolated for the others
 | 
			
		||||
        """
 | 
			
		||||
        self.method = method.lower()
 | 
			
		||||
        self.dispersion_tolerance = dispersion_tolerance
 | 
			
		||||
        self.phase_shift_tolerance = phase_shift_tolerance
 | 
			
		||||
        self.computed_channels = computed_channels
 | 
			
		||||
        self.computed_number_of_channels = computed_number_of_channels
 | 
			
		||||
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return {"method": self.method,
 | 
			
		||||
                "dispersion_tolerance": self.dispersion_tolerance,
 | 
			
		||||
                "phase_shift_tolerance": self.phase_shift_tolerance,
 | 
			
		||||
                "computed_channels": self.computed_channels,
 | 
			
		||||
                "computed_number_of_channels": self.computed_number_of_channels}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SimParams(Parameters):
 | 
			
		||||
@@ -98,8 +121,68 @@ class RoadmParams(Parameters):
 | 
			
		||||
            self.pmd = kwargs['pmd']
 | 
			
		||||
            self.pdl = kwargs['pdl']
 | 
			
		||||
            self.restrictions = kwargs['restrictions']
 | 
			
		||||
            self.roadm_path_impairments = self.get_roadm_path_impairments(kwargs['roadm-path-impairments'])
 | 
			
		||||
        except KeyError as e:
 | 
			
		||||
            raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}')
 | 
			
		||||
        self.per_degree_impairments = kwargs.get('per_degree_impairments', [])
 | 
			
		||||
        self.design_bands = kwargs.get('design_bands', [])
 | 
			
		||||
        self.per_degree_design_bands = kwargs.get('per_degree_design_bands', {})
 | 
			
		||||
 | 
			
		||||
    def get_roadm_path_impairments(self, path_impairments_list):
 | 
			
		||||
        """Get the ROADM list of profiles for impairments definition
 | 
			
		||||
 | 
			
		||||
        transform the ietf model into gnpy internal model: add a path-type in the attributes
 | 
			
		||||
        """
 | 
			
		||||
        if not path_impairments_list:
 | 
			
		||||
            return {}
 | 
			
		||||
        authorized_path_types = {
 | 
			
		||||
            'roadm-express-path': 'express',
 | 
			
		||||
            'roadm-add-path': 'add',
 | 
			
		||||
            'roadm-drop-path': 'drop',
 | 
			
		||||
        }
 | 
			
		||||
        roadm_path_impairments = {}
 | 
			
		||||
        for path_impairment in path_impairments_list:
 | 
			
		||||
            index = path_impairment['roadm-path-impairments-id']
 | 
			
		||||
            path_type = next(key for key in path_impairment if key in authorized_path_types.keys())
 | 
			
		||||
            impairment_dict = {'path-type': authorized_path_types[path_type], 'impairment': path_impairment[path_type]}
 | 
			
		||||
            roadm_path_impairments[index] = RoadmImpairment(impairment_dict)
 | 
			
		||||
        return roadm_path_impairments
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RoadmPath:
 | 
			
		||||
    def __init__(self, from_degree, to_degree, path_type, impairment_id=None, impairment=None):
 | 
			
		||||
        """Records roadm internal paths, types and impairment
 | 
			
		||||
 | 
			
		||||
        path_type must be in "express", "add", "drop"
 | 
			
		||||
        impairment_id must be one of the id detailed in equipement
 | 
			
		||||
        """
 | 
			
		||||
        self.from_degree = from_degree
 | 
			
		||||
        self.to_degree = to_degree
 | 
			
		||||
        self.path_type = path_type
 | 
			
		||||
        self.impairment_id = impairment_id
 | 
			
		||||
        self.impairment = impairment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RoadmImpairment:
 | 
			
		||||
    """Generic definition of impairments for express, add and drop"""
 | 
			
		||||
    default_values = {
 | 
			
		||||
        'roadm-pmd': None,
 | 
			
		||||
        'roadm-cd': None,
 | 
			
		||||
        'roadm-pdl': None,
 | 
			
		||||
        'roadm-inband-crosstalk': None,
 | 
			
		||||
        'roadm-maxloss': 0,
 | 
			
		||||
        'roadm-osnr': None,
 | 
			
		||||
        'roadm-pmax': None,
 | 
			
		||||
        'roadm-noise-figure': None,
 | 
			
		||||
        'minloss': None,
 | 
			
		||||
        'typloss': None,
 | 
			
		||||
        'pmin': None,
 | 
			
		||||
        'ptyp': None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, params):
 | 
			
		||||
        self.path_type = params.get('path-type')
 | 
			
		||||
        self.impairments = params['impairment']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FusedParams(Parameters):
 | 
			
		||||
@@ -108,7 +191,33 @@ class FusedParams(Parameters):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DEFAULT_RAMAN_COEFFICIENT = {
 | 
			
		||||
    # SSMF Raman coefficient profile normalized with respect to the effective area overlap (g0 * A_eff(f_probe, f_pump))
 | 
			
		||||
    # SSMF Raman coefficient profile in terms of mode intensity (g0 * A_ff_overlap)
 | 
			
		||||
    'gamma_raman': array(
 | 
			
		||||
        [0.0, 8.524419934705497e-16, 2.643567866245371e-15, 4.410548410941305e-15, 6.153422961291078e-15,
 | 
			
		||||
         7.484924703044943e-15, 8.452060808349209e-15, 9.101549322698156e-15, 9.57837595158966e-15,
 | 
			
		||||
         1.0008642675474562e-14, 1.0865773569905647e-14, 1.1300776305865833e-14, 1.2143238647099625e-14,
 | 
			
		||||
         1.3231065750676068e-14, 1.4624900971525384e-14, 1.6013330554840492e-14, 1.7458119359310242e-14,
 | 
			
		||||
         1.9320241330434762e-14, 2.1720395392873534e-14, 2.4137337406734775e-14, 2.628163218460466e-14,
 | 
			
		||||
         2.8041019963285974e-14, 2.9723155447089933e-14, 3.129353531005888e-14, 3.251796163324624e-14,
 | 
			
		||||
         3.3198839487612773e-14, 3.329527690685666e-14, 3.313155691238456e-14, 3.289013852154548e-14,
 | 
			
		||||
         3.2458917188506916e-14, 3.060684277937575e-14, 3.2660349473783173e-14, 2.957419109657689e-14,
 | 
			
		||||
         2.518894321396672e-14, 1.734560485857344e-14, 9.902860761605233e-15, 7.219176385099358e-15,
 | 
			
		||||
         6.079565990401311e-15, 5.828373065963427e-15, 7.20580801091692e-15, 7.561924351387493e-15,
 | 
			
		||||
         7.621152352332206e-15, 6.8859886780643254e-15, 5.629181047471162e-15, 3.679727598966185e-15,
 | 
			
		||||
         2.7555869742500355e-15, 2.4810133942597675e-15, 2.2160080532403624e-15, 2.1440626024765557e-15,
 | 
			
		||||
         2.33873070799544e-15, 2.557317929858713e-15, 3.039839048226572e-15, 4.8337165515610065e-15,
 | 
			
		||||
         5.4647431818257436e-15, 5.229187813711269e-15, 4.510768525811313e-15, 3.3213473130607794e-15,
 | 
			
		||||
         2.2602577027996455e-15, 1.969576495866441e-15, 1.5179853954188527e-15, 1.2953988551200156e-15,
 | 
			
		||||
         1.1304672156251838e-15, 9.10004390675213e-16, 8.432919922183503e-16, 7.849224069008326e-16,
 | 
			
		||||
         7.827568196032024e-16, 9.000514440646232e-16, 1.3025926460013665e-15, 1.5444108938497558e-15,
 | 
			
		||||
         1.8795594063060786e-15, 1.7796130169921014e-15, 1.5938159865046653e-15, 1.1585522355108287e-15,
 | 
			
		||||
         8.507044444633358e-16, 7.625404663756823e-16, 8.14510750925789e-16, 9.047944693473188e-16,
 | 
			
		||||
         9.636431901702084e-16, 9.298633899602105e-16, 8.349739503637023e-16, 7.482901278066085e-16,
 | 
			
		||||
         6.240794767134268e-16, 5.00652535687506e-16, 3.553373263685851e-16, 2.0344217706119682e-16,
 | 
			
		||||
         1.4267522642294203e-16, 8.980016576743517e-17, 2.9829068181832594e-17, 1.4861959129014824e-17,
 | 
			
		||||
         7.404482113326137e-18]
 | 
			
		||||
    ),  # m/W
 | 
			
		||||
    # SSMF Raman coefficient profile
 | 
			
		||||
    'g0': array(
 | 
			
		||||
        [0.00000000e+00, 1.12351610e-05, 3.47838074e-05, 5.79356636e-05, 8.06921680e-05, 9.79845709e-05, 1.10454361e-04,
 | 
			
		||||
         1.18735302e-04, 1.24736889e-04, 1.30110053e-04, 1.41001273e-04, 1.46383247e-04, 1.57011792e-04, 1.70765865e-04,
 | 
			
		||||
@@ -123,22 +232,21 @@ DEFAULT_RAMAN_COEFFICIENT = {
 | 
			
		||||
         2.03744008e-05, 1.81939341e-05, 1.31862121e-05, 9.65352116e-06, 8.62698322e-06, 9.18688016e-06, 1.01737784e-05,
 | 
			
		||||
         1.08017817e-05, 1.03903588e-05, 9.30040333e-06, 8.30809173e-06, 6.90650401e-06, 5.52238029e-06, 3.90648708e-06,
 | 
			
		||||
         2.22908227e-06, 1.55796177e-06, 9.77218716e-07, 3.23477236e-07, 1.60602454e-07, 7.97306386e-08]
 | 
			
		||||
    ),  # [m/W]
 | 
			
		||||
    ),  # [1 / (W m)]
 | 
			
		||||
 | 
			
		||||
    # Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
 | 
			
		||||
    'frequency_offset': array([
 | 
			
		||||
        0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5,
 | 
			
		||||
        12.,
 | 
			
		||||
        12.5, 12.75, 13., 13.25, 13.5, 14., 14.5, 14.75, 15., 15.5, 16., 16.5, 17., 17.5, 18., 18.25, 18.5, 18.75, 19.,
 | 
			
		||||
        19.5, 20., 20.5, 21., 21.5, 22., 22.5, 23., 23.5, 24., 24.5, 25., 25.5, 26., 26.5, 27., 27.5, 28., 28.5, 29.,
 | 
			
		||||
        29.5,
 | 
			
		||||
        30., 30.5, 31., 31.5, 32., 32.5, 33., 33.5, 34., 34.5, 35., 35.5, 36., 36.5, 37., 37.5, 38., 38.5, 39., 39.5,
 | 
			
		||||
        40.,
 | 
			
		||||
        40.5, 41., 41.5, 42.]
 | 
			
		||||
    ) * 1e12,  # [Hz]
 | 
			
		||||
        12., 12.5, 12.75, 13., 13.25, 13.5, 14., 14.5, 14.75, 15., 15.5, 16., 16.5, 17., 17.5, 18., 18.25, 18.5, 18.75,
 | 
			
		||||
        19., 19.5, 20., 20.5, 21., 21.5, 22., 22.5, 23., 23.5, 24., 24.5, 25., 25.5, 26., 26.5, 27., 27.5, 28., 28.5,
 | 
			
		||||
        29., 29.5, 30., 30.5, 31., 31.5, 32., 32.5, 33., 33.5, 34., 34.5, 35., 35.5, 36., 36.5, 37., 37.5, 38., 38.5,
 | 
			
		||||
        39., 39.5, 40., 40.5, 41., 41.5, 42.]) * 1e12,  # [Hz]
 | 
			
		||||
 | 
			
		||||
    # Raman profile reference frequency
 | 
			
		||||
    'reference_frequency': 206184634112792  # [Hz] (1454 nm)}
 | 
			
		||||
    'reference_frequency': 206.184634112792e12,  # [Hz] (1454 nm)
 | 
			
		||||
 | 
			
		||||
    # Raman profile reference effective area
 | 
			
		||||
    'reference_effective_area': 75.74659443542413e-12  # [m^2] (@1454 nm)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -179,8 +287,8 @@ class FiberParams(Parameters):
 | 
			
		||||
            # Chromatic Dispersion
 | 
			
		||||
            if 'dispersion_per_frequency' in kwargs:
 | 
			
		||||
                # Frequency-dependent dispersion
 | 
			
		||||
                self._dispersion = asarray(kwargs['dispersion']['value'])  # s/m/m
 | 
			
		||||
                self._f_dispersion_ref = asarray(kwargs['dispersion']['frequency'])  # Hz
 | 
			
		||||
                self._dispersion = asarray(kwargs['dispersion_per_frequency']['value'])  # s/m/m
 | 
			
		||||
                self._f_dispersion_ref = asarray(kwargs['dispersion_per_frequency']['frequency'])  # Hz
 | 
			
		||||
                self._dispersion_slope = None
 | 
			
		||||
            elif 'dispersion' in kwargs:
 | 
			
		||||
                # Single value dispersion
 | 
			
		||||
@@ -211,14 +319,21 @@ class FiberParams(Parameters):
 | 
			
		||||
                pi * self._core_radius ** 2 / self._effective_area)) ** 2
 | 
			
		||||
 | 
			
		||||
            # Raman Gain Coefficient
 | 
			
		||||
            raman_coefficient = kwargs.get('raman_coefficient', DEFAULT_RAMAN_COEFFICIENT)
 | 
			
		||||
            self._g0 = asarray(raman_coefficient['g0'])
 | 
			
		||||
            raman_reference_frequency = raman_coefficient['reference_frequency']
 | 
			
		||||
            frequency_offset = asarray(raman_coefficient['frequency_offset'])
 | 
			
		||||
            stokes_wave = raman_reference_frequency - frequency_offset
 | 
			
		||||
            gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, raman_reference_frequency)
 | 
			
		||||
            normalized_gamma_raman = gamma_raman / raman_reference_frequency  # 1 / m / W / Hz
 | 
			
		||||
            self._raman_reference_frequency = raman_reference_frequency
 | 
			
		||||
            raman_coefficient = kwargs.get('raman_coefficient')
 | 
			
		||||
            if raman_coefficient is None:
 | 
			
		||||
                self._raman_reference_frequency = DEFAULT_RAMAN_COEFFICIENT['reference_frequency']
 | 
			
		||||
                frequency_offset = asarray(DEFAULT_RAMAN_COEFFICIENT['frequency_offset'])
 | 
			
		||||
                gamma_raman = asarray(DEFAULT_RAMAN_COEFFICIENT['gamma_raman'])
 | 
			
		||||
                stokes_wave = self._raman_reference_frequency - frequency_offset
 | 
			
		||||
                normalized_gamma_raman = gamma_raman / self._raman_reference_frequency  # 1 / m / W / Hz
 | 
			
		||||
                self._g0 = gamma_raman / self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
 | 
			
		||||
            else:
 | 
			
		||||
                self._raman_reference_frequency = raman_coefficient['reference_frequency']
 | 
			
		||||
                frequency_offset = asarray(raman_coefficient['frequency_offset'])
 | 
			
		||||
                stokes_wave = self._raman_reference_frequency - frequency_offset
 | 
			
		||||
                self._g0 = asarray(raman_coefficient['g0'])
 | 
			
		||||
                gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
 | 
			
		||||
                normalized_gamma_raman = gamma_raman / self._raman_reference_frequency  # 1 / m / W / Hz
 | 
			
		||||
 | 
			
		||||
            # Raman gain coefficient array of the frequency offset constructed such that positive frequency values
 | 
			
		||||
            # represent a positive power transfer from higher frequency and vice versa
 | 
			
		||||
@@ -355,6 +470,38 @@ class FiberParams(Parameters):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EdfaParams:
 | 
			
		||||
    default_values = {
 | 
			
		||||
        'f_min': None,
 | 
			
		||||
        'f_max': None,
 | 
			
		||||
        'multi_band': None,
 | 
			
		||||
        'bands': None,
 | 
			
		||||
        'type_variety': '',
 | 
			
		||||
        'type_def': '',
 | 
			
		||||
        'gain_flatmax': None,
 | 
			
		||||
        'gain_min': None,
 | 
			
		||||
        'p_max': None,
 | 
			
		||||
        'nf_model': None,
 | 
			
		||||
        'dual_stage_model': None,
 | 
			
		||||
        'preamp_variety': None,
 | 
			
		||||
        'booster_variety': None,
 | 
			
		||||
        'nf_min': None,
 | 
			
		||||
        'nf_max': None,
 | 
			
		||||
        'nf_coef': None,
 | 
			
		||||
        'nf0': None,
 | 
			
		||||
        'nf_fit_coeff': None,
 | 
			
		||||
        'nf_ripple': 0,
 | 
			
		||||
        'dgt': None,
 | 
			
		||||
        'gain_ripple': 0,
 | 
			
		||||
        'tilt_ripple': 0,
 | 
			
		||||
        'f_ripple_ref': None,
 | 
			
		||||
        'out_voa_auto': False,
 | 
			
		||||
        'allowed_for_design': False,
 | 
			
		||||
        'raman': False,
 | 
			
		||||
        'pmd': 0,
 | 
			
		||||
        'pdl': 0,
 | 
			
		||||
        'advance_configurations_from_json': None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **params):
 | 
			
		||||
        try:
 | 
			
		||||
            self.type_variety = params['type_variety']
 | 
			
		||||
@@ -363,9 +510,11 @@ class EdfaParams:
 | 
			
		||||
            # Bandwidth
 | 
			
		||||
            self.f_min = params['f_min']
 | 
			
		||||
            self.f_max = params['f_max']
 | 
			
		||||
            self.bandwidth = self.f_max - self.f_min
 | 
			
		||||
            self.f_cent = (self.f_max + self.f_min) / 2
 | 
			
		||||
            self.bandwidth = self.f_max - self.f_min if self.f_max and self.f_min else None
 | 
			
		||||
            self.f_cent = (self.f_max + self.f_min) / 2 if self.f_max and self.f_min else None
 | 
			
		||||
            self.f_ripple_ref = params['f_ripple_ref']
 | 
			
		||||
            self.bands = [{'f_min': params['f_min'],
 | 
			
		||||
                           'f_max': params['f_max']}]
 | 
			
		||||
 | 
			
		||||
            # Gain
 | 
			
		||||
            self.gain_flatmax = params['gain_flatmax']
 | 
			
		||||
@@ -452,7 +601,7 @@ class EdfaParams:
 | 
			
		||||
 | 
			
		||||
    def update_params(self, kwargs):
 | 
			
		||||
        for k, v in kwargs.items():
 | 
			
		||||
            setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v)
 | 
			
		||||
            setattr(self, k, v)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EdfaOperational:
 | 
			
		||||
@@ -460,7 +609,7 @@ class EdfaOperational:
 | 
			
		||||
        'gain_target': None,
 | 
			
		||||
        'delta_p': None,
 | 
			
		||||
        'out_voa': None,
 | 
			
		||||
        'tilt_target': 0
 | 
			
		||||
        'tilt_target': None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **operational):
 | 
			
		||||
@@ -475,3 +624,62 @@ class EdfaOperational:
 | 
			
		||||
        return (f'{type(self).__name__}('
 | 
			
		||||
                f'gain_target={self.gain_target!r}, '
 | 
			
		||||
                f'tilt_target={self.tilt_target!r})')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MultiBandParams:
 | 
			
		||||
    default_values = {
 | 
			
		||||
        'bands': [],
 | 
			
		||||
        'type_variety': '',
 | 
			
		||||
        'type_def': None,
 | 
			
		||||
        'allowed_for_design': False
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **params):
 | 
			
		||||
        try:
 | 
			
		||||
            self.update_attr(params)
 | 
			
		||||
        except KeyError as e:
 | 
			
		||||
            raise ParametersError(f'Multiband configurations json must include {e}. Configuration: {params}')
 | 
			
		||||
 | 
			
		||||
    def update_attr(self, kwargs):
 | 
			
		||||
        clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
 | 
			
		||||
        for k, v in self.default_values.items():
 | 
			
		||||
            # use deepcopy to avoid sharing same object amongst all instance when v is a list or a dict!
 | 
			
		||||
            if isinstance(v, (list, dict)):
 | 
			
		||||
                setattr(self, k, clean_kwargs.get(k, deepcopy(v)))
 | 
			
		||||
            else:
 | 
			
		||||
                setattr(self, k, clean_kwargs.get(k, v))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TransceiverParams:
 | 
			
		||||
    def __init__(self, **params):
 | 
			
		||||
        self.design_bands = params.get('design_bands', [])
 | 
			
		||||
        self.per_degree_design_bands = params.get('per_degree_design_bands', {})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@dataclass
 | 
			
		||||
class FrequencyBand:
 | 
			
		||||
    """Frequency band
 | 
			
		||||
    """
 | 
			
		||||
    f_min: float
 | 
			
		||||
    f_max: float
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DEFAULT_BANDS_DEFINITION = {
 | 
			
		||||
    "LBAND": FrequencyBand(f_min=187e12, f_max=189e12),
 | 
			
		||||
    "CBAND": FrequencyBand(f_min=191.3e12, f_max=196.0e12)
 | 
			
		||||
}
 | 
			
		||||
# use this definition to index amplifiers'element of a multiband amplifier.
 | 
			
		||||
# this is not the design band
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_band_name(band: FrequencyBand) -> str:
 | 
			
		||||
    """return the default band name (CBAND, LBAND, ...) that corresponds to the band frequency range
 | 
			
		||||
    Use the band center frequency: if center frequency is inside the band then returns CBAND.
 | 
			
		||||
    This is to flexibly encompass all kind of bands definitions.
 | 
			
		||||
    returns the first matching band name.
 | 
			
		||||
    """
 | 
			
		||||
    for band_name, frequency_range in DEFAULT_BANDS_DEFINITION.items():
 | 
			
		||||
        center_frequency = (band.f_min + band.f_max) / 2
 | 
			
		||||
        if center_frequency >= frequency_range.f_min and center_frequency <= frequency_range.f_max:
 | 
			
		||||
            return band_name
 | 
			
		||||
    return 'unknown_band'
 | 
			
		||||
 
 | 
			
		||||
@@ -12,14 +12,14 @@ The solvers take as input instances of the spectral information, the fiber and t
 | 
			
		||||
 | 
			
		||||
from numpy import interp, pi, zeros, cos, array, append, ones, exp, arange, sqrt, trapz, arcsinh, clip, abs, sum, \
 | 
			
		||||
    concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, sort, unique, argsort, cumprod, \
 | 
			
		||||
    polyfit
 | 
			
		||||
    polyfit, log, reshape, swapaxes, full, nan, cumsum
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
from scipy.constants import k, h
 | 
			
		||||
from scipy.interpolate import interp1d
 | 
			
		||||
from math import isclose
 | 
			
		||||
from math import isclose, factorial
 | 
			
		||||
 | 
			
		||||
from gnpy.core.utils import db2lin, lin2db
 | 
			
		||||
from gnpy.core.exceptions import EquipmentConfigError
 | 
			
		||||
from gnpy.core.exceptions import EquipmentConfigError, ParametersError
 | 
			
		||||
from gnpy.core.parameters import SimParams
 | 
			
		||||
from gnpy.core.info import SpectralInformation
 | 
			
		||||
 | 
			
		||||
@@ -136,15 +136,17 @@ class RamanSolver:
 | 
			
		||||
                    co_cr = fiber.cr(co_frequency)
 | 
			
		||||
                    co_alpha = fiber.alpha(co_frequency)
 | 
			
		||||
                    co_power_profile = \
 | 
			
		||||
                        RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z, lumped_losses)
 | 
			
		||||
                        RamanSolver.calculate_unidirectional_stimulated_raman_scattering(co_power, co_alpha, co_cr, z,
 | 
			
		||||
                                                                                         lumped_losses)
 | 
			
		||||
                # Counter-propagating profile initialization
 | 
			
		||||
                cnt_power_profile = zeros([cnt_frequency.size, z.size])
 | 
			
		||||
                if cnt_frequency.size:
 | 
			
		||||
                    cnt_cr = fiber.cr(cnt_frequency)
 | 
			
		||||
                    cnt_alpha = fiber.alpha(cnt_frequency)
 | 
			
		||||
                    cnt_power_profile = \
 | 
			
		||||
                        flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr,
 | 
			
		||||
                                                                         z[-1] - flip(z), flip(lumped_losses)), axis=1)
 | 
			
		||||
                    cnt_power_profile = flip(
 | 
			
		||||
                        RamanSolver.calculate_unidirectional_stimulated_raman_scattering(cnt_power, cnt_alpha, cnt_cr,
 | 
			
		||||
                                                                                         z[-1] - flip(z),
 | 
			
		||||
                                                                                         flip(lumped_losses)), axis=1)
 | 
			
		||||
                # Co-propagating and Counter-propagating Profile Computation
 | 
			
		||||
                if co_frequency.size and cnt_frequency.size:
 | 
			
		||||
                    co_power_profile, cnt_power_profile = \
 | 
			
		||||
@@ -163,8 +165,9 @@ class RamanSolver:
 | 
			
		||||
                alpha = fiber.alpha(spectral_info.frequency)
 | 
			
		||||
                cr = fiber.cr(spectral_info.frequency)
 | 
			
		||||
                # Power profile
 | 
			
		||||
                power_profile = \
 | 
			
		||||
                    RamanSolver.first_order_derivative_solution(spectral_info.signal, alpha, cr, z, lumped_losses)
 | 
			
		||||
                power_profile = (
 | 
			
		||||
                    RamanSolver.calculate_unidirectional_stimulated_raman_scattering(spectral_info.signal, alpha, cr, z,
 | 
			
		||||
                                                                                     lumped_losses))
 | 
			
		||||
                # Loss profile
 | 
			
		||||
                loss_profile = power_profile / outer(spectral_info.signal, ones(z.size))
 | 
			
		||||
                frequency = spectral_info.frequency
 | 
			
		||||
@@ -200,8 +203,8 @@ class RamanSolver:
 | 
			
		||||
        return ase
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def first_order_derivative_solution(power_in, alpha, cr, z, lumped_losses):
 | 
			
		||||
        """Solves the Raman first order derivative equation
 | 
			
		||||
    def calculate_unidirectional_stimulated_raman_scattering(power_in, alpha, cr, z, lumped_losses):
 | 
			
		||||
        """Solves the Raman equation
 | 
			
		||||
 | 
			
		||||
        :param power_in: launch power array
 | 
			
		||||
        :param alpha: loss coefficient array
 | 
			
		||||
@@ -210,18 +213,66 @@ class RamanSolver:
 | 
			
		||||
        :param lumped_losses: concentrated losses array along the fiber span
 | 
			
		||||
        :return: power profile matrix
 | 
			
		||||
        """
 | 
			
		||||
        dz = z[1:] - z[:-1]
 | 
			
		||||
        power = outer(power_in, ones(z.size))
 | 
			
		||||
        for i in range(1, z.size):
 | 
			
		||||
            power[:, i] = \
 | 
			
		||||
                power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) * lumped_losses[i - 1]
 | 
			
		||||
        if sim_params.raman_params.method == 'perturbative':
 | 
			
		||||
            if sim_params.raman_params.order > 4:
 | 
			
		||||
                raise ValueError(f'Order {sim_params.raman_params.order} not implemented in Raman Solver.')
 | 
			
		||||
            z_lumped_losses = append(z[lumped_losses != 1], z[-1])
 | 
			
		||||
            llumped_losses = append(1, lumped_losses[lumped_losses != 1])
 | 
			
		||||
            power = outer(power_in, ones(z.size))
 | 
			
		||||
            last_position = 0
 | 
			
		||||
            z_indices = arange(0, z.size)
 | 
			
		||||
 | 
			
		||||
            for z_lumped_loss, lumped_loss in zip(z_lumped_losses, llumped_losses):
 | 
			
		||||
                if last_position < z[-1]:
 | 
			
		||||
                    interval = z_indices[(z >= last_position) * (z <= z_lumped_loss) == 1]
 | 
			
		||||
                    z_interval = z[interval] - last_position
 | 
			
		||||
                    dz = z_interval[1:] - z_interval[:-1]
 | 
			
		||||
                    last_position = z[interval][-1]
 | 
			
		||||
                    p0 = power_in * lumped_loss
 | 
			
		||||
                    power_interval = outer(p0, ones(z_interval.size))
 | 
			
		||||
                    alphaz = outer(alpha, z_interval)
 | 
			
		||||
                    expz = exp(- alphaz)
 | 
			
		||||
                    eff_length = 1 / outer(alpha, ones(z_interval.size)) * (1 - expz)
 | 
			
		||||
                    crpz = transpose(ones([z_interval.size, cr.shape[0], cr.shape[1]]) * cr * p0, (1, 2, 0))
 | 
			
		||||
                    exponent = - alphaz
 | 
			
		||||
                    if sim_params.raman_params.order >= 1:
 | 
			
		||||
                        gamma1 = sum(crpz * eff_length, 1)
 | 
			
		||||
                        exponent += gamma1
 | 
			
		||||
                    if sim_params.raman_params.order >= 2:
 | 
			
		||||
                        z_integrand = expz * gamma1
 | 
			
		||||
                        z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
 | 
			
		||||
                        gamma2 = zeros(gamma1.shape)
 | 
			
		||||
                        gamma2[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
 | 
			
		||||
                        exponent += gamma2
 | 
			
		||||
                    if sim_params.raman_params.order >= 3:
 | 
			
		||||
                        z_integrand = expz * (gamma2 + 1/2 * gamma1**2)
 | 
			
		||||
                        z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
 | 
			
		||||
                        gamma3 = zeros(gamma1.shape)
 | 
			
		||||
                        gamma3[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
 | 
			
		||||
                        exponent += gamma3
 | 
			
		||||
                    if sim_params.raman_params.order >= 4:
 | 
			
		||||
                        z_integrand = expz * (gamma3 + gamma1 * gamma2 + 1/factorial(3) * gamma1**3)
 | 
			
		||||
                        z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
 | 
			
		||||
                        gamma4 = zeros(gamma1.shape)
 | 
			
		||||
                        gamma4[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
 | 
			
		||||
                        exponent += gamma4
 | 
			
		||||
                    power_interval *= exp(exponent)
 | 
			
		||||
                    power[:, interval[1:]] = power_interval[:, 1:]
 | 
			
		||||
                    power_in = power_interval[:, -1]
 | 
			
		||||
        elif sim_params.raman_params.method == 'numerical':
 | 
			
		||||
            dz = z[1:] - z[:-1]
 | 
			
		||||
            power = outer(power_in, ones(z.size))
 | 
			
		||||
            for i in range(1, z.size):
 | 
			
		||||
                power[:, i] = (power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) *
 | 
			
		||||
                               lumped_losses[i - 1])
 | 
			
		||||
        else:
 | 
			
		||||
            raise ValueError(f'Method {sim_params.raman_params.method} not implemented in Raman Solver.')
 | 
			
		||||
        return power
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def iterative_algorithm(co_initial_guess_power, cnt_initial_guess_power, co_frequency, cnt_frequency, z, fiber,
 | 
			
		||||
                            lumped_losses):
 | 
			
		||||
        """Solves the Raman first order derivative equation in case of both co- and counter-propagating
 | 
			
		||||
        frequencies
 | 
			
		||||
        """Solves the Raman equation in case of both co- and counter-propagating frequencies
 | 
			
		||||
 | 
			
		||||
        :param co_initial_guess_power: co-propagationg Raman first order derivative equation solution
 | 
			
		||||
        :param cnt_initial_guess_power: counter-propagationg Raman first order derivative equation solution
 | 
			
		||||
@@ -276,6 +327,7 @@ class NliSolver:
 | 
			
		||||
    List of implemented methods:
 | 
			
		||||
    'gn_model_analytic': eq. 120 from arXiv:1209.0394
 | 
			
		||||
    'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225
 | 
			
		||||
    'ggn_approx': eq. 24-25 jlt:9741324
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    SPM_WEIGHT = (16.0 / 27.0)
 | 
			
		||||
@@ -305,6 +357,10 @@ class NliSolver:
 | 
			
		||||
        elif 'ggn_spectrally_separated' in sim_params.nli_params.method:
 | 
			
		||||
            if sim_params.nli_params.computed_channels is not None:
 | 
			
		||||
                cut_indices = array(sim_params.nli_params.computed_channels) - 1
 | 
			
		||||
            elif sim_params.nli_params.computed_number_of_channels is not None:
 | 
			
		||||
                nb_ch_computed = sim_params.nli_params.computed_number_of_channels
 | 
			
		||||
                nb_ch = len(spectral_info.channel_number)
 | 
			
		||||
                cut_indices = array([round(i * (nb_ch - 1) / (nb_ch_computed - 1)) for i in range(0, nb_ch_computed)])
 | 
			
		||||
            else:
 | 
			
		||||
                cut_indices = array(spectral_info.channel_number) - 1
 | 
			
		||||
 | 
			
		||||
@@ -320,6 +376,28 @@ class NliSolver:
 | 
			
		||||
            g_nli = sum(g_nli, 1)
 | 
			
		||||
            g_nli = interp(spectral_info.frequency, cut_frequency, g_nli)
 | 
			
		||||
            nli = spectral_info.baud_rate * g_nli  # Local white noise
 | 
			
		||||
        elif 'ggn_approx' in sim_params.nli_params.method:
 | 
			
		||||
            if sim_params.nli_params.computed_channels is not None:
 | 
			
		||||
                cut_indices = array(sim_params.nli_params.computed_channels) - 1
 | 
			
		||||
            elif sim_params.nli_params.computed_number_of_channels is not None:
 | 
			
		||||
                nb_ch_computed = sim_params.nli_params.computed_number_of_channels
 | 
			
		||||
                nb_ch = len(spectral_info.channel_number)
 | 
			
		||||
                cut_indices = array([round(i * (nb_ch - 1) / (nb_ch_computed - 1)) for i in range(0, nb_ch_computed)])
 | 
			
		||||
            else:
 | 
			
		||||
                cut_indices = array(spectral_info.channel_number) - 1
 | 
			
		||||
 | 
			
		||||
            eta = NliSolver._ggn_approx(cut_indices, spectral_info, fiber, srs)
 | 
			
		||||
 | 
			
		||||
            # Interpolation over the channels not indicated as computed channels in simulation parameters
 | 
			
		||||
            cut_power = outer(spectral_info.signal[cut_indices], ones(spectral_info.number_of_channels))
 | 
			
		||||
            cut_frequency = spectral_info.frequency[cut_indices]
 | 
			
		||||
            pump_power = outer(ones(cut_indices.size), spectral_info.signal)
 | 
			
		||||
            cut_baud_rate = outer(spectral_info.baud_rate[cut_indices], ones(spectral_info.number_of_channels))
 | 
			
		||||
 | 
			
		||||
            g_nli = eta * cut_power * pump_power ** 2 / cut_baud_rate
 | 
			
		||||
            g_nli = sum(g_nli, 1)
 | 
			
		||||
            g_nli = interp(spectral_info.frequency, cut_frequency, g_nli)
 | 
			
		||||
            nli = spectral_info.baud_rate * g_nli  # Local white noise
 | 
			
		||||
        else:
 | 
			
		||||
            raise ValueError(f'Method {sim_params.nli_params.method} not implemented.')
 | 
			
		||||
 | 
			
		||||
@@ -522,6 +600,89 @@ class NliSolver:
 | 
			
		||||
        freq_offset_th = ((k_ref * delta_f_ref) * rs_ref * beta2_ref) / (beta2 * symbol_rate)
 | 
			
		||||
        return freq_offset_th
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def _ggn_approx(cut_indices, spectral_info: SpectralInformation, fiber, srs, spm_weight=SPM_WEIGHT,
 | 
			
		||||
                    xpm_weight=XPM_WEIGHT):
 | 
			
		||||
        """Computes the nonlinear interference power evaluated at the fiber input.
 | 
			
		||||
        The method uses eq. 24-25 of https://ieeexplore.ieee.org/document/9741324
 | 
			
		||||
        """
 | 
			
		||||
        # Spectral Features
 | 
			
		||||
        nch = spectral_info.number_of_channels
 | 
			
		||||
        frequency = spectral_info.frequency
 | 
			
		||||
        baud_rate = spectral_info.baud_rate
 | 
			
		||||
        slot_width = spectral_info.slot_width
 | 
			
		||||
        roll_off = spectral_info.roll_off
 | 
			
		||||
        df = spectral_info.df + diag(full(nch, nan))
 | 
			
		||||
 | 
			
		||||
        # Physical fiber parameters
 | 
			
		||||
        alpha = fiber.alpha(frequency)
 | 
			
		||||
        beta2 = fiber.beta2(frequency)
 | 
			
		||||
        gamma = outer(fiber.gamma(frequency[cut_indices]), ones(nch))
 | 
			
		||||
 | 
			
		||||
        identity = diag(ones(nch))
 | 
			
		||||
        weight = spm_weight * identity + xpm_weight * (ones([nch, nch]) - identity)
 | 
			
		||||
        weight = weight[cut_indices, :]
 | 
			
		||||
 | 
			
		||||
        dispersion_tolerance = sim_params.nli_params.dispersion_tolerance
 | 
			
		||||
        phase_shift_tolerance = sim_params.nli_params.phase_shift_tolerance
 | 
			
		||||
        max_slot_width = max(slot_width)
 | 
			
		||||
        max_beta2 = max(abs(beta2))
 | 
			
		||||
        delta_z = sim_params.raman_params.result_spatial_resolution
 | 
			
		||||
 | 
			
		||||
        # Approximation psi
 | 
			
		||||
        loss_profile = srs.loss_profile[:nch]
 | 
			
		||||
        z = srs.z
 | 
			
		||||
        psi = NliSolver._approx_psi(df=df, frequency=frequency, beta2=beta2, baud_rate=baud_rate,
 | 
			
		||||
                                    loss_profile=loss_profile, z=z)
 | 
			
		||||
 | 
			
		||||
        # GGN for SPM
 | 
			
		||||
        for cut_index in cut_indices:
 | 
			
		||||
            dn = 0
 | 
			
		||||
            cut_frequency = frequency[cut_index]
 | 
			
		||||
            cut_baud_rate = baud_rate[cut_index]
 | 
			
		||||
            cut_roll_off = roll_off[cut_index]
 | 
			
		||||
            cut_beta2 = beta2[cut_index]
 | 
			
		||||
            cut_alpha = alpha[cut_index]
 | 
			
		||||
            k_tol = dispersion_tolerance * abs(cut_alpha)
 | 
			
		||||
            phi_tol = phase_shift_tolerance / delta_z
 | 
			
		||||
            f_cut_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * (1 + dn) * max_slot_width)
 | 
			
		||||
            f_pump_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * max_slot_width)
 | 
			
		||||
            psi[cut_index, cut_index] = NliSolver._generalized_psi(cut_frequency, cut_frequency, cut_baud_rate,
 | 
			
		||||
                                                                   cut_roll_off, cut_frequency, cut_baud_rate,
 | 
			
		||||
                                                                   cut_roll_off, f_cut_resolution, f_pump_resolution,
 | 
			
		||||
                                                                   srs, cut_alpha, cut_beta2, 0, cut_frequency)
 | 
			
		||||
        psi = psi[cut_indices, :]
 | 
			
		||||
        cut_baud_rate = outer(baud_rate[cut_indices], ones(nch))
 | 
			
		||||
        pump_baud_rate = outer(ones(cut_indices.size), baud_rate)
 | 
			
		||||
 | 
			
		||||
        eta_cut_central_frequency = \
 | 
			
		||||
            gamma ** 2 * weight * psi / (cut_baud_rate * pump_baud_rate ** 2)
 | 
			
		||||
        eta = cut_baud_rate * eta_cut_central_frequency  # Local white noise
 | 
			
		||||
 | 
			
		||||
        return eta
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def _approx_psi(df, frequency, baud_rate, beta2, loss_profile, z):
 | 
			
		||||
        """Computes the approximated psi function similarly to the one used in the GN model.
 | 
			
		||||
        The method uses eq. 25 of https://ieeexplore.ieee.org/document/9741324"""
 | 
			
		||||
        pump_baud_rate = outer(ones(frequency.size), baud_rate)
 | 
			
		||||
        cut_beta = outer(beta2, ones(frequency.size))
 | 
			
		||||
        pump_beta = outer(ones(frequency.size), beta2)
 | 
			
		||||
        delta_z = abs(z[:-1] - z[1:])
 | 
			
		||||
 | 
			
		||||
        loss_lin = log(loss_profile)
 | 
			
		||||
        pump_alpha = (loss_lin[:, 1:] - loss_lin[:, :-1]) / delta_z
 | 
			
		||||
        leff = abs((loss_profile[:, 1:] - loss_profile[:, :-1]) / sqrt(abs(pump_alpha))) * pump_alpha / abs(pump_alpha)
 | 
			
		||||
        leff = reshape(outer(leff, ones(z.size - 1)), newshape=[leff.shape[0], leff.shape[1], leff.shape[1]])
 | 
			
		||||
        leff2 = leff * swapaxes(leff, 2, 1)
 | 
			
		||||
        leff2 = sum(leff2, axis=(1, 2))
 | 
			
		||||
        z_int = outer(ones(frequency.size), leff2)
 | 
			
		||||
 | 
			
		||||
        delta_beta = (cut_beta + pump_beta) / 2
 | 
			
		||||
        psi = z_int * pump_baud_rate / (4 * pi * abs(delta_beta * df))
 | 
			
		||||
        return psi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def estimate_nf_model(type_variety, gain_min, gain_max, nf_min, nf_max):
 | 
			
		||||
    if nf_min < -10:
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,10 @@ This module contains utility functions that are used with gnpy.
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from csv import writer
 | 
			
		||||
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean
 | 
			
		||||
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean, array
 | 
			
		||||
from scipy import constants
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from typing import List
 | 
			
		||||
 | 
			
		||||
from gnpy.core.exceptions import ConfigurationError
 | 
			
		||||
 | 
			
		||||
@@ -213,17 +214,6 @@ wavelength2freq = constants.lambda2nu
 | 
			
		||||
freq2wavelength = constants.nu2lambda
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def freq2wavelength(value):
 | 
			
		||||
    """Converts frequency units to wavelength units.
 | 
			
		||||
 | 
			
		||||
    >>> round(freq2wavelength(191.35e12) * 1e9, 3)
 | 
			
		||||
    1566.723
 | 
			
		||||
    >>> round(freq2wavelength(196.1e12) * 1e9, 3)
 | 
			
		||||
    1528.773
 | 
			
		||||
    """
 | 
			
		||||
    return constants.c / value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def snr_sum(snr, bw, snr_added, bw_added=12.5e9):
 | 
			
		||||
    snr_added = snr_added - lin2db(bw / bw_added)
 | 
			
		||||
    snr = -lin2db(db2lin(-snr) + db2lin(-snr_added))
 | 
			
		||||
@@ -452,3 +442,86 @@ def restore_order(elements, order):
 | 
			
		||||
    [3, 2, 7]
 | 
			
		||||
    """
 | 
			
		||||
    return [elements[i[0]] for i in sorted(enumerate(order), key=lambda x:x[1]) if elements[i[0]] is not None]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def calculate_absolute_min_or_zero(x: array) -> array:
 | 
			
		||||
    """Calculates the element-wise absolute minimum between the x and zero.
 | 
			
		||||
 | 
			
		||||
    Parameters:
 | 
			
		||||
    x (array): The first input array.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
    array: The element-wise absolute minimum between x and zero.
 | 
			
		||||
 | 
			
		||||
    Example:
 | 
			
		||||
    >>> x = array([-1, 2, -3])
 | 
			
		||||
    >>> calculate_absolute_min_or_zero(x)
 | 
			
		||||
    array([1., 0., 3.])
 | 
			
		||||
    """
 | 
			
		||||
    return (abs(x) - x) / 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def nice_column_str(data: List[List[str]], max_length: int = 30, padding: int = 1) -> str:
 | 
			
		||||
    """data is a list of rows, creates strings with nice alignment per colum and padding with spaces
 | 
			
		||||
    letf justified
 | 
			
		||||
 | 
			
		||||
    >>> table_data = [['aaa', 'b', 'c'], ['aaaaaaaa', 'bbb', 'c'], ['a', 'bbbbbbbbbb', 'c']]
 | 
			
		||||
    >>> print(nice_column_str(table_data))
 | 
			
		||||
    aaa      b          c 
 | 
			
		||||
    aaaaaaaa bbb        c 
 | 
			
		||||
    a        bbbbbbbbbb c 
 | 
			
		||||
    """
 | 
			
		||||
    # transpose data to determine size of columns
 | 
			
		||||
    transposed_data = list(map(list, zip(*data)))
 | 
			
		||||
    column_width = [max(len(word) for word in column) + padding for column in transposed_data]
 | 
			
		||||
    nice_str = []
 | 
			
		||||
    for row in data:
 | 
			
		||||
        column = ''.join(word[0:max_length].ljust(min(width, max_length)) for width, word in zip(column_width, row))
 | 
			
		||||
        nice_str.append(f'{column}')
 | 
			
		||||
    return '\n'.join(nice_str)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_common_range(amp_bands: List[List[dict]], default_band_f_min: float, default_band_f_max: float) \
 | 
			
		||||
        -> List[dict]:
 | 
			
		||||
    """Find the common frequency range of bands
 | 
			
		||||
    If there are no amplifiers in the path, then use default band
 | 
			
		||||
 | 
			
		||||
    >>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \
 | 
			
		||||
        [{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \
 | 
			
		||||
        [{'f_min': 186e12, 'f_max': 193e12}]]
 | 
			
		||||
    >>> find_common_range(amp_bands, 190e12, 195e12)
 | 
			
		||||
    [{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}, {'f_min': 192000000000000.0, 'f_max': 193000000000000.0}]
 | 
			
		||||
    >>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \
 | 
			
		||||
        [{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \
 | 
			
		||||
        [{'f_min': 186e12, 'f_max': 192e12}]]
 | 
			
		||||
    >>> find_common_range(amp_bands, 190e12, 195e12)
 | 
			
		||||
    [{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}]
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    _amp_bands = [sorted(amp, key=lambda x: x['f_min']) for amp in amp_bands]
 | 
			
		||||
    _temp = []
 | 
			
		||||
    # remove None bands
 | 
			
		||||
    for amp in _amp_bands:
 | 
			
		||||
        is_band = True
 | 
			
		||||
        for band in amp:
 | 
			
		||||
            if not (is_band and band['f_min'] and band['f_max']):
 | 
			
		||||
                is_band = False
 | 
			
		||||
        if is_band:
 | 
			
		||||
            _temp.append(amp)
 | 
			
		||||
 | 
			
		||||
    # remove duplicate
 | 
			
		||||
    unique_amp_bands = []
 | 
			
		||||
    for amp in _temp:
 | 
			
		||||
        if amp not in unique_amp_bands:
 | 
			
		||||
            unique_amp_bands.append(amp)
 | 
			
		||||
    if unique_amp_bands:
 | 
			
		||||
        common_range = unique_amp_bands[0]
 | 
			
		||||
    else:
 | 
			
		||||
        if default_band_f_min is None or default_band_f_max is None:
 | 
			
		||||
            return []
 | 
			
		||||
        common_range = [{'f_min': default_band_f_min, 'f_max': default_band_f_max}]
 | 
			
		||||
    for bands in unique_amp_bands:
 | 
			
		||||
        common_range = [{'f_min': max(first['f_min'], second['f_min']), 'f_max': min(first['f_max'], second['f_max'])}
 | 
			
		||||
                        for first in common_range for second in bands
 | 
			
		||||
                        if max(first['f_min'], second['f_min']) < min(first['f_max'], second['f_max'])]
 | 
			
		||||
    return sorted(common_range, key=lambda x: x['f_min'])
 | 
			
		||||
 
 | 
			
		||||
@@ -1,160 +1,160 @@
 | 
			
		||||
{
 | 
			
		||||
    "nf_fit_coeff": [
 | 
			
		||||
        0.0008,
 | 
			
		||||
        0.0272,
 | 
			
		||||
        -0.2249,
 | 
			
		||||
        6.4902
 | 
			
		||||
    ],
 | 
			
		||||
    "f_min": 191.4e12,
 | 
			
		||||
    "f_max": 196.1e12,
 | 
			
		||||
    "nf_ripple": [
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0
 | 
			
		||||
    ],
 | 
			
		||||
    "gain_ripple": [
 | 
			
		||||
        -0.15656302345061,
 | 
			
		||||
        -0.22244242043552,
 | 
			
		||||
        -0.25188965661642,
 | 
			
		||||
        -0.23575900335007,
 | 
			
		||||
        -0.20897508375209,
 | 
			
		||||
        -0.19440221943049,
 | 
			
		||||
        -0.18324644053602,
 | 
			
		||||
        -0.18053287269681,
 | 
			
		||||
        -0.17113588777219,
 | 
			
		||||
        -0.15460322445561,
 | 
			
		||||
        -0.13550774706866,
 | 
			
		||||
        -0.10606051088777,
 | 
			
		||||
        -0.0765630234506,
 | 
			
		||||
        -0.04962835008375,
 | 
			
		||||
        -0.01319618927973,
 | 
			
		||||
        0.01027114740367,
 | 
			
		||||
        0.03378873534338,
 | 
			
		||||
        0.04961788107202,
 | 
			
		||||
        0.04494451423784,
 | 
			
		||||
        0.0399193886097,
 | 
			
		||||
        0.01584903685091,
 | 
			
		||||
        -0.00420121440538,
 | 
			
		||||
        -0.01847257118928,
 | 
			
		||||
        -0.02475397822447,
 | 
			
		||||
        -0.01053287269681,
 | 
			
		||||
        0.01509526800668,
 | 
			
		||||
        0.05921587102177,
 | 
			
		||||
        0.1191656197655,
 | 
			
		||||
        0.18147717755444,
 | 
			
		||||
        0.23579878559464,
 | 
			
		||||
        0.26941687604691,
 | 
			
		||||
        0.27836159966498,
 | 
			
		||||
        0.26956762981574,
 | 
			
		||||
        0.23826109715241,
 | 
			
		||||
        0.18936662479061,
 | 
			
		||||
        0.1204721524288,
 | 
			
		||||
        0.0453465242881,
 | 
			
		||||
        -0.00877407872698,
 | 
			
		||||
        -0.02199015912898,
 | 
			
		||||
        0.00107516750419,
 | 
			
		||||
        0.02795958961474,
 | 
			
		||||
        0.02740682579566,
 | 
			
		||||
        -0.01028161641541,
 | 
			
		||||
        -0.05982935510889,
 | 
			
		||||
        -0.06701528475711,
 | 
			
		||||
        0.00223094639866,
 | 
			
		||||
        0.14157768006701,
 | 
			
		||||
        0.15017064489112
 | 
			
		||||
    ],
 | 
			
		||||
    "dgt": [
 | 
			
		||||
        1.0,
 | 
			
		||||
        1.03941448941778,
 | 
			
		||||
        1.07773189112355,
 | 
			
		||||
        1.11575888725852,
 | 
			
		||||
        1.15209185089701,
 | 
			
		||||
        1.18632744096844,
 | 
			
		||||
        1.21911100318577,
 | 
			
		||||
        1.24931318255134,
 | 
			
		||||
        1.27657903892303,
 | 
			
		||||
        1.30069883494415,
 | 
			
		||||
        1.32210817897091,
 | 
			
		||||
        1.3405812000038,
 | 
			
		||||
        1.35690844654118,
 | 
			
		||||
        1.3710092503689,
 | 
			
		||||
        1.38430337205545,
 | 
			
		||||
        1.3966294751726,
 | 
			
		||||
        1.40864903907609,
 | 
			
		||||
        1.42089447397912,
 | 
			
		||||
        1.43476940680732,
 | 
			
		||||
        1.44977369463316,
 | 
			
		||||
        1.46637521309853,
 | 
			
		||||
        1.48420288841848,
 | 
			
		||||
        1.50335352244996,
 | 
			
		||||
        1.5242627235492,
 | 
			
		||||
        1.54578500307573,
 | 
			
		||||
        1.56750088631614,
 | 
			
		||||
        1.58973304612691,
 | 
			
		||||
        1.61073904908309,
 | 
			
		||||
        1.63068023161292,
 | 
			
		||||
        1.64799163036252,
 | 
			
		||||
        1.66286684904577,
 | 
			
		||||
        1.6761448370895,
 | 
			
		||||
        1.68845480656382,
 | 
			
		||||
        1.70379790088896,
 | 
			
		||||
        1.72461030013125,
 | 
			
		||||
        1.75428006928365,
 | 
			
		||||
        1.79748596476494,
 | 
			
		||||
        1.85543800978691,
 | 
			
		||||
        1.92915262384742,
 | 
			
		||||
        2.01414465424155,
 | 
			
		||||
        2.10336369905543,
 | 
			
		||||
        2.19013043016015,
 | 
			
		||||
        2.26678136721453,
 | 
			
		||||
        2.33147727493671,
 | 
			
		||||
        2.38192717604575,
 | 
			
		||||
        2.41879254989742,
 | 
			
		||||
        2.44342862248888,
 | 
			
		||||
        2.4553191172498
 | 
			
		||||
    ]
 | 
			
		||||
  "nf_fit_coeff": [
 | 
			
		||||
    0.0008,
 | 
			
		||||
    0.0272,
 | 
			
		||||
    -0.2249,
 | 
			
		||||
    6.4902
 | 
			
		||||
  ],
 | 
			
		||||
  "f_min": 191.4e12,
 | 
			
		||||
  "f_max": 196.1e12,
 | 
			
		||||
  "nf_ripple": [
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0,
 | 
			
		||||
    0.0
 | 
			
		||||
  ],
 | 
			
		||||
  "gain_ripple": [
 | 
			
		||||
    -0.15656302345061,
 | 
			
		||||
    -0.22244242043552,
 | 
			
		||||
    -0.25188965661642,
 | 
			
		||||
    -0.23575900335007,
 | 
			
		||||
    -0.20897508375209,
 | 
			
		||||
    -0.19440221943049,
 | 
			
		||||
    -0.18324644053602,
 | 
			
		||||
    -0.18053287269681,
 | 
			
		||||
    -0.17113588777219,
 | 
			
		||||
    -0.15460322445561,
 | 
			
		||||
    -0.13550774706866,
 | 
			
		||||
    -0.10606051088777,
 | 
			
		||||
    -0.0765630234506,
 | 
			
		||||
    -0.04962835008375,
 | 
			
		||||
    -0.01319618927973,
 | 
			
		||||
    0.01027114740367,
 | 
			
		||||
    0.03378873534338,
 | 
			
		||||
    0.04961788107202,
 | 
			
		||||
    0.04494451423784,
 | 
			
		||||
    0.0399193886097,
 | 
			
		||||
    0.01584903685091,
 | 
			
		||||
    -0.00420121440538,
 | 
			
		||||
    -0.01847257118928,
 | 
			
		||||
    -0.02475397822447,
 | 
			
		||||
    -0.01053287269681,
 | 
			
		||||
    0.01509526800668,
 | 
			
		||||
    0.05921587102177,
 | 
			
		||||
    0.1191656197655,
 | 
			
		||||
    0.18147717755444,
 | 
			
		||||
    0.23579878559464,
 | 
			
		||||
    0.26941687604691,
 | 
			
		||||
    0.27836159966498,
 | 
			
		||||
    0.26956762981574,
 | 
			
		||||
    0.23826109715241,
 | 
			
		||||
    0.18936662479061,
 | 
			
		||||
    0.1204721524288,
 | 
			
		||||
    0.0453465242881,
 | 
			
		||||
    -0.00877407872698,
 | 
			
		||||
    -0.02199015912898,
 | 
			
		||||
    0.00107516750419,
 | 
			
		||||
    0.02795958961474,
 | 
			
		||||
    0.02740682579566,
 | 
			
		||||
    -0.01028161641541,
 | 
			
		||||
    -0.05982935510889,
 | 
			
		||||
    -0.06701528475711,
 | 
			
		||||
    0.00223094639866,
 | 
			
		||||
    0.14157768006701,
 | 
			
		||||
    0.15017064489112
 | 
			
		||||
  ],
 | 
			
		||||
  "dgt": [
 | 
			
		||||
    1.0,
 | 
			
		||||
    1.03941448941778,
 | 
			
		||||
    1.07773189112355,
 | 
			
		||||
    1.11575888725852,
 | 
			
		||||
    1.15209185089701,
 | 
			
		||||
    1.18632744096844,
 | 
			
		||||
    1.21911100318577,
 | 
			
		||||
    1.24931318255134,
 | 
			
		||||
    1.27657903892303,
 | 
			
		||||
    1.30069883494415,
 | 
			
		||||
    1.32210817897091,
 | 
			
		||||
    1.3405812000038,
 | 
			
		||||
    1.35690844654118,
 | 
			
		||||
    1.3710092503689,
 | 
			
		||||
    1.38430337205545,
 | 
			
		||||
    1.3966294751726,
 | 
			
		||||
    1.40864903907609,
 | 
			
		||||
    1.42089447397912,
 | 
			
		||||
    1.43476940680732,
 | 
			
		||||
    1.44977369463316,
 | 
			
		||||
    1.46637521309853,
 | 
			
		||||
    1.48420288841848,
 | 
			
		||||
    1.50335352244996,
 | 
			
		||||
    1.5242627235492,
 | 
			
		||||
    1.54578500307573,
 | 
			
		||||
    1.56750088631614,
 | 
			
		||||
    1.58973304612691,
 | 
			
		||||
    1.61073904908309,
 | 
			
		||||
    1.63068023161292,
 | 
			
		||||
    1.64799163036252,
 | 
			
		||||
    1.66286684904577,
 | 
			
		||||
    1.6761448370895,
 | 
			
		||||
    1.68845480656382,
 | 
			
		||||
    1.70379790088896,
 | 
			
		||||
    1.72461030013125,
 | 
			
		||||
    1.75428006928365,
 | 
			
		||||
    1.79748596476494,
 | 
			
		||||
    1.85543800978691,
 | 
			
		||||
    1.92915262384742,
 | 
			
		||||
    2.01414465424155,
 | 
			
		||||
    2.10336369905543,
 | 
			
		||||
    2.19013043016015,
 | 
			
		||||
    2.26678136721453,
 | 
			
		||||
    2.33147727493671,
 | 
			
		||||
    2.38192717604575,
 | 
			
		||||
    2.41879254989742,
 | 
			
		||||
    2.44342862248888,
 | 
			
		||||
    2.4553191172498
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,106 +1,108 @@
 | 
			
		||||
{
 | 
			
		||||
    "nf_ripple": [
 | 
			
		||||
        0.0
 | 
			
		||||
    ],
 | 
			
		||||
    "gain_ripple": [
 | 
			
		||||
        0.0
 | 
			
		||||
    ],
 | 
			
		||||
    "dgt": [
 | 
			
		||||
        1.0,
 | 
			
		||||
        1.017807767853702,
 | 
			
		||||
        1.0356155337864215,
 | 
			
		||||
        1.0534217504465226,
 | 
			
		||||
        1.0712204022764056,
 | 
			
		||||
        1.0895983485572227,
 | 
			
		||||
        1.108555289615659,
 | 
			
		||||
        1.1280891949729075,
 | 
			
		||||
        1.1476135933863398,
 | 
			
		||||
        1.1672278304018044,
 | 
			
		||||
        1.1869318618366975,
 | 
			
		||||
        1.2067249615595257,
 | 
			
		||||
        1.2264996957264114,
 | 
			
		||||
        1.2428104897182262,
 | 
			
		||||
        1.2556591482982988,
 | 
			
		||||
        1.2650555289898042,
 | 
			
		||||
        1.2744470198196236,
 | 
			
		||||
        1.2838336236692311,
 | 
			
		||||
        1.2932153453410835,
 | 
			
		||||
        1.3040618749785347,
 | 
			
		||||
        1.316383926863083,
 | 
			
		||||
        1.3301807335621048,
 | 
			
		||||
        1.3439818461440451,
 | 
			
		||||
        1.3598972673004606,
 | 
			
		||||
        1.3779439775587023,
 | 
			
		||||
        1.3981208704326855,
 | 
			
		||||
        1.418273806730323,
 | 
			
		||||
        1.4340878115214444,
 | 
			
		||||
        1.445565137158368,
 | 
			
		||||
        1.45273959485914,
 | 
			
		||||
        1.4599103316162523,
 | 
			
		||||
        1.4670307626366115,
 | 
			
		||||
        1.474100442252211,
 | 
			
		||||
        1.48111939735681,
 | 
			
		||||
        1.488134243479226,
 | 
			
		||||
        1.495145456062699,
 | 
			
		||||
        1.502153039909686,
 | 
			
		||||
        1.5097346239790443,
 | 
			
		||||
        1.5178910621476225,
 | 
			
		||||
        1.5266220576235803,
 | 
			
		||||
        1.5353620432989845,
 | 
			
		||||
        1.545374152761467,
 | 
			
		||||
        1.5566577309558969,
 | 
			
		||||
        1.569199764184379,
 | 
			
		||||
        1.5817353179379183,
 | 
			
		||||
        1.5986915141218316,
 | 
			
		||||
        1.6201194134191075,
 | 
			
		||||
        1.6460167077689267,
 | 
			
		||||
        1.6719047669939942,
 | 
			
		||||
        1.6918150918099673,
 | 
			
		||||
        1.7057507692361864,
 | 
			
		||||
        1.7137640932265894,
 | 
			
		||||
        1.7217732861435076,
 | 
			
		||||
        1.7297783508684146,
 | 
			
		||||
        1.737780757913635,
 | 
			
		||||
        1.7459181197626403,
 | 
			
		||||
        1.7541903672600494,
 | 
			
		||||
        1.7625959636196327,
 | 
			
		||||
        1.7709972329654864,
 | 
			
		||||
        1.7793941781790852,
 | 
			
		||||
        1.7877868031023945,
 | 
			
		||||
        1.7961751115773796,
 | 
			
		||||
        1.8045606557581335,
 | 
			
		||||
        1.8139629377087627,
 | 
			
		||||
        1.824381436842932,
 | 
			
		||||
        1.835814081380705,
 | 
			
		||||
        1.847275503201129,
 | 
			
		||||
        1.862235672444246,
 | 
			
		||||
        1.8806927939516411,
 | 
			
		||||
        1.9026104247588487,
 | 
			
		||||
        1.9245345552113182,
 | 
			
		||||
        1.9482128147680253,
 | 
			
		||||
        1.9736443063300082,
 | 
			
		||||
        2.0008103857988204,
 | 
			
		||||
        2.0279625371819305,
 | 
			
		||||
        2.055100772005235,
 | 
			
		||||
        2.082225099873648,
 | 
			
		||||
        2.1183028432496016,
 | 
			
		||||
        2.16337565384239,
 | 
			
		||||
        2.2174389328192197,
 | 
			
		||||
        2.271520771371253,
 | 
			
		||||
        2.322373696229342,
 | 
			
		||||
        2.3699990328716107,
 | 
			
		||||
        2.414398437185221,
 | 
			
		||||
        2.4587748041127506,
 | 
			
		||||
        2.499446286796604,
 | 
			
		||||
        2.5364027376452056,
 | 
			
		||||
        2.5696460593920065,
 | 
			
		||||
        2.602860350286428,
 | 
			
		||||
        2.630396440815385,
 | 
			
		||||
        2.6521732021128046,
 | 
			
		||||
        2.6681935771243177,
 | 
			
		||||
        2.6841217449620203,
 | 
			
		||||
        2.6947834587664494,
 | 
			
		||||
        2.705443819238505,
 | 
			
		||||
        2.714526681131686
 | 
			
		||||
    ]
 | 
			
		||||
  "nf_ripple": [
 | 
			
		||||
    0.0
 | 
			
		||||
  ],
 | 
			
		||||
  "gain_ripple": [
 | 
			
		||||
    0.0
 | 
			
		||||
  ],
 | 
			
		||||
  "f_min": 191.275e12,
 | 
			
		||||
  "f_max": 196.125e12,
 | 
			
		||||
  "dgt": [
 | 
			
		||||
    1.0,
 | 
			
		||||
    1.017807767853702,
 | 
			
		||||
    1.0356155337864215,
 | 
			
		||||
    1.0534217504465226,
 | 
			
		||||
    1.0712204022764056,
 | 
			
		||||
    1.0895983485572227,
 | 
			
		||||
    1.108555289615659,
 | 
			
		||||
    1.1280891949729075,
 | 
			
		||||
    1.1476135933863398,
 | 
			
		||||
    1.1672278304018044,
 | 
			
		||||
    1.1869318618366975,
 | 
			
		||||
    1.2067249615595257,
 | 
			
		||||
    1.2264996957264114,
 | 
			
		||||
    1.2428104897182262,
 | 
			
		||||
    1.2556591482982988,
 | 
			
		||||
    1.2650555289898042,
 | 
			
		||||
    1.2744470198196236,
 | 
			
		||||
    1.2838336236692311,
 | 
			
		||||
    1.2932153453410835,
 | 
			
		||||
    1.3040618749785347,
 | 
			
		||||
    1.316383926863083,
 | 
			
		||||
    1.3301807335621048,
 | 
			
		||||
    1.3439818461440451,
 | 
			
		||||
    1.3598972673004606,
 | 
			
		||||
    1.3779439775587023,
 | 
			
		||||
    1.3981208704326855,
 | 
			
		||||
    1.418273806730323,
 | 
			
		||||
    1.4340878115214444,
 | 
			
		||||
    1.445565137158368,
 | 
			
		||||
    1.45273959485914,
 | 
			
		||||
    1.4599103316162523,
 | 
			
		||||
    1.4670307626366115,
 | 
			
		||||
    1.474100442252211,
 | 
			
		||||
    1.48111939735681,
 | 
			
		||||
    1.488134243479226,
 | 
			
		||||
    1.495145456062699,
 | 
			
		||||
    1.502153039909686,
 | 
			
		||||
    1.5097346239790443,
 | 
			
		||||
    1.5178910621476225,
 | 
			
		||||
    1.5266220576235803,
 | 
			
		||||
    1.5353620432989845,
 | 
			
		||||
    1.545374152761467,
 | 
			
		||||
    1.5566577309558969,
 | 
			
		||||
    1.569199764184379,
 | 
			
		||||
    1.5817353179379183,
 | 
			
		||||
    1.5986915141218316,
 | 
			
		||||
    1.6201194134191075,
 | 
			
		||||
    1.6460167077689267,
 | 
			
		||||
    1.6719047669939942,
 | 
			
		||||
    1.6918150918099673,
 | 
			
		||||
    1.7057507692361864,
 | 
			
		||||
    1.7137640932265894,
 | 
			
		||||
    1.7217732861435076,
 | 
			
		||||
    1.7297783508684146,
 | 
			
		||||
    1.737780757913635,
 | 
			
		||||
    1.7459181197626403,
 | 
			
		||||
    1.7541903672600494,
 | 
			
		||||
    1.7625959636196327,
 | 
			
		||||
    1.7709972329654864,
 | 
			
		||||
    1.7793941781790852,
 | 
			
		||||
    1.7877868031023945,
 | 
			
		||||
    1.7961751115773796,
 | 
			
		||||
    1.8045606557581335,
 | 
			
		||||
    1.8139629377087627,
 | 
			
		||||
    1.824381436842932,
 | 
			
		||||
    1.835814081380705,
 | 
			
		||||
    1.847275503201129,
 | 
			
		||||
    1.862235672444246,
 | 
			
		||||
    1.8806927939516411,
 | 
			
		||||
    1.9026104247588487,
 | 
			
		||||
    1.9245345552113182,
 | 
			
		||||
    1.9482128147680253,
 | 
			
		||||
    1.9736443063300082,
 | 
			
		||||
    2.0008103857988204,
 | 
			
		||||
    2.0279625371819305,
 | 
			
		||||
    2.055100772005235,
 | 
			
		||||
    2.082225099873648,
 | 
			
		||||
    2.1183028432496016,
 | 
			
		||||
    2.16337565384239,
 | 
			
		||||
    2.2174389328192197,
 | 
			
		||||
    2.271520771371253,
 | 
			
		||||
    2.322373696229342,
 | 
			
		||||
    2.3699990328716107,
 | 
			
		||||
    2.414398437185221,
 | 
			
		||||
    2.4587748041127506,
 | 
			
		||||
    2.499446286796604,
 | 
			
		||||
    2.5364027376452056,
 | 
			
		||||
    2.5696460593920065,
 | 
			
		||||
    2.602860350286428,
 | 
			
		||||
    2.630396440815385,
 | 
			
		||||
    2.6521732021128046,
 | 
			
		||||
    2.6681935771243177,
 | 
			
		||||
    2.6841217449620203,
 | 
			
		||||
    2.6947834587664494,
 | 
			
		||||
    2.705443819238505,
 | 
			
		||||
    2.714526681131686
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,80 +1,80 @@
 | 
			
		||||
{
 | 
			
		||||
    "network_name": "EDFA Example Network - P2P",
 | 
			
		||||
    "elements": [{
 | 
			
		||||
            "uid": "Site_A",
 | 
			
		||||
            "type": "Transceiver",
 | 
			
		||||
            "metadata": {
 | 
			
		||||
                "location": {
 | 
			
		||||
                    "city": "Site A",
 | 
			
		||||
                    "region": "",
 | 
			
		||||
                    "latitude": 0,
 | 
			
		||||
                    "longitude": 0
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "uid": "Span1",
 | 
			
		||||
            "type": "Fiber",
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "params": {
 | 
			
		||||
                "length": 80,
 | 
			
		||||
                "loss_coef": 0.2,
 | 
			
		||||
                "length_units": "km",
 | 
			
		||||
                "att_in": 0,
 | 
			
		||||
                "con_in": 0.5,
 | 
			
		||||
                "con_out": 0.5                
 | 
			
		||||
                },
 | 
			
		||||
            "metadata": {
 | 
			
		||||
                "location": {
 | 
			
		||||
                    "region": "",
 | 
			
		||||
                    "latitude": 1,
 | 
			
		||||
                    "longitude": 0
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "uid": "Edfa1",
 | 
			
		||||
            "type": "Edfa",
 | 
			
		||||
            "type_variety": "std_low_gain",            
 | 
			
		||||
            "operational": {
 | 
			
		||||
                "gain_target": 17,
 | 
			
		||||
                "tilt_target": 0,
 | 
			
		||||
                "out_voa": 0
 | 
			
		||||
            },
 | 
			
		||||
            "metadata": {
 | 
			
		||||
                "location": {
 | 
			
		||||
                    "region": "",
 | 
			
		||||
                    "latitude": 2,
 | 
			
		||||
                    "longitude": 0
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "uid": "Site_B",
 | 
			
		||||
            "type": "Transceiver",
 | 
			
		||||
            "metadata": {
 | 
			
		||||
                "location": {
 | 
			
		||||
                    "city": "Site B",
 | 
			
		||||
                    "region": "",
 | 
			
		||||
                    "latitude": 2,
 | 
			
		||||
                    "longitude": 0
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
  "network_name": "EDFA Example Network - P2P",
 | 
			
		||||
  "elements": [
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "Site_A",
 | 
			
		||||
      "type": "Transceiver",
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
          "city": "Site A",
 | 
			
		||||
          "region": "",
 | 
			
		||||
          "latitude": 0,
 | 
			
		||||
          "longitude": 0
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    ],
 | 
			
		||||
    "connections": [{
 | 
			
		||||
            "from_node": "Site_A",
 | 
			
		||||
            "to_node": "Span1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "from_node": "Span1",
 | 
			
		||||
            "to_node": "Edfa1"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "from_node": "Edfa1",
 | 
			
		||||
            "to_node": "Site_B"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "Span1",
 | 
			
		||||
      "type": "Fiber",
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "length": 80,
 | 
			
		||||
        "loss_coef": 0.2,
 | 
			
		||||
        "length_units": "km",
 | 
			
		||||
        "att_in": 0,
 | 
			
		||||
        "con_in": 0.5,
 | 
			
		||||
        "con_out": 0.5
 | 
			
		||||
      },
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
          "region": "",
 | 
			
		||||
          "latitude": 1,
 | 
			
		||||
          "longitude": 0
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "Edfa1",
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_low_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 17,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
      },
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
          "region": "",
 | 
			
		||||
          "latitude": 2,
 | 
			
		||||
          "longitude": 0
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "Site_B",
 | 
			
		||||
      "type": "Transceiver",
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
          "city": "Site B",
 | 
			
		||||
          "region": "",
 | 
			
		||||
          "latitude": 2,
 | 
			
		||||
          "longitude": 0
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "connections": [
 | 
			
		||||
    {
 | 
			
		||||
      "from_node": "Site_A",
 | 
			
		||||
      "to_node": "Span1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "from_node": "Span1",
 | 
			
		||||
      "to_node": "Edfa1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "from_node": "Edfa1",
 | 
			
		||||
      "to_node": "Site_B"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,323 +1,443 @@
 | 
			
		||||
{     "Edfa":[{
 | 
			
		||||
            "type_variety": "high_detail_model_example",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },                  {
 | 
			
		||||
            "type_variety": "Juniper_BoosterHG",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 10,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "advanced_config_from_json": "Juniper-BoosterHG.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            }, 
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "operator_model_example",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 23,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false           
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-8.104e-4,-6.221e-2,-5.889e-1,37.62],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },          
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_ila_standard",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4,-6.250e-2,-1.071,28.99],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp",
 | 
			
		||||
            "type_def": "openroadm_preamp",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp_typical_ver5",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4,-6.250e-2,-1.071,28.99],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp_worstcase_ver5",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4,-6.250e-2,-1.071,27.99],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
            "type_def": "openroadm_booster",
 | 
			
		||||
            "gain_flatmax": 32,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_high_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 35,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.5,
 | 
			
		||||
            "nf_max": 7,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },            
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 23,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 23,
 | 
			
		||||
            "nf_min": 6.5,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "high_power",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 25,
 | 
			
		||||
            "nf_min": 9,
 | 
			
		||||
            "nf_max": 15,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },            
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5.5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "4pumps_raman",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 12,
 | 
			
		||||
            "gain_min": 12,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": -1,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            },   
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "hybrid_4pumps_lowgain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "raman": true,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "4pumps_raman",
 | 
			
		||||
            "booster_variety": "std_low_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "hybrid_4pumps_mediumgain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "raman": true,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "4pumps_raman",
 | 
			
		||||
            "booster_variety": "std_medium_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },            
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "medium+low_gain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "std_medium_gain",
 | 
			
		||||
            "booster_variety": "std_low_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "medium+high_power",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "std_medium_gain",
 | 
			
		||||
            "booster_variety": "high_power",
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            }                                  
 | 
			
		||||
{
 | 
			
		||||
  "Edfa": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "high_detail_model_example",
 | 
			
		||||
      "type_def": "advanced_model",
 | 
			
		||||
      "gain_flatmax": 25,
 | 
			
		||||
      "gain_min": 15,
 | 
			
		||||
      "p_max": 21,
 | 
			
		||||
      "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "Juniper_BoosterHG",
 | 
			
		||||
      "type_def": "advanced_model",
 | 
			
		||||
      "gain_flatmax": 25,
 | 
			
		||||
      "gain_min": 10,
 | 
			
		||||
      "p_max": 21,
 | 
			
		||||
      "advanced_config_from_json": "Juniper-BoosterHG.json",
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "operator_model_example",
 | 
			
		||||
      "type_def": "variable_gain",
 | 
			
		||||
      "gain_flatmax": 26,
 | 
			
		||||
      "gain_min": 15,
 | 
			
		||||
      "p_max": 23,
 | 
			
		||||
      "nf_min": 6,
 | 
			
		||||
      "nf_max": 10,
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -8.104e-4,
 | 
			
		||||
        -6.221e-2,
 | 
			
		||||
        -5.889e-1,
 | 
			
		||||
        37.62
 | 
			
		||||
      ],
 | 
			
		||||
      "Fiber":[{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "NZDF",
 | 
			
		||||
            "dispersion": 0.5e-05,
 | 
			
		||||
            "effective_area": 72e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "LOF",
 | 
			
		||||
            "dispersion": 2.2e-05,
 | 
			
		||||
            "effective_area": 125e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            }
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_standard",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        28.99
 | 
			
		||||
      ],
 | 
			
		||||
      "RamanFiber":[{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            }
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp",
 | 
			
		||||
      "type_def": "openroadm_preamp",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp_typical_ver5",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        28.99
 | 
			
		||||
      ],
 | 
			
		||||
      "Span":[{
 | 
			
		||||
            "power_mode":true,
 | 
			
		||||
            "delta_power_range_db": [-2,3,0.5],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 10,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
            }
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp_worstcase_ver5",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        27.99
 | 
			
		||||
      ],
 | 
			
		||||
      "Roadm":[{
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                            "preamp_variety_list":[],
 | 
			
		||||
                            "booster_variety_list":[]
 | 
			
		||||
                            }            
 | 
			
		||||
            }],
 | 
			
		||||
      "SI":[{
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "f_max":195.1e12,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [0,0,1],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "sys_margins": 2
 | 
			
		||||
            }],
 | 
			
		||||
      "Transceiver":[
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
      "type_def": "openroadm_booster",
 | 
			
		||||
      "gain_flatmax": 32,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "std_high_gain",
 | 
			
		||||
      "type_def": "variable_gain",
 | 
			
		||||
      "gain_flatmax": 35,
 | 
			
		||||
      "gain_min": 25,
 | 
			
		||||
      "p_max": 21,
 | 
			
		||||
      "nf_min": 5.5,
 | 
			
		||||
      "nf_max": 7,
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "type_def": "variable_gain",
 | 
			
		||||
      "gain_flatmax": 26,
 | 
			
		||||
      "gain_min": 15,
 | 
			
		||||
      "p_max": 23,
 | 
			
		||||
      "nf_min": 6,
 | 
			
		||||
      "nf_max": 10,
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "std_low_gain",
 | 
			
		||||
      "type_def": "variable_gain",
 | 
			
		||||
      "gain_flatmax": 16,
 | 
			
		||||
      "gain_min": 8,
 | 
			
		||||
      "p_max": 23,
 | 
			
		||||
      "nf_min": 6.5,
 | 
			
		||||
      "nf_max": 11,
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "high_power",
 | 
			
		||||
      "type_def": "variable_gain",
 | 
			
		||||
      "gain_flatmax": 16,
 | 
			
		||||
      "gain_min": 8,
 | 
			
		||||
      "p_max": 25,
 | 
			
		||||
      "nf_min": 9,
 | 
			
		||||
      "nf_max": 15,
 | 
			
		||||
      "out_voa_auto": false,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "std_fixed_gain",
 | 
			
		||||
      "type_def": "fixed_gain",
 | 
			
		||||
      "gain_flatmax": 21,
 | 
			
		||||
      "gain_min": 20,
 | 
			
		||||
      "p_max": 21,
 | 
			
		||||
      "nf0": 5.5,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "4pumps_raman",
 | 
			
		||||
      "type_def": "fixed_gain",
 | 
			
		||||
      "gain_flatmax": 12,
 | 
			
		||||
      "gain_min": 12,
 | 
			
		||||
      "p_max": 21,
 | 
			
		||||
      "nf0": -1,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "hybrid_4pumps_lowgain",
 | 
			
		||||
      "type_def": "dual_stage",
 | 
			
		||||
      "raman": true,
 | 
			
		||||
      "gain_min": 25,
 | 
			
		||||
      "preamp_variety": "4pumps_raman",
 | 
			
		||||
      "booster_variety": "std_low_gain",
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "hybrid_4pumps_mediumgain",
 | 
			
		||||
      "type_def": "dual_stage",
 | 
			
		||||
      "raman": true,
 | 
			
		||||
      "gain_min": 25,
 | 
			
		||||
      "preamp_variety": "4pumps_raman",
 | 
			
		||||
      "booster_variety": "std_medium_gain",
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "medium+low_gain",
 | 
			
		||||
      "type_def": "dual_stage",
 | 
			
		||||
      "gain_min": 25,
 | 
			
		||||
      "preamp_variety": "std_medium_gain",
 | 
			
		||||
      "booster_variety": "std_low_gain",
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "medium+high_power",
 | 
			
		||||
      "type_def": "dual_stage",
 | 
			
		||||
      "gain_min": 25,
 | 
			
		||||
      "preamp_variety": "std_medium_gain",
 | 
			
		||||
      "booster_variety": "high_power",
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Fiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "NZDF",
 | 
			
		||||
      "dispersion": 0.5e-05,
 | 
			
		||||
      "effective_area": 72e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "LOF",
 | 
			
		||||
      "dispersion": 2.2e-05,
 | 
			
		||||
      "effective_area": 125e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "RamanFiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Span": [
 | 
			
		||||
    {
 | 
			
		||||
      "power_mode": true,
 | 
			
		||||
      "delta_power_range_db": [
 | 
			
		||||
        -2,
 | 
			
		||||
        3,
 | 
			
		||||
        0.5
 | 
			
		||||
      ],
 | 
			
		||||
      "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
      "target_extended_gain": 2.5,
 | 
			
		||||
      "max_length": 150,
 | 
			
		||||
      "length_units": "km",
 | 
			
		||||
      "max_loss": 28,
 | 
			
		||||
      "padding": 10,
 | 
			
		||||
      "EOL": 0,
 | 
			
		||||
      "con_in": 0,
 | 
			
		||||
      "con_out": 0
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Roadm": [
 | 
			
		||||
    {
 | 
			
		||||
      "target_pch_out_db": -20,
 | 
			
		||||
      "add_drop_osnr": 38,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "restrictions": {
 | 
			
		||||
        "preamp_variety_list": [],
 | 
			
		||||
        "booster_variety_list": []
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "roadm_type_1",
 | 
			
		||||
      "target_pch_out_db": -18,
 | 
			
		||||
      "add_drop_osnr": 35,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "restrictions": {
 | 
			
		||||
        "preamp_variety_list": [],
 | 
			
		||||
        "booster_variety_list": []
 | 
			
		||||
      },
 | 
			
		||||
      "roadm-path-impairments": []
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "detailed_impairments",
 | 
			
		||||
      "target_pch_out_db": -20,
 | 
			
		||||
      "add_drop_osnr": 38,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "restrictions": {
 | 
			
		||||
        "preamp_variety_list": [],
 | 
			
		||||
        "booster_variety_list": []
 | 
			
		||||
      },
 | 
			
		||||
      "roadm-path-impairments": [
 | 
			
		||||
        {
 | 
			
		||||
          "roadm-path-impairments-id": 0,
 | 
			
		||||
          "roadm-express-path": [
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 11,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 37.5e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 15,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 12,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 37.5e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 3",
 | 
			
		||||
                       "baud_rate": 44e9,
 | 
			
		||||
                       "OSNR": 18,
 | 
			
		||||
                       "bit_rate": 300e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 62.5e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 21,
 | 
			
		||||
                       "bit_rate": 400e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 4",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 16,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 40,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
              "frequency-range": {
 | 
			
		||||
                "lower-frequency": 191.3e12,
 | 
			
		||||
                "upper-frequency": 196.1e12
 | 
			
		||||
              },
 | 
			
		||||
              "roadm-pmd": 0,
 | 
			
		||||
              "roadm-cd": 0,
 | 
			
		||||
              "roadm-pdl": 0,
 | 
			
		||||
              "roadm-inband-crosstalk": 0,
 | 
			
		||||
              "roadm-maxloss": 16.5
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "roadm-path-impairments-id": 1,
 | 
			
		||||
          "roadm-add-path": [
 | 
			
		||||
            {
 | 
			
		||||
              "frequency-range": {
 | 
			
		||||
                "lower-frequency": 191.3e12,
 | 
			
		||||
                "upper-frequency": 196.1e12
 | 
			
		||||
              },
 | 
			
		||||
              "roadm-pmd": 0,
 | 
			
		||||
              "roadm-cd": 0,
 | 
			
		||||
              "roadm-pdl": 0,
 | 
			
		||||
              "roadm-inband-crosstalk": 0,
 | 
			
		||||
              "roadm-maxloss": 11.5,
 | 
			
		||||
              "roadm-pmax": 2.5,
 | 
			
		||||
              "roadm-osnr": 41,
 | 
			
		||||
              "roadm-noise-figure": 23
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "roadm-path-impairments-id": 2,
 | 
			
		||||
          "roadm-drop-path": [
 | 
			
		||||
            {
 | 
			
		||||
              "frequency-range": {
 | 
			
		||||
                "lower-frequency": 191.3e12,
 | 
			
		||||
                "upper-frequency": 196.1e12
 | 
			
		||||
              },
 | 
			
		||||
              "roadm-pmd": 0,
 | 
			
		||||
              "roadm-cd": 0,
 | 
			
		||||
              "roadm-pdl": 0,
 | 
			
		||||
              "roadm-inband-crosstalk": 0,
 | 
			
		||||
              "roadm-maxloss": 11.5,
 | 
			
		||||
              "roadm-minloss": 7.5,
 | 
			
		||||
              "roadm-typloss": 10,
 | 
			
		||||
              "roadm-pmin": -13.5,
 | 
			
		||||
              "roadm-pmax": -9.5,
 | 
			
		||||
              "roadm-ptyp": -12,
 | 
			
		||||
              "roadm-osnr": 41,
 | 
			
		||||
              "roadm-noise-figure": 15
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "SI": [
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 191.3e12,
 | 
			
		||||
      "baud_rate": 32e9,
 | 
			
		||||
      "f_max": 195.1e12,
 | 
			
		||||
      "spacing": 50e9,
 | 
			
		||||
      "power_dbm": 0,
 | 
			
		||||
      "power_range_db": [
 | 
			
		||||
        0,
 | 
			
		||||
        0,
 | 
			
		||||
        1
 | 
			
		||||
      ],
 | 
			
		||||
      "tx_power_dbm": 0,
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 40,
 | 
			
		||||
      "sys_margins": 2
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Transceiver": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "vendorA_trx-type1",
 | 
			
		||||
      "frequency": {
 | 
			
		||||
        "min": 191.35e12,
 | 
			
		||||
        "max": 196.1e12
 | 
			
		||||
      },
 | 
			
		||||
      "mode": [
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 1",
 | 
			
		||||
          "baud_rate": 32e9,
 | 
			
		||||
          "OSNR": 11,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 37.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 2",
 | 
			
		||||
          "baud_rate": 66e9,
 | 
			
		||||
          "OSNR": 15,
 | 
			
		||||
          "bit_rate": 200e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 75e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "Voyager",
 | 
			
		||||
      "frequency": {
 | 
			
		||||
        "min": 191.35e12,
 | 
			
		||||
        "max": 196.1e12
 | 
			
		||||
      },
 | 
			
		||||
      "mode": [
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 1",
 | 
			
		||||
          "baud_rate": 32e9,
 | 
			
		||||
          "OSNR": 12,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 37.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 3",
 | 
			
		||||
          "baud_rate": 44e9,
 | 
			
		||||
          "OSNR": 18,
 | 
			
		||||
          "bit_rate": 300e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 62.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 2",
 | 
			
		||||
          "baud_rate": 66e9,
 | 
			
		||||
          "OSNR": 21,
 | 
			
		||||
          "bit_rate": 400e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 75e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "mode 4",
 | 
			
		||||
          "baud_rate": 66e9,
 | 
			
		||||
          "OSNR": 16,
 | 
			
		||||
          "bit_rate": 200e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 40,
 | 
			
		||||
          "min_spacing": 75e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										479
									
								
								gnpy/example-data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								gnpy/example-data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,479 @@
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_high_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 35,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.5,
 | 
			
		||||
            "nf_max": 7,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 23,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 23,
 | 
			
		||||
            "nf_min": 6.5,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "high_power",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 25,
 | 
			
		||||
            "nf_min": 9,
 | 
			
		||||
            "nf_max": 15,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5.5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "4pumps_raman",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 12,
 | 
			
		||||
            "gain_min": 12,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": -1,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "hybrid_4pumps_lowgain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "raman": true,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "4pumps_raman",
 | 
			
		||||
            "booster_variety": "std_low_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "hybrid_4pumps_mediumgain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "raman": true,
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "4pumps_raman",
 | 
			
		||||
            "booster_variety": "std_medium_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "medium+low_gain",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "std_medium_gain",
 | 
			
		||||
            "booster_variety": "std_low_gain",
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "medium+high_power",
 | 
			
		||||
            "type_def": "dual_stage",
 | 
			
		||||
            "gain_min": 25,
 | 
			
		||||
            "preamp_variety": "std_medium_gain",
 | 
			
		||||
            "booster_variety": "high_power",
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_C",
 | 
			
		||||
            "f_min": 191.225e12,
 | 
			
		||||
            "f_max": 196.125e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_L",
 | 
			
		||||
            "f_min": 186.5e12,
 | 
			
		||||
            "f_max": 190.1e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_reduced_band",
 | 
			
		||||
            "f_min": 192.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_bis",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_L_ter",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 16,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_L_reduced_band",
 | 
			
		||||
            "f_min": 187.3e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.8,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "test_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_booster",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_booster_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_booster_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_booster",
 | 
			
		||||
                "std_booster_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_medium_gain_C",
 | 
			
		||||
                "std_medium_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_ter",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain",
 | 
			
		||||
                "std_low_gain_L_ter"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_bis",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_bis",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_reduced",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_reduced",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_reduced",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_bis",
 | 
			
		||||
                "std_low_gain_L_reduced_band"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "NZDF",
 | 
			
		||||
            "dispersion": 0.5e-05,
 | 
			
		||||
            "effective_area": 72e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "LOF",
 | 
			
		||||
            "dispersion": 2.2e-05,
 | 
			
		||||
            "effective_area": 125e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "RamanFiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [
 | 
			
		||||
        {
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [
 | 
			
		||||
                -2,
 | 
			
		||||
                3,
 | 
			
		||||
                0.5
 | 
			
		||||
            ],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 10,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [
 | 
			
		||||
        {
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "f_max": 195.1e12,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [
 | 
			
		||||
                0,
 | 
			
		||||
                0,
 | 
			
		||||
                1
 | 
			
		||||
            ],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "sys_margins": 2
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "lband",
 | 
			
		||||
            "f_min": 186.3e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "f_max": 190.1e12,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [
 | 
			
		||||
                0,
 | 
			
		||||
                0,
 | 
			
		||||
                1
 | 
			
		||||
            ],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "sys_margins": 2
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Transceiver": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 37.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 37.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 3",
 | 
			
		||||
                    "baud_rate": 44e9,
 | 
			
		||||
                    "OSNR": 18,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 62.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "mode 4",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 16,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 40,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,349 +1,371 @@
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [
 | 
			
		||||
  "Edfa": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -8.104e-4,
 | 
			
		||||
        -6.221e-2,
 | 
			
		||||
        -5.889e-1,
 | 
			
		||||
        37.62
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 0.7,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_standard",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        28.99
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 0.7,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp",
 | 
			
		||||
      "type_def": "openroadm_preamp",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
      "type_def": "openroadm_booster",
 | 
			
		||||
      "gain_flatmax": 32,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Fiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "NZDF",
 | 
			
		||||
      "dispersion": 0.5e-05,
 | 
			
		||||
      "effective_area": 72e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "LOF",
 | 
			
		||||
      "dispersion": 2.2e-05,
 | 
			
		||||
      "effective_area": 125e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "RamanFiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Span": [
 | 
			
		||||
    {
 | 
			
		||||
      "power_mode": true,
 | 
			
		||||
      "delta_power_range_db": [
 | 
			
		||||
        0,
 | 
			
		||||
        0,
 | 
			
		||||
        0
 | 
			
		||||
      ],
 | 
			
		||||
      "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
      "target_extended_gain": 0,
 | 
			
		||||
      "max_length": 135,
 | 
			
		||||
      "length_units": "km",
 | 
			
		||||
      "max_loss": 28,
 | 
			
		||||
      "padding": 11,
 | 
			
		||||
      "EOL": 0,
 | 
			
		||||
      "con_in": 0,
 | 
			
		||||
      "con_out": 0
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Roadm": [
 | 
			
		||||
    {
 | 
			
		||||
      "target_pch_out_db": -20,
 | 
			
		||||
      "add_drop_osnr": 30,
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 1.5,
 | 
			
		||||
      "restrictions": {
 | 
			
		||||
        "preamp_variety_list": [
 | 
			
		||||
          "openroadm_mw_mw_preamp"
 | 
			
		||||
        ],
 | 
			
		||||
        "booster_variety_list": [
 | 
			
		||||
          "openroadm_mw_mw_booster"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "SI": [
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 191.3e12,
 | 
			
		||||
      "baud_rate": 31.57e9,
 | 
			
		||||
      "f_max": 196.1e12,
 | 
			
		||||
      "spacing": 50e9,
 | 
			
		||||
      "power_dbm": 2,
 | 
			
		||||
      "power_range_db": [
 | 
			
		||||
        0,
 | 
			
		||||
        0,
 | 
			
		||||
        1
 | 
			
		||||
      ],
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 35,
 | 
			
		||||
      "sys_margins": 2
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Transceiver": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "OpenROADM MSA ver. 4.0",
 | 
			
		||||
      "frequency": {
 | 
			
		||||
        "min": 191.35e12,
 | 
			
		||||
        "max": 196.1e12
 | 
			
		||||
      },
 | 
			
		||||
      "mode": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 0.7,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_ila_standard",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 0.7,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp",
 | 
			
		||||
            "type_def": "openroadm_preamp",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
            "type_def": "openroadm_booster",
 | 
			
		||||
            "gain_flatmax": 32,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "NZDF",
 | 
			
		||||
            "dispersion": 0.5e-05,
 | 
			
		||||
            "effective_area": 72e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "LOF",
 | 
			
		||||
            "dispersion": 2.2e-05,
 | 
			
		||||
            "effective_area": 125e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "RamanFiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [
 | 
			
		||||
        {
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [0, 0, 0],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 0,
 | 
			
		||||
            "max_length": 135,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 11,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [
 | 
			
		||||
        {
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 30,
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 1.5,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": ["openroadm_mw_mw_preamp"],
 | 
			
		||||
                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "baud_rate": 31.57e9,
 | 
			
		||||
            "f_max": 196.1e12,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 2,
 | 
			
		||||
            "power_range_db": [0, 0, 1],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 35,
 | 
			
		||||
            "sys_margins": 2
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Transceiver": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "OpenROADM MSA ver. 4.0",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
          "format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
 | 
			
		||||
          "baud_rate": 27.95e9,
 | 
			
		||||
          "OSNR": 17,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": null,
 | 
			
		||||
          "tx_osnr": 33,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 27.95e9,
 | 
			
		||||
                    "OSNR": 17,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": null,
 | 
			
		||||
                    "tx_osnr": 33,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 18e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 30,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 6,
 | 
			
		||||
                            "penalty_value": 4
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 31.57e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 35,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 40e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 30,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 6,
 | 
			
		||||
                            "penalty_value": 4
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "200 Gbit/s, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 17,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 24e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 25,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "300 Gbit/s, DP-8QAM",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 18e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 25,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "400 Gbit/s, DP-16QAM",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 24,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 12e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 20,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 18e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 30,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 6,
 | 
			
		||||
              "penalty_value": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 50e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
 | 
			
		||||
          "baud_rate": 31.57e9,
 | 
			
		||||
          "OSNR": 12,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 35,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 40e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 30,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 6,
 | 
			
		||||
              "penalty_value": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 50e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "200 Gbit/s, DP-QPSK",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 17,
 | 
			
		||||
          "bit_rate": 200e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 24e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 25,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "300 Gbit/s, DP-8QAM",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 21,
 | 
			
		||||
          "bit_rate": 300e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 18e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 25,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "400 Gbit/s, DP-16QAM",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 24,
 | 
			
		||||
          "bit_rate": 400e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 12e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 20,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,409 +1,441 @@
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [
 | 
			
		||||
  "Edfa": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -8.104e-4,
 | 
			
		||||
        -6.221e-2,
 | 
			
		||||
        -5.889e-1,
 | 
			
		||||
        37.62
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 0.7,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_ila_standard",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        28.99
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 0.7,
 | 
			
		||||
      "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp_typical_ver5",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        28.99
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_preamp_worstcase_ver5",
 | 
			
		||||
      "type_def": "openroadm",
 | 
			
		||||
      "gain_flatmax": 27,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "nf_coef": [
 | 
			
		||||
        -5.952e-4,
 | 
			
		||||
        -6.250e-2,
 | 
			
		||||
        -1.071,
 | 
			
		||||
        27.99
 | 
			
		||||
      ],
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
      "type_def": "openroadm_booster",
 | 
			
		||||
      "gain_flatmax": 32,
 | 
			
		||||
      "gain_min": 0,
 | 
			
		||||
      "p_max": 22,
 | 
			
		||||
      "pmd": 0,
 | 
			
		||||
      "pdl": 0,
 | 
			
		||||
      "allowed_for_design": false
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Fiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "NZDF",
 | 
			
		||||
      "dispersion": 0.5e-05,
 | 
			
		||||
      "effective_area": 72e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "LOF",
 | 
			
		||||
      "dispersion": 2.2e-05,
 | 
			
		||||
      "effective_area": 125e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "RamanFiber": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "SSMF",
 | 
			
		||||
      "dispersion": 1.67e-05,
 | 
			
		||||
      "effective_area": 83e-12,
 | 
			
		||||
      "pmd_coef": 1.265e-15
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Span": [
 | 
			
		||||
    {
 | 
			
		||||
      "power_mode": true,
 | 
			
		||||
      "delta_power_range_db": [
 | 
			
		||||
        0,
 | 
			
		||||
        0,
 | 
			
		||||
        0
 | 
			
		||||
      ],
 | 
			
		||||
      "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
      "target_extended_gain": 0,
 | 
			
		||||
      "max_length": 135,
 | 
			
		||||
      "length_units": "km",
 | 
			
		||||
      "max_loss": 28,
 | 
			
		||||
      "padding": 11,
 | 
			
		||||
      "EOL": 0,
 | 
			
		||||
      "con_in": 0,
 | 
			
		||||
      "con_out": 0
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Roadm": [
 | 
			
		||||
    {
 | 
			
		||||
      "target_pch_out_db": -20,
 | 
			
		||||
      "add_drop_osnr": 33,
 | 
			
		||||
      "pmd": 3e-12,
 | 
			
		||||
      "pdl": 1.5,
 | 
			
		||||
      "restrictions": {
 | 
			
		||||
        "preamp_variety_list": [
 | 
			
		||||
          "openroadm_mw_mw_preamp_worstcase_ver5"
 | 
			
		||||
        ],
 | 
			
		||||
        "booster_variety_list": [
 | 
			
		||||
          "openroadm_mw_mw_booster"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "SI": [
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 191.3e12,
 | 
			
		||||
      "baud_rate": 31.57e9,
 | 
			
		||||
      "f_max": 196.1e12,
 | 
			
		||||
      "spacing": 50e9,
 | 
			
		||||
      "power_dbm": 2,
 | 
			
		||||
      "power_range_db": [
 | 
			
		||||
        0,
 | 
			
		||||
        0,
 | 
			
		||||
        1
 | 
			
		||||
      ],
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 35,
 | 
			
		||||
      "sys_margins": 2
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "Transceiver": [
 | 
			
		||||
    {
 | 
			
		||||
      "type_variety": "OpenROADM MSA ver. 5.0",
 | 
			
		||||
      "frequency": {
 | 
			
		||||
        "min": 191.35e12,
 | 
			
		||||
        "max": 196.1e12
 | 
			
		||||
      },
 | 
			
		||||
      "mode": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_ila_low_noise",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 0.7,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_ila_standard",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 0.7,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp_typical_ver5",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_preamp_worstcase_ver5",
 | 
			
		||||
            "type_def": "openroadm",
 | 
			
		||||
            "gain_flatmax": 27,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 27.99],
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "openroadm_mw_mw_booster",
 | 
			
		||||
            "type_def": "openroadm_booster",
 | 
			
		||||
            "gain_flatmax": 32,
 | 
			
		||||
            "gain_min": 0,
 | 
			
		||||
            "p_max": 22,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "NZDF",
 | 
			
		||||
            "dispersion": 0.5e-05,
 | 
			
		||||
            "effective_area": 72e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "LOF",
 | 
			
		||||
            "dispersion": 2.2e-05,
 | 
			
		||||
            "effective_area": 125e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "RamanFiber": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [
 | 
			
		||||
        {
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [0, 0, 0],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 0,
 | 
			
		||||
            "max_length": 135,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 11,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [
 | 
			
		||||
        {
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 33,
 | 
			
		||||
            "pmd": 3e-12,
 | 
			
		||||
            "pdl": 1.5,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": ["openroadm_mw_mw_preamp_worstcase_ver5"],
 | 
			
		||||
                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "baud_rate": 31.57e9,
 | 
			
		||||
            "f_max": 196.1e12,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 2,
 | 
			
		||||
            "power_range_db": [0, 0, 1],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 35,
 | 
			
		||||
            "sys_margins": 2
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Transceiver": [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "OpenROADM MSA ver. 5.0",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
          "format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
 | 
			
		||||
          "baud_rate": 27.95e9,
 | 
			
		||||
          "OSNR": 17,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": null,
 | 
			
		||||
          "tx_osnr": 33,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "100 Gbit/s, 27.95 Gbaud, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 27.95e9,
 | 
			
		||||
                    "OSNR": 17,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": null,
 | 
			
		||||
                    "tx_osnr": 33,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 18e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 30,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 6,
 | 
			
		||||
                            "penalty_value": 4
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 31.57e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 48e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 30,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 6,
 | 
			
		||||
                            "penalty_value": 4
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "200 Gbit/s, 31.57 Gbaud, DP-16QAM",
 | 
			
		||||
                    "baud_rate": 31.57e9,
 | 
			
		||||
                    "OSNR": 20.5,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 24e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 30,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 6,
 | 
			
		||||
                            "penalty_value": 4
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "200 Gbit/s, DP-QPSK",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 17,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 24e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 25,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "300 Gbit/s, DP-8QAM",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 18e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 25,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "format": "400 Gbit/s, DP-16QAM",
 | 
			
		||||
                    "baud_rate": 63.1e9,
 | 
			
		||||
                    "OSNR": 24,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 36,
 | 
			
		||||
                    "penalties": [
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": -1e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 4e3,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "chromatic_dispersion": 12e3,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 10,
 | 
			
		||||
                            "penalty_value": 0
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pmd": 20,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 1,
 | 
			
		||||
                            "penalty_value": 0.5
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 2,
 | 
			
		||||
                            "penalty_value": 1
 | 
			
		||||
                        },
 | 
			
		||||
                        {
 | 
			
		||||
                            "pdl": 4,
 | 
			
		||||
                            "penalty_value": 2.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ],
 | 
			
		||||
                    "min_spacing": 87.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 18e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 30,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 6,
 | 
			
		||||
              "penalty_value": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 50e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "100 Gbit/s, 31.57 Gbaud, DP-QPSK",
 | 
			
		||||
          "baud_rate": 31.57e9,
 | 
			
		||||
          "OSNR": 12,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 48e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 30,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 6,
 | 
			
		||||
              "penalty_value": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 50e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "200 Gbit/s, 31.57 Gbaud, DP-16QAM",
 | 
			
		||||
          "baud_rate": 31.57e9,
 | 
			
		||||
          "OSNR": 20.5,
 | 
			
		||||
          "bit_rate": 100e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 24e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 30,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 6,
 | 
			
		||||
              "penalty_value": 4
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 50e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "200 Gbit/s, DP-QPSK",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 17,
 | 
			
		||||
          "bit_rate": 200e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 24e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 25,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "300 Gbit/s, DP-8QAM",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 21,
 | 
			
		||||
          "bit_rate": 300e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 18e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 25,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "format": "400 Gbit/s, DP-16QAM",
 | 
			
		||||
          "baud_rate": 63.1e9,
 | 
			
		||||
          "OSNR": 24,
 | 
			
		||||
          "bit_rate": 400e9,
 | 
			
		||||
          "roll_off": 0.15,
 | 
			
		||||
          "tx_osnr": 36,
 | 
			
		||||
          "penalties": [
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": -1e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 4e3,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "chromatic_dispersion": 12e3,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 10,
 | 
			
		||||
              "penalty_value": 0
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pmd": 20,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 1,
 | 
			
		||||
              "penalty_value": 0.5
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 2,
 | 
			
		||||
              "penalty_value": 1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              "pdl": 4,
 | 
			
		||||
              "penalty_value": 2.5
 | 
			
		||||
            }
 | 
			
		||||
          ],
 | 
			
		||||
          "min_spacing": 87.5e9,
 | 
			
		||||
          "cost": 1
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
      "spectrum":[
 | 
			
		||||
            {
 | 
			
		||||
            "f_min": 191.35e12,
 | 
			
		||||
            "f_max": 195.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40
 | 
			
		||||
            }
 | 
			
		||||
      ]
 | 
			
		||||
  "spectrum": [
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 191.35e12,
 | 
			
		||||
      "f_max": 195.1e12,
 | 
			
		||||
      "baud_rate": 32e9,
 | 
			
		||||
      "slot_width": 50e9,
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 40
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,23 @@
 | 
			
		||||
{
 | 
			
		||||
      "spectrum":[
 | 
			
		||||
            {
 | 
			
		||||
            "f_min": 191.4e12,
 | 
			
		||||
            "f_max":193.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "delta_pdb": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "label": "mode_1"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "f_min": 193.1625e12,
 | 
			
		||||
            "f_max":195e12,
 | 
			
		||||
            "baud_rate": 64e9,
 | 
			
		||||
            "slot_width": 75e9,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "label": "mode_2"
 | 
			
		||||
            }
 | 
			
		||||
      ]
 | 
			
		||||
  "spectrum": [
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 191.4e12,
 | 
			
		||||
      "f_max": 193.1e12,
 | 
			
		||||
      "baud_rate": 32e9,
 | 
			
		||||
      "slot_width": 50e9,
 | 
			
		||||
      "delta_pdb": 0,
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 40,
 | 
			
		||||
      "label": "mode_1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "f_min": 193.1625e12,
 | 
			
		||||
      "f_max": 195e12,
 | 
			
		||||
      "baud_rate": 64e9,
 | 
			
		||||
      "slot_width": 75e9,
 | 
			
		||||
      "roll_off": 0.15,
 | 
			
		||||
      "tx_osnr": 40,
 | 
			
		||||
      "label": "mode_2"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1894
									
								
								gnpy/example-data/multiband_example_network.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1894
									
								
								gnpy/example-data/multiband_example_network.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								gnpy/example-data/multiband_spectrum.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								gnpy/example-data/multiband_spectrum.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
{
 | 
			
		||||
    "spectrum": [
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "f_max": 195.1e12,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "delta_pdb": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "label": "cband"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 186.3e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "f_max": 190.1e12,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "delta_pdb": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "label": "lband"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -8,6 +8,12 @@
 | 
			
		||||
    "method": "ggn_spectrally_separated",
 | 
			
		||||
    "dispersion_tolerance": 1,
 | 
			
		||||
    "phase_shift_tolerance": 0.1,
 | 
			
		||||
    "computed_channels": [1, 18, 37, 56, 75]
 | 
			
		||||
    "computed_channels": [
 | 
			
		||||
      1,
 | 
			
		||||
      18,
 | 
			
		||||
      37,
 | 
			
		||||
      56,
 | 
			
		||||
      75
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,304 +1,304 @@
 | 
			
		||||
{
 | 
			
		||||
    "nf_fit_coeff": [
 | 
			
		||||
        0.000168241,
 | 
			
		||||
        0.0469961,
 | 
			
		||||
        0.0359549,
 | 
			
		||||
        5.82851
 | 
			
		||||
    ],
 | 
			
		||||
    "f_min": 191.35e12,
 | 
			
		||||
    "f_max": 196.1e12,
 | 
			
		||||
    "nf_ripple": [
 | 
			
		||||
        0.4372876328262819,
 | 
			
		||||
        0.4372876328262819,
 | 
			
		||||
        0.41270842850729195,
 | 
			
		||||
        0.38814205928193013,
 | 
			
		||||
        0.36358851509924695,
 | 
			
		||||
        0.3390191214858807,
 | 
			
		||||
        0.30474360397422756,
 | 
			
		||||
        0.27048596623174515,
 | 
			
		||||
        0.23624619427167134,
 | 
			
		||||
        0.202035284929368,
 | 
			
		||||
        0.1694483010211072,
 | 
			
		||||
        0.13687829834471027,
 | 
			
		||||
        0.1043252636301016,
 | 
			
		||||
        0.07184040799914815,
 | 
			
		||||
        0.061288823415841555,
 | 
			
		||||
        0.050742731588695494,
 | 
			
		||||
        0.04020212822983975,
 | 
			
		||||
        0.029667009055877668,
 | 
			
		||||
        0.01913736978785662,
 | 
			
		||||
        0.00861320615127981,
 | 
			
		||||
        -0.010157321677553965,
 | 
			
		||||
        -0.028982516728038848,
 | 
			
		||||
        -0.04779792991567815,
 | 
			
		||||
        -0.06660356886269536,
 | 
			
		||||
        -0.06256260169582961,
 | 
			
		||||
        -0.05832916277634124,
 | 
			
		||||
        -0.05409792133358102,
 | 
			
		||||
        -0.04990610405914272,
 | 
			
		||||
        -0.05078533294804249,
 | 
			
		||||
        -0.05166410580536087,
 | 
			
		||||
        -0.05254242298580185,
 | 
			
		||||
        -0.05342028484370278,
 | 
			
		||||
        -0.051742390657545205,
 | 
			
		||||
        -0.050039429413028365,
 | 
			
		||||
        -0.048337350303318156,
 | 
			
		||||
        -0.04663615264317309,
 | 
			
		||||
        -0.04493583574805963,
 | 
			
		||||
        -0.043236398934156144,
 | 
			
		||||
        -0.035622012697103154,
 | 
			
		||||
        -0.027999803010447587,
 | 
			
		||||
        -0.02038153550619876,
 | 
			
		||||
        -0.012779471908040341,
 | 
			
		||||
        -0.006436207679519103,
 | 
			
		||||
        -9.622162373026585e-05,
 | 
			
		||||
        0.006240488799898697,
 | 
			
		||||
        0.012573926129294415,
 | 
			
		||||
        0.021418708618354456,
 | 
			
		||||
        0.030289222542492025,
 | 
			
		||||
        0.03915515813685565,
 | 
			
		||||
        0.047899419704645264,
 | 
			
		||||
        0.04256372893215024,
 | 
			
		||||
        0.03723078993416436,
 | 
			
		||||
        0.03190060058247842,
 | 
			
		||||
        0.02657315875107553,
 | 
			
		||||
        0.021248462316134083,
 | 
			
		||||
        0.01605877647020772,
 | 
			
		||||
        0.02326948274513522,
 | 
			
		||||
        0.03047647598902483,
 | 
			
		||||
        0.037679759069084225,
 | 
			
		||||
        0.044883315610536455,
 | 
			
		||||
        0.052470799141237305,
 | 
			
		||||
        0.06005437964543287,
 | 
			
		||||
        0.0676340601339394,
 | 
			
		||||
        0.07521193198077789,
 | 
			
		||||
        0.08415906712621996,
 | 
			
		||||
        0.09310160456603413,
 | 
			
		||||
        0.1020395478432815,
 | 
			
		||||
        0.11079585523492333,
 | 
			
		||||
        0.1018180306253394,
 | 
			
		||||
        0.09284481475528361,
 | 
			
		||||
        0.0838762040768461,
 | 
			
		||||
        0.07482015390297145,
 | 
			
		||||
        0.05670549786742816,
 | 
			
		||||
        0.03860013139908377,
 | 
			
		||||
        0.020504047353947653,
 | 
			
		||||
        0.0024172385953583004,
 | 
			
		||||
        -0.015660302006048,
 | 
			
		||||
        -0.03372858157230583,
 | 
			
		||||
        -0.07037375788020579,
 | 
			
		||||
        -0.10709599992470213,
 | 
			
		||||
        -0.14379944379052215,
 | 
			
		||||
        -0.18048410390821285,
 | 
			
		||||
        -0.20911178784023846,
 | 
			
		||||
        -0.23772399031437283,
 | 
			
		||||
        -0.26632156113294336,
 | 
			
		||||
        -0.2949045115165272,
 | 
			
		||||
        -0.30206775396360075,
 | 
			
		||||
        -0.30915729645781326,
 | 
			
		||||
        -0.31624321721895354,
 | 
			
		||||
        -0.3233255190215882,
 | 
			
		||||
        -0.32037911876162584,
 | 
			
		||||
        -0.3172854168606314,
 | 
			
		||||
        -0.31419329378173544,
 | 
			
		||||
        -0.31110274831665313,
 | 
			
		||||
        -0.3110761646066259,
 | 
			
		||||
        -0.3110761646066259
 | 
			
		||||
    ],
 | 
			
		||||
    "dgt": [
 | 
			
		||||
        1.0,
 | 
			
		||||
        1.017807767853702,
 | 
			
		||||
        1.0356155337864215,
 | 
			
		||||
        1.0534217504465226,
 | 
			
		||||
        1.0712204022764056,
 | 
			
		||||
        1.0895983485572227,
 | 
			
		||||
        1.108555289615659,
 | 
			
		||||
        1.1280891949729075,
 | 
			
		||||
        1.1476135933863398,
 | 
			
		||||
        1.1672278304018044,
 | 
			
		||||
        1.1869318618366975,
 | 
			
		||||
        1.2067249615595257,
 | 
			
		||||
        1.2264996957264114,
 | 
			
		||||
        1.2428104897182262,
 | 
			
		||||
        1.2556591482982988,
 | 
			
		||||
        1.2650555289898042,
 | 
			
		||||
        1.2744470198196236,
 | 
			
		||||
        1.2838336236692311,
 | 
			
		||||
        1.2932153453410835,
 | 
			
		||||
        1.3040618749785347,
 | 
			
		||||
        1.316383926863083,
 | 
			
		||||
        1.3301807335621048,
 | 
			
		||||
        1.3439818461440451,
 | 
			
		||||
        1.3598972673004606,
 | 
			
		||||
        1.3779439775587023,
 | 
			
		||||
        1.3981208704326855,
 | 
			
		||||
        1.418273806730323,
 | 
			
		||||
        1.4340878115214444,
 | 
			
		||||
        1.445565137158368,
 | 
			
		||||
        1.45273959485914,
 | 
			
		||||
        1.4599103316162523,
 | 
			
		||||
        1.4670307626366115,
 | 
			
		||||
        1.474100442252211,
 | 
			
		||||
        1.48111939735681,
 | 
			
		||||
        1.488134243479226,
 | 
			
		||||
        1.495145456062699,
 | 
			
		||||
        1.502153039909686,
 | 
			
		||||
        1.5097346239790443,
 | 
			
		||||
        1.5178910621476225,
 | 
			
		||||
        1.5266220576235803,
 | 
			
		||||
        1.5353620432989845,
 | 
			
		||||
        1.545374152761467,
 | 
			
		||||
        1.5566577309558969,
 | 
			
		||||
        1.569199764184379,
 | 
			
		||||
        1.5817353179379183,
 | 
			
		||||
        1.5986915141218316,
 | 
			
		||||
        1.6201194134191075,
 | 
			
		||||
        1.6460167077689267,
 | 
			
		||||
        1.6719047669939942,
 | 
			
		||||
        1.6918150918099673,
 | 
			
		||||
        1.7057507692361864,
 | 
			
		||||
        1.7137640932265894,
 | 
			
		||||
        1.7217732861435076,
 | 
			
		||||
        1.7297783508684146,
 | 
			
		||||
        1.737780757913635,
 | 
			
		||||
        1.7459181197626403,
 | 
			
		||||
        1.7541903672600494,
 | 
			
		||||
        1.7625959636196327,
 | 
			
		||||
        1.7709972329654864,
 | 
			
		||||
        1.7793941781790852,
 | 
			
		||||
        1.7877868031023945,
 | 
			
		||||
        1.7961751115773796,
 | 
			
		||||
        1.8045606557581335,
 | 
			
		||||
        1.8139629377087627,
 | 
			
		||||
        1.824381436842932,
 | 
			
		||||
        1.835814081380705,
 | 
			
		||||
        1.847275503201129,
 | 
			
		||||
        1.862235672444246,
 | 
			
		||||
        1.8806927939516411,
 | 
			
		||||
        1.9026104247588487,
 | 
			
		||||
        1.9245345552113182,
 | 
			
		||||
        1.9482128147680253,
 | 
			
		||||
        1.9736443063300082,
 | 
			
		||||
        2.0008103857988204,
 | 
			
		||||
        2.0279625371819305,
 | 
			
		||||
        2.055100772005235,
 | 
			
		||||
        2.082225099873648,
 | 
			
		||||
        2.1183028432496016,
 | 
			
		||||
        2.16337565384239,
 | 
			
		||||
        2.2174389328192197,
 | 
			
		||||
        2.271520771371253,
 | 
			
		||||
        2.322373696229342,
 | 
			
		||||
        2.3699990328716107,
 | 
			
		||||
        2.414398437185221,
 | 
			
		||||
        2.4587748041127506,
 | 
			
		||||
        2.499446286796604,
 | 
			
		||||
        2.5364027376452056,
 | 
			
		||||
        2.5696460593920065,
 | 
			
		||||
        2.602860350286428,
 | 
			
		||||
        2.630396440815385,
 | 
			
		||||
        2.6521732021128046,
 | 
			
		||||
        2.6681935771243177,
 | 
			
		||||
        2.6841217449620203,
 | 
			
		||||
        2.6947834587664494,
 | 
			
		||||
        2.705443819238505,
 | 
			
		||||
        2.714526681131686
 | 
			
		||||
    ],
 | 
			
		||||
    "gain_ripple": [
 | 
			
		||||
        0.07704745697916238,
 | 
			
		||||
        0.06479749697916048,
 | 
			
		||||
        0.05257029697916238,
 | 
			
		||||
        0.040326236979161934,
 | 
			
		||||
        0.028098946979159933,
 | 
			
		||||
        0.01393231697916164,
 | 
			
		||||
        -0.0021726530208390216,
 | 
			
		||||
        -0.01819858302084043,
 | 
			
		||||
        -0.03218106302083967,
 | 
			
		||||
        -0.042428283020839785,
 | 
			
		||||
        -0.05095282302083959,
 | 
			
		||||
        -0.05947139302083926,
 | 
			
		||||
        -0.06968090302083851,
 | 
			
		||||
        -0.07844600302084004,
 | 
			
		||||
        -0.08407607302083875,
 | 
			
		||||
        -0.0865687230208394,
 | 
			
		||||
        -0.08906007302083907,
 | 
			
		||||
        -0.0913487130208388,
 | 
			
		||||
        -0.09343261302083761,
 | 
			
		||||
        -0.09717347302083823,
 | 
			
		||||
        -0.1027863830208382,
 | 
			
		||||
        -0.11089282302084058,
 | 
			
		||||
        -0.11963431302083904,
 | 
			
		||||
        -0.1279646530208396,
 | 
			
		||||
        -0.13525493302083902,
 | 
			
		||||
        -0.1409032730208395,
 | 
			
		||||
        -0.14591937302083835,
 | 
			
		||||
        -0.14823350302084037,
 | 
			
		||||
        -0.1484450830208388,
 | 
			
		||||
        -0.1455411330208385,
 | 
			
		||||
        -0.14160178302083892,
 | 
			
		||||
        -0.1353792530208402,
 | 
			
		||||
        -0.12789859302083784,
 | 
			
		||||
        -0.11916081302083725,
 | 
			
		||||
        -0.11041488302083735,
 | 
			
		||||
        -0.10103437302083762,
 | 
			
		||||
        -0.09101254302083817,
 | 
			
		||||
        -0.07868024302083754,
 | 
			
		||||
        -0.06468462302083822,
 | 
			
		||||
        -0.051112303020840244,
 | 
			
		||||
        -0.039618433020837784,
 | 
			
		||||
        -0.028748483020837767,
 | 
			
		||||
        -0.016475303020840215,
 | 
			
		||||
        -0.006936193020838033,
 | 
			
		||||
        -0.0015763130208377163,
 | 
			
		||||
        0.0007104669791608842,
 | 
			
		||||
        0.0040435869791615175,
 | 
			
		||||
        0.006965146979162284,
 | 
			
		||||
        0.00842583697916055,
 | 
			
		||||
        0.00874012697916271,
 | 
			
		||||
        0.00936596697916059,
 | 
			
		||||
        0.01030063697916006,
 | 
			
		||||
        0.011234826979162449,
 | 
			
		||||
        0.013321846979160057,
 | 
			
		||||
        0.01659282697915998,
 | 
			
		||||
        0.023488786979161347,
 | 
			
		||||
        0.03285456697916089,
 | 
			
		||||
        0.04072968697916224,
 | 
			
		||||
        0.04467697697916151,
 | 
			
		||||
        0.04551704697916037,
 | 
			
		||||
        0.04717897697916129,
 | 
			
		||||
        0.04946107697915991,
 | 
			
		||||
        0.05154489697916276,
 | 
			
		||||
        0.05447361697916264,
 | 
			
		||||
        0.05848224697916038,
 | 
			
		||||
        0.06916723697916183,
 | 
			
		||||
        0.08548825697916129,
 | 
			
		||||
        0.10802383697916085,
 | 
			
		||||
        0.13114358697916018,
 | 
			
		||||
        0.15216302697916007,
 | 
			
		||||
        0.17037189697916233,
 | 
			
		||||
        0.1767381569791624,
 | 
			
		||||
        0.1739275269791598,
 | 
			
		||||
        0.15945681697916214,
 | 
			
		||||
        0.14239527697916188,
 | 
			
		||||
        0.12276252697916235,
 | 
			
		||||
        0.10313984697916112,
 | 
			
		||||
        0.08731066697916035,
 | 
			
		||||
        0.07533675697916209,
 | 
			
		||||
        0.07114372697916238,
 | 
			
		||||
        0.07094413697916124,
 | 
			
		||||
        0.07091459697916136,
 | 
			
		||||
        0.0670723869791594,
 | 
			
		||||
        0.054956336979159914,
 | 
			
		||||
        0.038328296979159404,
 | 
			
		||||
        0.017572956979162058,
 | 
			
		||||
        -0.0028138630208403015,
 | 
			
		||||
        -0.016792253020838643,
 | 
			
		||||
        -0.0246928330208398,
 | 
			
		||||
        -0.018326963020840026,
 | 
			
		||||
        -0.0036199830208403228,
 | 
			
		||||
        0.02602813697916062,
 | 
			
		||||
        0.06245819697916133,
 | 
			
		||||
        0.09542181697916163,
 | 
			
		||||
        0.11822862697916037,
 | 
			
		||||
        0.1359703369791596
 | 
			
		||||
    ]
 | 
			
		||||
  "nf_fit_coeff": [
 | 
			
		||||
    0.000168241,
 | 
			
		||||
    0.0469961,
 | 
			
		||||
    0.0359549,
 | 
			
		||||
    5.82851
 | 
			
		||||
  ],
 | 
			
		||||
  "f_min": 191.275e12,
 | 
			
		||||
  "f_max": 196.125e12,
 | 
			
		||||
  "nf_ripple": [
 | 
			
		||||
    0.4372876328262819,
 | 
			
		||||
    0.4372876328262819,
 | 
			
		||||
    0.41270842850729195,
 | 
			
		||||
    0.38814205928193013,
 | 
			
		||||
    0.36358851509924695,
 | 
			
		||||
    0.3390191214858807,
 | 
			
		||||
    0.30474360397422756,
 | 
			
		||||
    0.27048596623174515,
 | 
			
		||||
    0.23624619427167134,
 | 
			
		||||
    0.202035284929368,
 | 
			
		||||
    0.1694483010211072,
 | 
			
		||||
    0.13687829834471027,
 | 
			
		||||
    0.1043252636301016,
 | 
			
		||||
    0.07184040799914815,
 | 
			
		||||
    0.061288823415841555,
 | 
			
		||||
    0.050742731588695494,
 | 
			
		||||
    0.04020212822983975,
 | 
			
		||||
    0.029667009055877668,
 | 
			
		||||
    0.01913736978785662,
 | 
			
		||||
    0.00861320615127981,
 | 
			
		||||
    -0.010157321677553965,
 | 
			
		||||
    -0.028982516728038848,
 | 
			
		||||
    -0.04779792991567815,
 | 
			
		||||
    -0.06660356886269536,
 | 
			
		||||
    -0.06256260169582961,
 | 
			
		||||
    -0.05832916277634124,
 | 
			
		||||
    -0.05409792133358102,
 | 
			
		||||
    -0.04990610405914272,
 | 
			
		||||
    -0.05078533294804249,
 | 
			
		||||
    -0.05166410580536087,
 | 
			
		||||
    -0.05254242298580185,
 | 
			
		||||
    -0.05342028484370278,
 | 
			
		||||
    -0.051742390657545205,
 | 
			
		||||
    -0.050039429413028365,
 | 
			
		||||
    -0.048337350303318156,
 | 
			
		||||
    -0.04663615264317309,
 | 
			
		||||
    -0.04493583574805963,
 | 
			
		||||
    -0.043236398934156144,
 | 
			
		||||
    -0.035622012697103154,
 | 
			
		||||
    -0.027999803010447587,
 | 
			
		||||
    -0.02038153550619876,
 | 
			
		||||
    -0.012779471908040341,
 | 
			
		||||
    -0.006436207679519103,
 | 
			
		||||
    -9.622162373026585e-05,
 | 
			
		||||
    0.006240488799898697,
 | 
			
		||||
    0.012573926129294415,
 | 
			
		||||
    0.021418708618354456,
 | 
			
		||||
    0.030289222542492025,
 | 
			
		||||
    0.03915515813685565,
 | 
			
		||||
    0.047899419704645264,
 | 
			
		||||
    0.04256372893215024,
 | 
			
		||||
    0.03723078993416436,
 | 
			
		||||
    0.03190060058247842,
 | 
			
		||||
    0.02657315875107553,
 | 
			
		||||
    0.021248462316134083,
 | 
			
		||||
    0.01605877647020772,
 | 
			
		||||
    0.02326948274513522,
 | 
			
		||||
    0.03047647598902483,
 | 
			
		||||
    0.037679759069084225,
 | 
			
		||||
    0.044883315610536455,
 | 
			
		||||
    0.052470799141237305,
 | 
			
		||||
    0.06005437964543287,
 | 
			
		||||
    0.0676340601339394,
 | 
			
		||||
    0.07521193198077789,
 | 
			
		||||
    0.08415906712621996,
 | 
			
		||||
    0.09310160456603413,
 | 
			
		||||
    0.1020395478432815,
 | 
			
		||||
    0.11079585523492333,
 | 
			
		||||
    0.1018180306253394,
 | 
			
		||||
    0.09284481475528361,
 | 
			
		||||
    0.0838762040768461,
 | 
			
		||||
    0.07482015390297145,
 | 
			
		||||
    0.05670549786742816,
 | 
			
		||||
    0.03860013139908377,
 | 
			
		||||
    0.020504047353947653,
 | 
			
		||||
    0.0024172385953583004,
 | 
			
		||||
    -0.015660302006048,
 | 
			
		||||
    -0.03372858157230583,
 | 
			
		||||
    -0.07037375788020579,
 | 
			
		||||
    -0.10709599992470213,
 | 
			
		||||
    -0.14379944379052215,
 | 
			
		||||
    -0.18048410390821285,
 | 
			
		||||
    -0.20911178784023846,
 | 
			
		||||
    -0.23772399031437283,
 | 
			
		||||
    -0.26632156113294336,
 | 
			
		||||
    -0.2949045115165272,
 | 
			
		||||
    -0.30206775396360075,
 | 
			
		||||
    -0.30915729645781326,
 | 
			
		||||
    -0.31624321721895354,
 | 
			
		||||
    -0.3233255190215882,
 | 
			
		||||
    -0.32037911876162584,
 | 
			
		||||
    -0.3172854168606314,
 | 
			
		||||
    -0.31419329378173544,
 | 
			
		||||
    -0.31110274831665313,
 | 
			
		||||
    -0.3110761646066259,
 | 
			
		||||
    -0.3110761646066259
 | 
			
		||||
  ],
 | 
			
		||||
  "dgt": [
 | 
			
		||||
    1.0,
 | 
			
		||||
    1.017807767853702,
 | 
			
		||||
    1.0356155337864215,
 | 
			
		||||
    1.0534217504465226,
 | 
			
		||||
    1.0712204022764056,
 | 
			
		||||
    1.0895983485572227,
 | 
			
		||||
    1.108555289615659,
 | 
			
		||||
    1.1280891949729075,
 | 
			
		||||
    1.1476135933863398,
 | 
			
		||||
    1.1672278304018044,
 | 
			
		||||
    1.1869318618366975,
 | 
			
		||||
    1.2067249615595257,
 | 
			
		||||
    1.2264996957264114,
 | 
			
		||||
    1.2428104897182262,
 | 
			
		||||
    1.2556591482982988,
 | 
			
		||||
    1.2650555289898042,
 | 
			
		||||
    1.2744470198196236,
 | 
			
		||||
    1.2838336236692311,
 | 
			
		||||
    1.2932153453410835,
 | 
			
		||||
    1.3040618749785347,
 | 
			
		||||
    1.316383926863083,
 | 
			
		||||
    1.3301807335621048,
 | 
			
		||||
    1.3439818461440451,
 | 
			
		||||
    1.3598972673004606,
 | 
			
		||||
    1.3779439775587023,
 | 
			
		||||
    1.3981208704326855,
 | 
			
		||||
    1.418273806730323,
 | 
			
		||||
    1.4340878115214444,
 | 
			
		||||
    1.445565137158368,
 | 
			
		||||
    1.45273959485914,
 | 
			
		||||
    1.4599103316162523,
 | 
			
		||||
    1.4670307626366115,
 | 
			
		||||
    1.474100442252211,
 | 
			
		||||
    1.48111939735681,
 | 
			
		||||
    1.488134243479226,
 | 
			
		||||
    1.495145456062699,
 | 
			
		||||
    1.502153039909686,
 | 
			
		||||
    1.5097346239790443,
 | 
			
		||||
    1.5178910621476225,
 | 
			
		||||
    1.5266220576235803,
 | 
			
		||||
    1.5353620432989845,
 | 
			
		||||
    1.545374152761467,
 | 
			
		||||
    1.5566577309558969,
 | 
			
		||||
    1.569199764184379,
 | 
			
		||||
    1.5817353179379183,
 | 
			
		||||
    1.5986915141218316,
 | 
			
		||||
    1.6201194134191075,
 | 
			
		||||
    1.6460167077689267,
 | 
			
		||||
    1.6719047669939942,
 | 
			
		||||
    1.6918150918099673,
 | 
			
		||||
    1.7057507692361864,
 | 
			
		||||
    1.7137640932265894,
 | 
			
		||||
    1.7217732861435076,
 | 
			
		||||
    1.7297783508684146,
 | 
			
		||||
    1.737780757913635,
 | 
			
		||||
    1.7459181197626403,
 | 
			
		||||
    1.7541903672600494,
 | 
			
		||||
    1.7625959636196327,
 | 
			
		||||
    1.7709972329654864,
 | 
			
		||||
    1.7793941781790852,
 | 
			
		||||
    1.7877868031023945,
 | 
			
		||||
    1.7961751115773796,
 | 
			
		||||
    1.8045606557581335,
 | 
			
		||||
    1.8139629377087627,
 | 
			
		||||
    1.824381436842932,
 | 
			
		||||
    1.835814081380705,
 | 
			
		||||
    1.847275503201129,
 | 
			
		||||
    1.862235672444246,
 | 
			
		||||
    1.8806927939516411,
 | 
			
		||||
    1.9026104247588487,
 | 
			
		||||
    1.9245345552113182,
 | 
			
		||||
    1.9482128147680253,
 | 
			
		||||
    1.9736443063300082,
 | 
			
		||||
    2.0008103857988204,
 | 
			
		||||
    2.0279625371819305,
 | 
			
		||||
    2.055100772005235,
 | 
			
		||||
    2.082225099873648,
 | 
			
		||||
    2.1183028432496016,
 | 
			
		||||
    2.16337565384239,
 | 
			
		||||
    2.2174389328192197,
 | 
			
		||||
    2.271520771371253,
 | 
			
		||||
    2.322373696229342,
 | 
			
		||||
    2.3699990328716107,
 | 
			
		||||
    2.414398437185221,
 | 
			
		||||
    2.4587748041127506,
 | 
			
		||||
    2.499446286796604,
 | 
			
		||||
    2.5364027376452056,
 | 
			
		||||
    2.5696460593920065,
 | 
			
		||||
    2.602860350286428,
 | 
			
		||||
    2.630396440815385,
 | 
			
		||||
    2.6521732021128046,
 | 
			
		||||
    2.6681935771243177,
 | 
			
		||||
    2.6841217449620203,
 | 
			
		||||
    2.6947834587664494,
 | 
			
		||||
    2.705443819238505,
 | 
			
		||||
    2.714526681131686
 | 
			
		||||
  ],
 | 
			
		||||
  "gain_ripple": [
 | 
			
		||||
    0.07704745697916238,
 | 
			
		||||
    0.06479749697916048,
 | 
			
		||||
    0.05257029697916238,
 | 
			
		||||
    0.040326236979161934,
 | 
			
		||||
    0.028098946979159933,
 | 
			
		||||
    0.01393231697916164,
 | 
			
		||||
    -0.0021726530208390216,
 | 
			
		||||
    -0.01819858302084043,
 | 
			
		||||
    -0.03218106302083967,
 | 
			
		||||
    -0.042428283020839785,
 | 
			
		||||
    -0.05095282302083959,
 | 
			
		||||
    -0.05947139302083926,
 | 
			
		||||
    -0.06968090302083851,
 | 
			
		||||
    -0.07844600302084004,
 | 
			
		||||
    -0.08407607302083875,
 | 
			
		||||
    -0.0865687230208394,
 | 
			
		||||
    -0.08906007302083907,
 | 
			
		||||
    -0.0913487130208388,
 | 
			
		||||
    -0.09343261302083761,
 | 
			
		||||
    -0.09717347302083823,
 | 
			
		||||
    -0.1027863830208382,
 | 
			
		||||
    -0.11089282302084058,
 | 
			
		||||
    -0.11963431302083904,
 | 
			
		||||
    -0.1279646530208396,
 | 
			
		||||
    -0.13525493302083902,
 | 
			
		||||
    -0.1409032730208395,
 | 
			
		||||
    -0.14591937302083835,
 | 
			
		||||
    -0.14823350302084037,
 | 
			
		||||
    -0.1484450830208388,
 | 
			
		||||
    -0.1455411330208385,
 | 
			
		||||
    -0.14160178302083892,
 | 
			
		||||
    -0.1353792530208402,
 | 
			
		||||
    -0.12789859302083784,
 | 
			
		||||
    -0.11916081302083725,
 | 
			
		||||
    -0.11041488302083735,
 | 
			
		||||
    -0.10103437302083762,
 | 
			
		||||
    -0.09101254302083817,
 | 
			
		||||
    -0.07868024302083754,
 | 
			
		||||
    -0.06468462302083822,
 | 
			
		||||
    -0.051112303020840244,
 | 
			
		||||
    -0.039618433020837784,
 | 
			
		||||
    -0.028748483020837767,
 | 
			
		||||
    -0.016475303020840215,
 | 
			
		||||
    -0.006936193020838033,
 | 
			
		||||
    -0.0015763130208377163,
 | 
			
		||||
    0.0007104669791608842,
 | 
			
		||||
    0.0040435869791615175,
 | 
			
		||||
    0.006965146979162284,
 | 
			
		||||
    0.00842583697916055,
 | 
			
		||||
    0.00874012697916271,
 | 
			
		||||
    0.00936596697916059,
 | 
			
		||||
    0.01030063697916006,
 | 
			
		||||
    0.011234826979162449,
 | 
			
		||||
    0.013321846979160057,
 | 
			
		||||
    0.01659282697915998,
 | 
			
		||||
    0.023488786979161347,
 | 
			
		||||
    0.03285456697916089,
 | 
			
		||||
    0.04072968697916224,
 | 
			
		||||
    0.04467697697916151,
 | 
			
		||||
    0.04551704697916037,
 | 
			
		||||
    0.04717897697916129,
 | 
			
		||||
    0.04946107697915991,
 | 
			
		||||
    0.05154489697916276,
 | 
			
		||||
    0.05447361697916264,
 | 
			
		||||
    0.05848224697916038,
 | 
			
		||||
    0.06916723697916183,
 | 
			
		||||
    0.08548825697916129,
 | 
			
		||||
    0.10802383697916085,
 | 
			
		||||
    0.13114358697916018,
 | 
			
		||||
    0.15216302697916007,
 | 
			
		||||
    0.17037189697916233,
 | 
			
		||||
    0.1767381569791624,
 | 
			
		||||
    0.1739275269791598,
 | 
			
		||||
    0.15945681697916214,
 | 
			
		||||
    0.14239527697916188,
 | 
			
		||||
    0.12276252697916235,
 | 
			
		||||
    0.10313984697916112,
 | 
			
		||||
    0.08731066697916035,
 | 
			
		||||
    0.07533675697916209,
 | 
			
		||||
    0.07114372697916238,
 | 
			
		||||
    0.07094413697916124,
 | 
			
		||||
    0.07091459697916136,
 | 
			
		||||
    0.0670723869791594,
 | 
			
		||||
    0.054956336979159914,
 | 
			
		||||
    0.038328296979159404,
 | 
			
		||||
    0.017572956979162058,
 | 
			
		||||
    -0.0028138630208403015,
 | 
			
		||||
    -0.016792253020838643,
 | 
			
		||||
    -0.0246928330208398,
 | 
			
		||||
    -0.018326963020840026,
 | 
			
		||||
    -0.0036199830208403228,
 | 
			
		||||
    0.02602813697916062,
 | 
			
		||||
    0.06245819697916133,
 | 
			
		||||
    0.09542181697916163,
 | 
			
		||||
    0.11822862697916037,
 | 
			
		||||
    0.1359703369791596
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,24 +12,21 @@ import argparse
 | 
			
		||||
import logging
 | 
			
		||||
import sys
 | 
			
		||||
from math import ceil
 | 
			
		||||
from numpy import linspace, mean
 | 
			
		||||
from numpy import mean
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
 | 
			
		||||
import gnpy.core.ansi_escapes as ansi_escapes
 | 
			
		||||
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.core.elements import Transceiver, Fiber, RamanFiber, Roadm
 | 
			
		||||
import gnpy.core.exceptions as exceptions
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.core.parameters import SimParams
 | 
			
		||||
from gnpy.core.utils import db2lin, lin2db, automatic_nch
 | 
			
		||||
from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation,
 | 
			
		||||
                                   BLOCKING_NOPATH, correct_json_route_list,
 | 
			
		||||
                                   deduplicate_disjunctions, compute_path_with_disjunction,
 | 
			
		||||
                                   PathRequest, compute_constrained_path, propagate)
 | 
			
		||||
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum
 | 
			
		||||
from gnpy.core.utils import lin2db, pretty_summary_print, per_label_average, watt2dbm
 | 
			
		||||
from gnpy.topology.request import (ResultElement, jsontocsv, BLOCKING_NOPATH)
 | 
			
		||||
from gnpy.tools.json_io import (load_equipment, load_network, load_json, load_requests, save_network,
 | 
			
		||||
                                requests_from_json, disjunctions_from_json, save_json, load_initial_spectrum)
 | 
			
		||||
                                requests_from_json, save_json, load_initial_spectrum)
 | 
			
		||||
from gnpy.tools.plots import plot_baseline, plot_results
 | 
			
		||||
from gnpy.tools.worker_utils import designed_network, transmission_simulation, planning
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
_logger = logging.getLogger(__name__)
 | 
			
		||||
_examples_dir = Path(__file__).parent.parent / 'example-data'
 | 
			
		||||
@@ -144,19 +141,17 @@ def transmission_main_example(args=None):
 | 
			
		||||
        sys.exit()
 | 
			
		||||
 | 
			
		||||
    # First try to find exact match if source/destination provided
 | 
			
		||||
    source = None
 | 
			
		||||
    if args.source:
 | 
			
		||||
        source = transceivers.pop(args.source, None)
 | 
			
		||||
        valid_source = True if source else False
 | 
			
		||||
    else:
 | 
			
		||||
        source = None
 | 
			
		||||
        _logger.info('No source node specified: picking random transceiver')
 | 
			
		||||
 | 
			
		||||
    destination = None
 | 
			
		||||
    nodes_list = []
 | 
			
		||||
    loose_list = []
 | 
			
		||||
    if args.destination:
 | 
			
		||||
        destination = transceivers.pop(args.destination, None)
 | 
			
		||||
        valid_destination = True if destination else False
 | 
			
		||||
    else:
 | 
			
		||||
        destination = None
 | 
			
		||||
        _logger.info('No destination node specified: picking random transceiver')
 | 
			
		||||
 | 
			
		||||
    # If no exact match try to find partial match
 | 
			
		||||
    if args.source and not source:
 | 
			
		||||
@@ -173,87 +168,72 @@ def transmission_main_example(args=None):
 | 
			
		||||
    if not source:
 | 
			
		||||
        source = list(transceivers.values())[0]
 | 
			
		||||
        del transceivers[source.uid]
 | 
			
		||||
        _logger.info('No source node specified: picking random transceiver')
 | 
			
		||||
 | 
			
		||||
    if not destination:
 | 
			
		||||
        destination = list(transceivers.values())[0]
 | 
			
		||||
        nodes_list = [destination.uid]
 | 
			
		||||
        loose_list = ['STRICT']
 | 
			
		||||
        _logger.info('No destination node specified: picking random transceiver')
 | 
			
		||||
 | 
			
		||||
    _logger.info(f'source = {args.source!r}')
 | 
			
		||||
    _logger.info(f'destination = {args.destination!r}')
 | 
			
		||||
    _logger.info(f'source = {source.uid!r}')
 | 
			
		||||
    _logger.info(f'destination = {destination.uid!r}')
 | 
			
		||||
 | 
			
		||||
    params = {}
 | 
			
		||||
    params['request_id'] = 0
 | 
			
		||||
    params['trx_type'] = ''
 | 
			
		||||
    params['trx_mode'] = ''
 | 
			
		||||
    params['source'] = source.uid
 | 
			
		||||
    params['destination'] = destination.uid
 | 
			
		||||
    params['bidir'] = False
 | 
			
		||||
    params['nodes_list'] = [destination.uid]
 | 
			
		||||
    params['loose_list'] = ['strict']
 | 
			
		||||
    params['format'] = ''
 | 
			
		||||
    params['path_bandwidth'] = 0
 | 
			
		||||
    params['effective_freq_slot'] = None
 | 
			
		||||
    trx_params = trx_mode_params(equipment)
 | 
			
		||||
    if args.power:
 | 
			
		||||
        trx_params['power'] = db2lin(float(args.power)) * 1e-3
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
    initial_spectrum = None
 | 
			
		||||
    nb_channels = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
 | 
			
		||||
    if args.spectrum:
 | 
			
		||||
        # use the spectrum defined by user for the propagation.
 | 
			
		||||
        # the nb of channel for design remains the one of the reference channel
 | 
			
		||||
        initial_spectrum = load_initial_spectrum(args.spectrum)
 | 
			
		||||
        nb_channels = len(initial_spectrum)
 | 
			
		||||
        print('User input for spectrum used for propagation instead of SI')
 | 
			
		||||
    params['nb_channel'] = nb_channels
 | 
			
		||||
    req = PathRequest(**params)
 | 
			
		||||
    req.initial_spectrum = initial_spectrum
 | 
			
		||||
    print(f'There are {nb_channels} channels propagating')
 | 
			
		||||
    power_mode = equipment['Span']['default'].power_mode
 | 
			
		||||
    print('\n'.join([f'Power mode is set to {power_mode}',
 | 
			
		||||
                     f'=> it can be modified in eqpt_config.json - Span']))
 | 
			
		||||
                     '=> it can be modified in eqpt_config.json - Span']))
 | 
			
		||||
 | 
			
		||||
    # Keep the reference channel for design: the one from SI, with full load same channels
 | 
			
		||||
    pref_ch_db = lin2db(req.power * 1e3)  # reference channel power / span (SL=20dB)
 | 
			
		||||
    pref_total_db = pref_ch_db + lin2db(req.nb_channel)  # reference total power / span (SL=20dB)
 | 
			
		||||
    # Simulate !
 | 
			
		||||
    try:
 | 
			
		||||
        build_network(network, equipment, pref_ch_db, pref_total_db, args.no_insert_edfas)
 | 
			
		||||
        network, req, ref_req = designed_network(equipment, network, source.uid, destination.uid,
 | 
			
		||||
                                                 nodes_list=nodes_list, loose_list=loose_list,
 | 
			
		||||
                                                 args_power=args.power,
 | 
			
		||||
                                                 initial_spectrum=initial_spectrum,
 | 
			
		||||
                                                 no_insert_edfas=args.no_insert_edfas)
 | 
			
		||||
        path, propagations_for_path, powers_dbm, infos = transmission_simulation(equipment, network, req, ref_req)
 | 
			
		||||
    except exceptions.NetworkTopologyError as e:
 | 
			
		||||
        print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    except exceptions.ConfigurationError as e:
 | 
			
		||||
        print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    path = compute_constrained_path(network, req)
 | 
			
		||||
 | 
			
		||||
    except exceptions.ServiceError as e:
 | 
			
		||||
        print(f'Service error: {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    # print or export results
 | 
			
		||||
    spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)]
 | 
			
		||||
    print(f'\nThere are {len(spans)} fiber spans over {sum(spans)/1000:.0f} km between {source.uid} '
 | 
			
		||||
          f'and {destination.uid}')
 | 
			
		||||
    print(f'\nNow propagating between {source.uid} and {destination.uid}:')
 | 
			
		||||
 | 
			
		||||
    power_range = [0]
 | 
			
		||||
    if power_mode:
 | 
			
		||||
        # power cannot be changed in gain mode
 | 
			
		||||
        try:
 | 
			
		||||
            p_start, p_stop, p_step = equipment['SI']['default'].power_range_db
 | 
			
		||||
            p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1
 | 
			
		||||
            power_range = list(linspace(p_start, p_stop, p_num))
 | 
			
		||||
        except TypeError:
 | 
			
		||||
            print('invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]')
 | 
			
		||||
    for dp_db in power_range:
 | 
			
		||||
        req.power = db2lin(pref_ch_db + dp_db) * 1e-3
 | 
			
		||||
        # if initial spectrum did not contain any power, now we need to use this one.
 | 
			
		||||
        # note the initial power defines a differential wrt req.power so that if req.power is set to 2mW (3dBm)
 | 
			
		||||
        # and initial spectrum was set to 0, this sets a initial per channel delta power to -3dB, so that
 | 
			
		||||
        # whatever the equalization, -3 dB is applied on all channels (ie initial power in initial spectrum pre-empts
 | 
			
		||||
        # "--power" option)
 | 
			
		||||
    print(f'Reference used for design: (Input optical power reference in span = {watt2dbm(ref_req.power):.2f}dBm,\n'
 | 
			
		||||
          + f'                            spacing = {ref_req.spacing * 1e-9:.2f}GHz\n'
 | 
			
		||||
          + f'                            nb_channels = {ref_req.nb_channel})')
 | 
			
		||||
    print('\nChannels propagating: (Input optical power deviation in span = '
 | 
			
		||||
          + f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n'
 | 
			
		||||
          + '                       spacing = '
 | 
			
		||||
          + f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n'
 | 
			
		||||
          + '                       transceiver output power = '
 | 
			
		||||
          + f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n'
 | 
			
		||||
          + f'                       nb_channels = {infos.number_of_channels})')
 | 
			
		||||
    for path, power_dbm in zip(propagations_for_path, powers_dbm):
 | 
			
		||||
        if power_mode:
 | 
			
		||||
            print(f'\nPropagating with input power = {ansi_escapes.cyan}{lin2db(req.power*1e3):.2f} dBm{ansi_escapes.reset}:')
 | 
			
		||||
            print(f'Input optical power reference in span = {ansi_escapes.cyan}{power_dbm:.2f} '
 | 
			
		||||
                  + f'dBm{ansi_escapes.reset}:')
 | 
			
		||||
        else:
 | 
			
		||||
            print(f'\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
 | 
			
		||||
        infos = propagate(path, req, equipment)
 | 
			
		||||
        if len(power_range) == 1:
 | 
			
		||||
            print('\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
 | 
			
		||||
        if len(powers_dbm) == 1:
 | 
			
		||||
            for elem in path:
 | 
			
		||||
                print(elem)
 | 
			
		||||
            if power_mode:
 | 
			
		||||
                print(f'\nTransmission result for input power = {lin2db(req.power*1e3):.2f} dBm:')
 | 
			
		||||
                print(f'\nTransmission result for input optical power reference in span = {power_dbm:.2f} dBm:')
 | 
			
		||||
            else:
 | 
			
		||||
                print(f'\nTransmission results:')
 | 
			
		||||
            print(f'  Final GSNR (0.1 nm): {ansi_escapes.cyan}{mean(destination.snr_01nm):.02f} dB{ansi_escapes.reset}')
 | 
			
		||||
@@ -319,83 +299,50 @@ 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)
 | 
			
		||||
 | 
			
		||||
    _logger.info(f'Computing path requests {args.service_filename.name} into JSON format')
 | 
			
		||||
 | 
			
		||||
    (equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
 | 
			
		||||
    (equipment, network) = \
 | 
			
		||||
        load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
 | 
			
		||||
 | 
			
		||||
    # Build the network once using the default power defined in SI in eqpt config
 | 
			
		||||
    # TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
 | 
			
		||||
    # spacing, f_min and f_max
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
    if args.save_network is not None:
 | 
			
		||||
        save_network(network, args.save_network)
 | 
			
		||||
        print(f'Network (after autodesign) saved to {args.save_network}')
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        build_network(network, equipment, p_db, p_total_db, args.no_insert_edfas)
 | 
			
		||||
        network, _, _ = designed_network(equipment, network, no_insert_edfas=args.no_insert_edfas)
 | 
			
		||||
        data = load_requests(args.service_filename, equipment, bidir=args.bidir,
 | 
			
		||||
                             network=network, network_filename=args.topology)
 | 
			
		||||
        _data = requests_from_json(data, equipment)
 | 
			
		||||
        oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result = \
 | 
			
		||||
            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)
 | 
			
		||||
    except exceptions.ConfigurationError as e:
 | 
			
		||||
        print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    if args.save_network is not None:
 | 
			
		||||
        save_network(network, args.save_network)
 | 
			
		||||
        print(f'{ansi_escapes.blue}Network (after autodesign) saved to {args.save_network}{ansi_escapes.reset}')
 | 
			
		||||
    oms_list = build_oms_list(network, equipment)
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        data = load_requests(args.service_filename, equipment, bidir=args.bidir,
 | 
			
		||||
                             network=network, network_filename=args.topology)
 | 
			
		||||
        rqs = requests_from_json(data, equipment)
 | 
			
		||||
    except exceptions.ServiceError as e:
 | 
			
		||||
        print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    # check that request ids are unique. Non unique ids, may
 | 
			
		||||
    # mess the computation: better to stop the computation
 | 
			
		||||
    all_ids = [r.request_id for r in rqs]
 | 
			
		||||
    if len(all_ids) != len(set(all_ids)):
 | 
			
		||||
        for item in list(set(all_ids)):
 | 
			
		||||
            all_ids.remove(item)
 | 
			
		||||
        msg = f'Requests id {all_ids} are not unique'
 | 
			
		||||
        _logger.critical(msg)
 | 
			
		||||
        sys.exit()
 | 
			
		||||
    rqs = correct_json_route_list(network, rqs)
 | 
			
		||||
 | 
			
		||||
    # pths = compute_path(network, equipment, rqs)
 | 
			
		||||
    dsjn = disjunctions_from_json(data)
 | 
			
		||||
 | 
			
		||||
    print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}')
 | 
			
		||||
    print(dsjn)
 | 
			
		||||
    # need to warn or correct in case of wrong disjunction form
 | 
			
		||||
    # disjunction must not be repeated with same or different ids
 | 
			
		||||
    dsjn = deduplicate_disjunctions(dsjn)
 | 
			
		||||
 | 
			
		||||
    # Aggregate demands with same exact constraints
 | 
			
		||||
    print(f'{ansi_escapes.blue}Aggregating similar requests{ansi_escapes.reset}')
 | 
			
		||||
 | 
			
		||||
    rqs, dsjn = requests_aggregation(rqs, dsjn)
 | 
			
		||||
    # TODO export novel set of aggregated demands in a json file
 | 
			
		||||
 | 
			
		||||
    print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}')
 | 
			
		||||
    print(rqs)
 | 
			
		||||
 | 
			
		||||
    print(f'{ansi_escapes.blue}Computing all paths with constraints{ansi_escapes.reset}')
 | 
			
		||||
    try:
 | 
			
		||||
        pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
 | 
			
		||||
    except exceptions.DisjunctionError as this_e:
 | 
			
		||||
        print(f'{ansi_escapes.red}Disjunction error:{ansi_escapes.reset} {this_e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    print(f'{ansi_escapes.blue}Propagating on selected path{ansi_escapes.reset}')
 | 
			
		||||
    propagatedpths, reversed_pths, reversed_propagatedpths = compute_path_with_disjunction(network, equipment, rqs, pths)
 | 
			
		||||
    # 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.
 | 
			
		||||
 | 
			
		||||
    pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
 | 
			
		||||
    except exceptions.ServiceError as e:
 | 
			
		||||
        print(f'Service error: {e}')
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
    print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}')
 | 
			
		||||
    print(dsjn)
 | 
			
		||||
    print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}')
 | 
			
		||||
    print(_data)
 | 
			
		||||
 | 
			
		||||
    print(f'{ansi_escapes.blue}Result summary{ansi_escapes.reset}')
 | 
			
		||||
    header = ['req id', '  demand', ' GSNR@bandwidth A-Z (Z-A)', ' GSNR@0.1nm A-Z (Z-A)',
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@ class Eqpt(object):
 | 
			
		||||
        'east_att_in': 0,
 | 
			
		||||
        'east_amp_gain': None,
 | 
			
		||||
        'east_amp_dp': None,
 | 
			
		||||
        'east_tilt': 0,
 | 
			
		||||
        'east_tilt_vs_wavelength': 0,
 | 
			
		||||
        'east_att_out': None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -345,13 +345,13 @@ def create_east_eqpt_element(node):
 | 
			
		||||
        eqpt['type_variety'] = f'{node.east_amp_type}'
 | 
			
		||||
        eqpt['operational'] = {'gain_target': node.east_amp_gain,
 | 
			
		||||
                               'delta_p':     node.east_amp_dp,
 | 
			
		||||
                               'tilt_target': node.east_tilt,
 | 
			
		||||
                               'tilt_target': node.east_tilt_vs_wavelength,
 | 
			
		||||
                               'out_voa':     node.east_att_out}
 | 
			
		||||
    elif node.east_amp_type.lower() == '':
 | 
			
		||||
        eqpt['type'] = 'Edfa'
 | 
			
		||||
        eqpt['operational'] = {'gain_target': node.east_amp_gain,
 | 
			
		||||
                               'delta_p':     node.east_amp_dp,
 | 
			
		||||
                               'tilt_target': node.east_tilt,
 | 
			
		||||
                               'tilt_target': node.east_tilt_vs_wavelength,
 | 
			
		||||
                               'out_voa':     node.east_att_out}
 | 
			
		||||
    elif node.east_amp_type.lower() == 'fused':
 | 
			
		||||
        # fused edfa variety is a hack to indicate that there should not be
 | 
			
		||||
@@ -378,12 +378,12 @@ def create_west_eqpt_element(node):
 | 
			
		||||
        eqpt['type_variety'] = f'{node.west_amp_type}'
 | 
			
		||||
        eqpt['operational'] = {'gain_target': node.west_amp_gain,
 | 
			
		||||
                               'delta_p':     node.west_amp_dp,
 | 
			
		||||
                               'tilt_target': node.west_tilt,
 | 
			
		||||
                               'tilt_target': node.west_tilt_vs_wavelength,
 | 
			
		||||
                               'out_voa':     node.west_att_out}
 | 
			
		||||
    elif node.west_amp_type.lower() == '':
 | 
			
		||||
        eqpt['operational'] = {'gain_target': node.west_amp_gain,
 | 
			
		||||
                               'delta_p':     node.west_amp_dp,
 | 
			
		||||
                               'tilt_target': node.west_tilt,
 | 
			
		||||
                               'tilt_target': node.west_tilt_vs_wavelength,
 | 
			
		||||
                               'out_voa':     node.west_att_out}
 | 
			
		||||
    elif node.west_amp_type.lower() == 'fused':
 | 
			
		||||
        eqpt['type'] = 'Fused'
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,15 @@ from pathlib import Path
 | 
			
		||||
import json
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
from numpy import arange
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
 | 
			
		||||
from gnpy.core import elements
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params, find_type_variety
 | 
			
		||||
from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError
 | 
			
		||||
from gnpy.core.science_utils import estimate_nf_model
 | 
			
		||||
from gnpy.core.info import Carrier
 | 
			
		||||
from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions
 | 
			
		||||
from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT
 | 
			
		||||
from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions, dbm2watt
 | 
			
		||||
from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT, EdfaParams, MultiBandParams
 | 
			
		||||
from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth
 | 
			
		||||
from gnpy.topology.spectrum_assignment import mvalue_to_slots
 | 
			
		||||
from gnpy.tools.convert import xls_to_json_data
 | 
			
		||||
@@ -51,9 +52,10 @@ class _JsonThing:
 | 
			
		||||
        clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
 | 
			
		||||
        for k, v in default_values.items():
 | 
			
		||||
            setattr(self, k, clean_kwargs.get(k, v))
 | 
			
		||||
            if k not in clean_kwargs and name != 'Amp':
 | 
			
		||||
                msg = f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' \
 | 
			
		||||
                    + f'\n default value is {k} = {v}'
 | 
			
		||||
            if k not in clean_kwargs and name != 'Amp' and v is not None and v != []:
 | 
			
		||||
                # do not show this warning if the default value is None
 | 
			
		||||
                msg = f'\n\tWARNING missing {k} attribute in eqpt_config.json[{name}]' \
 | 
			
		||||
                    + f'\n\tdefault value is {k} = {v}\n'
 | 
			
		||||
                _logger.warning(msg)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +69,8 @@ class SI(_JsonThing):
 | 
			
		||||
        "power_range_db": [0, 0, 0.5],
 | 
			
		||||
        "roll_off": 0.15,
 | 
			
		||||
        "tx_osnr": 45,
 | 
			
		||||
        "sys_margins": 0
 | 
			
		||||
        "sys_margins": 0,
 | 
			
		||||
        "tx_power_dbm": None  # optional value in SI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs):
 | 
			
		||||
@@ -95,13 +98,15 @@ class Span(_JsonThing):
 | 
			
		||||
 | 
			
		||||
class Roadm(_JsonThing):
 | 
			
		||||
    default_values = {
 | 
			
		||||
        'type_variety': 'default',
 | 
			
		||||
        'add_drop_osnr': 100,
 | 
			
		||||
        'pmd': 0,
 | 
			
		||||
        'pdl': 0,
 | 
			
		||||
        'restrictions': {
 | 
			
		||||
            'preamp_variety_list': [],
 | 
			
		||||
            'booster_variety_list': []
 | 
			
		||||
        }
 | 
			
		||||
        },
 | 
			
		||||
        'roadm-path-impairments': []
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs):
 | 
			
		||||
@@ -180,35 +185,7 @@ class RamanFiber(Fiber):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Amp(_JsonThing):
 | 
			
		||||
    default_values = {
 | 
			
		||||
        'f_min': 191.35e12,
 | 
			
		||||
        'f_max': 196.1e12,
 | 
			
		||||
        'type_variety': '',
 | 
			
		||||
        'type_def': '',
 | 
			
		||||
        'gain_flatmax': None,
 | 
			
		||||
        'gain_min': None,
 | 
			
		||||
        'p_max': None,
 | 
			
		||||
        'nf_model': None,
 | 
			
		||||
        'dual_stage_model': None,
 | 
			
		||||
        'preamp_variety': None,
 | 
			
		||||
        'booster_variety': None,
 | 
			
		||||
        'nf_min': None,
 | 
			
		||||
        'nf_max': None,
 | 
			
		||||
        'nf_coef': None,
 | 
			
		||||
        'nf0': None,
 | 
			
		||||
        'nf_fit_coeff': None,
 | 
			
		||||
        'nf_ripple': 0,
 | 
			
		||||
        'dgt': None,
 | 
			
		||||
        'gain_ripple': 0,
 | 
			
		||||
        'tilt_ripple': 0,
 | 
			
		||||
        'f_ripple_ref': None,
 | 
			
		||||
        'out_voa_auto': False,
 | 
			
		||||
        'allowed_for_design': False,
 | 
			
		||||
        'raman': False,
 | 
			
		||||
        'pmd': 0,
 | 
			
		||||
        'pdl': 0,
 | 
			
		||||
        'advance_configurations_from_json': None
 | 
			
		||||
    }
 | 
			
		||||
    default_values = EdfaParams.default_values
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs):
 | 
			
		||||
        self.update_attr(self.default_values, kwargs, 'Amp')
 | 
			
		||||
@@ -216,11 +193,12 @@ class Amp(_JsonThing):
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def from_json(cls, filename, **kwargs):
 | 
			
		||||
        config = Path(filename).parent / 'default_edfa_config.json'
 | 
			
		||||
 | 
			
		||||
        # default_edfa_config.json assumes a DGT profile independantly from fmin/fmax, that's a generic profile
 | 
			
		||||
        type_variety = kwargs['type_variety']
 | 
			
		||||
        type_def = kwargs.get('type_def', 'variable_gain')  # default compatibility with older json eqpt files
 | 
			
		||||
        nf_def = None
 | 
			
		||||
        dual_stage_def = None
 | 
			
		||||
        amplifiers = None
 | 
			
		||||
 | 
			
		||||
        if type_def == 'fixed_gain':
 | 
			
		||||
            try:
 | 
			
		||||
@@ -265,16 +243,25 @@ class Amp(_JsonThing):
 | 
			
		||||
                preamp_variety = kwargs.pop('preamp_variety')
 | 
			
		||||
                booster_variety = kwargs.pop('booster_variety')
 | 
			
		||||
            except KeyError:
 | 
			
		||||
                msg = f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config'
 | 
			
		||||
                raise EquipmentConfigError(msg)
 | 
			
		||||
                raise EquipmentConfigError(f'missing preamp/booster variety input for amplifier: {type_variety}'
 | 
			
		||||
                                           + ' in equipment config')
 | 
			
		||||
            dual_stage_def = Model_dual_stage(preamp_variety, booster_variety)
 | 
			
		||||
        elif type_def == 'multi_band':
 | 
			
		||||
            amplifiers = kwargs['amplifiers']
 | 
			
		||||
        else:
 | 
			
		||||
            raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist')
 | 
			
		||||
 | 
			
		||||
        json_data = load_json(config)
 | 
			
		||||
 | 
			
		||||
        # raise an error if config does not contain f_min, f_max
 | 
			
		||||
        if 'f_min' not in json_data or 'f_max' not in json_data:
 | 
			
		||||
            raise EquipmentConfigError('default Edfa config does not contain f_min and f_max values.'
 | 
			
		||||
                                       + ' Please correct file.')
 | 
			
		||||
        # use f_min, f_max from kwargs
 | 
			
		||||
        if 'f_min' in kwargs:
 | 
			
		||||
            json_data.pop('f_min', None)
 | 
			
		||||
            json_data.pop('f_max', None)
 | 
			
		||||
        return cls(**{**kwargs, **json_data,
 | 
			
		||||
                      'nf_model': nf_def, 'dual_stage_model': dual_stage_def})
 | 
			
		||||
                      'nf_model': nf_def, 'dual_stage_model': dual_stage_def, 'multi_band': amplifiers})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _automatic_spacing(baud_rate):
 | 
			
		||||
@@ -294,7 +281,7 @@ def _spectrum_from_json(json_data):
 | 
			
		||||
    label should be different for each partition
 | 
			
		||||
    >>> json_data = {'spectrum': \
 | 
			
		||||
        [{'f_min': 193.2e12, 'f_max': 193.4e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15, \
 | 
			
		||||
            'delta_pdb': 1, 'tx_osnr': 45},\
 | 
			
		||||
            'delta_pdb': 1, 'tx_osnr': 45, 'tx_power_dbm': -7},\
 | 
			
		||||
        {'f_min': 193.4625e12, 'f_max': 193.9875e12, 'slot_width': 75e9, 'baud_rate': 64e9, 'roll_off': 0.15},\
 | 
			
		||||
        {'f_min': 194.075e12, 'f_max': 194.075e12, 'slot_width': 100e9, 'baud_rate': 90e9, 'roll_off': 0.15},\
 | 
			
		||||
        {'f_min': 194.2e12, 'f_max': 194.35e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15}]}
 | 
			
		||||
@@ -302,24 +289,24 @@ def _spectrum_from_json(json_data):
 | 
			
		||||
    >>> for k, v in spectrum.items():
 | 
			
		||||
    ...     print(f'{k}: {v}')
 | 
			
		||||
    ...
 | 
			
		||||
    193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
 | 
			
		||||
    193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
 | 
			
		||||
    193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
 | 
			
		||||
    193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
 | 
			
		||||
    193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G')
 | 
			
		||||
    193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G')
 | 
			
		||||
    194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, label='2-90.00G')
 | 
			
		||||
    194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
 | 
			
		||||
    194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
 | 
			
		||||
    194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
 | 
			
		||||
    194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G')
 | 
			
		||||
    193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
 | 
			
		||||
    193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
 | 
			
		||||
    193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
 | 
			
		||||
    193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
 | 
			
		||||
    193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
 | 
			
		||||
    193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
 | 
			
		||||
    194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='2-90.00G')
 | 
			
		||||
    194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
 | 
			
		||||
    194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
 | 
			
		||||
    194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
 | 
			
		||||
    194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
 | 
			
		||||
    """
 | 
			
		||||
    spectrum = {}
 | 
			
		||||
    json_data = sorted(json_data, key=lambda x: x['f_min'])
 | 
			
		||||
@@ -335,6 +322,9 @@ def _spectrum_from_json(json_data):
 | 
			
		||||
        # default tx_osnr is set to 40 dB
 | 
			
		||||
        if 'tx_osnr' not in part:
 | 
			
		||||
            part['tx_osnr'] = 40
 | 
			
		||||
        # default tx_power_dbm is set to 0 dBn
 | 
			
		||||
        if 'tx_power_dbm' not in part:
 | 
			
		||||
            part['tx_power_dbm'] = 0
 | 
			
		||||
        # starting freq is exactly f_min to be consistent with utils.automatic_nch
 | 
			
		||||
        # first partition min occupation is f_min - slot_width / 2 (central_frequency is f_min)
 | 
			
		||||
        # supposes that carriers are centered on frequency
 | 
			
		||||
@@ -353,7 +343,8 @@ def _spectrum_from_json(json_data):
 | 
			
		||||
                                   part['slot_width']):
 | 
			
		||||
            spectrum[current_freq] = Carrier(delta_pdb=part['delta_pdb'], baud_rate=part['baud_rate'],
 | 
			
		||||
                                             slot_width=part['slot_width'], roll_off=part['roll_off'],
 | 
			
		||||
                                             tx_osnr=part['tx_osnr'], label=part['label'])
 | 
			
		||||
                                             tx_osnr=part['tx_osnr'], tx_power=dbm2watt(part['tx_power_dbm']),
 | 
			
		||||
                                             label=part['label'])
 | 
			
		||||
        previous_part_max_freq = current_freq + part['slot_width'] / 2
 | 
			
		||||
    return spectrum
 | 
			
		||||
 | 
			
		||||
@@ -387,13 +378,40 @@ def _update_dual_stage(equipment):
 | 
			
		||||
    return equipment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _update_band(equipment: dict) -> dict:
 | 
			
		||||
    """Creates a list of bands for this amplifier, and remove other parameters which are not applicable
 | 
			
		||||
    """
 | 
			
		||||
    amp_dict = equipment['Edfa']
 | 
			
		||||
    for amplifier in amp_dict.values():
 | 
			
		||||
        if amplifier.type_def != 'multi_band':
 | 
			
		||||
            amplifier.bands = [{'f_min': amplifier.f_min,
 | 
			
		||||
                                'f_max': amplifier.f_max}]
 | 
			
		||||
            # updates band parameter
 | 
			
		||||
        else:
 | 
			
		||||
            _bands = [{'f_min': amp_dict[a].f_min,
 | 
			
		||||
                       'f_max': amp_dict[a].f_max} for a in amp_dict[amplifier.type_variety].multi_band]
 | 
			
		||||
            # remove duplicates
 | 
			
		||||
            amplifier.bands = []
 | 
			
		||||
            for b in _bands:
 | 
			
		||||
                if b not in amplifier.bands:
 | 
			
		||||
                    amplifier.bands.append(b)
 | 
			
		||||
            # remove non applicable parameters
 | 
			
		||||
            for key in ['f_min', 'f_max', 'gain_flatmax', 'gain_min', 'p_max', 'nf_model', 'dual_stage_model',
 | 
			
		||||
                        'nf_fit_coeff', 'nf_ripple', 'dgt', 'gain_ripple']:
 | 
			
		||||
                delattr(amplifier, key)
 | 
			
		||||
 | 
			
		||||
    return equipment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _roadm_restrictions_sanity_check(equipment):
 | 
			
		||||
    """verifies that booster and preamp restrictions specified in roadm equipment are listed in the edfa."""
 | 
			
		||||
    restrictions = equipment['Roadm']['default'].restrictions['booster_variety_list'] + \
 | 
			
		||||
        equipment['Roadm']['default'].restrictions['preamp_variety_list']
 | 
			
		||||
    for amp_name in restrictions:
 | 
			
		||||
        if amp_name not in equipment['Edfa']:
 | 
			
		||||
            raise EquipmentConfigError(f'ROADM restriction {amp_name} does not refer to a defined EDFA name')
 | 
			
		||||
    for roadm_type, roadm_eqpt in equipment['Roadm'].items():
 | 
			
		||||
        restrictions = roadm_eqpt.restrictions['booster_variety_list'] + \
 | 
			
		||||
            roadm_eqpt.restrictions['preamp_variety_list']
 | 
			
		||||
        for amp_name in restrictions:
 | 
			
		||||
            if amp_name not in equipment['Edfa']:
 | 
			
		||||
                raise EquipmentConfigError(f'ROADM {roadm_type} restriction {amp_name} does not refer to a '
 | 
			
		||||
                                           + 'defined EDFA name')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _check_fiber_vs_raman_fiber(equipment):
 | 
			
		||||
@@ -434,6 +452,9 @@ def _equipment_from_json(json_data, filename):
 | 
			
		||||
            elif key == 'Roadm':
 | 
			
		||||
                equipment[key][subkey] = Roadm(**entry)
 | 
			
		||||
            elif key == 'SI':
 | 
			
		||||
                # use power_dbm value for tx_power_dbm if the key is not in 'SI'
 | 
			
		||||
                # if 'tx_power_dbm' not in entry.keys():
 | 
			
		||||
                #     entry['tx_power_dbm'] = entry['power_dbm']
 | 
			
		||||
                equipment[key][subkey] = SI(**entry)
 | 
			
		||||
            elif key == 'Transceiver':
 | 
			
		||||
                equipment[key][subkey] = Transceiver(**entry)
 | 
			
		||||
@@ -443,7 +464,13 @@ def _equipment_from_json(json_data, filename):
 | 
			
		||||
                raise EquipmentConfigError(f'Unrecognized network element type "{key}"')
 | 
			
		||||
    _check_fiber_vs_raman_fiber(equipment)
 | 
			
		||||
    equipment = _update_dual_stage(equipment)
 | 
			
		||||
    equipment = _update_band(equipment)
 | 
			
		||||
    _roadm_restrictions_sanity_check(equipment)
 | 
			
		||||
    possible_SI = list(equipment['SI'].keys())
 | 
			
		||||
    if 'default' not in possible_SI:
 | 
			
		||||
        # Use "default" key in the equipment, using the first listed keys
 | 
			
		||||
        equipment['SI']['default'] = equipment['SI'][possible_SI[0]]
 | 
			
		||||
        del equipment['SI'][possible_SI[0]]
 | 
			
		||||
    return equipment
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -479,6 +506,8 @@ def _cls_for(equipment_type):
 | 
			
		||||
        return elements.Fiber
 | 
			
		||||
    elif equipment_type == 'RamanFiber':
 | 
			
		||||
        return elements.RamanFiber
 | 
			
		||||
    elif equipment_type == 'Multiband_amplifier':
 | 
			
		||||
        return elements.Multiband_amplifier
 | 
			
		||||
    else:
 | 
			
		||||
        raise ConfigurationError(f'Unknown network equipment "{equipment_type}"')
 | 
			
		||||
 | 
			
		||||
@@ -492,7 +521,55 @@ def network_from_json(json_data, equipment):
 | 
			
		||||
        typ = el_config.pop('type')
 | 
			
		||||
        variety = el_config.pop('type_variety', 'default')
 | 
			
		||||
        cls = _cls_for(typ)
 | 
			
		||||
        if typ == 'Fused':
 | 
			
		||||
        if typ == 'Transceiver':
 | 
			
		||||
            temp = el_config.setdefault('params', {})
 | 
			
		||||
        if typ == 'Multiband_amplifier':
 | 
			
		||||
            if variety in ['default', '']:
 | 
			
		||||
                extra_params = None
 | 
			
		||||
                temp = el_config.setdefault('params', {})
 | 
			
		||||
                temp = merge_amplifier_restrictions(temp, deepcopy(MultiBandParams.default_values))
 | 
			
		||||
                el_config['params'] = temp
 | 
			
		||||
            else:
 | 
			
		||||
                extra_params = equipment['Edfa'][variety]
 | 
			
		||||
                temp = el_config.setdefault('params', {})
 | 
			
		||||
                # use config params preferably to library params, only use library params to fill in
 | 
			
		||||
                # the missing attribute
 | 
			
		||||
                temp = merge_amplifier_restrictions(temp, deepcopy(extra_params.__dict__))
 | 
			
		||||
                el_config['params'] = temp
 | 
			
		||||
                el_config['type_variety'] = variety
 | 
			
		||||
            # if config does not contain any amp list create one
 | 
			
		||||
            amps = el_config.setdefault('amplifiers', [])
 | 
			
		||||
            for amp in amps:
 | 
			
		||||
                amp_variety = amp['type_variety']    # juste pour essayer
 | 
			
		||||
                amp_extra_params = equipment['Edfa'][amp_variety]
 | 
			
		||||
                temp = amp.setdefault('params', {})
 | 
			
		||||
                temp = merge_amplifier_restrictions(temp, amp_extra_params.__dict__)
 | 
			
		||||
                amp['params'] = temp
 | 
			
		||||
                amp['type_variety'] = amp_variety
 | 
			
		||||
            # check type_variety consistant with amps type_variety
 | 
			
		||||
            if amps:
 | 
			
		||||
                try:
 | 
			
		||||
                    multiband_type_variety = find_type_variety([a['type_variety'] for a in amps], equipment)
 | 
			
		||||
                except ConfigurationError as e:
 | 
			
		||||
                    msg = f'Node {el_config["uid"]}: {e}'
 | 
			
		||||
                    raise ConfigurationError(msg)
 | 
			
		||||
                if variety is not None and variety != multiband_type_variety:
 | 
			
		||||
                    raise ConfigurationError(f'In node {el_config["uid"]}: multiband amplifier type_variety is not '
 | 
			
		||||
                                             + 'consistent with its amps type varieties.')
 | 
			
		||||
            if not amps and extra_params is not None:
 | 
			
		||||
                # the amp config does not contain the amplifiers operational settings, but has a type_variety
 | 
			
		||||
                # defined so that it is possible to create the template of amps for design for each band. This
 | 
			
		||||
                # defines the default design bands.
 | 
			
		||||
                # This lopp populates each amp with default values, for each band
 | 
			
		||||
                for band in extra_params.bands:
 | 
			
		||||
                    params = {k: v for k, v in Amp.default_values.items()}
 | 
			
		||||
                    # update frequencies with band values
 | 
			
		||||
                    params['f_min'] = band['f_min']
 | 
			
		||||
                    params['f_max'] = band['f_max']
 | 
			
		||||
                    amps.append({'params': params})
 | 
			
		||||
            # without type_variety, it is not possible to set the amplifier dict at this point: need to wait
 | 
			
		||||
            # for design, and use user defined design-bands
 | 
			
		||||
        elif typ == 'Fused':
 | 
			
		||||
            # well, there's no variety for the 'Fused' node type
 | 
			
		||||
            pass
 | 
			
		||||
        elif variety in equipment[typ]:
 | 
			
		||||
@@ -509,7 +586,7 @@ def network_from_json(json_data, equipment):
 | 
			
		||||
            temp = merge_amplifier_restrictions(temp, extra_params)
 | 
			
		||||
            el_config['params'] = temp
 | 
			
		||||
            el_config['type_variety'] = variety
 | 
			
		||||
        elif (typ in ['Fiber', 'RamanFiber']):
 | 
			
		||||
        elif (typ in ['Fiber', 'RamanFiber', 'Roadm']):
 | 
			
		||||
            raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
 | 
			
		||||
                                     '\nplease check it is properly defined in the eqpt_config json file')
 | 
			
		||||
        elif typ == 'Edfa':
 | 
			
		||||
@@ -600,7 +677,6 @@ def requests_from_json(json_data, equipment):
 | 
			
		||||
        params['nodes_list'] = [n['num-unnum-hop']['node-id'] for n in nd_list]
 | 
			
		||||
        params['loose_list'] = [n['num-unnum-hop']['hop-type'] for n in nd_list]
 | 
			
		||||
        # recover trx physical param (baudrate, ...) from type and mode
 | 
			
		||||
        # in trx_mode_params optical power is read from equipment['SI']['default'] and
 | 
			
		||||
        # nb_channel is computed based on min max frequency and spacing
 | 
			
		||||
        try:
 | 
			
		||||
            trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
			
		||||
@@ -608,13 +684,11 @@ def requests_from_json(json_data, equipment):
 | 
			
		||||
            msg = f'Equipment Config error in {req["request-id"]}: {e}'
 | 
			
		||||
            raise EquipmentConfigError(msg) from e
 | 
			
		||||
        params.update(trx_params)
 | 
			
		||||
        # optical power might be set differently in the request. if it is indicated then the
 | 
			
		||||
        # params['power'] is updated
 | 
			
		||||
        try:
 | 
			
		||||
            if req['path-constraints']['te-bandwidth']['output-power']:
 | 
			
		||||
                params['power'] = req['path-constraints']['te-bandwidth']['output-power']
 | 
			
		||||
        except KeyError:
 | 
			
		||||
            pass
 | 
			
		||||
        params['power'] = req['path-constraints']['te-bandwidth'].get('output-power')
 | 
			
		||||
        # params must not be None, but user can set to None: catch this case
 | 
			
		||||
        if params['power'] is None:
 | 
			
		||||
            params['power'] = dbm2watt(equipment['SI']['default'].power_dbm)
 | 
			
		||||
 | 
			
		||||
        # same process for nb-channel
 | 
			
		||||
        f_min = params['f_min']
 | 
			
		||||
        f_max_from_si = params['f_max']
 | 
			
		||||
@@ -634,6 +708,14 @@ def requests_from_json(json_data, equipment):
 | 
			
		||||
            params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
 | 
			
		||||
        except KeyError:
 | 
			
		||||
            pass
 | 
			
		||||
        params['tx_power'] = req['path-constraints']['te-bandwidth'].get('tx_power')
 | 
			
		||||
        default_tx_power_dbm = equipment['SI']['default'].tx_power_dbm
 | 
			
		||||
        if params['tx_power'] is None:
 | 
			
		||||
            # use request's input power in span instead
 | 
			
		||||
            params['tx_power'] = params['power']
 | 
			
		||||
            if default_tx_power_dbm is not None:
 | 
			
		||||
                # use default tx power
 | 
			
		||||
                params['tx_power'] = dbm2watt(default_tx_power_dbm)
 | 
			
		||||
        _check_one_request(params, f_max_from_si)
 | 
			
		||||
        requests_list.append(PathRequest(**params))
 | 
			
		||||
    return requests_list
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										248
									
								
								gnpy/tools/worker_utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								gnpy/tools/worker_utils.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,248 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
gnpy.tools.worker_utils
 | 
			
		||||
=======================
 | 
			
		||||
 | 
			
		||||
Common code for CLI examples and API
 | 
			
		||||
'''
 | 
			
		||||
import logging
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from typing import Union, List, Tuple
 | 
			
		||||
from numpy import linspace
 | 
			
		||||
from networkx import DiGraph
 | 
			
		||||
 | 
			
		||||
from gnpy.core.utils import automatic_nch, watt2dbm, dbm2watt, pretty_summary_print, per_label_average
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.core.network import add_missing_elements_in_network, design_network
 | 
			
		||||
from gnpy.core import exceptions
 | 
			
		||||
from gnpy.core.info import SpectralInformation
 | 
			
		||||
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum, OMS
 | 
			
		||||
from gnpy.topology.request import correct_json_route_list, deduplicate_disjunctions, requests_aggregation, \
 | 
			
		||||
    compute_path_dsjctn, compute_path_with_disjunction, ResultElement, PathRequest, Disjunction, \
 | 
			
		||||
    compute_constrained_path, propagate
 | 
			
		||||
from gnpy.tools.json_io import requests_from_json, disjunctions_from_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def designed_network(equipment: dict, network: DiGraph, source: str = None, destination: str = None,
 | 
			
		||||
                     nodes_list: List[str] = None, loose_list: List[str] = None,
 | 
			
		||||
                     initial_spectrum: dict = None, no_insert_edfas: bool = False,
 | 
			
		||||
                     args_power: Union[str, float, int] = None,
 | 
			
		||||
                     service_req: PathRequest = None) -> Tuple[DiGraph, PathRequest, PathRequest]:
 | 
			
		||||
    """Build the reference channels based on inputs and design the network for this reference channel, and build the
 | 
			
		||||
    channel to be propagated for the single transmission script.
 | 
			
		||||
 | 
			
		||||
    Reference channel (target input power in spans, nb of channels, transceiver output power) is built using
 | 
			
		||||
    equipment['SI'] information. If indicated,  with target input power in spans is updated with args_power.
 | 
			
		||||
    Channel to be propagated is using the same channel reference, except if different settings are provided
 | 
			
		||||
    with service_req and initial_spectrum. The service to be propagated uses specified source, destination
 | 
			
		||||
    and list nodes_list of include nodes constraint except if the service_req is specified.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
    - equipment: a dictionary containing equipment information.
 | 
			
		||||
    - network: a directed graph representing the initial network.
 | 
			
		||||
    - no_insert_edfas: a boolean indicating whether to insert EDFAs in the network.
 | 
			
		||||
    - args_power: the power to be used for the network design.
 | 
			
		||||
    - service_req: the service request the user wants to propagate.
 | 
			
		||||
    - source: the source node for the channel to be propagated if no service_req is specified.
 | 
			
		||||
    - destination: the destination node for the channel to be propagated if no service_req is specified.
 | 
			
		||||
    - nodes_list: a list of nodes to be included ifor the channel to be propagated if no service_req is specified.
 | 
			
		||||
    - loose_list: a list of loose nodes to be included in the network design.
 | 
			
		||||
    - initial_spectrum: a dictionary representing the initial spectrum to propagate.
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
    - The designed network.
 | 
			
		||||
    - The channel to propagate.
 | 
			
		||||
    - The reference channel used for the design.
 | 
			
		||||
    """
 | 
			
		||||
    if loose_list is None:
 | 
			
		||||
        loose_list = []
 | 
			
		||||
    if nodes_list is None:
 | 
			
		||||
        nodes_list = []
 | 
			
		||||
    if not no_insert_edfas:
 | 
			
		||||
        add_missing_elements_in_network(network, equipment)
 | 
			
		||||
 | 
			
		||||
    if not nodes_list:
 | 
			
		||||
        if destination:
 | 
			
		||||
            nodes_list = [destination]
 | 
			
		||||
            loose_list = ['STRICT']
 | 
			
		||||
        else:
 | 
			
		||||
            nodes_list = []
 | 
			
		||||
            loose_list = []
 | 
			
		||||
    params = {
 | 
			
		||||
        'request_id': 'reference',
 | 
			
		||||
        'trx_type': '',
 | 
			
		||||
        'trx_mode': '',
 | 
			
		||||
        'source': source,
 | 
			
		||||
        'destination': destination,
 | 
			
		||||
        'bidir': False,
 | 
			
		||||
        'nodes_list': nodes_list,
 | 
			
		||||
        'loose_list': loose_list,
 | 
			
		||||
        'format': '',
 | 
			
		||||
        'path_bandwidth': 0,
 | 
			
		||||
        'effective_freq_slot': None,
 | 
			
		||||
        'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max,
 | 
			
		||||
                                    equipment['SI']['default'].spacing),
 | 
			
		||||
        'power': dbm2watt(equipment['SI']['default'].power_dbm),
 | 
			
		||||
        'tx_power': None
 | 
			
		||||
    }
 | 
			
		||||
    params['tx_power'] = dbm2watt(equipment['SI']['default'].power_dbm)
 | 
			
		||||
    if equipment['SI']['default'].tx_power_dbm is not None:
 | 
			
		||||
        # use SI tx_power if present
 | 
			
		||||
        params['tx_power'] = dbm2watt(equipment['SI']['default'].tx_power_dbm)
 | 
			
		||||
    trx_params = trx_mode_params(equipment)
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
 | 
			
		||||
    # use args_power instead of si
 | 
			
		||||
    if args_power:
 | 
			
		||||
        params['power'] = dbm2watt(float(args_power))
 | 
			
		||||
        if equipment['SI']['default'].tx_power_dbm is None:
 | 
			
		||||
            params['tx_power'] = params['power']
 | 
			
		||||
 | 
			
		||||
    # use si as reference channel
 | 
			
		||||
    reference_channel = PathRequest(**params)
 | 
			
		||||
    # temporary till multiband design feat is available: do not design for L band
 | 
			
		||||
    reference_channel.nb_channel = min(params['nb_channel'], automatic_nch(191.2e12, 196.0e12, params['spacing']))
 | 
			
		||||
 | 
			
		||||
    if service_req:
 | 
			
		||||
        # use service_req as reference channel with si tx_power if service_req tx_power is None
 | 
			
		||||
        if service_req.tx_power is None:
 | 
			
		||||
            service_req.tx_power = params['tx_power']
 | 
			
		||||
        reference_channel = service_req
 | 
			
		||||
 | 
			
		||||
    design_network(reference_channel, network, equipment, set_connector_losses=True, verbose=True)
 | 
			
		||||
 | 
			
		||||
    if initial_spectrum:
 | 
			
		||||
        params['nb_channel'] = len(initial_spectrum)
 | 
			
		||||
 | 
			
		||||
    req = PathRequest(**params)
 | 
			
		||||
    if service_req:
 | 
			
		||||
        req = service_req
 | 
			
		||||
 | 
			
		||||
    req.initial_spectrum = initial_spectrum
 | 
			
		||||
    return network, req, reference_channel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def check_request_path_ids(rqs: List[PathRequest]):
 | 
			
		||||
    """check that request ids are unique. Non unique ids, may
 | 
			
		||||
    mess the computation: better to stop the computation
 | 
			
		||||
    """
 | 
			
		||||
    all_ids = [r.request_id for r in rqs]
 | 
			
		||||
    if len(all_ids) != len(set(all_ids)):
 | 
			
		||||
        for item in list(set(all_ids)):
 | 
			
		||||
            all_ids.remove(item)
 | 
			
		||||
        msg = f'Requests id {all_ids} are not unique'
 | 
			
		||||
        logger.error(msg)
 | 
			
		||||
        raise ValueError(msg)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
    # check that request ids are unique.
 | 
			
		||||
    check_request_path_ids(rqs)
 | 
			
		||||
    rqs = correct_json_route_list(network, rqs)
 | 
			
		||||
    dsjn = disjunctions_from_json(data)
 | 
			
		||||
    logger.info('List of disjunctions:\n%s', dsjn)
 | 
			
		||||
    # need to warn or correct in case of wrong disjunction form
 | 
			
		||||
    # disjunction must not be repeated with same or different ids
 | 
			
		||||
    dsjn = deduplicate_disjunctions(dsjn)
 | 
			
		||||
    logger.info('Aggregating similar requests')
 | 
			
		||||
    rqs, dsjn = requests_aggregation(rqs, dsjn)
 | 
			
		||||
    logger.info('The following services have been requested:\n%s', rqs)
 | 
			
		||||
    # logger.info('Computing all paths with constraints for request %s', optical_path_result_id)
 | 
			
		||||
 | 
			
		||||
    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, 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.
 | 
			
		||||
 | 
			
		||||
    # Allowed user_policy are first_fit and 2partition
 | 
			
		||||
    pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
 | 
			
		||||
    for i, rq in enumerate(rqs):
 | 
			
		||||
        if hasattr(rq, 'OSNR') and rq.OSNR:
 | 
			
		||||
            rq.osnr_with_sys_margin = rq.OSNR + equipment["SI"]["default"].sys_margins
 | 
			
		||||
 | 
			
		||||
    # assumes that list of rqs and list of propgatedpths have same order
 | 
			
		||||
    result = [ResultElement(rq, pth, rpth) for rq, pth, rpth in zip(rqs, propagatedpths, reversed_propagatedpths)]
 | 
			
		||||
    return oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def transmission_simulation(equipment: dict, network: DiGraph, req: PathRequest, ref_req: PathRequest) \
 | 
			
		||||
        -> Tuple[list, List[list], List[Union[float, int]], SpectralInformation]:
 | 
			
		||||
    """Run simulation and returms the propagation result for each power sweep iteration.
 | 
			
		||||
    Args:
 | 
			
		||||
    - equipment: a dictionary containing equipment information.
 | 
			
		||||
    - network: network after being designed using ref_req. Any missing information (amp gain or delta_p) must have
 | 
			
		||||
    been filled using ref_req as reference channel previuos to this function.
 | 
			
		||||
    - req: channel to be propagated.
 | 
			
		||||
    - ref_req: the reference channel used for filling missing information in the network.
 | 
			
		||||
    In case of power sweep, network is redesigned using ref_req whose target input power in span is
 | 
			
		||||
    updated with the power step.
 | 
			
		||||
 | 
			
		||||
    Returns a tuple containing:
 | 
			
		||||
    - path: last propagated path. Power sweep is not possible with gain mode (as gain targets are used)
 | 
			
		||||
    - propagations: list of propagated path for each power iteration
 | 
			
		||||
    - powers_dbm: list of power used for the power sweep
 | 
			
		||||
    - infos: last propagated spectral information
 | 
			
		||||
    """
 | 
			
		||||
    power_mode = equipment['Span']['default'].power_mode
 | 
			
		||||
    logger.info('Power mode is set to %s=> it can be modified in eqpt_config.json - Span', power_mode)
 | 
			
		||||
    # initial network is designed using ref_req. that is that any missing information (amp gain or delta_p) is filled
 | 
			
		||||
    # using this ref_req.power, previous to any sweep requested later on.
 | 
			
		||||
 | 
			
		||||
    pref_ch_db = watt2dbm(ref_req.power)
 | 
			
		||||
    p_ch_db = watt2dbm(req.power)
 | 
			
		||||
    path = compute_constrained_path(network, req)
 | 
			
		||||
    power_range = [0]
 | 
			
		||||
    if power_mode:
 | 
			
		||||
        # power cannot be changed in gain mode
 | 
			
		||||
        try:
 | 
			
		||||
            p_start, p_stop, p_step = equipment['SI']['default'].power_range_db
 | 
			
		||||
            p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1
 | 
			
		||||
            power_range = list(linspace(p_start, p_stop, p_num))
 | 
			
		||||
        except TypeError as e:
 | 
			
		||||
            msg = 'invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]'
 | 
			
		||||
            logger.error(msg)
 | 
			
		||||
            raise exceptions.EquipmentConfigError(msg) from e
 | 
			
		||||
 | 
			
		||||
    logger.info('Now propagating between %s and %s', req.source, req.destination)
 | 
			
		||||
 | 
			
		||||
    propagations = []
 | 
			
		||||
    powers_dbm = []
 | 
			
		||||
    for dp_db in power_range:
 | 
			
		||||
        ref_req.power = dbm2watt(pref_ch_db + dp_db)
 | 
			
		||||
        req.power = dbm2watt(p_ch_db + dp_db)
 | 
			
		||||
 | 
			
		||||
        # Power sweep is made to evaluate different span input powers, so redesign is mandatory for each power,
 | 
			
		||||
        #  but no need to redesign if there are no power sweep
 | 
			
		||||
        if len(power_range) > 1:
 | 
			
		||||
            design_network(ref_req, network.subgraph(path), equipment, set_connector_losses=False, verbose=False)
 | 
			
		||||
 | 
			
		||||
        infos = propagate(path, req, equipment)
 | 
			
		||||
        propagations.append(deepcopy(path))
 | 
			
		||||
        powers_dbm.append(pref_ch_db + dp_db)
 | 
			
		||||
        logger.info('\nChannels propagating: (Input optical power deviation in span = '
 | 
			
		||||
                    + f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n'
 | 
			
		||||
                    + '                       spacing = '
 | 
			
		||||
                    + f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n'
 | 
			
		||||
                    + '                       transceiver output power = '
 | 
			
		||||
                    + f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n'
 | 
			
		||||
                    + f'                       nb_channels = {infos.number_of_channels})')
 | 
			
		||||
        if not power_mode:
 | 
			
		||||
            logger.info('\n\tPropagating using gain targets: Input optical power deviation in span ignored')
 | 
			
		||||
    return path, propagations, powers_dbm, infos
 | 
			
		||||
@@ -16,14 +16,18 @@ See: draft-ietf-teas-yang-path-computation-01.txt
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from collections import namedtuple, OrderedDict
 | 
			
		||||
from typing import List
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
from networkx import (dijkstra_path, NetworkXNoPath,
 | 
			
		||||
                      all_simple_paths, shortest_simple_paths)
 | 
			
		||||
from networkx.utils import pairwise
 | 
			
		||||
from numpy import mean, argmin
 | 
			
		||||
from gnpy.core.elements import Transceiver, Roadm
 | 
			
		||||
from gnpy.core.utils import lin2db
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, ReferenceCarrier
 | 
			
		||||
 | 
			
		||||
from gnpy.core.elements import Transceiver, Roadm, Edfa, Multiband_amplifier
 | 
			
		||||
from gnpy.core.utils import lin2db, find_common_range
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, \
 | 
			
		||||
    demuxed_spectral_information, muxed_spectral_information, SpectralInformation
 | 
			
		||||
from gnpy.core import network as network_module
 | 
			
		||||
from gnpy.core.exceptions import ServiceError, DisjunctionError
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from csv import writer
 | 
			
		||||
@@ -35,7 +39,7 @@ RequestParams = namedtuple('RequestParams', 'request_id source destination bidir
 | 
			
		||||
                           ' trx_mode nodes_list loose_list spacing power nb_channel f_min'
 | 
			
		||||
                           ' f_max format baud_rate OSNR penalties bit_rate'
 | 
			
		||||
                           ' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
 | 
			
		||||
                           ' equalization_offset_db')
 | 
			
		||||
                           ' equalization_offset_db, tx_power')
 | 
			
		||||
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
 | 
			
		||||
                               ' node_diverse disjunctions_req')
 | 
			
		||||
 | 
			
		||||
@@ -64,6 +68,7 @@ class PathRequest:
 | 
			
		||||
        self.bit_rate = params.bit_rate
 | 
			
		||||
        self.roll_off = params.roll_off
 | 
			
		||||
        self.tx_osnr = params.tx_osnr
 | 
			
		||||
        self.tx_power = params.tx_power
 | 
			
		||||
        self.min_spacing = params.min_spacing
 | 
			
		||||
        self.cost = params.cost
 | 
			
		||||
        self.path_bandwidth = params.path_bandwidth
 | 
			
		||||
@@ -94,7 +99,8 @@ class PathRequest:
 | 
			
		||||
                            f'baud_rate:\t{temp} Gbaud',
 | 
			
		||||
                            f'bit_rate:\t{temp2} Gb/s',
 | 
			
		||||
                            f'spacing:\t{self.spacing * 1e-9} GHz',
 | 
			
		||||
                            f'power:  \t{round(lin2db(self.power)+30, 2)} dBm',
 | 
			
		||||
                            f'power:  \t{round(lin2db(self.power) + 30, 2)} dBm',
 | 
			
		||||
                            f'tx_power_dbm:  \t{round(lin2db(self.tx_power) + 30, 2)} dBm',
 | 
			
		||||
                            f'nb channels: \t{self.nb_channel}',
 | 
			
		||||
                            f'path_bandwidth: \t{round(self.path_bandwidth * 1e-9, 2)} Gbit/s',
 | 
			
		||||
                            f'nodes-list:\t{self.nodes_list}',
 | 
			
		||||
@@ -329,36 +335,46 @@ def compute_constrained_path(network, req):
 | 
			
		||||
    return total_path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ref_carrier(equipment):
 | 
			
		||||
    """Create a reference carier based SI information with the specified request's power:
 | 
			
		||||
    req_power records the power in W that the user has defined for a given request
 | 
			
		||||
    (which might be different from the one used for the design).
 | 
			
		||||
    """
 | 
			
		||||
    return ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
 | 
			
		||||
                            slot_width=equipment['SI']['default'].spacing)
 | 
			
		||||
def filter_si(path: list, equipment: dict, si: SpectralInformation) -> SpectralInformation:
 | 
			
		||||
    """Filter spectral information based on the amplifiers common range"""
 | 
			
		||||
    # First retrieve f_min, f_max spectrum according to amplifiers' spectrum on the path
 | 
			
		||||
    common_range = find_elements_common_range(path, equipment)
 | 
			
		||||
    # filter out frequencies that should not be created
 | 
			
		||||
    filtered_si = []
 | 
			
		||||
    for band in common_range:
 | 
			
		||||
        temp = demuxed_spectral_information(si, band)
 | 
			
		||||
        if temp:
 | 
			
		||||
            filtered_si.append(temp)
 | 
			
		||||
    if not filtered_si:
 | 
			
		||||
        raise ValueError('Defined propagation band does not match amplifiers band.')
 | 
			
		||||
    return muxed_spectral_information(filtered_si)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def propagate(path, req, equipment):
 | 
			
		||||
    """propagates signals in each element according to initial spectrum set by user"""
 | 
			
		||||
    """propagates signals in each element according to initial spectrum set by user
 | 
			
		||||
    Spectrum is specified in request through f_min, f_max and spacing, or initial_spectrum
 | 
			
		||||
    and amps frequency band on the path is used to filter out frequencies"""
 | 
			
		||||
    # generates spectrum based on request
 | 
			
		||||
    if req.initial_spectrum is not None:
 | 
			
		||||
        si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum,
 | 
			
		||||
                                              power=req.power, ref_carrier=ref_carrier(equipment))
 | 
			
		||||
        si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum, power=req.power)
 | 
			
		||||
    else:
 | 
			
		||||
        si = create_input_spectral_information(
 | 
			
		||||
            f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate,
 | 
			
		||||
            power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr, delta_pdb=req.offset_db,
 | 
			
		||||
            ref_carrier=ref_carrier(equipment))
 | 
			
		||||
            spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power, delta_pdb=req.offset_db)
 | 
			
		||||
    # filter out frequencies that should not be created
 | 
			
		||||
    si = filter_si(path, equipment, si)
 | 
			
		||||
    roadm_osnr = []
 | 
			
		||||
    for i, el in enumerate(path):
 | 
			
		||||
        if isinstance(el, Roadm):
 | 
			
		||||
            si = el(si, degree=path[i+1].uid)
 | 
			
		||||
            si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
 | 
			
		||||
            roadm_osnr.append(el.get_impairment('roadm-osnr', si.frequency,
 | 
			
		||||
                                                from_degree=path[i - 1].uid, degree=path[i + 1].uid))
 | 
			
		||||
        else:
 | 
			
		||||
            si = el(si)
 | 
			
		||||
    path[0].update_snr(si.tx_osnr)
 | 
			
		||||
    path[0].calc_penalties(req.penalties)
 | 
			
		||||
    if any(isinstance(el, Roadm) for el in path):
 | 
			
		||||
        path[-1].update_snr(si.tx_osnr, equipment['Roadm']['default'].add_drop_osnr)
 | 
			
		||||
    else:
 | 
			
		||||
        path[-1].update_snr(si.tx_osnr)
 | 
			
		||||
    roadm_osnr.append(si.tx_osnr)
 | 
			
		||||
    path[-1].update_snr(*roadm_osnr)
 | 
			
		||||
    path[-1].calc_penalties(req.penalties)
 | 
			
		||||
    return si
 | 
			
		||||
 | 
			
		||||
@@ -390,22 +406,26 @@ def propagate_and_optimize_mode(path, req, equipment):
 | 
			
		||||
                raise ServiceError(msg)
 | 
			
		||||
            spc_info = create_input_spectral_information(f_min=req.f_min, f_max=req.f_max,
 | 
			
		||||
                                                         roll_off=equipment['SI']['default'].roll_off,
 | 
			
		||||
                                                         baud_rate=this_br, power=req.power, spacing=req.spacing,
 | 
			
		||||
                                                         delta_pdb=this_offset,
 | 
			
		||||
                                                         tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment))
 | 
			
		||||
                                                         baud_rate=this_br, spacing=req.spacing,
 | 
			
		||||
                                                         delta_pdb=this_offset, tx_osnr=req.tx_osnr,
 | 
			
		||||
                                                         tx_power=req.tx_power)
 | 
			
		||||
            spc_info = filter_si(path, equipment, spc_info)
 | 
			
		||||
            roadm_osnr = []
 | 
			
		||||
            for i, el in enumerate(path):
 | 
			
		||||
                if isinstance(el, Roadm):
 | 
			
		||||
                    spc_info = el(spc_info, degree=path[i+1].uid)
 | 
			
		||||
                    spc_info = el(spc_info, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
 | 
			
		||||
                    roadm_osnr.append(el.get_impairment('roadm-osnr', spc_info.frequency,
 | 
			
		||||
                                                        from_degree=path[i - 1].uid, degree=path[i + 1].uid))
 | 
			
		||||
                else:
 | 
			
		||||
                    spc_info = el(spc_info)
 | 
			
		||||
            for this_mode in modes_to_explore:
 | 
			
		||||
                if path[-1].snr is not None:
 | 
			
		||||
                    path[0].update_snr(this_mode['tx_osnr'])
 | 
			
		||||
                    path[0].calc_penalties(this_mode['penalties'])
 | 
			
		||||
                    if any(isinstance(el, Roadm) for el in path):
 | 
			
		||||
                        path[-1].update_snr(this_mode['tx_osnr'], equipment['Roadm']['default'].add_drop_osnr)
 | 
			
		||||
                    else:
 | 
			
		||||
                        path[-1].update_snr(this_mode['tx_osnr'])
 | 
			
		||||
                    roadm_osnr.append(this_mode['tx_osnr'])
 | 
			
		||||
                    path[-1].update_snr(*roadm_osnr)
 | 
			
		||||
                    # remove the tx_osnr from roadm_osnr list for the next iteration
 | 
			
		||||
                    del roadm_osnr[-1]
 | 
			
		||||
                    path[-1].calc_penalties(this_mode['penalties'])
 | 
			
		||||
                    if round(min(path[-1].snr_01nm - path[-1].total_penalty), 2) \
 | 
			
		||||
                            > this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
 | 
			
		||||
@@ -977,6 +997,7 @@ def compare_reqs(req1, req2, disjlist):
 | 
			
		||||
            req1.format == req2.format and \
 | 
			
		||||
            req1.OSNR == req2.OSNR and \
 | 
			
		||||
            req1.roll_off == req2.roll_off and \
 | 
			
		||||
            req1.tx_power == req2.tx_power and \
 | 
			
		||||
            same_disj:
 | 
			
		||||
        return True
 | 
			
		||||
    else:
 | 
			
		||||
@@ -1076,7 +1097,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 !
 | 
			
		||||
@@ -1085,6 +1106,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
 | 
			
		||||
@@ -1102,6 +1127,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
 | 
			
		||||
        # 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)
 | 
			
		||||
@@ -1216,3 +1251,11 @@ def _penalty_msg(total_path, msg, min_ind):
 | 
			
		||||
        else:
 | 
			
		||||
            msg += f'\n\t{pretty} penalty not evaluated'
 | 
			
		||||
    return msg
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_elements_common_range(el_list: list, equipment: dict) -> List[dict]:
 | 
			
		||||
    """Find the common frequency range of amps of a given list of elements (for example an OMS or a path)
 | 
			
		||||
    If there are no amplifiers in the path, then use the SI
 | 
			
		||||
    """
 | 
			
		||||
    amp_bands = [n.params.bands for n in el_list if isinstance(n, (Edfa, Multiband_amplifier))]
 | 
			
		||||
    return find_common_range(amp_bands, equipment['SI']['default'].f_min, equipment['SI']['default'].f_max)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,28 +15,31 @@ element/oms correspondace
 | 
			
		||||
 | 
			
		||||
from collections import namedtuple
 | 
			
		||||
from logging import getLogger
 | 
			
		||||
from gnpy.core.elements import Roadm, Transceiver
 | 
			
		||||
 | 
			
		||||
from gnpy.core.elements import Roadm, Transceiver, Edfa, Multiband_amplifier
 | 
			
		||||
from gnpy.core.exceptions import ServiceError, SpectrumError
 | 
			
		||||
from gnpy.core.utils import order_slots, restore_order
 | 
			
		||||
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth
 | 
			
		||||
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth, find_elements_common_range
 | 
			
		||||
 | 
			
		||||
LOGGER = getLogger(__name__)
 | 
			
		||||
GUARDBAND = 25e9
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Bitmap:
 | 
			
		||||
    """records the spectrum occupation"""
 | 
			
		||||
 | 
			
		||||
    def __init__(self, f_min, f_max, grid, guardband=0.15e12, bitmap=None):
 | 
			
		||||
        # n is the min index including guardband. Guardband is require to be sure
 | 
			
		||||
    def __init__(self, f_min, f_max, grid, guardband=GUARDBAND, bitmap=None):
 | 
			
		||||
        # n is the min index including guardband. Guardband is required to be sure
 | 
			
		||||
        # that a channel can be assigned  with center frequency fmin (means that its
 | 
			
		||||
        # slot occupation goes below freq_index_min
 | 
			
		||||
        n_min = frequency_to_n(f_min - guardband, grid)
 | 
			
		||||
        n_max = frequency_to_n(f_max + guardband, grid) - 1
 | 
			
		||||
        n_min = frequency_to_n(f_min, grid)
 | 
			
		||||
        n_max = frequency_to_n(f_max, grid)
 | 
			
		||||
        self.n_min = n_min
 | 
			
		||||
        self.n_max = n_max
 | 
			
		||||
        self.freq_index_min = frequency_to_n(f_min)
 | 
			
		||||
        self.freq_index_max = frequency_to_n(f_max)
 | 
			
		||||
        self.freq_index_min = frequency_to_n(f_min + guardband)
 | 
			
		||||
        self.freq_index_max = frequency_to_n(f_max - guardband)
 | 
			
		||||
        self.freq_index = list(range(n_min, n_max + 1))
 | 
			
		||||
        self.guardband = guardband
 | 
			
		||||
        if bitmap is None:
 | 
			
		||||
            self.bitmap = [1] * (n_max - n_min + 1)
 | 
			
		||||
        elif len(bitmap) == len(self.freq_index):
 | 
			
		||||
@@ -83,7 +86,6 @@ class OMS:
 | 
			
		||||
        self.spectrum_bitmap = []
 | 
			
		||||
        self.nb_channels = 0
 | 
			
		||||
        self.service_list = []
 | 
			
		||||
    # TODO
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return '\n\t'.join([f'{type(self).__name__} {self.oms_id}',
 | 
			
		||||
@@ -98,7 +100,7 @@ class OMS:
 | 
			
		||||
        self.el_id_list.append(elem.uid)
 | 
			
		||||
        self.el_list.append(elem)
 | 
			
		||||
 | 
			
		||||
    def update_spectrum(self, f_min, f_max, guardband=0.15e12, existing_spectrum=None, grid=0.00625e12):
 | 
			
		||||
    def update_spectrum(self, f_min, f_max, guardband=GUARDBAND, existing_spectrum=None, grid=0.00625e12):
 | 
			
		||||
        """Frequencies expressed in Hz.
 | 
			
		||||
        Add 150 GHz margin to enable a center channel on f_min
 | 
			
		||||
        Use ITU-T G694.1 Flexible DWDM grid definition
 | 
			
		||||
@@ -226,6 +228,40 @@ def align_grids(oms_list):
 | 
			
		||||
    return oms_list
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_network_freq_range(network, equipment):
 | 
			
		||||
    """Find the lowest freq from amps and highest freq among all amps to determine the resulting bitmap
 | 
			
		||||
    """
 | 
			
		||||
    amp_bands = [band for n in network.nodes() if isinstance(n, (Edfa, Multiband_amplifier)) for band in n.params.bands]
 | 
			
		||||
    min_frequencies = [a['f_min'] for a in amp_bands]
 | 
			
		||||
    max_frequencies = [a['f_max'] for a in amp_bands]
 | 
			
		||||
    return min(min_frequencies), max(max_frequencies)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_oms_bitmap(oms, equipment, f_min, f_max, guardband, grid):
 | 
			
		||||
    """Find the highest low freq from oms amps and lowest high freq among oms amps to determine
 | 
			
		||||
    the possible bitmap window.
 | 
			
		||||
    f_min and f_max represent the useable spectrum (not the useable center frequencies)
 | 
			
		||||
    ie n smaller than frequency_to_n(min_freq, grid) are not useable
 | 
			
		||||
    """
 | 
			
		||||
    n_min = frequency_to_n(f_min, grid)
 | 
			
		||||
    n_max = frequency_to_n(f_max, grid) - 1
 | 
			
		||||
    common_range = find_elements_common_range(oms.el_list, equipment)
 | 
			
		||||
    band0 = common_range[0]
 | 
			
		||||
    band0_n_min = frequency_to_n(band0['f_min'], grid)
 | 
			
		||||
    band0_n_max = frequency_to_n(band0['f_max'], grid)
 | 
			
		||||
    bitmap = [0] * (band0_n_min - n_min) + [1] * (band0_n_max - band0_n_min + 1)
 | 
			
		||||
    i = 1
 | 
			
		||||
    while i < len(common_range):
 | 
			
		||||
        band = common_range[i]
 | 
			
		||||
        band_n_min = frequency_to_n(band['f_min'], grid)
 | 
			
		||||
        band_n_max = frequency_to_n(band['f_max'], grid)
 | 
			
		||||
        bitmap = bitmap + [0] * (band_n_min - band0_n_max - 1) + [1] * (band_n_max - band_n_min + 1)
 | 
			
		||||
        band0_n_max = band_n_max
 | 
			
		||||
        i += 1
 | 
			
		||||
    bitmap = bitmap + [0] * (n_max - band0_n_max)
 | 
			
		||||
    return bitmap
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def build_oms_list(network, equipment):
 | 
			
		||||
    """initialization of OMS list in the network
 | 
			
		||||
 | 
			
		||||
@@ -237,7 +273,15 @@ def build_oms_list(network, equipment):
 | 
			
		||||
    """
 | 
			
		||||
    oms_id = 0
 | 
			
		||||
    oms_list = []
 | 
			
		||||
    for node in [n for n in network.nodes() if isinstance(n, Roadm)]:
 | 
			
		||||
    # identify all vertices of OMS: of course ROADM, but aso links to external chassis transponders
 | 
			
		||||
    oms_vertices = [n for n in network.nodes() if isinstance(n, Roadm)] +\
 | 
			
		||||
                   [n for n in network.nodes() if isinstance(n, Transceiver)
 | 
			
		||||
                    and not isinstance(next(network.successors(n)), Roadm)]
 | 
			
		||||
    # determine the size of the bitmap common to all the omses: find min and max frequencies of all amps
 | 
			
		||||
    # in the network. These gives the band not the center frequency. Thhen we use a reference channel
 | 
			
		||||
    # slot width (50GHz) to set the f_min, f_max
 | 
			
		||||
    f_min, f_max = find_network_freq_range(network, equipment)
 | 
			
		||||
    for node in oms_vertices:
 | 
			
		||||
        for edge in network.edges([node]):
 | 
			
		||||
            if not isinstance(edge[1], Transceiver):
 | 
			
		||||
                nd_in = edge[0]  # nd_in is a Roadm
 | 
			
		||||
@@ -271,8 +315,9 @@ def build_oms_list(network, equipment):
 | 
			
		||||
                    nd_out.oms_list = []
 | 
			
		||||
                    nd_out.oms_list.append(oms_id)
 | 
			
		||||
 | 
			
		||||
                oms.update_spectrum(equipment['SI']['default'].f_min,
 | 
			
		||||
                                    equipment['SI']['default'].f_max, grid=0.00625e12)
 | 
			
		||||
                bitmap = create_oms_bitmap(oms, equipment, f_min=f_min, f_max=f_max, guardband=GUARDBAND,
 | 
			
		||||
                                           grid=0.00625e12)
 | 
			
		||||
                oms.update_spectrum(f_min, f_max, guardband=GUARDBAND, grid=0.00625e12, existing_spectrum=bitmap)
 | 
			
		||||
                # oms.assign_spectrum(13,7) gives back (193137500000000.0, 193225000000000.0)
 | 
			
		||||
                # as in the example in the standard
 | 
			
		||||
                # oms.assign_spectrum(13,7)
 | 
			
		||||
@@ -333,10 +378,11 @@ def aggregate_oms_bitmap(path_oms, oms_list):
 | 
			
		||||
        'el_id_list': 0,
 | 
			
		||||
        'el_list': []
 | 
			
		||||
    }
 | 
			
		||||
    freq_min = nvalue_to_frequency(spectrum.freq_index_min)
 | 
			
		||||
    freq_max = nvalue_to_frequency(spectrum.freq_index_max)
 | 
			
		||||
    freq_min = nvalue_to_frequency(spectrum.n_min)
 | 
			
		||||
    freq_max = nvalue_to_frequency(spectrum.n_max)
 | 
			
		||||
    aggregate_oms = OMS(**params)
 | 
			
		||||
    aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, existing_spectrum=bitmap)
 | 
			
		||||
    aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, guardband=spectrum.guardband,
 | 
			
		||||
                                  existing_spectrum=bitmap)
 | 
			
		||||
    return aggregate_oms
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
# matplotlib 3.8 removed support for Python 3.8
 | 
			
		||||
matplotlib>=3.7.3,<4
 | 
			
		||||
# networkx 3.2 removed support for Python 3.8
 | 
			
		||||
networkx>=3.1,<4
 | 
			
		||||
# numpy 1.25 removed support for Python 3.8
 | 
			
		||||
numpy>=1.24.4,<2
 | 
			
		||||
pbr>=6.0.0,<7
 | 
			
		||||
# scipy 1.11 removed support for Python 3.8
 | 
			
		||||
scipy>=1.10.1,<2
 | 
			
		||||
# xlrd 2.x removed support for .xlsx, it's only .xls now
 | 
			
		||||
xlrd>=1.2.0,<2
 | 
			
		||||
							
								
								
									
										32
									
								
								setup.cfg
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								setup.cfg
									
									
									
									
									
								
							@@ -49,3 +49,35 @@ console_scripts =
 | 
			
		||||
    gnpy-transmission-example = gnpy.tools.cli_examples:transmission_main_example
 | 
			
		||||
    gnpy-path-request = gnpy.tools.cli_examples:path_requests_run
 | 
			
		||||
    gnpy-convert-xls = gnpy.tools.convert:_do_convert
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
install_requires =
 | 
			
		||||
	# matplotlib 3.8 removed support for Python 3.8
 | 
			
		||||
	matplotlib>=3.7.3,<4
 | 
			
		||||
	# networkx 3.2 removed support for Python 3.8
 | 
			
		||||
	networkx>=3.1,<4
 | 
			
		||||
	# numpy 1.25 removed support for Python 3.8
 | 
			
		||||
	numpy>=1.24.4,<2
 | 
			
		||||
	pbr>=6.0.0,<7
 | 
			
		||||
	# scipy 1.11 removed support for Python 3.8
 | 
			
		||||
	scipy>=1.10.1,<2
 | 
			
		||||
	# xlrd 2.x removed support for .xlsx, it's only .xls now
 | 
			
		||||
	xlrd>=1.2.0,<2
 | 
			
		||||
 | 
			
		||||
[options.extras_require]
 | 
			
		||||
tests =
 | 
			
		||||
	build>=1.0.3,<2
 | 
			
		||||
	pytest>=7.4.3,<8
 | 
			
		||||
	# pandas 2.1 removed support for Python 3.8
 | 
			
		||||
	pandas>=2.0.3,<3
 | 
			
		||||
	# flake v6 killed the --diff option
 | 
			
		||||
	flake8>=5.0.4,<6
 | 
			
		||||
 | 
			
		||||
docs =
 | 
			
		||||
	alabaster>=0.7.12,<1
 | 
			
		||||
	docutils>=0.17.1,<1
 | 
			
		||||
	myst-parser>=0.16.1,<1
 | 
			
		||||
	Pygments>=2.11.2,<3
 | 
			
		||||
	rstcheck
 | 
			
		||||
	Sphinx>=5.3.0,<6
 | 
			
		||||
	sphinxcontrib-bibtex>=2.4.1,<3
 | 
			
		||||
 
 | 
			
		||||
@@ -1203,6 +1203,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Abilene",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1226,6 +1227,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Albany",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1249,6 +1251,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Albuquerque",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1274,6 +1277,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Atlanta",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1298,6 +1302,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Austin",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1321,6 +1326,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Baltimore",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1345,6 +1351,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Baton_Rouge",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1368,6 +1375,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Billings",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1392,6 +1400,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Birmingham",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1416,6 +1425,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Bismarck",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1439,6 +1449,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Boston",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1462,6 +1473,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Buffalo",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1485,6 +1497,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Charleston",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1508,6 +1521,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Charlotte",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1531,6 +1545,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Chicago",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1555,6 +1570,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Cincinnati",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1579,6 +1595,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Cleveland",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1603,6 +1620,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Columbus",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1627,6 +1645,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Dallas",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1653,6 +1672,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Denver",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1678,6 +1698,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Detroit",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1701,6 +1722,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm El_Paso",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1726,6 +1748,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Fresno",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1750,6 +1773,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Greensboro",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1775,6 +1799,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Hartford",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1798,6 +1823,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Houston",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1822,6 +1848,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Jacksonville",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1846,6 +1873,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Kansas_City",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1870,6 +1898,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Las_Vegas",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1895,6 +1924,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Little_Rock",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1918,6 +1948,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Long_Island",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1941,6 +1972,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Los_Angeles",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1966,6 +1998,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Louisville",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1991,6 +2024,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Memphis",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2014,6 +2048,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Miami",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2038,6 +2073,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Milwaukee",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2061,6 +2097,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Minneapolis",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2085,6 +2122,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Nashville",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2109,6 +2147,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm New_Orleans",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2133,6 +2172,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm New_York",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2159,6 +2199,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Newark",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2182,6 +2223,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Norfolk",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2205,6 +2247,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Oakland",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2231,6 +2274,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Oklahoma_City",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2254,6 +2298,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Omaha",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2278,6 +2323,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Orlando",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2301,6 +2347,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Philadelphia",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2325,6 +2372,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Phoenix",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2349,6 +2397,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Pittsburgh",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2373,6 +2422,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Portland",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2398,6 +2448,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Providence",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2421,6 +2472,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Raleigh",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2445,6 +2497,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Richmond",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2468,6 +2521,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Rochester",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2491,6 +2545,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Sacramento",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2514,6 +2569,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Salt_Lake_City",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2539,6 +2595,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm San_Antonio",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2562,6 +2619,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm San_Diego",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2585,6 +2643,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm San_Francisco",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2608,6 +2667,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm San_Jose",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2631,6 +2691,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Santa_Barbara",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2654,6 +2715,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Scranton",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2679,6 +2741,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Seattle",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2702,6 +2765,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Spokane",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2725,6 +2789,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Springfield",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2748,6 +2813,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm St_Louis",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2772,6 +2838,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Syracuse",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2796,6 +2863,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Tallahassee",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2819,6 +2887,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Tampa",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2842,6 +2911,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Toledo",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2865,6 +2935,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Tucson",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2888,6 +2959,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Tulsa",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2911,6 +2983,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Washington_DC",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2936,6 +3009,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm West_Palm_Beach",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2959,6 +3033,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Wilmington",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -2982,6 +3057,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Amsterdam",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3007,6 +3083,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Berlin",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3030,6 +3107,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Brussels",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3053,6 +3131,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Bucharest",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3076,6 +3155,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Frankfurt",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3099,6 +3179,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Istanbul",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3123,6 +3204,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm London",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3147,6 +3229,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Madrid",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3170,6 +3253,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Paris",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3194,6 +3278,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Rome",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3219,6 +3304,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Vienna",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3243,6 +3329,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Warsaw",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3267,6 +3354,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Zurich",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3290,6 +3378,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Bangkok",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3313,6 +3402,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Beijing",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3336,6 +3426,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Delhi",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3360,6 +3451,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Hong_Kong",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3385,6 +3477,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Honolulu",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3409,6 +3502,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Mumbai",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3433,6 +3527,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Seoul",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3456,6 +3551,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Shanghai",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3479,6 +3575,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Singapore",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3502,6 +3599,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Sydney",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3526,6 +3624,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Taipei",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -3551,6 +3650,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Tokyo",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -83375,7 +83475,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.5006,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -88752,7 +88852,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.5032,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -89037,7 +89137,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.5006,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -89721,7 +89821,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.502,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -89797,7 +89897,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.502,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -89911,7 +90011,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 28.5032,
 | 
			
		||||
        "gain_target": 28.5,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "f_min": 191.275e12,
 | 
			
		||||
    "f_max": 196.125e12,
 | 
			
		||||
    "nf_ripple": [
 | 
			
		||||
        0.0,
 | 
			
		||||
        0.0,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
{     "Edfa":[{
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [{
 | 
			
		||||
            "type_variety": "CienaDB_medium_gain",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
@@ -7,8 +8,7 @@
 | 
			
		||||
            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
@@ -18,8 +18,7 @@
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
@@ -29,8 +28,7 @@
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
@@ -40,8 +38,7 @@
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
@@ -49,8 +46,7 @@
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_booster",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
@@ -58,18 +54,18 @@
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
            }            
 | 
			
		||||
      ],
 | 
			
		||||
      "Fiber":[{
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Span":[{
 | 
			
		||||
            "power_mode":true,
 | 
			
		||||
            "delta_power_range_db": [0,0,0.5],
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [{
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
@@ -79,157 +75,232 @@
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Roadm":[{
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [{
 | 
			
		||||
            "type_variety": "example_test",
 | 
			
		||||
            "target_pch_out_db": -18,
 | 
			
		||||
            "add_drop_osnr": 35,
 | 
			
		||||
            "pmd": 1e-12,
 | 
			
		||||
            "pdl": 0.5,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            },
 | 
			
		||||
            "roadm-path-impairments": []
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "example_detailed_impairments",
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 35,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list":[],
 | 
			
		||||
                "booster_variety_list":[]
 | 
			
		||||
                            },
 | 
			
		||||
            "roadm-path-impairments": [
 | 
			
		||||
                  {
 | 
			
		||||
                    "roadm-path-impairments-id": 0,
 | 
			
		||||
                    "roadm-express-path": [{
 | 
			
		||||
                        "frequency-range": {
 | 
			
		||||
                            "lower-frequency": 191.3e12,
 | 
			
		||||
                            "upper-frequency": 196.1e12
 | 
			
		||||
                            },
 | 
			
		||||
                        "roadm-pmd": 0,
 | 
			
		||||
                        "roadm-cd": 0,
 | 
			
		||||
                        "roadm-pdl": 0,
 | 
			
		||||
                        "roadm-inband-crosstalk": 0,
 | 
			
		||||
                        "roadm-maxloss": 16.5
 | 
			
		||||
                        }
 | 
			
		||||
                    ]
 | 
			
		||||
                }, {
 | 
			
		||||
                    "roadm-path-impairments-id": 1,
 | 
			
		||||
                    "roadm-add-path": [{
 | 
			
		||||
                        "frequency-range": {
 | 
			
		||||
                            "lower-frequency": 191.3e12,
 | 
			
		||||
                            "upper-frequency": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
                        "roadm-pmd": 0,
 | 
			
		||||
                        "roadm-cd": 0,
 | 
			
		||||
                        "roadm-pdl": 0,
 | 
			
		||||
                        "roadm-inband-crosstalk": 0,
 | 
			
		||||
                        "roadm-maxloss": 11.5,
 | 
			
		||||
                        "roadm-pmax": 2.5,
 | 
			
		||||
                        "roadm-osnr": 41,
 | 
			
		||||
                        "roadm-noise-figure": 23
 | 
			
		||||
                    }, {
 | 
			
		||||
                        "frequency-range": {
 | 
			
		||||
                            "lower-frequency": 186.3e12,
 | 
			
		||||
                            "upper-frequency": 190.1e12
 | 
			
		||||
                        },
 | 
			
		||||
                        "roadm-pmd": 0,
 | 
			
		||||
                        "roadm-cd": 0,
 | 
			
		||||
                        "roadm-pdl": 0.5,
 | 
			
		||||
                        "roadm-inband-crosstalk": 0,
 | 
			
		||||
                        "roadm-maxloss": 5,
 | 
			
		||||
                        "roadm-pmax": 0,
 | 
			
		||||
                        "roadm-osnr": 35,
 | 
			
		||||
                        "roadm-noise-figure": 6
 | 
			
		||||
                    }]
 | 
			
		||||
                }, {
 | 
			
		||||
                    "roadm-path-impairments-id": 2,
 | 
			
		||||
                    "roadm-drop-path": [{
 | 
			
		||||
                        "frequency-range": {
 | 
			
		||||
                            "lower-frequency": 191.3e12,
 | 
			
		||||
                            "upper-frequency": 196.1e12
 | 
			
		||||
                            },
 | 
			
		||||
                        "roadm-pmd": 0,
 | 
			
		||||
                        "roadm-cd": 0,
 | 
			
		||||
                        "roadm-pdl": 0,
 | 
			
		||||
                        "roadm-inband-crosstalk": 0,
 | 
			
		||||
                        "roadm-maxloss": 11.5,
 | 
			
		||||
                        "roadm-minloss": 7.5,
 | 
			
		||||
                        "roadm-typloss": 10,
 | 
			
		||||
                        "roadm-pmin": -13.5,
 | 
			
		||||
                        "roadm-pmax": -9.5,
 | 
			
		||||
                        "roadm-ptyp": -12,
 | 
			
		||||
                        "roadm-osnr": 41,
 | 
			
		||||
                        "roadm-noise-figure": 15
 | 
			
		||||
                    }]
 | 
			
		||||
                }]
 | 
			
		||||
        }, {
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                            "preamp_variety_list":[],
 | 
			
		||||
                            "booster_variety_list":[]
 | 
			
		||||
                            }    
 | 
			
		||||
            }],
 | 
			
		||||
      "SI":[{
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [{
 | 
			
		||||
            "type_variety": "default",
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "f_max":196.1e12,
 | 
			
		||||
            "f_max": 196.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [0,0,0.5],
 | 
			
		||||
            "power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 100,
 | 
			
		||||
            "sys_margins": 0
 | 
			
		||||
            }],
 | 
			
		||||
        }],
 | 
			
		||||
      "Transceiver":[
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "PS_SP64_1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 11,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "PS_SP64_2",
 | 
			
		||||
                       "baud_rate": 64e9,
 | 
			
		||||
                       "OSNR": 15,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1                       
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 11,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 64e9,
 | 
			
		||||
                       "OSNR": 15,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1                       
 | 
			
		||||
                       }                       
 | 
			
		||||
                   ]
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "PS_SP64_1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "PS_SP64_2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager_16QAM",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "16QAM",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 19,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "16QAM",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 19,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 12,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 3",
 | 
			
		||||
                       "baud_rate": 44e9,
 | 
			
		||||
                       "OSNR": 18,
 | 
			
		||||
                       "bit_rate": 300e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 62.5e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 21,
 | 
			
		||||
                       "bit_rate": 400e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2 - fake",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 21,
 | 
			
		||||
                       "bit_rate": 400e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 4",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 16,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            }
 | 
			
		||||
      ]
 | 
			
		||||
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.35e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 3",
 | 
			
		||||
                    "baud_rate": 44e9,
 | 
			
		||||
                    "OSNR": 18,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 62.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2 - fake",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 4",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 16,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										396
									
								
								tests/data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								tests/data/eqpt_config_multiband.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,396 @@
 | 
			
		||||
{     "Edfa":[{
 | 
			
		||||
            "type_variety": "CienaDB_medium_gain",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_medium_gain_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_low_gain_reduced_band",
 | 
			
		||||
            "f_min": 192.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
        "type_variety": "std_low_gain_reduced",
 | 
			
		||||
        "f_min": 192.25e12,
 | 
			
		||||
        "f_max": 196.15e12,
 | 
			
		||||
        "type_def": "variable_gain",
 | 
			
		||||
        "gain_flatmax": 16,
 | 
			
		||||
        "gain_min": 8,
 | 
			
		||||
        "p_max": 21,
 | 
			
		||||
        "nf_min": 7,
 | 
			
		||||
        "nf_max": 11,
 | 
			
		||||
        "out_voa_auto": false,
 | 
			
		||||
        "allowed_for_design": true
 | 
			
		||||
    },
 | 
			
		||||
		{
 | 
			
		||||
            "type_variety": "std_low_gain_bis",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain_L_ter",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 16,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        },
 | 
			
		||||
		{
 | 
			
		||||
            "type_variety": "std_low_gain_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "type_variety": "std_low_gain_L_reduced_band",
 | 
			
		||||
                "f_min": 187.3e12,
 | 
			
		||||
                "f_max": 190.05e12,
 | 
			
		||||
                "type_def": "variable_gain",
 | 
			
		||||
                "gain_flatmax": 16,
 | 
			
		||||
                "gain_min": 8,
 | 
			
		||||
                "p_max": 21,
 | 
			
		||||
                "nf_min": 7,
 | 
			
		||||
                "nf_max": 11,
 | 
			
		||||
                "out_voa_auto": false,
 | 
			
		||||
                "allowed_for_design": true
 | 
			
		||||
                },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.8,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "test_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_booster",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
                    }, {
 | 
			
		||||
            "type_variety": "std_booster_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_booster_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_booster",
 | 
			
		||||
                "std_booster_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_medium_gain",
 | 
			
		||||
                "std_medium_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_ter",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain",
 | 
			
		||||
                "std_low_gain_L_ter"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_bis",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_bis",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_reduced_bis",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_reduced",
 | 
			
		||||
                "std_low_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain_multiband_reduced",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_low_gain_bis",
 | 
			
		||||
                "std_low_gain_L_reduced_band"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "Fiber":[{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Span":[{
 | 
			
		||||
            "power_mode":true,
 | 
			
		||||
            "delta_power_range_db": [0,0,0.5],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 10,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Roadm":[{
 | 
			
		||||
            "target_pch_out_db": -20,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                            "preamp_variety_list":[],
 | 
			
		||||
                            "booster_variety_list":[]
 | 
			
		||||
                            }
 | 
			
		||||
            }],
 | 
			
		||||
      "SI":[{
 | 
			
		||||
            "f_min": 191.3e12,
 | 
			
		||||
            "f_max":196.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [0,0,0.5],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 100,
 | 
			
		||||
            "sys_margins": 0
 | 
			
		||||
            }],
 | 
			
		||||
      "Transceiver":[
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "PS_SP64_1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 11,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "PS_SP64_2",
 | 
			
		||||
                       "baud_rate": 64e9,
 | 
			
		||||
                       "OSNR": 15,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 11,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 64e9,
 | 
			
		||||
                       "OSNR": 15,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "Voyager_16QAM",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "16QAM",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 19,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 100,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                        "min": 191.35e12,
 | 
			
		||||
                        "max": 196.1e12
 | 
			
		||||
                        },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 1",
 | 
			
		||||
                       "baud_rate": 32e9,
 | 
			
		||||
                       "OSNR": 12,
 | 
			
		||||
                       "bit_rate": 100e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 50e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 3",
 | 
			
		||||
                       "baud_rate": 44e9,
 | 
			
		||||
                       "OSNR": 18,
 | 
			
		||||
                       "bit_rate": 300e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 62.5e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 21,
 | 
			
		||||
                       "bit_rate": 400e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 2 - fake",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 21,
 | 
			
		||||
                       "bit_rate": 400e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                       "format": "mode 4",
 | 
			
		||||
                       "baud_rate": 66e9,
 | 
			
		||||
                       "OSNR": 16,
 | 
			
		||||
                       "bit_rate": 200e9,
 | 
			
		||||
                       "roll_off": 0.15,
 | 
			
		||||
                       "tx_osnr": 45,
 | 
			
		||||
                       "min_spacing": 75e9,
 | 
			
		||||
                       "cost":1
 | 
			
		||||
                       }
 | 
			
		||||
                   ]
 | 
			
		||||
            }
 | 
			
		||||
      ]
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										220
									
								
								tests/data/eqpt_config_psd.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								tests/data/eqpt_config_psd.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [{
 | 
			
		||||
            "type_variety": "CienaDB_medium_gain",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.8,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_booster",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [{
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 10,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [{
 | 
			
		||||
            "target_psd_out_mWperGHz": 3.125e-4,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [{
 | 
			
		||||
            "f_min": 191.35e12,
 | 
			
		||||
            "f_max": 196.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 100,
 | 
			
		||||
            "sys_margins": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Transceiver": [{
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "PS_SP64_1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "PS_SP64_2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager_16QAM",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "16QAM",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 19,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 3",
 | 
			
		||||
                    "baud_rate": 44e9,
 | 
			
		||||
                    "OSNR": 18,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 62.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2 - fake",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 4",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 16,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										220
									
								
								tests/data/eqpt_config_psw.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								tests/data/eqpt_config_psw.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
			
		||||
{
 | 
			
		||||
    "Edfa": [{
 | 
			
		||||
            "type_variety": "CienaDB_medium_gain",
 | 
			
		||||
            "type_def": "advanced_model",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_medium_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_low_gain",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 16,
 | 
			
		||||
            "gain_min": 8,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 7,
 | 
			
		||||
            "nf_max": 11,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 25,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 5.8,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": false,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "test_fixed_gain",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": true
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "std_booster",
 | 
			
		||||
            "type_def": "fixed_gain",
 | 
			
		||||
            "gain_flatmax": 21,
 | 
			
		||||
            "gain_min": 20,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf0": 5,
 | 
			
		||||
            "allowed_for_design": false
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Fiber": [{
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "dispersion": 1.67e-05,
 | 
			
		||||
            "effective_area": 83e-12,
 | 
			
		||||
            "pmd_coef": 1.265e-15
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Span": [{
 | 
			
		||||
            "power_mode": true,
 | 
			
		||||
            "delta_power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
            "target_extended_gain": 2.5,
 | 
			
		||||
            "max_length": 150,
 | 
			
		||||
            "length_units": "km",
 | 
			
		||||
            "max_loss": 28,
 | 
			
		||||
            "padding": 10,
 | 
			
		||||
            "EOL": 0,
 | 
			
		||||
            "con_in": 0,
 | 
			
		||||
            "con_out": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Roadm": [{
 | 
			
		||||
            "target_out_mWperSlotWidth": 2.0e-4,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "SI": [{
 | 
			
		||||
            "f_min": 191.35e12,
 | 
			
		||||
            "f_max": 196.1e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "spacing": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "power_range_db": [0, 0, 0.5],
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 100,
 | 
			
		||||
            "sys_margins": 0
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "Transceiver": [{
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "PS_SP64_1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "PS_SP64_2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 11,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 64e9,
 | 
			
		||||
                    "OSNR": 15,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager_16QAM",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "16QAM",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 19,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 100,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }, {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                "min": 191.4e12,
 | 
			
		||||
                "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [{
 | 
			
		||||
                    "format": "mode 1",
 | 
			
		||||
                    "baud_rate": 32e9,
 | 
			
		||||
                    "OSNR": 12,
 | 
			
		||||
                    "bit_rate": 100e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 50e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 3",
 | 
			
		||||
                    "baud_rate": 44e9,
 | 
			
		||||
                    "OSNR": 18,
 | 
			
		||||
                    "bit_rate": 300e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 62.5e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 2 - fake",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 21,
 | 
			
		||||
                    "bit_rate": 400e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "format": "mode 4",
 | 
			
		||||
                    "baud_rate": 66e9,
 | 
			
		||||
                    "OSNR": 16,
 | 
			
		||||
                    "bit_rate": 200e9,
 | 
			
		||||
                    "roll_off": 0.15,
 | 
			
		||||
                    "tx_osnr": 45,
 | 
			
		||||
                    "min_spacing": 75e9,
 | 
			
		||||
                    "cost": 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										238
									
								
								tests/data/eqpt_config_sweep.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								tests/data/eqpt_config_sweep.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,238 @@
 | 
			
		||||
{
 | 
			
		||||
      "Edfa": [{
 | 
			
		||||
                  "type_variety": "CienaDB_medium_gain",
 | 
			
		||||
                  "type_def": "advanced_model",
 | 
			
		||||
                  "gain_flatmax": 25,
 | 
			
		||||
                  "gain_min": 15,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
			
		||||
                  "out_voa_auto": false,
 | 
			
		||||
                  "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                  "type_variety": "std_medium_gain",
 | 
			
		||||
                  "type_def": "variable_gain",
 | 
			
		||||
                  "gain_flatmax": 26,
 | 
			
		||||
                  "gain_min": 15,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "nf_min": 6,
 | 
			
		||||
                  "nf_max": 10,
 | 
			
		||||
                  "out_voa_auto": false,
 | 
			
		||||
                  "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                  "type_variety": "std_low_gain",
 | 
			
		||||
                  "type_def": "variable_gain",
 | 
			
		||||
                  "gain_flatmax": 16,
 | 
			
		||||
                  "gain_min": 8,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "nf_min": 7,
 | 
			
		||||
                  "nf_max": 11,
 | 
			
		||||
                  "out_voa_auto": false,
 | 
			
		||||
                  "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                  "type_variety": "test",
 | 
			
		||||
                  "type_def": "variable_gain",
 | 
			
		||||
                  "gain_flatmax": 25,
 | 
			
		||||
                  "gain_min": 15,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "nf_min": 5.8,
 | 
			
		||||
                  "nf_max": 10,
 | 
			
		||||
                  "out_voa_auto": false,
 | 
			
		||||
                  "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                  "type_variety": "test_fixed_gain",
 | 
			
		||||
                  "type_def": "fixed_gain",
 | 
			
		||||
                  "gain_flatmax": 21,
 | 
			
		||||
                  "gain_min": 20,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "nf0": 5,
 | 
			
		||||
                  "allowed_for_design": true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                  "type_variety": "std_booster",
 | 
			
		||||
                  "type_def": "fixed_gain",
 | 
			
		||||
                  "gain_flatmax": 21,
 | 
			
		||||
                  "gain_min": 20,
 | 
			
		||||
                  "p_max": 21,
 | 
			
		||||
                  "nf0": 5,
 | 
			
		||||
                  "allowed_for_design": false
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Fiber": [{
 | 
			
		||||
                  "type_variety": "SSMF",
 | 
			
		||||
                  "dispersion": 1.67e-05,
 | 
			
		||||
                  "effective_area": 83e-12,
 | 
			
		||||
                  "pmd_coef": 1.265e-15
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Span": [{
 | 
			
		||||
                  "power_mode":true,
 | 
			
		||||
                  "delta_power_range_db": [0,0,0.5],
 | 
			
		||||
                  "max_fiber_lineic_loss_for_raman": 0.25,
 | 
			
		||||
                  "target_extended_gain": 2.5,
 | 
			
		||||
                  "max_length": 150,
 | 
			
		||||
                  "length_units": "km",
 | 
			
		||||
                  "max_loss": 28,
 | 
			
		||||
                  "padding": 10,
 | 
			
		||||
                  "EOL": 0,
 | 
			
		||||
                  "con_in": 0,
 | 
			
		||||
                  "con_out": 0
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Roadm": [{
 | 
			
		||||
                  "target_pch_out_db": -20,
 | 
			
		||||
                  "add_drop_osnr": 38,
 | 
			
		||||
                  "pmd": 0,
 | 
			
		||||
                  "pdl": 0,
 | 
			
		||||
                  "restrictions": {
 | 
			
		||||
                                  "preamp_variety_list":[],
 | 
			
		||||
                                  "booster_variety_list":[]
 | 
			
		||||
                  }
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "SI": [{
 | 
			
		||||
                  "f_min": 191.35e12,
 | 
			
		||||
                  "f_max": 196.1e12,
 | 
			
		||||
                  "baud_rate": 32e9,
 | 
			
		||||
                  "spacing": 50e9,
 | 
			
		||||
                  "power_dbm": 0,
 | 
			
		||||
                  "power_range_db": [-6,0,0.5],
 | 
			
		||||
                  "roll_off": 0.15,
 | 
			
		||||
                  "tx_osnr": 100,
 | 
			
		||||
                  "sys_margins": 0
 | 
			
		||||
            }
 | 
			
		||||
      ],
 | 
			
		||||
      "Transceiver":[
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "vendorA_trx-type1",
 | 
			
		||||
            "frequency":{
 | 
			
		||||
                  "min": 191.4e12,
 | 
			
		||||
                  "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode":[
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "PS_SP64_1",
 | 
			
		||||
                             "baud_rate": 32e9,
 | 
			
		||||
                             "OSNR": 11,
 | 
			
		||||
                             "bit_rate": 100e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 100,
 | 
			
		||||
                             "min_spacing": 50e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "PS_SP64_2",
 | 
			
		||||
                             "baud_rate": 64e9,
 | 
			
		||||
                             "OSNR": 15,
 | 
			
		||||
                             "bit_rate": 200e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 100,
 | 
			
		||||
                             "min_spacing": 75e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 1",
 | 
			
		||||
                             "baud_rate": 32e9,
 | 
			
		||||
                             "OSNR": 11,
 | 
			
		||||
                             "bit_rate": 100e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 100,
 | 
			
		||||
                             "min_spacing": 50e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 2",
 | 
			
		||||
                             "baud_rate": 64e9,
 | 
			
		||||
                             "OSNR": 15,
 | 
			
		||||
                             "bit_rate": 200e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 100,
 | 
			
		||||
                             "min_spacing": 75e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       }
 | 
			
		||||
                  ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "Voyager_16QAM",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                  "min": 191.4e12,
 | 
			
		||||
                  "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "16QAM",
 | 
			
		||||
                             "baud_rate": 32e9,
 | 
			
		||||
                             "OSNR": 19,
 | 
			
		||||
                             "bit_rate": 200e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 100,
 | 
			
		||||
                             "min_spacing": 50e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       }
 | 
			
		||||
                  ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            "type_variety": "Voyager",
 | 
			
		||||
            "frequency": {
 | 
			
		||||
                  "min": 191.4e12,
 | 
			
		||||
                  "max": 196.1e12
 | 
			
		||||
            },
 | 
			
		||||
            "mode": [
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 1",
 | 
			
		||||
                             "baud_rate": 32e9,
 | 
			
		||||
                             "OSNR": 12,
 | 
			
		||||
                             "bit_rate": 100e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 45,
 | 
			
		||||
                             "min_spacing": 50e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 3",
 | 
			
		||||
                             "baud_rate": 44e9,
 | 
			
		||||
                             "OSNR": 18,
 | 
			
		||||
                             "bit_rate": 300e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 45,
 | 
			
		||||
                             "min_spacing": 62.5e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 2",
 | 
			
		||||
                             "baud_rate": 66e9,
 | 
			
		||||
                             "OSNR": 21,
 | 
			
		||||
                             "bit_rate": 400e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 45,
 | 
			
		||||
                             "min_spacing": 75e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 2 - fake",
 | 
			
		||||
                             "baud_rate": 66e9,
 | 
			
		||||
                             "OSNR": 21,
 | 
			
		||||
                             "bit_rate": 400e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 45,
 | 
			
		||||
                             "min_spacing": 75e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       },
 | 
			
		||||
                       {
 | 
			
		||||
                             "format": "mode 4",
 | 
			
		||||
                             "baud_rate": 66e9,
 | 
			
		||||
                             "OSNR": 16,
 | 
			
		||||
                             "bit_rate": 200e9,
 | 
			
		||||
                             "roll_off": 0.15,
 | 
			
		||||
                             "tx_osnr": 45,
 | 
			
		||||
                             "min_spacing": 75e9,
 | 
			
		||||
                             "cost": 1
 | 
			
		||||
                       }
 | 
			
		||||
                  ]
 | 
			
		||||
            }
 | 
			
		||||
      ]
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -63,6 +63,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Lannion_CAS",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -18.6,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -87,6 +88,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Lorient_KMA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -111,6 +113,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Vannes_KBE",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -134,6 +137,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Rennes_STA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -157,6 +161,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Brest_KLA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
  "raman_params": {
 | 
			
		||||
    "flag": true,
 | 
			
		||||
    "result_spatial_resolution": 10e3,
 | 
			
		||||
    "solver_spatial_resolution": 50
 | 
			
		||||
    "solver_spatial_resolution": 10e3
 | 
			
		||||
  },
 | 
			
		||||
  "nli_params": {
 | 
			
		||||
    "method": "ggn_spectrally_separated",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,7 @@
 | 
			
		||||
{     "nf_fit_coeff": [
 | 
			
		||||
{
 | 
			
		||||
      "f_min": 191.275e12,
 | 
			
		||||
      "f_max": 196.125e12,
 | 
			
		||||
      "nf_fit_coeff": [
 | 
			
		||||
      0.000168241,
 | 
			
		||||
      0.0469961,
 | 
			
		||||
      0.0359549,
 | 
			
		||||
 
 | 
			
		||||
@@ -159,6 +159,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Lannion_CAS",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -183,6 +184,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Lorient_KMA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -207,6 +209,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Vannes_KBE",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -230,6 +233,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Rennes_STA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -240,7 +244,6 @@
 | 
			
		||||
          "east edfa in Rennes_STA to Stbrieuc": -20,
 | 
			
		||||
          "east edfa in Rennes_STA to Ploermel": -20
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      },
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
@@ -254,6 +257,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm Brest_KLA",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -277,6 +281,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm a",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -302,6 +307,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm b",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -310,7 +316,7 @@
 | 
			
		||||
          ],
 | 
			
		||||
          "booster_variety_list": []
 | 
			
		||||
        },
 | 
			
		||||
        "per_degree_pch_out_db":{
 | 
			
		||||
        "per_degree_pch_out_db": {
 | 
			
		||||
          "east edfa in b to a": -20,
 | 
			
		||||
          "east edfa in b to f": -20
 | 
			
		||||
        }
 | 
			
		||||
@@ -327,13 +333,14 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm c",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
          "preamp_variety_list": [],
 | 
			
		||||
          "booster_variety_list": []
 | 
			
		||||
        },
 | 
			
		||||
        "per_degree_pch_out_db":{
 | 
			
		||||
        "per_degree_pch_out_db": {
 | 
			
		||||
          "east edfa in c to a": -20,
 | 
			
		||||
          "east edfa in c to d": -20,
 | 
			
		||||
          "east edfa in c to f": -20
 | 
			
		||||
@@ -351,6 +358,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm d",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -374,6 +382,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm e",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -397,6 +406,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm f",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -421,6 +431,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm g",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -430,7 +441,7 @@
 | 
			
		||||
        "per_degree_pch_out_db": {
 | 
			
		||||
          "east edfa in g to e": -20,
 | 
			
		||||
          "east edfa in g to h": -20
 | 
			
		||||
         }
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      "metadata": {
 | 
			
		||||
        "location": {
 | 
			
		||||
@@ -444,6 +455,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "uid": "roadm h",
 | 
			
		||||
      "type": "Roadm",
 | 
			
		||||
      "type_variety": "default",
 | 
			
		||||
      "params": {
 | 
			
		||||
        "target_pch_out_db": -20,
 | 
			
		||||
        "restrictions": {
 | 
			
		||||
@@ -1593,7 +1605,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_medium_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 18.5,
 | 
			
		||||
        "gain_target": 13.177288,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -2235,7 +2247,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_low_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 6.5,
 | 
			
		||||
        "gain_target": 11.822712,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -2292,7 +2304,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "std_low_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 13.82,
 | 
			
		||||
        "gain_target": 13.822712,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
@@ -2311,7 +2323,7 @@
 | 
			
		||||
      "type": "Edfa",
 | 
			
		||||
      "type_variety": "test_fixed_gain",
 | 
			
		||||
      "operational": {
 | 
			
		||||
        "gain_target": 15.18,
 | 
			
		||||
        "gain_target": 15.177288,
 | 
			
		||||
        "delta_p": null,
 | 
			
		||||
        "tilt_target": 0,
 | 
			
		||||
        "out_voa": 0
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,6 @@
 | 
			
		||||
,signal,nli
 | 
			
		||||
0,3.9807550201531427e-07,1.0345007661598643e-10
 | 
			
		||||
1,3.582672964406964e-07,8.554802579711129e-11
 | 
			
		||||
2,5.174953110822109e-07,1.2476289414924814e-10
 | 
			
		||||
3,3.1845777742391393e-07,8.147850636202276e-11
 | 
			
		||||
4,4.776857897651456e-07,1.5683132697931042e-10
 | 
			
		||||
		
		
			
  | 
@@ -1,96 +1,97 @@
 | 
			
		||||
0.001,0.0007537739940510926,0.0005921033539224395,0.000384643453726324,0.00024710943492700773,0.00015765779381207088,0.00010015276356884663,6.345008665672524e-05,4.012925332336102e-05,2.535268958174273e-05
 | 
			
		||||
0.001,0.0007532443480762404,0.0005915606741358828,0.00038408573214392957,0.00024666764094038643,0.00015734224135307426,9.993879038586218e-05,6.330912140259024e-05,4.003794165686942e-05,2.529414108865862e-05
 | 
			
		||||
0.001,0.0007527148738848327,0.0005910183036445593,0.0003835286706438232,0.0002462265418760313,0.00015702726304657165,9.972523988324127e-05,6.316844848796591e-05,3.994682503096186e-05,2.5235719950422228e-05
 | 
			
		||||
0.001,0.0007521855703345118,0.0005904762413907948,0.00038297226807207136,0.0002457861365766504,0.00015671285789580896,9.9512111295817e-05,6.302806736731544e-05,3.985590307420444e-05,2.5177425921282973e-05
 | 
			
		||||
0.001,0.0007516564362539944,0.0005899344862777934,0.00038241652320864807,0.0002453464238190796,0.00015639902485083639,9.929940381972637e-05,6.288797746852316e-05,3.976517539750482e-05,2.511925874398998e-05
 | 
			
		||||
0.001,0.0007511274704431355,0.0005893930371697809,0.0003818614347679428,0.0002449074023149522,0.00015608576280913723,9.908711661290977e-05,6.27481781932559e-05,3.967464159435973e-05,2.5061218149955632e-05
 | 
			
		||||
0.001,0.0007505986716729718,0.0005888518928921378,0.00038130700139925517,0.0002444690707113658,0.00015577307061625246,9.887524879560432e-05,6.260866891731864e-05,3.958430124109855e-05,2.5003303859417958e-05
 | 
			
		||||
0.001,0.0007500678710880661,0.0005883088511431218,0.000380751009486411,0.0002440296996901373,0.00015545972380501664,9.866297459432463e-05,6.246890748950651e-05,3.949380391318895e-05,2.4945291488462056e-05
 | 
			
		||||
0.001,0.0007495350705096461,0.0005877639154939723,0.000380193466563788,0.00024358929686534952,0.00015514572847430736,9.8450298405315e-05,6.232889690863924e-05,3.9403151593579556e-05,2.4887182324516918e-05
 | 
			
		||||
0.001,0.0007490002717484986,0.0005872170894971442,0.00037963438011605534,0.00024314786979147204,0.00015483109067004745,9.823722458416644e-05,6.218864014470764e-05,3.931234624568946e-05,2.4828977642138712e-05
 | 
			
		||||
0.001,0.0007484634766050366,0.000586668376686434,0.0003790737575785661,0.00024270542596389042,0.0001545158163857142,9.802375744622405e-05,6.204814013916893e-05,3.9221389813611975e-05,2.4770678703146694e-05
 | 
			
		||||
0.001,0.0007479199274773811,0.0005861128912299699,0.0003785065486556895,0.00024225795000622747,0.0001541970308568484,9.780794472023814e-05,6.190610951865765e-05,3.9129447888412384e-05,2.471175028700643e-05
 | 
			
		||||
0.001,0.0007473696306726699,0.0005855506450602122,0.0003779327791658341,0.00024180546890527417,0.0001538747562360148,9.758980264023896e-05,6.176255947727244e-05,3.903652792388679e-05,2.4652197254708885e-05
 | 
			
		||||
0.001,0.0007468125926679213,0.0005849816503235855,0.0003773524752207052,0.00024134800990073543,0.00015354901486124996,9.736934756691086e-05,6.161750129261558e-05,3.8942637427869684e-05,2.459202450185328e-05
 | 
			
		||||
0.001,0.0007462488201102061,0.0005844059193804029,0.00037676566322402907,0.00024088560048334876,0.0001532198292542639,9.714659598616437e-05,6.147094632476142e-05,3.884778396152801e-05,2.4531236958179027e-05
 | 
			
		||||
0.001,0.0007456783198168171,0.0005838234648047683,0.00037617236987025305,0.00024041826839299018,0.00015288722211863548,9.692156450770277e-05,6.132290601522212e-05,3.875197513865345e-05,2.4469839587096592e-05
 | 
			
		||||
0.001,0.0007451010987754332,0.0005832342993844907,0.0003755726221432343,0.0002399460416167659,0.00015255121633799497,9.66942698635831e-05,6.11733918859104e-05,3.8655218624953314e-05,2.4407837385217267e-05
 | 
			
		||||
0.001,0.0007445173992825126,0.0005826386743528757,0.00037496668540476865,0.00023946913369259697,0.00015221196586566552,9.646481704279825e-05,6.102247334575324e-05,3.85575594785277e-05,2.4345259282747418e-05
 | 
			
		||||
0.001,0.0007439272282773631,0.0005820366023339485,0.0003743545861363169,0.00023898757201912962,0.00015186949307274757,9.623322238874437e-05,6.0870161643097905e-05,3.845900518061352e-05,2.4282110155051444e-05
 | 
			
		||||
0.001,0.0007433305928659832,0.0005814280961601982,0.00037373635109929905,0.0002385013842326201,0.0001515238205025659,9.599950236146117e-05,6.071646810276464e-05,3.835956326175255e-05,2.4218394908993806e-05
 | 
			
		||||
0.001,0.0007427275003211868,0.0005808131688724332,0.0003731120073337174,0.00023801059820498021,0.0001511749708688244,9.576367353617374e-05,6.05614041249978e-05,3.825924130107498e-05,2.4154118482464792e-05
 | 
			
		||||
0.001,0.0007421180800523362,0.0005801919587229117,0.00037248171070273063,0.0002375153439047009,0.00015082303982525373,9.55258019540184e-05,6.0405013700224733e-05,3.815806798909622e-05,2.4089299350133826e-05
 | 
			
		||||
0.001,0.0007415023395254894,0.0005795644789202474,0.00037184548827748576,0.0002370156491221818,0.00015046804996987382,9.528590408468248e-05,6.0247308147258e-05,3.8056050847170796e-05,2.4023942410771268e-05
 | 
			
		||||
0.001,0.0007408802863797739,0.000578930742889133,0.00037120336741830446,0.00023651154189285886,0.00015011002407818366,9.504399651802114e-05,6.008829886368558e-05,3.7953197447440844e-05,2.395805259559495e-05
 | 
			
		||||
0.001,0.0007402519284274773,0.00057829076427012,0.0003705553757730914,0.00023600305049498863,0.0001497489851010917,9.480009596242987e-05,5.992799732470356e-05,3.784951541204015e-05,2.389163486774317e-05
 | 
			
		||||
0.001,0.0007396172736541335,0.0005776445569193926,0.0003699015412757306,0.000235490203447419,0.00014938495616282697,9.455421924320194e-05,5.976641508193571e-05,3.774501241228877e-05,2.38246942217421e-05
 | 
			
		||||
0.001,0.0007389763302186035,0.0005769921349085269,0.00036924189214444916,0.00023497302950733012,0.00014901796055883247,9.4306383300876e-05,5.960356376224896e-05,3.763969616788547e-05,2.37572356829714e-05
 | 
			
		||||
0.001,0.000738329973009011,0.0005763343882557762,0.00036857732657886674,0.00023445223185895243,0.00014864849677321228,9.40569245366171e-05,5.943966431343476e-05,3.753370952478887e-05,2.3689350732036766e-05
 | 
			
		||||
0.001,0.0007376782088319843,0.0005756713289449496,0.0003679078688863157,0.00023392783529630037,0.00014827658488585004,9.38058575472753e-05,5.927472675087035e-05,3.7427059131368685e-05,2.362104369630353e-05
 | 
			
		||||
0.001,0.0007370210446325295,0.0005750029691304239,0.000367233543593211,0.00023339986479263558,0.00014790224510292775,9.355319701349314e-05,5.910876114408311e-05,3.7319751670569666e-05,2.3552318925085614e-05
 | 
			
		||||
0.001,0.0007363584874940915,0.0005743293211369546,0.0003665543754437431,0.00023286834549865966,0.00014752549775524457,9.329895769838934e-05,5.8941777615809794e-05,3.721179385927125e-05,2.348318078922229e-05
 | 
			
		||||
0.001,0.0007356906659117175,0.0005736505214206793,0.00036587051603697917,0.00023233340267585003,0.00014714643450378646,9.30432026577021e-05,5.8773818072131705e-05,3.710321298927822e-05,2.3413646846771747e-05
 | 
			
		||||
0.001,0.0007350175870680764,0.0005729665823498456,0.00036518198995355594,0.00023179506120909636,0.00014676507541963834,9.278594644638945e-05,5.8604892484780656e-05,3.699401567385024e-05,2.3343721399750524e-05
 | 
			
		||||
0.001,0.000734339258284937,0.0005722775164633901,0.0003644888219905243,0.00023125334615855053,0.0001463814406964208,9.252720370024704e-05,5.8435010877524154e-05,3.688420855938328e-05,2.327340877117354e-05
 | 
			
		||||
0.001,0.0007336556870231954,0.0005715833364706749,0.00036379103715988533,0.00023070828275766533,0.00014599555064848363,9.226698913450141e-05,5.82641833251609e-05,3.677379832472749e-05,2.320271330460301e-05
 | 
			
		||||
0.001,0.0007329668808828947,0.0005708840552512191,0.00036308866068712113,0.00023015989641122435,0.00014560742570909416,9.200531754239911e-05,5.8092419952513674e-05,3.666279168050168e-05,2.313163936369656e-05
 | 
			
		||||
0.001,0.000732272847603227,0.0005701796858544125,0.000362381718009681,0.0002296082126933358,0.00014521708642859763,9.174220379377606e-05,5.791973093340874e-05,3.6551195368400524e-05,2.3060191331749373e-05
 | 
			
		||||
0.001,0.0007315751779154508,0.0005694718366517781,0.00036167180797618383,0.00022905447155647377,0.00014482540661409508,9.147823538482221e-05,5.774650123146614e-05,3.643925790598459e-05,2.2988528215049473e-05
 | 
			
		||||
0.001,0.0007308738763564251,0.0005687605159526348,0.00036095894758939165,0.00022849869020493823,0.00014443240010265552,9.121342232553745e-05,5.7572737692798364e-05,3.6326983828340116e-05,2.2916652961499898e-05
 | 
			
		||||
0.001,0.0007301689475478705,0.0005680457321686527,0.00036024315397386176,0.00022794088593578913,0.00014403808079282816,9.094777466478586e-05,5.739844718775089e-05,3.6214377685641065e-05,2.2844568528419092e-05
 | 
			
		||||
0.001,0.0007294603961963875,0.0005673274938137002,0.0003595244443750873,0.00022738107613769066,0.00014364246264358423,9.068130248947494e-05,5.72236366103174e-05,3.610144404275241e-05,2.2772277882278848e-05
 | 
			
		||||
0.001,0.0007287502876018436,0.0005666079096289159,0.00035880496633647314,0.00022682095171468864,0.00014324674865159545,9.041481948469436e-05,5.7048841153261715e-05,3.598852922211342e-05,2.270000293927642e-05
 | 
			
		||||
0.001,0.0007280386231103084,0.0005658869826353605,0.0003580847262718071,0.00022626051891339797,0.00014285094367250402,9.014832907727154e-05,5.687406312117876e-05,3.587563473352017e-05,2.2627744673782604e-05
 | 
			
		||||
0.001,0.0007273254041056322,0.0005651647158992671,0.00035736373064750184,0.00022569978402038908,0.00014245505258865028,8.988183471111395e-05,5.669930482943582e-05,3.5762762093538084e-05,2.2555504064421286e-05
 | 
			
		||||
0.001,0.0007266106320094578,0.0005644411125319691,0.00035664198598218,0.00022513875336164715,0.0001420590803085807,8.961533984682783e-05,5.652456860390248e-05,3.564991282531874e-05,2.2483282093948716e-05
 | 
			
		||||
0.001,0.000725894308281204,0.0005637161756897977,0.0003559194988462394,0.00022457743330201225,0.00014166303176654256,8.934884796133105e-05,5.634985678067539e-05,3.5537088458413665e-05,2.2411079749130865e-05
 | 
			
		||||
0.001,0.0007251764344180624,0.0005629899085739927,0.00035519627586142176,0.0002240158302446243,0.00014126691192198565,8.90823625474685e-05,5.6175171705805915e-05,3.542429052859005e-05,2.233889802062196e-05
 | 
			
		||||
0.001,0.0007244588135748975,0.0005622641246704724,0.00035447409591105305,0.0002234553120905153,0.00014087167955905718,8.881652603390643e-05,5.600093342830372e-05,3.531178983274928e-05,2.2266910019981595e-05
 | 
			
		||||
0.001,0.000723741443178776,0.000561538821268995,0.0003537529553873339,0.00022289587522719752,0.00014047733166655684,8.855133617099835e-05,5.5827140373801375e-05,3.519958531186087e-05,2.219511505192651e-05
 | 
			
		||||
0.001,0.0007230243206833482,0.0005608139956950427,0.00035303285074046774,0.00022233751609917817,0.00014008386527925162,8.82867907426191e-05,5.565379099102327e-05,3.508767592227262e-05,2.212351243120618e-05
 | 
			
		||||
0.001,0.0007223074435688039,0.0005600896453097011,0.0003523137784782074,0.00022178023120736695,0.00013969127747733319,8.802288756574066e-05,5.5480883751481105e-05,3.4976060635503277e-05,2.2052101482465692e-05
 | 
			
		||||
0.001,0.0007215926247557181,0.0005593676122940626,0.00035159759247597197,0.00022122546934306127,0.00013930059415776796,8.776031848020719e-05,5.5308872854303e-05,3.486503301641155e-05,2.198107017600086e-05
 | 
			
		||||
0.001,0.0007208798585848073,0.0005586478889723664,0.0003508842795507963,0.0002206732171528304,0.00013891180440309996,8.749907547557891e-05,5.513775276548628e-05,3.475458937431628e-05,2.1910416102241813e-05
 | 
			
		||||
0.001,0.0007201691394257483,0.000557930467712979,0.00035017382661216696,0.00022012346138632064,0.00013852489738482468,8.723915060881119e-05,5.49675179985075e-05,3.464472605058592e-05,2.184013687270143e-05
 | 
			
		||||
0.001,0.0007194604616770773,0.00055721534092818,0.00034946622066134466,0.00021957618889536463,0.00013813986236255893,8.698053600359808e-05,5.4798163113848986e-05,3.453543941831367e-05,2.177023011975932e-05
 | 
			
		||||
0.001,0.0007187538197660722,0.0005565025010739346,0.00034876144879066544,0.00021903138663308575,0.0001377566886832086,8.672322384971475e-05,5.462968271852315e-05,3.442672588199151e-05,2.1700693496445714e-05
 | 
			
		||||
0.001,0.0007180492081486484,0.0005557919406496801,0.00034805949818288173,0.0002184890416530366,0.00013737536578016266,8.646720640237894e-05,5.446207146561145e-05,3.431858187719449e-05,2.1631524676231647e-05
 | 
			
		||||
0.001,0.000717348639431565,0.0005550856739198547,0.00034736232071304855,0.00021795064331956514,0.00013699693247692832,8.621317757037385e-05,5.429578217858938e-05,3.421129897003673e-05,2.1562909902755936e-05
 | 
			
		||||
0.001,0.0007166521035756881,0.0005543836868927082,0.0003466698924934393,0.00021741616794755068,0.00013662136971116798,8.596112351100096e-05,5.413080535731451e-05,3.410487085131832e-05,2.1494845067789903e-05
 | 
			
		||||
0.001,0.0007159595906065037,0.0005536859656730149,0.00034598218983055497,0.0002168855920630381,0.0001362486585998701,8.571103051605296e-05,5.396713159578493e-05,3.399929127512844e-05,2.142732610463052e-05
 | 
			
		||||
0.001,0.0007152710906138687,0.0005529924964615861,0.00034529918922366796,0.00021635889240138666,0.0001358787804376394,8.546288501047042e-05,5.380475158117202e-05,3.389455405818364e-05,2.1360348987661796e-05
 | 
			
		||||
0.001,0.0007145881681833736,0.0005523048607339887,0.0003446224616264519,0.00021583728670966556,0.00013551259312919557,8.521726369129195e-05,5.364404315662281e-05,3.379090310339315e-05,2.129406976339983e-05
 | 
			
		||||
0.001,0.0007139108109389651,0.0005516230407004492,0.0003439519758859039,0.00021532074399295122,0.00013515007172518374,8.497414844816332e-05,5.3484993898260945e-05,3.368833016244125e-05,2.122848306212633e-05
 | 
			
		||||
0.001,0.0007132390066148024,0.0005509470187317473,0.00034328770115903844,0.00021480923358720733,0.0001347911915544671,8.473352137819455e-05,5.3327591526929936e-05,3.358682708410006e-05,2.1163583577742056e-05
 | 
			
		||||
0.001,0.0007125727430549207,0.0005502767773585094,0.000342629606910633,0.00021430272515636744,0.0001344359282214269,8.449536478383494e-05,5.317182390666476e-05,3.348638581318404e-05,2.109936606707349e-05
 | 
			
		||||
0.001,0.0007119120082129148,0.0005496122992705212,0.0003419776629110174,0.0002138011886894788,0.00013408425760331254,8.425966117078749e-05,5.3017679043188334e-05,3.3386998389521964e-05,2.1035825349191292e-05
 | 
			
		||||
0.001,0.000711256790151613,0.0005489535673160376,0.0003413318392338714,0.00021330459449785352,0.00013373615584760944,8.40263932459383e-05,5.286514508242194e-05,3.3288656946938245e-05,2.0972956304734848e-05
 | 
			
		||||
0.001,0.0007106071943639499,0.0005483006816957998,0.00034069221933208274,0.0002128129992904075,0.00013339165932644894,8.379558393280961e-05,5.271423641048183e-05,3.31913705135711e-05,2.091076460544407e-05
 | 
			
		||||
0.001,0.000709963208882901,0.0005476536252143895,0.0003400587732671483,0.0002123263734210078,0.00013305074425072359,8.356721599784782e-05,5.256494122003263e-05,3.3095131256746724e-05,2.0849245154782437e-05
 | 
			
		||||
0.001,0.0007093248218486061,0.0005470123808316875,0.00033943147139689077,0.0002118446875576196,0.00013271338709432742,8.334127240311385e-05,5.241724783997488e-05,3.299993143509595e-05,2.0788392916005465e-05
 | 
			
		||||
0.001,0.0007086920215080653,0.0005463769316622218,0.0003388102843733889,0.00021136791267964032,0.0001323795645916927,8.311773630434548e-05,5.2271144734051514e-05,3.290576339760186e-05,2.07282029115292e-05
 | 
			
		||||
0.001,0.0007080656480431051,0.0005457481216341828,0.0003381960373995552,0.00021089668206097172,0.0001320497200486003,8.289690449717853e-05,5.2126825862102536e-05,3.2812752146082854e-05,2.0668755034757233e-05
 | 
			
		||||
0.001,0.0007074456886869565,0.0005451259321489777,0.0003375886977799707,0.0002104309633113142,0.00013172382748945162,8.26787581753205e-05,5.198427834496719e-05,3.2720889139431744e-05,2.061004372929991e-05
 | 
			
		||||
0.001,0.0007068321308093747,0.0005445103448031184,0.0003369882331820464,0.00020997072442018424,0.00013140186125447996,8.246327876643199e-05,5.18434894660219e-05,3.2630165945308436e-05,2.055206350992823e-05
 | 
			
		||||
0.001,0.0007062249619162967,0.0005439013413874698,0.00033639461163356655,0.00020951593375373114,0.00013108379599680725,8.225044792981545e-05,5.170444666951808e-05,3.254057423900392e-05,2.0494808961820763e-05
 | 
			
		||||
0.001,0.00070562416964951,0.0005432989038865089,0.00033580780152024723,0.000209066560051587,0.00013076960667953474,8.204024755412909e-05,5.156713755893784e-05,3.2452105802317056e-05,2.0438274739819433e-05
 | 
			
		||||
0.001,0.0007050297417863318,0.0005427030144775926,0.0003352277715833316,0.00020862257242375786,0.00013045926857287288,8.183265975513502e-05,5.143154989537623e-05,3.236475252244954e-05,2.038245556769746e-05
 | 
			
		||||
0.001,0.0007044417829621171,0.000542113771820027,0.0003346546023905152,0.00020818402485557293,0.00013015281596227648,8.162770599537212e-05,5.129769708700084e-05,3.227852278867728e-05,2.032735670561579e-05
 | 
			
		||||
0.001,0.0007038602809995153,0.0005415311581470623,0.00033408826282687573,0.00020775088664703998,0.00012985022429639665,8.142536853201701e-05,5.116556699709043e-05,3.219340855821242e-05,2.0272972923816322e-05
 | 
			
		||||
0.001,0.0007032852238493367,0.0005409551558747416,0.0003335287221154158,0.00020732312745044945,0.00012955146931603386,8.122562983828357e-05,5.103514763884953e-05,3.2109401888525124e-05,2.0219299058105656e-05
 | 
			
		||||
0.001,0.0007027165995902542,0.0005403857476012292,0.00033297594981485264,0.00020690071726752732,0.0001292565270515082,8.102847260135871e-05,5.090642717392409e-05,3.202649493632917e-05,2.0166330009182866e-05
 | 
			
		||||
0.001,0.0007021546252265139,0.0005398231466905069,0.00033243014325207994,0.00020648380199548492,0.0001289654971719027,8.083396250547584e-05,5.077944809587575e-05,3.194471491165552e-05,2.0114083097018264e-05
 | 
			
		||||
0.001,0.0007015992888126556,0.0005392673356287205,0.0003318912717105927,0.00020607235137144977,0.0001286783555062261,8.06420820982489e-05,5.065419847368218e-05,3.186405391103787e-05,2.006255318369691e-05
 | 
			
		||||
0.001,0.0007010505785332368,0.0005387182970867077,0.00033135930481238495,0.00020566633548374424,0.0001283950781739038,8.04528141416734e-05,5.053066652493675e-05,3.1784504130324826e-05,2.001173519622426e-05
 | 
			
		||||
0.001,0.000700508482702546,0.0005381760139193414,0.00033083421251577956,0.00020526572476908743,0.000128115641582197,8.026614161010359e-05,5.040884061439589e-05,3.170605786368809e-05,1.9961624125869314e-05
 | 
			
		||||
0.001,0.0006999729897643184,0.0005376404691648787,0.00033031596511327947,0.00020487049000982136,0.00012784002242364822,8.008204768824872e-05,5.028870925253973e-05,3.1628707502639986e-05,1.9912215027513866e-05
 | 
			
		||||
0.001,0.0006994440882914515,0.0005371116460443127,0.0003298045332294241,0.0002044806023311588,0.0001275681976735486,7.990051576919067e-05,5.0170261094149856e-05,3.155244553506268e-05,1.9863503019009735e-05
 | 
			
		||||
0.001,0.0006989172535560769,0.0005365850419669894,0.000329295612913881,0.00020409280438264766,0.00012729790663346764,7.972004038787022e-05,5.0052515589855926e-05,3.147664135129994e-05,1.9815085586326718e-05
 | 
			
		||||
0.001,0.0006983924815322933,0.0005360606511477293,0.0003287891938968759,0.00020370708584067882,0.00012702914094133737,7.954061545150935e-05,4.993546855036179e-05,3.140129216611291e-05,1.9766960914662127e-05
 | 
			
		||||
0.001,0.0006978697681747856,0.000535538467781285,0.000328285265898271,0.00020332343638453147,0.00012676189224377013,7.936223487646896e-05,4.981911579385119e-05,3.1326395199731696e-05,1.971912719297887e-05
 | 
			
		||||
0.001,0.0006973491094188342,0.0005350184860423863,0.0003277838186277228,0.0002029418456965422,0.0001264961521961901,7.918489258833681e-05,4.970345314604528e-05,3.125194767789152e-05,1.967158261402843e-05
 | 
			
		||||
0.001,0.0006968284099289676,0.000534498597351666,0.00032728277956097635,0.00020256071739357045,0.0001262308004979493,7.900783730702533e-05,4.958798911408524e-05,3.1177632631488905e-05,1.9624124503146986e-05
 | 
			
		||||
0.001,0.0006963076677967887,0.0005339787996978908,0.00032678214616920946,0.00020218004908417888,0.0001259658352285323,7.883106763041168e-05,4.947272273059253e-05,3.110344941552445e-05,1.957675243920473e-05
 | 
			
		||||
0.001,0.0006957868810888677,0.0005334590910383602,0.00032628191587964447,0.00020179983833834103,0.00012570125443876325,7.865458213663353e-05,4.935765301510161e-05,3.102939737649859e-05,1.9529465995615212e-05
 | 
			
		||||
0.001,0.0006952660478468047,0.0005329394692990367,0.0003257820860759608,0.00020142008268794192,0.0001254370561512512,7.847837938443003e-05,4.924277897429975e-05,3.0955475852573814e-05,1.94822647404421e-05
 | 
			
		||||
0.001,0.00069474516608728,0.0005324199323746772,0.00032528265409871067,0.0002010407796272818,0.0001251732383608348,7.830245791348127e-05,4.91280996022673e-05,3.088168417373684e-05,1.943514823650581e-05
 | 
			
		||||
0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km
 | 
			
		||||
0.001,0.0007539177767305848,0.0005922648034750569,0.00038490617279658137,0.000247392320543982,0.00015791555306607623,0.0001003671566373715,6.361853747449743e-05,4.0256607010916584e-05,2.5446360651215025e-05
 | 
			
		||||
0.001,0.0007533902419958185,0.0005917244917926066,0.0003843504806873478,0.0002469518485683003,0.0001576007478372822,0.00010015356028336005,6.347773727057954e-05,4.016534974386181e-05,2.5387814123899557e-05
 | 
			
		||||
0.001,0.0007528628792251897,0.0005911844879166931,0.0003837954443648265,0.0002465120671477305,0.00015728651344926157,9.994038442151031e-05,6.333722806950528e-05,4.007428674216739e-05,2.5329394519652018e-05
 | 
			
		||||
0.001,0.0007523356872805944,0.0005906447907925071,0.0003832410626787123,0.0002460729751307637,0.00015697284891103737,9.972762829117227e-05,6.319700932883725e-05,3.9983417636365086e-05,2.5271101593906498e-05
 | 
			
		||||
0.001,0.0007518086649950493,0.0005901053993262767,0.0003826873344129807,0.000245634571300401,0.00015665975317873245,9.95152910932062e-05,6.305708047968383e-05,3.9892742039402306e-05,2.5212935090640287e-05
 | 
			
		||||
0.001,0.0007512818111727442,0.0005895663123854124,0.00038213425828639575,0.0002451968543747938,0.0001563472251561599,9.930337199043154e-05,6.291744092702573e-05,3.980225954686196e-05,2.5154894742516358e-05
 | 
			
		||||
0.001,0.0007507551245890757,0.0005890275287986403,0.0003815818329529933,0.00024475982300791935,0.00015603526369546326,9.909187010814736e-05,6.277809005009466e-05,3.9711969737226656e-05,2.5096980271060998e-05
 | 
			
		||||
0.001,0.0007502264452226824,0.0005884868559085152,0.00038102785262825065,0.00024432175277214066,0.00015572264698517112,9.88799609470651e-05,6.26384862087587e-05,3.9621522312922004e-05,2.5038967246912867e-05
 | 
			
		||||
0.001,0.000749695774901522,0.0005879442972710813,0.00038047232480109013,0.00024388265123925605,0.00015540938109456906,9.866764888521257e-05,6.249863239143498e-05,3.953091925128679e-05,2.498085695464162e-05
 | 
			
		||||
0.001,0.0007491631154430714,0.0005873998564236413,0.00037991525691100856,0.00024344252592185564,0.00015509547204033507,9.845493826021018e-05,6.235853155787194e-05,3.944016251022327e-05,2.4922650665997884e-05
 | 
			
		||||
0.001,0.0007486284686543365,0.0005868535368848297,0.00037935665634847824,0.00024300138427382333,0.00015478092578703268,9.824183336966692e-05,6.2218186639435e-05,3.9349254028404254e-05,2.4864349640052216e-05
 | 
			
		||||
0.001,0.0007480870957031576,0.000586300474032492,0.00037879149123861057,0.0002425552230413961,0.00015446287448415177,9.80263854642033e-05,6.207631182945079e-05,3.925735993392708e-05,2.4805418700342044e-05
 | 
			
		||||
0.001,0.0007475390029192987,0.0005857406797529387,0.0003782197872436036,0.00024210406905347345,0.00015414134016629157,9.780861070114894e-05,6.193291827596257e-05,3.9164487654400794e-05,2.4745862693628148e-05
 | 
			
		||||
0.001,0.0007469841968019674,0.0005851741661454001,0.0003776415703174324,0.00024164794939077438,0.0001538163450528885,9.758852536415706e-05,6.178801721036571e-05,3.907064467141267e-05,2.4685686501265697e-05
 | 
			
		||||
0.001,0.0007464226840200367,0.0005846009455219824,0.00037705686670463337,0.0002411868913840224,0.0001534879115464833,9.736614586183658e-05,6.164161994641891e-05,3.897583851984993e-05,2.462489503874857e-05
 | 
			
		||||
0.001,0.0007458544714121565,0.0005840210304075477,0.00037646570293897594,0.00024072092261200308,0.00015315606223087128,9.714148872627883e-05,6.149373787917076e-05,3.888007678716513e-05,2.45634932552282e-05
 | 
			
		||||
0.001,0.0007452795659868886,0.0005834344335395587,0.00037586810584214404,0.0002402500708997022,0.000152820819869329,9.691457061165131e-05,6.134438248396139e-05,3.878336711269497e-05,2.450148613305654e-05
 | 
			
		||||
0.001,0.0007446982091229053,0.0005828414050804809,0.00037526433980072227,0.0002397745491251193,0.0001524823380310375,9.668549630724793e-05,6.119362307821724e-05,3.868575452092861e-05,2.4438902597094615e-05
 | 
			
		||||
0.001,0.0007441104077793266,0.0005822419576041865,0.000374654431136991,0.00023929438452844706,0.0001521406389697796,9.645428208068799e-05,6.10414708650461e-05,3.858724646752558e-05,2.4375747508899864e-05
 | 
			
		||||
0.001,0.0007435161690815189,0.0005816361038919765,0.0003740384064517259,0.00023880960458647735,0.00015179574511101,9.622094431596755e-05,6.0887937123913e-05,3.848785045741014e-05,2.4312025761525238e-05
 | 
			
		||||
0.001,0.0007429155003212045,0.0005810238569324259,0.0003734162926228523,0.00023832023701067176,0.00015144767905002232,9.598549951201614e-05,6.073303320960556e-05,3.83875740440667e-05,2.42477422790523e-05
 | 
			
		||||
0.001,0.0007423085305088799,0.0005804053544492479,0.00037278824495395505,0.0002378264113599139,0.00015109653618969462,9.574801357389848e-05,6.057680304696976e-05,3.828644589147927e-05,2.4182915529390252e-05
 | 
			
		||||
0.001,0.0007416952671281527,0.0005797806095975203,0.0003721542903540935,0.000237328155265129,0.00015074233901078615,9.550850289594038e-05,6.041925791001213e-05,3.8184473495775654e-05,2.411755039775751e-05
 | 
			
		||||
0.001,0.0007410757178351933,0.0005791496357472955,0.0003715144560199718,0.00023682549660121693,0.00015038511017095082,9.526698399235154e-05,6.026040915139781e-05,3.8081664403831414e-05,2.4051651801815565e-05
 | 
			
		||||
0.001,0.0007404498904588522,0.0005785124464833875,0.0003708687694343879,0.00023631846348487102,0.00015002487250269267,9.502347349561174e-05,6.0100268201280124e-05,3.797802621247342e-05,2.3985224691142176e-05
 | 
			
		||||
0.001,0.000739817793000736,0.0005778690556051271,0.0003702172583646133,0.00023580708427235972,0.00014966164901128063,9.477798815483971e-05,5.9938846566140114e-05,3.787356656768574e-05,2.3918274046705576e-05
 | 
			
		||||
0.001,0.0007391794336352683,0.0005772194771261406,0.00036955995086080306,0.00023529138755728292,0.00014929546287266413,9.453054483414699e-05,5.977615582759686e-05,3.776829316380097e-05,2.385080488032797e-05
 | 
			
		||||
0.001,0.0007385356837401969,0.0005765645972068202,0.00036889774196575574,0.0002347720745464529,0.00014892681149659162,9.42814794200372e-05,5.9612416728092556e-05,3.7662348796962334e-05,2.378290869241134e-05
 | 
			
		||||
0.001,0.0007378865501365786,0.0005759044277808471,0.0003682306558404449,0.0002342491698918279,0.00014855571485941296,9.403080644324396e-05,5.944763924389705e-05,3.755574009362634e-05,2.371458979861065e-05
 | 
			
		||||
0.001,0.0007372320397833855,0.0005752389809515306,0.00036755871686373843,0.00023372269842386576,0.0001481821930634036,9.377854051813779e-05,5.92818334053861e-05,3.74484737148236e-05,2.364585253654512e-05
 | 
			
		||||
0.001,0.0007365721597776102,0.0005745682689916729,0.0003668819496311701,0.00023319268514975972,0.00014780626633511263,9.352469634142839e-05,5.911500929610015e-05,3.734055635551828e-05,2.35767012653732e-05
 | 
			
		||||
0.001,0.0007359070382096695,0.0005738924278329212,0.00036620050520582223,0.0002326592549483615,0.00014742802610623578,9.326933684741753e-05,5.8947208765596136e-05,3.723201528626343e-05,2.3507153539330125e-05
 | 
			
		||||
0.001,0.0007352366822744919,0.0005732114697907263,0.0003655144080205807,0.0002321224325628545,0.00014704749234532768,9.30124765259338e-05,5.877844174725213e-05,3.712285709891949e-05,2.3437213649054356e-05
 | 
			
		||||
0.001,0.0007345610993055855,0.0005725254073502257,0.0003648236827235576,0.00023158224291094424,0.00014666468514311576,9.275412994749425e-05,5.860871822644595e-05,3.701308841848994e-05,2.336688590620212e-05
 | 
			
		||||
0.001,0.0007338802967751745,0.0005718342531661053,0.0003641283541767086,0.00023103871108296522,0.00014627962471074844,9.249431176193324e-05,5.843804823954878e-05,3.690271590243443e-05,2.32961746429929e-05
 | 
			
		||||
0.001,0.0007331942822941306,0.0005711380200622195,0.000363428447454292,0.00023049186233985435,0.00014589233137793237,9.223303669696582e-05,5.826644187292669e-05,3.679174623998899e-05,2.3225084211761806e-05
 | 
			
		||||
0.001,0.0007325030636119942,0.000570436721031382,0.0003627239878414387,0.00022994172211121704,0.00014550282559116622,9.197031955679165e-05,5.809390926192732e-05,3.66801861514784e-05,2.3153618984504423e-05
 | 
			
		||||
0.001,0.0007318082249846354,0.000569731957456593,0.0003620165686744435,0.0002293895269980944,0.0001451119793900387,9.170674702405544e-05,5.792083507086079e-05,3.656828410642266e-05,2.3081938026911105e-05
 | 
			
		||||
0.001,0.0007311097709589727,0.0005690237376093709,0.0003613062068501535,0.00022883529410468975,0.00014471980653999792,9.14423290636205e-05,5.774722611940683e-05,3.6456044625219865e-05,2.3010044279099164e-05
 | 
			
		||||
0.001,0.0007304077061664716,0.0005683120698629669,0.00036059291938656614,0.00022827904062761942,0.00014432632086784533,9.117707567918865e-05,5.757308925149413e-05,3.6343472243382366e-05,2.293794069062729e-05
 | 
			
		||||
0.001,0.0007297020353231152,0.0005675969626922158,0.0003598767234219355,0.00022772078385475435,0.00014393153626068395,9.091099691249356e-05,5.739843133472259e-05,3.6230571511141116e-05,2.2865630220232028e-05
 | 
			
		||||
0.001,0.0007289948155254126,0.0005668805157203741,0.00035915975887038315,0.00022716220982550104,0.00014353665302637602,9.064490513205597e-05,5.722378701487135e-05,3.611768859725593e-05,2.279333481077374e-05
 | 
			
		||||
0.001,0.0007282860481242219,0.0005661627319510184,0.0003584420321019746,0.00022660332474955334,0.0001431416759965279,9.037880375071969e-05,5.7049158588914064e-05,3.6004825007582225e-05,2.2721055434706506e-05
 | 
			
		||||
0.001,0.0007275757345080665,0.0005654436144326382,0.00035772354953912867,0.0002260441348764214,0.00014274661002939483,9.011269619839399e-05,5.687454836459578e-05,3.5891982254752056e-05,2.2648793068745655e-05
 | 
			
		||||
0.001,0.0007268638761030398,0.0005647231662585116,0.0003570043176561602,0.0002254846464948739,0.0001423514600093734,8.984658592167178e-05,5.6699958660169715e-05,3.5779161857992474e-05,2.2576548693746487e-05
 | 
			
		||||
0.001,0.0007261504743729061,0.0005640013905666712,0.00035628434297892044,0.0002249248659324104,0.00014195623084652692,8.958047638345721e-05,5.652539180412445e-05,3.5666365342942064e-05,2.250432329458613e-05
 | 
			
		||||
0.001,0.0007254355308190145,0.0005632782905397587,0.00035556363208430486,0.00022436479955468554,0.0001415609274760624,8.931437106256734e-05,5.635085013490999e-05,3.5553594241465086e-05,2.2432117860037706e-05
 | 
			
		||||
0.001,0.0007247208411865314,0.0005625556717890254,0.0003548439578507697,0.00022380581171795803,0.00014116650687104502,8.904891159204534e-05,5.61767534392646e-05,3.544111934056619e-05,2.2360105593797506e-05
 | 
			
		||||
0.001,0.00072400640290786,0.000561833531609933,0.00035412531668185007,0.00022324789882467925,0.00014077296603347102,8.878409573173543e-05,5.600310014889176e-05,3.5328939584811035e-05,2.228828580259237e-05
 | 
			
		||||
0.001,0.0007232922134419361,0.000561111867333509,0.00035340770503880037,0.00022269105733400152,0.00014038030201108317,8.8519921274859e-05,5.5829888718494674e-05,3.521705393409239e-05,2.221665780315407e-05
 | 
			
		||||
0.001,0.0007225782702742098,0.0005603906763262448,0.0003526911194401051,0.00022213528376118449,0.00013998851189683077,8.825638604758897e-05,5.5657117625479614e-05,3.510546136342301e-05,2.214522092208301e-05
 | 
			
		||||
0.001,0.0007218663790349207,0.0005596717927826706,0.0003519774072686018,0.00022158202285215626,0.0001395986194011808,8.79941808494171e-05,5.5485240659247415e-05,3.499445534348073e-05,2.207416317565271e-05
 | 
			
		||||
0.001,0.0007211565340671307,0.000558955209053062,0.0003512665554090523,0.0002210312613239567,0.0001392106136609281,8.773329770591506e-05,5.531425230770577e-05,3.4884032196140665e-05,2.200348216114185e-05
 | 
			
		||||
0.001,0.0007204487297429265,0.0005582409175317231,0.00035055855083818805,0.00022048298599609717,0.00013882448390129787,8.747372870968443e-05,5.514414710600884e-05,3.477418827518741e-05,2.1933175496831414e-05
 | 
			
		||||
0.001,0.0007197429604633029,0.0005575289106567639,0.00034985338062403464,0.00021993718378969884,0.00013844021943515845,8.721546601972457e-05,5.497491963609735e-05,3.466491996599965e-05,2.1863240821795316e-05
 | 
			
		||||
0.001,0.0007190392206580874,0.0005568191809099186,0.0003491510319252488,0.00021939384172660586,0.00013805780966217872,8.695850186076947e-05,5.480656452622117e-05,3.455622368522282e-05,2.1793675795681418e-05
 | 
			
		||||
0.001,0.0007183375047857581,0.0005561117208162645,0.0003484514919904163,0.00021885294692850114,0.00013767724406801954,8.670282852265318e-05,5.463907645048003e-05,3.444809588045186e-05,2.172447809850241e-05
 | 
			
		||||
0.001,0.0007176398171146462,0.0005554085359032386,0.00034775670623974134,0.0002183159850558065,0.00013729955964329822,8.644913914890404e-05,5.447290801376681e-05,3.4340828149382966e-05,2.165583410030806e-05
 | 
			
		||||
0.001,0.0007169461476104001,0.0005547096122322624,0.0003470666509123452,0.00021778293254731739,0.00013692473741724035,8.61974199558567e-05,5.430804975101775e-05,3.423441420247442e-05,2.15877397033261e-05
 | 
			
		||||
0.001,0.0007162564863033777,0.0005540149359610161,0.00034638130244054916,0.00021725376605180745,0.00013655275859741984,8.594765729366703e-05,5.4144492290891566e-05,3.412884781322755e-05,2.152019085117201e-05
 | 
			
		||||
0.001,0.0007155708232884887,0.0005533244933430584,0.0003457006374485156,0.00021672846242622396,0.00013618360456808432,8.569983764497563e-05,5.3982226354801364e-05,3.40241228175218e-05,2.1453183528407172e-05
 | 
			
		||||
0.001,0.0007148907167777357,0.0005526398589811358,0.0003450262214786548,0.00021620823613271921,0.00013581813150424676,8.545453691240582e-05,5.3821629494988794e-05,3.392048307301558e-05,2.1386873841072776e-05
 | 
			
		||||
0.001,0.0007142161543980302,0.0005519610151552632,0.0003443580235484482,0.00021569305634208547,0.00013545631457844443,8.521173706397784e-05,5.366268933409295e-05,3.381792035746172e-05,2.1321256433336487e-05
 | 
			
		||||
0.001,0.0007135471238866448,0.0005512879443055973,0.0003436960129838173,0.0002151828925541902,0.0001350981292399717,8.497142027417112e-05,5.350539363884576e-05,3.371642654533412e-05,2.1256326012778444e-05
 | 
			
		||||
0.001,0.0007128836130908273,0.0005506206290316834,0.00034304015941680915,0.00021467771459500972,0.00013474355121214092,8.473356892178238e-05,5.3349730318534455e-05,3.361599360677474e-05,2.1192077349695405e-05
 | 
			
		||||
0.001,0.0007122256099675188,0.0005499590520918091,0.0003423904327834519,0.00021417749261385993,0.00013439255648970008,8.449816558787534e-05,5.319568742351694e-05,3.35166136065783e-05,2.1128505276425763e-05
 | 
			
		||||
0.001,0.0007115731025829938,0.0005493031964022937,0.0003417468033215544,0.0002136821970805245,0.000134045121336186,8.426519305371512e-05,5.304325314373989e-05,3.341827870317759e-05,2.106560468667675e-05
 | 
			
		||||
0.001,0.0007109261960066054,0.0005486531617838624,0.0003411093543337103,0.00021319188469384628,0.00013370128216574169,8.403467429429362e-05,5.289244191063335e-05,3.3320997960119286e-05,2.1003381278303992e-05
 | 
			
		||||
0.001,0.0007102848782749661,0.0005480089311096272,0.00034047805604549785,0.00021270652596543237,0.00013336101530442401,8.380659214968773e-05,5.274324196034732e-05,3.3224763568979684e-05,2.0941829967612013e-05
 | 
			
		||||
0.001,0.0007096491375319776,0.0005473704874075498,0.00033985287897724074,0.00021222609171923644,0.00013302429733989257,8.358092965463258e-05,5.25956416646764e-05,3.312956781229619e-05,2.088094573050621e-05
 | 
			
		||||
0.001,0.0007090189620285115,0.0005467378138598193,0.00033923379394201156,0.00021175055308892372,0.0001326911051189623,8.335767003660405e-05,5.244962952967474e-05,3.3035403062615115e-05,2.0820723601860106e-05
 | 
			
		||||
0.001,0.0007083951884833238,0.0005461117507284293,0.0003386216233705354,0.00021128054172409337,0.00013236188112429926,8.31371097341464e-05,5.230539940125761e-05,3.294239432192892e-05,2.076124352066865e-05
 | 
			
		||||
0.001,0.0007077778041323896,0.000545492279490185,0.00033801633474888146,0.00021081602540817874,0.00013203659950671687,8.291923002160208e-05,5.216293844781483e-05,3.285053307562121e-05,2.0702499944560498e-05
 | 
			
		||||
0.001,0.0007071667963482699,0.0005448793818164008,0.0003374178959240363,0.00021035697230232543,0.00013171523473119512,8.270401240613943e-05,5.202223399957759e-05,3.2759810917439646e-05,2.064448740210184e-05
 | 
			
		||||
0.001,0.0007065621526397901,0.000544273039572169,0.0003368262751014692,0.00020990335094223987,0.0001313977615739679,8.249143862546502e-05,5.188327354697137e-05,3.267021954836586e-05,2.0587200492045967e-05
 | 
			
		||||
0.001,0.0007059638606517004,0.0005436732348155853,0.0003362414408426963,0.00020945513023505862,0.00013108415511962746,8.228149064554578e-05,5.174604473897535e-05,3.258175077549588e-05,2.053063388259103e-05
 | 
			
		||||
0.001,0.0007053719081643225,0.0005430799497970297,0.00033566336206289793,0.00020901227945626015,0.00013077439075827684,8.20741506583782e-05,5.161053538152209e-05,3.249439651094783e-05,2.047478231065629e-05
 | 
			
		||||
0.001,0.0007047863993885064,0.0005424932828039034,0.0003350921191971394,0.0002085748525953015,0.00013046850282623395,8.186944018288875e-05,5.147675893062123e-05,3.240816518060804e-05,2.0419651063027786e-05
 | 
			
		||||
0.001,0.0007042073221500205,0.000541913216142546,0.0003345276813035574,0.00020814281911618103,0.00013016646689064054,8.166734155142674e-05,5.134470329367606e-05,3.232304876615549e-05,2.0365234922821375e-05
 | 
			
		||||
0.001,0.0007036346644028755,0.0005413397323015136,0.0003339700177764314,0.00020771614883326046,0.00012986825880927205,8.146783731136239e-05,5.121435652738549e-05,3.2239039349161415e-05,2.0311528738515718e-05
 | 
			
		||||
0.001,0.0007030684142289592,0.0005407728139509093,0.00033341909834398085,0.00020729481190839792,0.00012957385472790145,8.12709102230124e-05,5.1085706836262186e-05,3.215612911007561e-05,2.0258527423278803e-05
 | 
			
		||||
0.001,0.0007025087877125606,0.0005402126735385767,0.0003328751197405316,0.00020687895394469412,0.00012928335419699167,8.107662593993734e-05,5.095879672189383e-05,3.2074345280702784e-05,2.0206248321016987e-05
 | 
			
		||||
0.001,0.0007019557729111361,0.0005396592936234858,0.0003323380514212155,0.00020646854484108668,0.0001289967331620245,8.088496708343894e-05,5.083361429641059e-05,3.1993679981452625e-05,2.0154686306347033e-05
 | 
			
		||||
0.001,0.0007014093580122255,0.0005391126569487217,0.00033180786317787807,0.00020606355484577673,0.00012871396785738722,8.069591648818549e-05,5.071014781993386e-05,3.191412543168724e-05,2.010383631860697e-05
 | 
			
		||||
0.001,0.0007008695313331482,0.0005385727464408199,0.0003312845251369297,0.00020566395455347188,0.0001284350348038258,8.050945720021523e-05,5.058838569914163e-05,3.1835673948741706e-05,2.0053693361205354e-05
 | 
			
		||||
0.001,0.0007003362813206957,0.0005380395452091099,0.00033076800775717,0.00020526971490259695,0.00012815991080588224,8.032557247492852e-05,5.046831648582724e-05,3.175831794694013e-05,2.0004252500969603e-05
 | 
			
		||||
0.001,0.0006998095965508554,0.0005375130365450592,0.00033025828182767485,0.00020488080717254625,0.00012788857294937395,8.014424577511121e-05,5.0349928875481843e-05,3.168204993662801e-05,1.9955508867504938e-05
 | 
			
		||||
0.001,0.0006992849713647436,0.000536988737498668,0.0003297510574308719,0.00020449398184933928,0.0001276187643023316,7.996397313508213e-05,5.023224268320585e-05,3.160623916862529e-05,1.9907059627792014e-05
 | 
			
		||||
0.001,0.0006987624017369506,0.0005364666423066755,0.0003292463243531191,0.00020410922866516542,0.000127350476544274,7.978474848904117e-05,5.011525373583123e-05,3.153088286679667e-05,1.985890297191875e-05
 | 
			
		||||
0.001,0.0006982418836227756,0.0005359467451858974,0.000328744072370431,0.00020372653735498857,0.00012708370136324496,7.960656578019794e-05,4.9998957867578574e-05,3.1455978260416835e-05,1.9811037093701456e-05
 | 
			
		||||
0.001,0.0006977234129582083,0.0005354290403332512,0.00032824429124863073,0.00020334589765671668,0.0001268184304559618,7.942941896086744e-05,4.988335092011608e-05,3.138152258420484e-05,1.976346019070644e-05
 | 
			
		||||
0.001,0.0006972049031024503,0.0005349114284143175,0.00032774491556384407,0.00020296571741865816,0.00012655354571184963,7.925255773427056e-05,4.976794174339877e-05,3.130719890433304e-05,1.971596949574029e-05
 | 
			
		||||
0.001,0.0006966863521517465,0.000534393907423076,0.000327245942795149,0.00020258599425811892,0.00012628904521745982,7.907598070306232e-05,4.965272937294146e-05,3.123300657741713e-05,1.966856458850977e-05
 | 
			
		||||
0.001,0.000696167758177353,0.0005338764753221901,0.0003267473703778833,0.00020220672575398438,0.00012602492703077633,7.889968645020544e-05,4.95377128311886e-05,3.1158944951577065e-05,1.9621245043263798e-05
 | 
			
		||||
0.001,0.0006956491192256274,0.0005333591300431401,0.0003262491957040711,0.00020182790944721542,0.00012576118918167348,7.872367353931904e-05,4.942289112776892e-05,3.108501336660957e-05,1.957401042890837e-05
 | 
			
		||||
0.001,0.0006951304333180151,0.0005328418694862771,0.0003257514161227785,0.00020144954284132072,0.00012549782967232552,7.854794051499734e-05,4.9308263259716635e-05,3.1011211154138606e-05,1.9526860309103978e-05
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -1,98 +1,99 @@
 | 
			
		||||
0.001,0.0007651928200015371,0.0006070713937965498,0.00041423535558437785,0.0002897888610631573,0.00021340907299884933,0.00017198131811953097,0.00016127923791982795,0.00019503601408127412,0.00036549739730595273
 | 
			
		||||
0.001,0.0007645995806173374,0.0006064422887178694,0.00041349144049413134,0.00028906380160320487,0.00021270693331134475,0.0001712438796411692,0.0001603765556252246,0.00019363496213474675,0.00036239423700181427
 | 
			
		||||
0.001,0.0007640065772643761,0.0006058136176614386,0.00041274866023030733,0.0002883403899406645,0.0002120069527025505,0.00017050944162049183,0.000159478716966613,0.00019224364342300643,0.0003593168093314386
 | 
			
		||||
0.001,0.0007634138087852742,0.000605185379478,0.0004120070127662441,0.0002876186224176594,0.00021130912485491145,0.00016977799240843955,0.0001585856969223786,0.00019086199210672448,0.0003562649023666937
 | 
			
		||||
0.001,0.0007628028346998721,0.0006045332187986192,0.0004112166712442958,0.0002868226029691562,0.00021050564591298308,0.0001688917074786142,0.00015743651373617922,0.00018893812235512526,0.0003514029291704815
 | 
			
		||||
0.001,0.0007621921143131398,0.0006038815297458003,0.00041042762231867933,0.00028602858816935265,0.00020970502628600424,0.00016800982241073787,0.00015629534163924753,0.00018703308452519017,0.00034660591682276115
 | 
			
		||||
0.001,0.0007615816463554626,0.0006032303109890501,0.0004096398633263614,0.0002852365728026657,0.00020890725596775628,0.00016713231600712825,0.00015516212643578583,0.00018514669874176095,0.00034187301148734186
 | 
			
		||||
0.001,0.0007609692265548555,0.000602577299493926,0.0004088509941253184,0.00028444450359523985,0.00020811064471691694,0.00016625772561605027,0.00015403541161623416,0.00018327705284413884,0.00033720006213702974
 | 
			
		||||
0.001,0.0007603548574442921,0.0006019224999904981,0.0004080610253035772,0.00028365239238410656,0.0002073152021201705,0.00016538605339556675,0.00015291517504370476,0.00018142402424673905,0.0003325863766610152
 | 
			
		||||
0.001,0.0007597350402439383,0.0006012612395706585,0.0004072600935672035,0.0002828447987841907,0.00020649842223713097,0.00016448344741808307,0.00015174362495246272,0.00017946021794659197,0.00032758319657592714
 | 
			
		||||
0.001,0.0007591132829776185,0.0006005982088110791,0.0004064581175876688,0.00028203726728774387,0.00020568299547110922,0.00016358411213968798,0.00015057934813125987,0.00017751539893581778,0.00032265060787650516
 | 
			
		||||
0.001,0.000758484736453085,0.0005999283660908604,0.0004056495676510805,0.00028122495212139567,0.00020486486304104927,0.00016268449575399985,0.00014941879820841596,0.00017558496339953558,0.0003177787884410679
 | 
			
		||||
0.001,0.0007578494094215417,0.0005992517275730322,0.0004048344831924046,0.000280407904430663,0.00020404408117776887,0.0001617846565020927,0.00014826202727426984,0.00017366890284920263,0.0003129672376410902
 | 
			
		||||
0.001,0.0007572073108060312,0.0005985683096346821,0.0004040129039083478,0.0002795861755026316,0.00020322070604404603,0.00016088465224596546,0.00014710908652278506,0.00017176720707727308,0.00030821545426856767
 | 
			
		||||
0.001,0.0007565575890478602,0.00059787696153193,0.0004031823074325593,0.00027875567967892653,0.00020238859856737548,0.00015997497741322437,0.00014594324831107206,0.00016984173084389243,0.0003033838449669414
 | 
			
		||||
0.001,0.0007559011152632264,0.0005971788697390111,0.00040234530612592536,0.0002779206290242912,0.00020155405878687617,0.00015906535701622418,0.0001447815990558725,0.00016793142878541938,0.0002986152551090434
 | 
			
		||||
0.001,0.000755237898986442,0.000596474051424026,0.00040150194087318277,0.00027708107588917086,0.00020071714346489746,0.00015815584855490808,0.00014362418708307366,0.00016603627832169687,0.00029390910930431773
 | 
			
		||||
0.001,0.0007545681886825906,0.0005957627683701927,0.00040065250958751827,0.00027623729012494873,0.00019987808563904174,0.00015724665811831285,0.0001424712015659587,0.00016415642490307197,0.0002892651425802985
 | 
			
		||||
0.001,0.0007538919937536639,0.0005950450374279253,0.0003997970520738093,0.0002753893223189692,0.00019903693960802692,0.00015633783972296886,0.0001413226854400146,0.00016229183664828758,0.0002846827650697017
 | 
			
		||||
0.001,0.0007532045557665671,0.0005943145247994342,0.0003989223236188871,0.00027451662339635243,0.0001981640806362608,0.00015538551594067732,0.00014010540813129958,0.00016028630721570607,0.00027963581042999
 | 
			
		||||
0.001,0.0007525106592079478,0.0005935776116184588,0.00039804170193550713,0.0002736399653899091,0.00019728948692008958,0.00015443417816766013,0.00013889388158999866,0.0001582996284854468,0.0002746667454821644
 | 
			
		||||
0.001,0.0007518104383956622,0.000592834444449282,0.0003971553683797481,0.0002727595219957832,0.00019641331428482412,0.00015348396557824612,0.00013768822268133468,0.000156331819705631,0.00026977480754699626
 | 
			
		||||
0.001,0.0007511039033537896,0.0005920850408658466,0.0003962633635582371,0.00027187534416274955,0.00019553561634171146,0.00015253492870981108,0.00013648846139846028,0.00015438279270990136,0.0002649590347362105
 | 
			
		||||
0.001,0.0007503910642803073,0.0005913294186556257,0.0003953657283217157,0.0002709874829437419,0.00019465644657888978,0.0001515871176567501,0.0001352946268320504,0.0001524524582210848,0.0002602184722292356
 | 
			
		||||
0.001,0.0007496855573046408,0.0005905851062898704,0.00039449552403657745,0.00027014241927282736,0.0001938361803657908,0.0001507194393001951,0.00013421767536698768,0.000150722476765932,0.0002559376038022294
 | 
			
		||||
0.001,0.0007489737467556278,0.0005898345737440663,0.000393619635985906,0.00026929349394052985,0.00019301404332913125,0.00014985216957655317,0.00013314488789598826,0.00014900672746282064,0.00025171693602497907
 | 
			
		||||
0.001,0.0007482556429977025,0.0005890778388714725,0.00039273810426086416,0.0002684407562332248,0.0001921900867993824,0.00014898535811302548,0.00013207630234912348,0.00014730517414690737,0.000247555825445753
 | 
			
		||||
0.001,0.000747532135526673,0.0005883158165865031,0.0003918519024244402,0.00026758503804540166,0.0001913649895279964,0.00014811957577380352,0.00013101244041258906,0.0001456183389249714,0.00024345460151209766
 | 
			
		||||
0.001,0.0007468032330641541,0.0005875485221384682,0.0003909610648762846,0.00026672638132361175,0.0001905387943939666,0.00014725486211264363,0.00012995332641946747,0.00014394616337354944,0.00023941257691738652
 | 
			
		||||
0.001,0.0007460689444707028,0.0005867759709451519,0.0003900656262003575,0.00026586482808789615,0.00018971154418348472,0.00014639125636754904,0.00012889898406950181,0.00014228858823944247,0.00023542906884335907
 | 
			
		||||
0.001,0.0007453292787585437,0.0005859981786120694,0.0003891656212152682,0.00026500042051039684,0.000188883281693472,0.0001455287975953345,0.000127849436626481,0.0001406455538271199,0.00023150340029334736
 | 
			
		||||
0.001,0.0007445843685250069,0.0005852152884984452,0.0003882612223549495,0.00026413331906842847,0.00018805414639063353,0.00014466760638632992,0.00012680478406473458,0.00013901709088191773,0.00022763506393382832
 | 
			
		||||
0.001,0.0007438342228409441,0.0005844273161744179,0.0003873524639441998,0.00026326356496406687,0.00018722417962072503,0.0001438077197030893,0.00012576504647438162,0.00013740313489262333,0.00022382338328436597
 | 
			
		||||
0.001,0.0007430788509165626,0.0005836342773781009,0.0003864393804873395,0.0002623911994661588,0.00018639342263244998,0.00014294917419819004,0.000124730243348245,0.00013580362065026603,0.00022006768669446508
 | 
			
		||||
0.001,0.000742327254060605,0.0005828476385639736,0.00038554300530339766,0.00026154496076193957,0.00018559797011481673,0.0001421370333657246,0.00012375932796391997,0.00013430279846409174,0.00021649152387618443
 | 
			
		||||
0.001,0.0007415704350109161,0.0005820559385468977,0.00038464228372291103,0.0002606960153281244,0.00018480150743526303,0.00014132579578003348,0.000122792459010487,0.0001328143978658426,0.0002129659469511457
 | 
			
		||||
0.001,0.0007408084031449065,0.0005812591931755618,0.00038373724983374976,0.00025984440338310303,0.0001840040745362742,0.0001405154975809745,0.00012182965960439977,0.00013133837476817992,0.00020949038404752677
 | 
			
		||||
0.001,0.0007400427720784002,0.0005804590496942265,0.00038282961864956994,0.0002589915613698488,0.00018320681873232144,0.00013970708155515462,0.00012087177639736769,0.00012987560432955444,0.00020606578076074432
 | 
			
		||||
0.001,0.0007392735475065714,0.0005796555183614057,0.00038191941292656456,0.0002581375157328154,0.0001824097650442608,0.00013890056717630873,0.00011991881140841177,0.0001284260094133047,0.00020269149646849757
 | 
			
		||||
0.001,0.0007385007352097838,0.0005788486095364762,0.00038100665551987393,0.00025728229294257515,0.00018161293842329387,0.00013809597373520515,0.00011897076635433426,0.0001269895128043655,0.00019936689671873207
 | 
			
		||||
0.001,0.0007377243410529983,0.0005780383336785572,0.0003800913693799712,0.0002564259194903244,0.00018081636374445108,0.00013729332033271256,0.00011802764264291933,0.00012556603720150224,0.00019609135315036536
 | 
			
		||||
0.001,0.0007369464655998592,0.0005772268587748353,0.0003791758785432219,0.0002555703831979673,0.00018002165393456068,0.00013649394990366146,0.00011709066577140669,0.00012415690240967774,0.0001928666431485617
 | 
			
		||||
0.001,0.0007361671107233329,0.000576414188654825,0.000378260191109379,0.00025471569177879693,0.0001792288130669198,0.00013569785799734456,0.00011615980704210183,0.00012276198311838844,0.00018969202938803596
 | 
			
		||||
0.001,0.0007353862783344302,0.000575600327192691,0.00037734431522203,0.00025386185296321013,0.00017843784520433673,0.00013490504014296103,0.00011523503783001357,0.00012138115492992521,0.0001865667844236815
 | 
			
		||||
0.001,0.0007346027258369329,0.0005747835721418604,0.00037642443290667116,0.0002530026346493095,0.000177639416207763,0.0001341012793025371,0.0001142922256260196,0.00011996295037667013,0.00018332302768968173
 | 
			
		||||
0.001,0.0007338177018431625,0.0005739656376861859,0.00037550439543261463,0.0002521443237629474,0.00017684294734265143,0.00013330094534015117,0.00011335582519792064,0.00011855974750452474,0.00018013280630154984
 | 
			
		||||
0.001,0.0007330312083387708,0.0005731465277735759,0.000374584210907019,0.00025128692777751636,0.0001760484420635206,0.00013250403238709868,0.00011242580398299235,0.00011717140625198769,0.000176995286763841
 | 
			
		||||
0.001,0.0007322450716827681,0.0005723280950701311,0.00037366577307640326,0.00025043200586833656,0.00017525712146802507,0.00013171151729665014,0.00011150300328069361,0.00011579873047427355,0.00017391111613739919
 | 
			
		||||
0.001,0.0007314592892342591,0.0005715103366354928,0.0003727490765712826,0.00024957954955556494,0.0001744689721973381,0.00013092337604814113,0.00011058736861417956,0.00011444154833756723,0.0001708794064250159
 | 
			
		||||
0.001,0.0007306738583803173,0.0005706932495677312,0.00037183411609277345,0.00024872955044744495,0.00017368398100343736,0.0001301395848004509,0.00010967884595770732,0.00011309968990727626,0.00016789928423747183
 | 
			
		||||
0.001,0.0007298887765314699,0.0005698768309963597,0.00037092088639398746,0.0002478820002115871,0.00017290213471209804,0.00012936011984533696,0.0001087773816703527,0.00011177298701463364,0.00016496989019036454
 | 
			
		||||
0.001,0.0007291058850619836,0.0005690629705872476,0.0003700113801847071,0.0002470385774678141,0.00017212477134492983,0.0001285860674779147,0.00010788392632853856,0.00011046237940908493,0.00016209217355659912
 | 
			
		||||
0.001,0.0007283251776795193,0.0005682516594285885,0.0003691055790623401,0.0002461992575642169,0.00017135185999287266,0.00012781738439880834,0.00010699840217906239,0.00010916766306641233,0.00015926520709064215
 | 
			
		||||
0.001,0.000727546648123048,0.000567442888658507,0.0003682034647519281,0.00024536401604150686,0.00017058337001160307,0.00012705402771768452,0.00010612073231230378,0.0001078886367084761,0.00015648808062028533
 | 
			
		||||
0.001,0.0007267691175258129,0.0005666351120658079,0.00036730194585451363,0.00024452825978826814,0.00016981299319253088,0.00012628722374912656,0.00010523753204397677,0.00010660034638564814,0.00015369233245141463
 | 
			
		||||
0.001,0.0007259937543683618,0.0005658298620581495,0.00036640409142867466,0.00024369656281803695,0.0001690470312136919,0.00012552576286196436,0.00010436224908854787,0.00010532792661952348,0.00015094700928094292
 | 
			
		||||
0.001,0.0007252205525006216,0.0005650271299429238,0.0003655098835814395,0.0002428689011484816,0.0001682854538881413,0.00012476960247399048,0.00010349480634605481,0.00010407117393308648,0.00014825118806841486
 | 
			
		||||
0.001,0.0007244515476870691,0.0005642289688561167,0.00036462138604045246,0.00024204694758546622,0.00016752954803985582,0.00012401974721449815,0.00010263603739686231,0.00010283083470852359,0.0001456053538142381
 | 
			
		||||
0.001,0.0007236867286572494,0.0005634353625294562,0.0003637385663464586,0.00024123066115747858,0.00016677926586679636,0.00012327613591461942,0.00010178584352378332,0.00010160667618634935,0.0001430085413998934
 | 
			
		||||
0.001,0.0007229260842094953,0.0005626462948017631,0.0003628613922977866,0.00024042000126051454,0.00016603456004153966,0.00012253870808207087,0.0001009441272602465,0.00010039846917127745,0.000140459805170444
 | 
			
		||||
0.001,0.0007221696032014468,0.000561861749604344,0.00036198983191176377,0.0002396149275989645,0.00016529538363567852,0.00012180740380654271,0.00010011079225737115,9.920598777483068e-05,0.00013795821792425024
 | 
			
		||||
0.001,0.0007214188723728384,0.00056108334509554,0.0003611255610840681,0.0002388168283348348,0.00016456282140960994,0.00012108307905286178,9.928655238677393e-05,9.802986918413655e-05,0.0001355041849544529
 | 
			
		||||
0.001,0.0007206738776295639,0.0005603110603628828,0.0003602685373417506,0.00023802565027806571,0.00016383681258690845,0.00012036565891864721,9.847129356381268e-05,9.686986333449523e-05,0.0001330967445342526
 | 
			
		||||
0.001,0.0007199346049934109,0.0005595448746691314,0.00035941871861020354,0.00023724134078502595,0.00016311729706930416,0.00011965506942237431,9.7664903298557e-05,9.57257243308077e-05,0.00013073495556510661
 | 
			
		||||
0.001,0.0007192103057281418,0.0005587965882928195,0.000358597914203722,0.00023649404923234267,0.0001624426539507404,0.00011900000933912548,9.693290327537121e-05,9.469853254875163e-05,0.0001286228242214262
 | 
			
		||||
0.001,0.0007184916860834766,0.000558054333130965,0.0003577841401235257,0.0002357533416394368,0.00016177407584741055,0.00011835110239617177,9.620855295571759e-05,9.368449216343134e-05,0.0001265476735456528
 | 
			
		||||
0.001,0.000717778732645577,0.0005573180893469085,0.0003569773567342285,0.0002350191694371068,0.0001611115088719043,0.00011770828481211398,9.549176022876216e-05,9.268341301362701e-05,0.00012450880618841231
 | 
			
		||||
0.001,0.0007170715507844816,0.0005565879566941514,0.0003561776441627035,0.00023429158098135867,0.00016045497378223205,0.00011707155159443024,9.47824835635146e-05,9.169515755193108e-05,0.00012250560759307665
 | 
			
		||||
0.001,0.0007163701270344053,0.0005558639152622166,0.0003553849627325309,0.00023357052778616886,0.00015980441694230793,0.00011644083951173604,9.408063218207804e-05,9.071953997714039e-05,0.00012053740486430812
 | 
			
		||||
0.001,0.0007156744480415676,0.0005551459453084167,0.00035459927313802623,0.00023285596185845654,0.00015915978530381373,0.00011581608608941654,9.338611653058621e-05,8.975637744384618e-05,0.00011860353870291344
 | 
			
		||||
0.001,0.0007149845005557793,0.0005544340272448129,0.0003538205364097734,0.0002321478356456351,0.0001585210263398076,0.00011519722952770958,9.269884816673769e-05,8.880548985453175e-05,0.00011670336266552508
 | 
			
		||||
0.001,0.0007143011352806332,0.0005537290222260827,0.0003530496254918224,0.00023144685778402562,0.00015788868071804074,0.00011458468167101622,9.20191492389152e-05,8.786712068874325e-05,0.00011483685132763588
 | 
			
		||||
0.001,0.0007136243377311475,0.0005530309085687206,0.00035228649684153725,0.0002307529751854999,0.00015726269010384348,0.00011397837465469773,9.134692457668887e-05,8.694108196461404e-05,0.00011300335424584403
 | 
			
		||||
0.001,0.0007129540935643617,0.0005523396647985742,0.000351531107363628,0.0002300661353432777,0.0001566429968410848,0.00011337824146720777,9.06820803490277e-05,8.602718880727694e-05,0.00011120223452206596
 | 
			
		||||
0.001,0.0007122949300063586,0.0005516609446370161,0.0003507932546232374,0.0002293990178082647,0.00015604454205901748,0.00011280134646728481,9.004396195380538e-05,8.514641523915274e-05,0.00010944396621311202
 | 
			
		||||
0.001,0.0007116422850379047,0.0005509890404263221,0.00035006301886912226,0.00022873877079420107,0.00015545216193435095,0.00011223032450910806,8.941277122627028e-05,8.427699754143763e-05,0.00010771649233683978
 | 
			
		||||
0.001,0.0007109961448775265,0.0005503239315436604,0.00034934035900275196,0.00022808534468017605,0.00015486580256638324,0.00011166511373672321,8.878842266662507e-05,8.341876815036907e-05,0.00010601922394974779
 | 
			
		||||
0.001,0.0007103566138672342,0.0005496657159311855,0.0003486253516297722,0.00022743878433373037,0.00015428548213839886,0.00011110570832676001,8.81708780194749e-05,8.25716070442755e-05,0.00010435164299643007
 | 
			
		||||
0.001,0.0007097236782517396,0.0005490143729973408,0.0003479179557857281,0.0002267990403962617,0.0001537111471536449,0.00011055204708289399,8.756005313455197e-05,8.173535064610718e-05,0.0001027131817052566
 | 
			
		||||
0.001,0.0007090973244087274,0.0005483698823458906,0.00034721813091834777,0.000226166064037726,0.00015314274472297157,0.00011000406955950422,8.695586501935841e-05,8.090983803329783e-05,0.00010110328401062253
 | 
			
		||||
0.001,0.0007084775388425413,0.0005477322237660661,0.0003465258368613831,0.00022553980691704316,0.00015258022251510344,0.00010946171600087524,8.635823175652435e-05,8.00949107862898e-05,9.952140501322636e-05
 | 
			
		||||
0.001,0.0007078645400735427,0.0005471016129101978,0.0003458412757255009,0.00022492042013778988,0.00015202368335334558,0.00010892504915290583,8.57671759148139e-05,7.929051589048381e-05,9.796715152670613e-05
 | 
			
		||||
0.001,0.0007072583145347741,0.0005464780293804963,0.00034516440688163317,0.00022430785483116316,0.0001514730744232032,0.00010839400891826328,8.518261565996433e-05,7.84964968569563e-05,9.643999410136803e-05
 | 
			
		||||
0.001,0.0007066588487940405,0.000545861452976259,0.0003444951901125997,0.00022370206265319418,0.00015092834351042303,0.00010786853593723236,8.460447028623623e-05,7.771269974698105e-05,9.493941424410264e-05
 | 
			
		||||
0.001,0.0007060768113835355,0.0005452653567881146,0.00034385780916102886,0.0002231355522451839,0.0001504295746545273,0.00010739737531972382,8.409424224945842e-05,7.702434963545377e-05,9.360618912201228e-05
 | 
			
		||||
0.001,0.0007055014939207988,0.0005446762036784223,0.00034322791998477503,0.0002225755642266546,0.00014993632274793293,0.00010693123855410087,8.358951092264173e-05,7.634435339541097e-05,9.22944227993744e-05
 | 
			
		||||
0.001,0.0007049328836329239,0.0005440939744776738,0.0003426054850001757,0.00022202205441602206,0.000149448541485554,0.00010647007505716636,8.309021096715739e-05,7.567259318109089e-05,9.100372969350909e-05
 | 
			
		||||
0.001,0.0007043664108869901,0.0005435140913972429,0.00034198598587466614,0.00022147141590047654,0.00014896349766232102,0.00010601178096740148,8.259459730216135e-05,7.500736724232048e-05,8.973176442333615e-05
 | 
			
		||||
0.001,0.0007038020712072354,0.0005429365478183962,0.00034136940918446675,0.0002209236320980648,0.00014848117283038098,0.00010555633431743894,8.210263744821714e-05,7.434860458126827e-05,8.847824135377829e-05
 | 
			
		||||
0.001,0.0007032398600991381,0.0005423613371043419,0.00034075574151016483,0.0002203786864681782,0.00014800154862415601,0.00010510371328265478,8.161429921011451e-05,7.369623501807121e-05,8.724287943554497e-05
 | 
			
		||||
0.001,0.0007026797730466592,0.0005417884525961108,0.00034014496942632764,0.0002198365624959981,0.00014752460674093983,0.00010465389615779026,8.112955064604149e-05,7.305018913687007e-05,8.602540201539488e-05
 | 
			
		||||
0.001,0.0007021196874055633,0.0005412157406692665,0.0003395348927353949,0.00021929545761274023,0.00014704895219343257,0.00010420578859113516,8.064746506639534e-05,7.240953347459202e-05,8.482441661675139e-05
 | 
			
		||||
0.001,0.0007015596012323657,0.0005406431992153213,0.0003389255082691921,0.00021875536780717296,0.00014657457987728414,0.00010375938295149973,8.016802726693694e-05,7.17742234562459e-05,8.363970356449741e-05
 | 
			
		||||
0.001,0.0007009995125587165,0.0005400708260946051,0.0003383168128172846,0.00021821628903476192,0.00014610148467187763,0.0001033146716169485,7.969122211456026e-05,7.114421486558773e-05,8.247104609297546e-05
 | 
			
		||||
0.001,0.000700426120570031,0.0005394817717340144,0.00033767827777106695,0.00021763678242090514,0.00014557802543177205,0.00010280805245363877,7.913535785684264e-05,7.040274681183516e-05,8.111172191387726e-05
 | 
			
		||||
0.001,0.0006998527383823768,0.0005388929110101418,0.0003370405259007354,0.00021705847496470142,0.00014505616500334602,0.00010230367256069614,7.858312049704058e-05,6.966868896041247e-05,7.977423771714316e-05
 | 
			
		||||
0.0010496228983614124,0.002020602352332682,0.0024834354692445607,0.004712247621156641,0.00854174709233096,0.015197203876184536,0.027142477151470907,0.049749449744480465,0.09589624880110185,0.2
 | 
			
		||||
0.004235602571438949,0.007336805952289255,0.008714058005603317,0.015024716476258112,0.025061770718850837,0.04079161627542227,0.0649508755581543,0.10074574737193842,0.14993445055894863,0.206
 | 
			
		||||
0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km
 | 
			
		||||
0.001,0.0007654185419972524,0.0006073276056093792,0.0004146475603472041,0.0002902671662170687,0.00021391771777705748,0.0001725335650783217,0.0001619576961300996,0.00019613348481478226,0.00036856555154569
 | 
			
		||||
0.001,0.0007648265274364283,0.0006066999211698721,0.00041390447843586643,0.00028954214777674505,0.00021321488386807227,0.000171794621873672,0.00016105212098646378,0.00019472570335261124,0.00036543839103292923
 | 
			
		||||
0.001,0.00076423475082742,0.0006060726714187721,0.00041316253063080743,0.0002888187769396436,0.00021251421079625184,0.0001710586847350929,0.00016015140443848455,0.0001933277019274264,0.0003623371672096105
 | 
			
		||||
0.001,0.0007636432110143774,0.0006054458552058583,0.0004124217148997164,0.0002880970500399001,0.00021181569222935437,0.00017032574197864756,0.00015925552136261768,0.00019193941431515274,0.0003592616661738057
 | 
			
		||||
0.001,0.00076303338083269,0.0006047950045143256,0.0004116319711720434,0.0002873006965446473,0.00021101094555209704,0.00016943701776024394,0.00015810165194844262,0.00019000410483730154,0.00035435344277520014
 | 
			
		||||
0.001,0.0007624238065102939,0.0006041446264165162,0.00041084352013847123,0.0002865063493191246,0.0002102090638489634,0.00016855270795343295,0.00015695583271993784,0.000188087762219128,0.00034951092824224374
 | 
			
		||||
0.001,0.0007618144867783217,0.0006034947195801519,0.00041005635912737644,0.00028571400313117073,0.000209410037075066,0.00016767279125308264,0.000155818009114819,0.0001861902048930817,0.00034473325633896016
 | 
			
		||||
0.001,0.0007612032230964268,0.0006028430274261829,0.0004092680923152776,0.00028492160640338084,0.00020861217469969167,0.00016679580316719344,0.00015468672086849377,0.00018430951195784153,0.0003400162401556392
 | 
			
		||||
0.001,0.0007605900180176352,0.0006021895546863309,0.000408478730269415,0.00028412917095061395,0.00020781548628341263,0.00016592174578786424,0.0001535619455802766,0.00018244555944842464,0.000335359176825339
 | 
			
		||||
0.001,0.0007599713504055552,0.0006015295991965402,0.0004076783487865176,0.0002833211587561824,0.00020699731581240013,0.00016501652229006483,0.00015238542164450143,0.000180469716663273,0.00033030742335106797
 | 
			
		||||
0.001,0.0007593507507343548,0.0006008678808679657,0.00040687692763931326,0.0002825132124386522,0.00020618050489600874,0.00016411458466993175,0.0001512162128542595,0.00017851301079839705,0.00032532712476693115
 | 
			
		||||
0.001,0.0007587233815624382,0.0006001993719156019,0.00040606894689472706,0.0002817004901671922,0.0002053609939218913,0.0001632123763493078,0.00015005076311129325,0.00017657081573262424,0.0003204083683965919
 | 
			
		||||
0.001,0.0007580892517126006,0.0005995240885208491,0.0004052544459439752,0.0002808830430533993,0.00020453883912382008,0.0001623099555953223,0.0001488891244397257,0.00017464312199372379,0.0003155506430768726
 | 
			
		||||
0.001,0.000757448370179369,0.0005988420470784952,0.00040443346443882024,0.0002800609223493252,0.00020371409666633197,0.00016140738029416416,0.00014773134796391561,0.00017272991838834854,0.0003107534371554913
 | 
			
		||||
0.001,0.0007567998780637095,0.00059815208713495,0.0004036034596839685,0.0002792300099339312,0.0002028805779162198,0.0001604950646725177,0.00014656055358564036,0.0001707926621492761,0.00030587527063737443
 | 
			
		||||
0.001,0.0007561446539823046,0.0005974554049330684,0.00040276706435836743,0.0002783945504517164,0.00020204463288750894,0.00015958281494627715,0.00014539398266818048,0.00016887071348766508,0.00030106092293455183
 | 
			
		||||
0.001,0.0007554827075416216,0.0005967520176577599,0.00040192431930056663,0.00027755459621831854,0.00020120631834502002,0.0001586706886366497,0.00014423168344504801,0.00016696404870095068,0.0002963098069760517
 | 
			
		||||
0.001,0.0007548142866478835,0.0005960421864035,0.00040107552190864405,0.000276710416864016,0.00020036586735025836,0.00015775889202640647,0.00014307384532883863,0.00016507281278915244,0.00029162164835553234
 | 
			
		||||
0.001,0.0007541394007727726,0.0005953259280357876,0.00040022071194032425,0.0002758620629396957,0.00019952333420039184,0.0001568474791446172,0.00014192051114461952,0.000163196972716382,0.0002869958456117749
 | 
			
		||||
0.001,0.000753453261276124,0.0005945968692177485,0.0003993465628625302,0.0002749888554209862,0.00019864889698783253,0.00015589225679197793,0.00014069786108208423,0.00016117883466097707,0.0002818995386546663
 | 
			
		||||
0.001,0.0007527606830746849,0.0005938614307668164,0.00039846653446453577,0.00027411169702333635,0.00019777273283424246,0.00015493803621995225,0.00013948100714945055,0.00015917971666279146,0.00027688213338452353
 | 
			
		||||
0.001,0.000752061800251107,0.000593119758904669,0.0003975808078042764,0.0002732307613051971,0.00019689499757748,0.00015398495670235495,0.00013827006619590224,0.00015719963654088831,0.0002719428500764955
 | 
			
		||||
0.001,0.0007513566228984858,0.0005923718712186205,0.00039668942343994645,0.00027234609917798486,0.0001960157448213401,0.0001530330687596212,0.0001370650679700252,0.0001552385042294358,0.000267080708365827
 | 
			
		||||
0.001,0.0007506451612836396,0.000591617785508762,0.0003957924221725467,0.000271457761656054,0.00019513502804513515,0.00015208242246717618,0.00013586604131538964,0.00015329622856198138,0.00026229473523033993
 | 
			
		||||
0.001,0.0007499410764512782,0.0005908750616328752,0.0003949229270536377,0.00027061232560569935,0.0001943133661054677,0.00015121214860141992,0.00013478433495717895,0.0001515553239579192,0.0002579720674546429
 | 
			
		||||
0.001,0.0007492307077939692,0.0005901261380362599,0.0003940477612542949,0.0002697630351391033,0.0001934898396676657,0.00015034229582385722,0.00013370682839182124,0.00014982878466439454,0.0002537103994437239
 | 
			
		||||
0.001,0.0007485140657428474,0.0005893710325813375,0.00039316696481225496,0.0002689099395032721,0.00019266450005914697,0.0001494729137699088,0.00013263355942168804,0.00014811657325897344,0.00024950907434075407
 | 
			
		||||
0.001,0.0007477920374988207,0.0005886106575770754,0.00039228150952041026,0.0002680538698732277,0.00019183802609277662,0.00014860457389983926,0.00013156505071301006,0.00014641921273032577,0.00024536841469387607
 | 
			
		||||
0.001,0.0007470646318417684,0.000587845028280153,0.00039139142972943226,0.00026719486815718823,0.00019101046063687028,0.0001477373157547231,0.00013050132642612272,0.00014473664329931894,0.00024128771968956965
 | 
			
		||||
0.001,0.000746331857690334,0.0005870741601150847,0.0003904967599732611,0.0002663329763359202,0.00019018184646592208,0.0001468711785583918,0.00012944241008601634,0.0001430688043627681,0.00023726629318772418
 | 
			
		||||
0.001,0.000745593724114763,0.0005862980686936137,0.0003895975350198339,0.0002654682365419898,0.00018935222636504533,0.00014600620135329296,0.00012838832478192589,0.0001414156348862137,0.00023330344508078714
 | 
			
		||||
0.001,0.0007448503634609417,0.0005855168970231048,0.00038869392700388675,0.0002646008091121948,0.00018852173980288115,0.00014514250481571783,0.00012733917050730646,0.00013977716467553823,0.00022939865638927297
 | 
			
		||||
0.001,0.0007441017848559784,0.0005847306606783223,0.0003877859701983709,0.00026373073520765555,0.0001876904281105713,0.0001442801258881357,0.00012629496716723198,0.0001381533278738466,0.00022555123779529113
 | 
			
		||||
0.001,0.000743347997566111,0.0005839393754013221,0.00038687369905472224,0.00026285805605533836,0.00018685833252122952,0.0001434191012016364,0.000125255734067765,0.0001365440579330561,0.0002217605049922782
 | 
			
		||||
0.001,0.0007425980122165197,0.0005831545190886928,0.0003859781684512971,0.00026201154253776947,0.00018606159531590292,0.00014260456502787665,0.00012428053620243385,0.0001350337902936029,0.00021815009586241928
 | 
			
		||||
0.001,0.0007418428222422646,0.0005823646190291856,0.00038507830193089523,0.00026116232813230903,0.0001852638537460305,0.00014179094397584395,0.00012330941740530514,0.00013353605951814913,0.000214590937375532
 | 
			
		||||
0.001,0.0007410824370750857,0.0005815696910727474,0.00038417413352571667,0.0002603104530145326,0.00018446514774054143,0.00014097827417406666,0.00012234240064855456,0.00013205082038162874,0.00021108244611026217
 | 
			
		||||
0.001,0.0007403184660014679,0.0005807713776603622,0.0003832673750805624,0.0002594573523562161,0.0001836666246937272,0.00014016749938812904,0.00012138033426810311,0.00013057895028626532,0.00020762556561303502
 | 
			
		||||
0.001,0.0007395509147560407,0.0005799696890514251,0.0003823580493090658,0.0002586030525652665,0.00018286830960336872,0.00013935863904919696,0.00012042322007081454,0.00012912037080446074,0.00020421964337946413
 | 
			
		||||
0.001,0.0007387797891584386,0.0005791646356057247,0.0003814461790231548,0.0002577475800751799,0.00018207022739706005,0.00013855171240478834,0.00011947105956106815,0.0001276750034397535,0.00020086403326178727
 | 
			
		||||
0.001,0.0007380050951127038,0.000578356227782297,0.00038053178712941366,0.00025689096133950617,0.0001812724029256328,0.00013774673851177748,0.00011852385393388548,0.0001262427696188339,0.00019755809538624924
 | 
			
		||||
0.001,0.0007372289278765602,0.0005775466274590334,0.00037961719344922816,0.00025603518246549605,0.00018047644930614432,0.00013694506185961904,0.00011758283148187963,0.00012482499369662246,0.0001943036135491255
 | 
			
		||||
0.001,0.0007364512893389424,0.0005767358384619004,0.0003787024060562486,0.0002551802511391958,0.00017968237057615404,0.0001361466779099092,0.00011664796319397039,0.00012342154884218158,0.00019109983808810176
 | 
			
		||||
0.001,0.0007356721814267267,0.0005759238646613067,0.0003777874330677233,0.0002543261750635963,0.00017889017076266666,0.00013535158210437542,0.00011571922013388507,0.00012203230915507028,0.00018794602945024216
 | 
			
		||||
0.001,0.0007348903474707337,0.0005751089853685418,0.00037686841880625214,0.0002534666634479025,0.00017809042928748983,0.00013454542482553396,0.00011477223754870921,0.00012060527355137842,0.0001846722184263047
 | 
			
		||||
0.001,0.0007341070502230424,0.0005742929332546843,0.0003759492523595486,0.00025260806222015907,0.0001772926545344648,0.0001337427099649026,0.00011383170595735486,0.00011919336498115804,0.00018145260378874068
 | 
			
		||||
0.001,0.0007333222916846016,0.0005734757122629472,0.0003750299418068227,0.0002517503788238516,0.00017649684991694604,0.00013294343155185963,0.00011289759243683735,0.00011779644164652425,0.00017828633792123003
 | 
			
		||||
0.001,0.0007325378931581444,0.0005726591695542582,0.00037411237735305734,0.00025089517102575937,0.00017570423657326553,0.00013214856737581396,0.00011197073980433406,0.0001164153090011861,0.00017517406255147756
 | 
			
		||||
0.001,0.0007317538520017976,0.0005718433021851622,0.00037319655361857124,0.00025004243032543557,0.00017491480109484205,0.00013135809328305347,0.0001110510931582075,0.00011504979334922632,0.00017211487548789828
 | 
			
		||||
0.001,0.0007309701656016873,0.0005710281072505973,0.0003722824652942578,0.0002491921483105776,0.0001741285301842189,0.000130571985300518,0.00011013859805243972,0.00011369972292133188,0.00016910788945367707
 | 
			
		||||
0.001,0.0007301868313673829,0.0005702135818768351,0.00037137010712276296,0.0002483443166280691,0.00017334541061775574,0.0001297902195887095,0.00010923320042963165,0.00011236492773944517,0.00016615223146969552
 | 
			
		||||
0.001,0.0007294056858799279,0.0005694016103111181,0.00037046146816096116,0.0002475006124214696,0.00017256678052747222,0.0001290138836109195,0.0001083358528422491,0.00011104635018836138,0.0001632488500459303
 | 
			
		||||
0.001,0.0007286267228265342,0.0005685921836368309,0.00036955653001307385,0.0002466610110284357,0.00017179260894632618,0.00012824293390221287,0.00010744647704539295,0.00010974378427192081,0.00016039680402653037
 | 
			
		||||
0.001,0.0007278499359259242,0.0005677852929874075,0.0003686552744110329,0.000245825487979439,0.00017102286517266867,0.00012747732740860064,0.00010656499564424898,0.00010845702677323144,0.00015759516965436614
 | 
			
		||||
0.001,0.0007270741396329974,0.0005669793834682747,0.00036775459243596013,0.0002449894231786493,0.00017025120181982169,0.00012670823171859124,0.00010567792500018758,0.00010716091111285436,0.00015477474449137119
 | 
			
		||||
0.001,0.000726300509089127,0.0005661759961906673,0.0003668575707603942,0.00024415741777526555,0.00016948395998088835,0.00012594449635600327,0.000104798812682607,0.00010588078664841973,0.00015200532201362785
 | 
			
		||||
0.001,0.0007255290381246482,0.0005653751224576382,0.0003659641914980988,0.00024332944777626794,0.00016872110941070693,0.00012518607857232714,0.00010392758109688598,0.00010461644792633948,0.00014928596543342006
 | 
			
		||||
0.001,0.0007247617567123682,0.0005645788092050789,0.0003650765144822908,0.0002425071844547339,0.00016796393694001768,0.00012443398389681975,0.0001030650652169494,0.00010336864256044427,0.00014661715384500229
 | 
			
		||||
0.001,0.0007239986535454607,0.0005637870401634551,0.0003641945072810511,0.0002416905868396016,0.00016721239470100498,0.00012368815096486452,0.00010221116577265065,0.00010213713571582715,0.00014399790845116419
 | 
			
		||||
0.001,0.0007232397173862652,0.0005629997991705343,0.0003633181377200508,0.00024087961432750444,0.00016646643530137355,0.0001229485190910589,0.00010136578475280116,0.00010092169616032506,0.00014142727026178776
 | 
			
		||||
0.001,0.00072248493705675,0.0005622170701566371,0.0003624473738436701,0.00024007422662323307,0.0001657260117481481,0.0001222150281737581,0.00010052882527084345,9.972209600365954e-05,0.000138904299062937
 | 
			
		||||
0.001,0.0007217358950348228,0.000561440466555814,0.00036158388844431124,0.00023927581064585389,0.0001649922088518066,0.00012148853502428482,9.97010025298723e-05,9.853897375975792e-05,0.00013642939611266722
 | 
			
		||||
0.001,0.0007209925771752469,0.0005606699674539418,0.0003607276390906435,0.00023848431321443392,0.00016426496576549843,0.00012076896452456461,9.888220185750974e-05,9.737207727303015e-05,0.00013400158668478175
 | 
			
		||||
0.001,0.0007202549694492843,0.0005599055521123883,0.0003598785837495114,0.00023769968169456287,0.0001635442223215586,0.00012005624248053424,9.807231018575002e-05,9.622115859912247e-05,0.0001316199170239902
 | 
			
		||||
0.001,0.0007195323462520794,0.0005591590509921624,0.0003590585920958888,0.00023695215697134095,0.00016286848728581805,0.00011939925459233543,9.733714368639992e-05,9.518785816120323e-05,0.00012948993319015237
 | 
			
		||||
0.001,0.0007188153904868624,0.0005584185656809617,0.00035824561959240325,0.0002362112130369942,0.00016219882234612553,0.00011874843483873407,9.660966052802588e-05,9.416779973181015e-05,0.00012739732395025585
 | 
			
		||||
0.001,0.0007181040886926203,0.0005576840763431772,0.00035743962664792336,0.00023547680133784063,0.00016153517356182933,0.00011810371926813217,9.588976814961258e-05,9.316079161517574e-05,0.00012534138272701054
 | 
			
		||||
0.001,0.0007173985458519898,0.0005569556823713467,0.0003566406932084415,0.00023474897015812488,0.0001608775616408074,0.00011746510277705029,9.517742467544867e-05,9.216669491688869e-05,0.00012332148630987257
 | 
			
		||||
0.001,0.0007166987484521553,0.0005562333638566226,0.00035584877964252954,0.00023402767102794237,0.00016022593289484238,0.00011683252196707568,9.447253888812898e-05,9.118532235085734e-05,0.00012133695300052025
 | 
			
		||||
0.001,0.0007160046830928351,0.0005555171010581067,0.00035506384668924896,0.00023331285597027454,0.00015958023422419515,0.00011620591419889337,9.377502080118898e-05,9.021648961473911e-05,0.0001193871149139895
 | 
			
		||||
0.001,0.0007153163364777631,0.0005548068743897313,0.0003542858554234702,0.00023260447744820426,0.00015894041305074621,0.00011558521750971036,9.308478154551746e-05,8.926001517936315e-05,0.00011747131722415646
 | 
			
		||||
0.001,0.0007146345569433116,0.0005541035424399441,0.0003535156771553805,0.00023190324345165713,0.00015830701004295562,0.00011497084410199294,9.240214376206843e-05,8.831614266750221e-05,0.00011558953011398195
 | 
			
		||||
0.001,0.0007139593299513231,0.0005534070835269872,0.0003527532683936443,0.00023120910091256188,0.0001576799668132194,0.0001143627259393922,9.172701183766888e-05,8.738468264977303e-05,0.00011374109491336212
 | 
			
		||||
0.001,0.0007132906411062882,0.000552717476178626,0.00035199858609393853,0.00023052199734406963,0.00015705922565321226,0.00011376079584113645,9.105929150577112e-05,8.646544883197101e-05,0.0001119253667056674
 | 
			
		||||
0.001,0.0007126330184449588,0.0005520403753247726,0.0003512614302897459,0.0002298546155988536,0.00015645973111213718,0.0001131821199461313,9.041832213305081e-05,8.557937250804453e-05,0.00011015252685143603
 | 
			
		||||
0.001,0.000711981898998139,0.0005513700720769836,0.0003505318788510462,0.00022919410061472063,0.0001558663157908185,0.00011260933085632868,8.978431049296584e-05,8.47047300887107e-05,0.00010841080451458245
 | 
			
		||||
0.001,0.0007113372689341813,0.0005507065458152156,0.0003498098907291114,0.00022854040278969112,0.00015527892573799634,0.00011204236655473188,8.91571706762786e-05,8.384135267939557e-05,0.00010669960309782175
 | 
			
		||||
0.001,0.0007106992322019796,0.0005500498941226498,0.0003490955423571875,0.00022789356692450827,0.00015469757908825738,0.00011148122111140715,8.85368641132709e-05,8.298911908997276e-05,0.00010501839736063321
 | 
			
		||||
0.001,0.0007100677749962943,0.0005494000964108962,0.0003483887928208825,0.00022725354367970012,0.00015412222229517684,0.0001109258331719869,8.792330625417495e-05,8.214786445649906e-05,0.00010336661223747767
 | 
			
		||||
0.001,0.0007094428836454011,0.0005487571322870243,0.0003476896016176379,0.00022662028424420426,0.00015355280242059424,0.00011037614213504096,8.731641371338838e-05,8.131742659415625e-05,0.00010174368455214035
 | 
			
		||||
0.001,0.000708824544604701,0.0005481209815436059,0.0003469979286303459,0.00022599374029548395,0.00015298926708448145,0.00010983208809074389,8.671610418600222e-05,8.049764584384383e-05,0.0001001490624678555
 | 
			
		||||
0.001,0.0007082129757140411,0.0005474918591435615,0.0003463139755716002,0.00022537406278014643,0.00015243171907300512,0.00010929373376222763,8.612240008214866e-05,7.968846833775761e-05,9.858234685897841e-05
 | 
			
		||||
0.001,0.000707608163356494,0.0005468697446924577,0.00034563770186245746,0.00022476120284855867,0.000151880105523236,0.00010876101889898551,8.55352191851817e-05,7.888973637819775e-05,9.704300162684373e-05
 | 
			
		||||
0.001,0.0007070100940503908,0.0005462546179930401,0.0003449690673354809,0.0002241551121757662,0.0001513343741731098,0.00010823388399029377,8.495448041312896e-05,7.810129484091103e-05,9.553050179700698e-05
 | 
			
		||||
0.001,0.0007064294568015821,0.0005456599791780414,0.0003443323098548347,0.00022358838010950836,0.00015083471987353974,0.00010776122599922914,8.444190686735427e-05,7.7408734986085e-05,9.418640444056476e-05
 | 
			
		||||
0.001,0.0007058555225588962,0.0005450722639773927,0.0003437030311737585,0.0002230281662249932,0.00015034058581471813,0.00010729360256509277,8.39348527119689e-05,7.67245852554126e-05,9.28639870067709e-05
 | 
			
		||||
0.001,0.0007052882785030611,0.0005444914532267761,0.0003430811937591523,0.00022247442636251605,0.00014985192565331347,0.00010683096298015644,8.343325230960875e-05,7.604872690242875e-05,9.156285904414627e-05
 | 
			
		||||
0.001,0.0007047231683832071,0.0005439129831785586,0.00034246228783126086,0.00022192355689618922,0.00014936600614401393,0.00010637120139586071,8.293535717958106e-05,7.537945268589432e-05,9.028066182205625e-05
 | 
			
		||||
0.001,0.0007041601877072604,0.0005433368472132987,0.00034184629997988753,0.0002213755412469509,0.00014888280881520869,0.00010591429577334988,8.244113465160048e-05,7.471669094184598e-05,8.901710564172274e-05
 | 
			
		||||
0.001,0.0007035993319644686,0.0005427630386936696,0.0003412332167993905,0.00022083036287728357,0.0001484023152778868,0.00010546022421726945,8.195055234184008e-05,7.406037083397318e-05,8.777190547391773e-05
 | 
			
		||||
0.001,0.0007030405966226531,0.0005421915509602746,0.00034062302487816926,0.00022028800527546067,0.00014792450720603156,0.00010500896495215848,8.146357812174912e-05,7.341042229889045e-05,8.65447807653603e-05
 | 
			
		||||
0.001,0.000702481864866424,0.0005416202367428493,0.000340013528083159,0.00021974666745789773,0.00014744798951136416,0.00010455942245749231,8.097928325582809e-05,7.276590831707151e-05,8.53343290345859e-05
 | 
			
		||||
0.001,0.0007019231347536531,0.000541049093933996,0.00033940472324505365,0.0002192063454080809,0.00014697275707368812,0.00010411158905958576,8.049765241221972e-05,7.212678380437272e-05,8.414032725111873e-05
 | 
			
		||||
0.001,0.0007013644043173649,0.0005404781203952333,0.00033879660715245314,0.0002186670350763442,0.0001464988047567028,0.00010366545709431046,8.001867033124847e-05,7.149300404124133e-05,8.296255535497e-05
 | 
			
		||||
0.001,0.0007007923380838431,0.0005398904209305891,0.0003381585602637609,0.00021808716235465733,0.0001459743062317574,0.00010315717126101123,7.946027734643345e-05,7.0747191644443e-05,8.159291401029592e-05
 | 
			
		||||
0.001,0.0007002202839606736,0.0005393029161815334,0.0003375212965814363,0.0002175084901000057,0.0001454514108138073,0.00010265113449578299,7.890553328521924e-05,7.000884795811205e-05,8.02453392500888e-05
 | 
			
		||||
0.0010564983206625808,0.0020323156209598047,0.0024972245821602065,0.004735193374982383,0.008578320915529132,0.015253393937469889,0.027225142859919765,0.049861478431656114,0.09601482521493776,0.2
 | 
			
		||||
0.004249939542299966,0.007357791565894658,0.008737301696751656,0.01505607870396766,0.02510093603015811,0.040835074437955504,0.0649892582783015,0.10076225398432796,0.14991538310282454,0.206
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -1,97 +1,97 @@
 | 
			
		||||
signal,ase,nli
 | 
			
		||||
0.000325019416624,3.8827360617812335e-08,2.397604591245591e-07
 | 
			
		||||
0.0003222815415358,3.8702821151814216e-08,2.4267833614138976e-07
 | 
			
		||||
0.0003195661748689,3.8578942925493807e-08,2.455296149641726e-07
 | 
			
		||||
0.000316873132879,3.8455721305309324e-08,2.483151861322029e-07
 | 
			
		||||
0.0003125687708988,3.815158818797417e-08,2.497308542349044e-07
 | 
			
		||||
0.0003083216327341,3.784989647314237e-08,2.5106122773764815e-07
 | 
			
		||||
0.0003041309702107,3.755062053762566e-08,2.523083160653813e-07
 | 
			
		||||
0.0002999931829076,3.725370771318225e-08,2.534716728592015e-07
 | 
			
		||||
0.0002959076621852,3.695913382975532e-08,2.545532047834699e-07
 | 
			
		||||
0.0002914749637887,3.6620413511505286e-08,2.5520557429118934e-07
 | 
			
		||||
0.0002871045786391,3.62847038107824e-08,2.557776344401253e-07
 | 
			
		||||
0.0002827879891071,3.5951828869209396e-08,2.5626453052593257e-07
 | 
			
		||||
0.0002785247470154,3.562176113110911e-08,2.5666832208790035e-07
 | 
			
		||||
0.0002743144039041,3.5294473123494e-08,2.569910409348857e-07
 | 
			
		||||
0.000270032675166,3.4954880805048256e-08,2.571167784361306e-07
 | 
			
		||||
0.0002658067200554,3.4618272391047544e-08,2.571652788509227e-07
 | 
			
		||||
0.000261636025157,3.428461757057609e-08,2.5713860104931033e-07
 | 
			
		||||
0.00025752034599,3.395388872366444e-08,2.570390408700655e-07
 | 
			
		||||
0.000253459157096,3.362605558722993e-08,2.5284986247287787e-07
 | 
			
		||||
0.000248983782073,3.3242702224575744e-08,2.48252059976888e-07
 | 
			
		||||
0.0002445773493265,3.286328176612301e-08,2.437277481862015e-07
 | 
			
		||||
0.0002402391773459,3.2487750441670215e-08,2.392761376865807e-07
 | 
			
		||||
0.0002359684123723,3.2116061418127753e-08,2.3489626905665574e-07
 | 
			
		||||
0.0002317642070805,3.174816817069829e-08,2.3058719110264335e-07
 | 
			
		||||
0.0002279695550926,3.1424928539548144e-08,2.2668986526609113e-07
 | 
			
		||||
0.0002242281358436,3.1104729317697146e-08,2.228495045304229e-07
 | 
			
		||||
0.0002205393783222,3.078753835343166e-08,2.190654562751529e-07
 | 
			
		||||
0.0002169035545525,3.047333197100547e-08,2.1533790605165431e-07
 | 
			
		||||
0.0002133200561122,3.01620779209974e-08,2.1166616520930645e-07
 | 
			
		||||
0.0002097882786443,2.9853744125792176e-08,2.080495504306458e-07
 | 
			
		||||
0.0002063076230434,2.9548298767727423e-08,2.0448738489666716e-07
 | 
			
		||||
0.0002028776374913,2.9245712991289203e-08,2.009791389793126e-07
 | 
			
		||||
0.0001994977236946,2.8945955168147914e-08,1.975241389908885e-07
 | 
			
		||||
0.0001961672877059,2.8648993828553545e-08,1.9412171682473827e-07
 | 
			
		||||
0.0001929967738963,2.8368195292008612e-08,1.9088102669437356e-07
 | 
			
		||||
0.0001898709450753,2.8090002575266257e-08,1.8768789971552863e-07
 | 
			
		||||
0.0001867892958482,2.7814389032455363e-08,1.8454176486632323e-07
 | 
			
		||||
0.000183752636707,2.754134148447891e-08,1.8115002092564538e-07
 | 
			
		||||
0.0001807604032471,2.7270832946920812e-08,1.7781492252546064e-07
 | 
			
		||||
0.0001778120365192,2.7002836607760232e-08,1.745356369687972e-07
 | 
			
		||||
0.0001749069829579,2.673732582084065e-08,1.7131134159682263e-07
 | 
			
		||||
0.0001720467771106,2.6474316260529432e-08,1.6814325920632144e-07
 | 
			
		||||
0.0001692307716138,2.6213779758633963e-08,1.6503047175593728e-07
 | 
			
		||||
0.0001664583277393,2.5955688359138642e-08,1.619720751255672e-07
 | 
			
		||||
0.0001635796256227,2.5677295228672648e-08,1.588223280583729e-07
 | 
			
		||||
0.0001607481963598,2.540169810843596e-08,1.557306487644946e-07
 | 
			
		||||
0.0001579633073114,2.512886316325068e-08,1.526960267832303e-07
 | 
			
		||||
0.0001552255108883,2.4858770138402143e-08,1.4971869736122287e-07
 | 
			
		||||
0.000152534027681,2.4591385101783997e-08,1.467976093017761e-07
 | 
			
		||||
0.0001498880910245,2.432667443532368e-08,1.439317302908228e-07
 | 
			
		||||
0.0001472869464661,2.4064604800471338e-08,1.411200462508912e-07
 | 
			
		||||
0.0001447314108795,2.3805175801260087e-08,1.3836305172259211e-07
 | 
			
		||||
0.0001422206714078,2.3548353146553164e-08,1.3565967973526553e-07
 | 
			
		||||
0.0001397539300508,2.3294102880186107e-08,1.3300888438790536e-07
 | 
			
		||||
0.0001372700286953,2.3032485432340423e-08,1.3035230831596558e-07
 | 
			
		||||
0.0001348306664569,2.2773547798807564e-08,1.277485195296911e-07
 | 
			
		||||
0.0001324350333325,2.2517253805739807e-08,1.2505815113074245e-07
 | 
			
		||||
0.0001300835425363,2.2263580536243144e-08,1.2242454150816991e-07
 | 
			
		||||
0.0001277753479236,2.2012491805819457e-08,1.1984647647989558e-07
 | 
			
		||||
0.0001255096202792,2.1763951788812352e-08,1.1732276843747534e-07
 | 
			
		||||
0.0001232855464269,2.1517924960982367e-08,1.148522552473446e-07
 | 
			
		||||
0.0001211034718808,2.1274400813402842e-08,1.1243486085670634e-07
 | 
			
		||||
0.0001189625537742,2.1033343271785093e-08,1.100694052812587e-07
 | 
			
		||||
0.0001168619671686,2.0794716623616593e-08,1.0775473577456182e-07
 | 
			
		||||
0.0001149842862687,2.0591381044652174e-08,1.056582342233035e-07
 | 
			
		||||
0.0001131392424142,2.038998454906055e-08,1.0360354473279054e-07
 | 
			
		||||
0.0001113262252932,2.0190503422606346e-08,1.0158979943539652e-07
 | 
			
		||||
0.0001095446965516,1.9992914861970927e-08,9.961620365200192e-08
 | 
			
		||||
0.0001077940670993,1.9797195630879305e-08,9.768192356581421e-08
 | 
			
		||||
0.0001060737596438,1.9603322741072024e-08,9.578614349620901e-08
 | 
			
		||||
0.0001043832080373,1.9411273409584944e-08,9.392806512410292e-08
 | 
			
		||||
0.0001027223865858,1.922103688152168e-08,9.210738192714242e-08
 | 
			
		||||
0.0001010907257366,1.9032590330084783e-08,9.032330177845482e-08
 | 
			
		||||
9.948766769187398e-05,1.8845911172333032e-08,8.857505025129074e-08
 | 
			
		||||
9.792267601599324e-05,1.8663442661346744e-08,8.687075031773093e-08
 | 
			
		||||
9.638489299064336e-05,1.848276820506329e-08,8.550652733411691e-08
 | 
			
		||||
9.48738026587305e-05,1.830386814585904e-08,8.416598440502352e-08
 | 
			
		||||
9.338895072626004e-05,1.8126723701740663e-08,8.284871850980459e-08
 | 
			
		||||
9.192983962632808e-05,1.7951315790883015e-08,8.155428823884958e-08
 | 
			
		||||
9.049598195913348e-05,1.7777625631449783e-08,8.028226120215297e-08
 | 
			
		||||
8.908690001727453e-05,1.7605634715742614e-08,7.903221360818749e-08
 | 
			
		||||
8.77022482135352e-05,1.743532764682425e-08,7.780383887402493e-08
 | 
			
		||||
8.634156228069215e-05,1.7266686393258476e-08,7.659672513140668e-08
 | 
			
		||||
8.50043874741986e-05,1.7099693224424935e-08,7.541046895998541e-08
 | 
			
		||||
8.381694660770028e-05,1.6962933489525264e-08,7.43570471865261e-08
 | 
			
		||||
8.26484651987276e-05,1.682764479561346e-08,7.33204450340972e-08
 | 
			
		||||
8.149860566615124e-05,1.6693821025332528e-08,7.230036302225977e-08
 | 
			
		||||
8.036532369463753e-05,1.6561436760581683e-08,7.129498756488483e-08
 | 
			
		||||
7.924836834130927e-05,1.6430487594212236e-08,7.030409604146297e-08
 | 
			
		||||
7.814749266035204e-05,1.6300969571299207e-08,6.932746937742372e-08
 | 
			
		||||
7.706245353522453e-05,1.6172879193985398e-08,6.836489189528336e-08
 | 
			
		||||
7.599203524832233e-05,1.6046190191322708e-08,6.741528508795074e-08
 | 
			
		||||
7.493604414299442e-05,1.5920900877281144e-08,6.647847715560108e-08
 | 
			
		||||
7.389428911314724e-05,1.57970100612018e-08,6.555429856110159e-08
 | 
			
		||||
7.268136514077581e-05,1.5628904744452727e-08,6.447826980203191e-08
 | 
			
		||||
7.148784598320314e-05,1.5462487634551132e-08,6.341945575654982e-08
 | 
			
		||||
0.0003277611420723,3.899470345438449e-08,2.4249796960234704e-07
 | 
			
		||||
0.0003250017686895,3.88695612548288e-08,2.454439759471401e-07
 | 
			
		||||
0.0003222650868463,3.8745084795940443e-08,2.483227752372772e-07
 | 
			
		||||
0.0003195509110308,3.8621269402790665e-08,2.5113526636955305e-07
 | 
			
		||||
0.0003152051917212,3.831511482545576e-08,2.525571834385986e-07
 | 
			
		||||
0.0003109173643927,3.801142847546096e-08,2.538929936309988e-07
 | 
			
		||||
0.0003066866698276,3.7710184357421544e-08,2.551447305997623e-07
 | 
			
		||||
0.0003025094755105,3.74113291159896e-08,2.5631194688927884e-07
 | 
			
		||||
0.0002983851632227,3.711483823464807e-08,2.57396572290435e-07
 | 
			
		||||
0.0002939090370085,3.677384148134545e-08,2.580457272005108e-07
 | 
			
		||||
0.0002894959951166,3.6435889805735655e-08,2.586138532899247e-07
 | 
			
		||||
0.0002851374388563,3.6100804786136576e-08,2.590960415051975e-07
 | 
			
		||||
0.0002808329106728,3.5768558450009235e-08,2.594943775098954e-07
 | 
			
		||||
0.0002765819528091,3.543912291177373e-08,2.5981091869063053e-07
 | 
			
		||||
0.0002722585970856,3.509728654683229e-08,2.599278683420713e-07
 | 
			
		||||
0.0002679917286135,3.475846792019279e-08,2.5996691909916645e-07
 | 
			
		||||
0.0002637808235807,3.44226362592242e-08,2.599301554005377e-07
 | 
			
		||||
0.000259625629125,3.4089763516669025e-08,2.598199006832183e-07
 | 
			
		||||
0.0002555256094681,3.375981897519707e-08,2.555756892447018e-07
 | 
			
		||||
0.0002510061132968,3.3373930606403456e-08,2.509166795385623e-07
 | 
			
		||||
0.0002465564627785,3.299202134196193e-08,2.463324441551975e-07
 | 
			
		||||
0.0002421759612383,3.2614046686258965e-08,2.418221717126139e-07
 | 
			
		||||
0.0002378637384678,3.2239959043845714e-08,2.373848791838885e-07
 | 
			
		||||
0.0002336189309368,3.18697111382095e-08,2.3301959212527745e-07
 | 
			
		||||
0.000229786907623,3.154429519674801e-08,2.290704910449234e-07
 | 
			
		||||
0.0002260088301865,3.1221956560459585e-08,2.251793706228873e-07
 | 
			
		||||
0.0002222841156937,3.090266251951521e-08,2.213455610060874e-07
 | 
			
		||||
0.0002186130300924,3.058638893853768e-08,2.175692384572231e-07
 | 
			
		||||
0.000214994952946,3.027310301755256e-08,2.138496969887665e-07
 | 
			
		||||
0.0002114292680468,2.9962772135295886e-08,2.1018623618806562e-07
 | 
			
		||||
0.0002079153646262,2.9655363939172943e-08,2.0657816240778285e-07
 | 
			
		||||
0.0002044527805171,2.9350849083358333e-08,2.0302493091347645e-07
 | 
			
		||||
0.0002010409060047,2.904919541568693e-08,1.995258515561229e-07
 | 
			
		||||
0.0001976791358816,2.8750370949174832e-08,1.9608024000424985e-07
 | 
			
		||||
0.0001944779969388,2.8467714690234763e-08,1.9279758501200657e-07
 | 
			
		||||
0.0001913221363037,2.8187696076865265e-08,1.895633279917293e-07
 | 
			
		||||
0.0001882110383135,2.7910287978744905e-08,1.8637688328585562e-07
 | 
			
		||||
0.0001851455117447,2.763547687941092e-08,1.8294394600063082e-07
 | 
			
		||||
0.000182124981625,2.7363235313116972e-08,1.795685295609545e-07
 | 
			
		||||
0.0001791488786026,2.7093535992876882e-08,1.762497841686646e-07
 | 
			
		||||
0.0001762166388716,2.6826351803791374e-08,1.729868703567211e-07
 | 
			
		||||
0.0001733298028653,2.6561698509687352e-08,1.6978101465406346e-07
 | 
			
		||||
0.0001704877122406,2.6299547455845844e-08,1.666312813274778e-07
 | 
			
		||||
0.0001676897174922,2.603987020688793e-08,1.635367489137303e-07
 | 
			
		||||
0.0001647841340631,2.575975887106765e-08,1.603495310656704e-07
 | 
			
		||||
0.0001619264140112,2.5482476734612484e-08,1.57221255401216e-07
 | 
			
		||||
0.0001591158121254,2.520798936957748e-08,1.541508918468439e-07
 | 
			
		||||
0.0001563528761692,2.493627607244877e-08,1.5113866658054666e-07
 | 
			
		||||
0.0001536368140911,2.4667302328210823e-08,1.4818350881997277e-07
 | 
			
		||||
0.0001509668468559,2.4401033945674264e-08,1.452843671077152e-07
 | 
			
		||||
0.0001483422079002,2.4137437022238145e-08,1.4244020864846993e-07
 | 
			
		||||
0.0001457637135497,2.3876511018332856e-08,1.3965152374161321e-07
 | 
			
		||||
0.0001432305385497,2.3618221073161605e-08,1.369172264569389e-07
 | 
			
		||||
0.0001407418727912,2.3362532671027093e-08,1.342362523931659e-07
 | 
			
		||||
0.0001382358967136,2.3099449050292612e-08,1.3154948565189317e-07
 | 
			
		||||
0.0001357749763134,2.283907541163823e-08,1.2891625322154978e-07
 | 
			
		||||
0.0001333582893299,2.2581374993581207e-08,1.2619656354429104e-07
 | 
			
		||||
0.0001309862438042,2.232632442642508e-08,1.2353438214155152e-07
 | 
			
		||||
0.0001286579813897,2.2073886950323847e-08,1.2092847534724114e-07
 | 
			
		||||
0.000126372660974,2.182402617504561e-08,1.1837763658356932e-07
 | 
			
		||||
0.0001241294577704,2.1576706021416435e-08,1.1588068523754277e-07
 | 
			
		||||
0.0001219287137845,2.1331915734067192e-08,1.1343753674855828e-07
 | 
			
		||||
0.0001197695745451,2.108961868593061e-08,1.110469928559736e-07
 | 
			
		||||
0.0001176512038143,2.08497786224886e-08,1.0870788304064741e-07
 | 
			
		||||
0.0001157575507964,2.064536482973696e-08,1.0658919731348233e-07
 | 
			
		||||
0.0001138968874049,2.0442910777630443e-08,1.0451285530046546e-07
 | 
			
		||||
0.0001120685950893,2.0242392369145183e-08,1.0247797592009348e-07
 | 
			
		||||
0.0001102721277733,2.0043786431072003e-08,1.004837520181078e-07
 | 
			
		||||
0.0001085068885057,1.9847069357675e-08,9.852933720632749e-08
 | 
			
		||||
0.0001067722923259,1.96522177979178e-08,9.661390355735894e-08
 | 
			
		||||
0.0001050677655983,1.9459208611917452e-08,9.473664081358061e-08
 | 
			
		||||
0.0001033932787473,1.9268030831168163e-08,9.289723486055733e-08
 | 
			
		||||
0.000101748254869,1.9078661277163014e-08,9.109488193990664e-08
 | 
			
		||||
0.0001001321289996,1.8891077021770737e-08,8.932879630040843e-08
 | 
			
		||||
9.855410305682533e-05,1.8707685556144628e-08,8.760688138727519e-08
 | 
			
		||||
9.70035750524988e-05,1.8526106268805162e-08,8.622858338902384e-08
 | 
			
		||||
9.54800221910602e-05,1.834631916025987e-08,8.487426418079828e-08
 | 
			
		||||
9.398298376195116e-05,1.816830511796191e-08,8.35435142269833e-08
 | 
			
		||||
9.251195567959074e-05,1.7992044730451886e-08,8.223588543496443e-08
 | 
			
		||||
9.106644418852578e-05,1.7817518892375448e-08,8.095093889480209e-08
 | 
			
		||||
8.964596537975902e-05,1.7644708778076547e-08,7.968824444928503e-08
 | 
			
		||||
8.825016836609303e-05,1.7473598709850392e-08,7.844749018716727e-08
 | 
			
		||||
8.687858293497841e-05,1.7304170348281186e-08,7.722825812630736e-08
 | 
			
		||||
8.553074854577241e-05,1.7136405660531677e-08,7.603013888213162e-08
 | 
			
		||||
8.433358305815234e-05,1.6998940860777966e-08,7.496595249494088e-08
 | 
			
		||||
8.315557511358139e-05,1.6862959916000355e-08,7.39187956635932e-08
 | 
			
		||||
8.199638277812437e-05,1.6728456488525712e-08,7.28883644355918e-08
 | 
			
		||||
8.085394966108952e-05,1.6595404781975636e-08,7.187283084061544e-08
 | 
			
		||||
7.972802118918304e-05,1.6463800186495995e-08,7.087196858293762e-08
 | 
			
		||||
7.861834686065792e-05,1.6333638547854104e-08,6.988555498611813e-08
 | 
			
		||||
7.752468007410017e-05,1.6204916172056103e-08,6.891337084080734e-08
 | 
			
		||||
7.644579608395804e-05,1.607760634807453e-08,6.795432744410053e-08
 | 
			
		||||
7.538149823706338e-05,1.5951707212505497e-08,6.700824998672802e-08
 | 
			
		||||
7.433159248509273e-05,1.5827217400105257e-08,6.607496597492307e-08
 | 
			
		||||
7.310944660054646e-05,1.5658417045863033e-08,6.498857397068902e-08
 | 
			
		||||
7.190690836035234e-05,1.5491319571073834e-08,6.391961162711614e-08
 | 
			
		||||
 
 | 
			
		||||
		
		
			
  | 
@@ -1,5 +1,124 @@
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
 | 
			
		||||
WARNING  gnpy.tools.json_io:json_io.py 
 | 
			
		||||
	WARNING missing type_variety attribute in eqpt_config.json[Roadm]
 | 
			
		||||
	default value is type_variety = default
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py List of disjunctions:
 | 
			
		||||
[Disjunction 3
 | 
			
		||||
	relaxable:    false
 | 
			
		||||
	link-diverse: True
 | 
			
		||||
	node-diverse: True
 | 
			
		||||
	request-id-numbers: ['3', '1']
 | 
			
		||||
, Disjunction 4
 | 
			
		||||
	relaxable:    false
 | 
			
		||||
	link-diverse: True
 | 
			
		||||
	node-diverse: True
 | 
			
		||||
	request-id-numbers: ['4', '5']
 | 
			
		||||
]
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py The following services have been requested:
 | 
			
		||||
[PathRequest 0
 | 
			
		||||
	source: 	trx Lorient_KMA
 | 
			
		||||
	destination:	trx Vannes_KBE
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	None
 | 
			
		||||
	baud_rate:	None Gbaud
 | 
			
		||||
	bit_rate:	None Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	1.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	80
 | 
			
		||||
	path_bandwidth: 	100.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 1
 | 
			
		||||
	source: 	trx Brest_KLA
 | 
			
		||||
	destination:	trx Vannes_KBE
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	mode 1
 | 
			
		||||
	baud_rate:	32.0 Gbaud
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	1.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	95
 | 
			
		||||
	path_bandwidth: 	200.0 Gbit/s
 | 
			
		||||
	nodes-list:	['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
			
		||||
	loose-list:	['LOOSE', 'LOOSE', 'LOOSE', 'LOOSE']
 | 
			
		||||
, PathRequest 3
 | 
			
		||||
	source: 	trx Lannion_CAS
 | 
			
		||||
	destination:	trx Rennes_STA
 | 
			
		||||
	trx type:	vendorA_trx-type1
 | 
			
		||||
	trx mode:	mode 1
 | 
			
		||||
	baud_rate:	32.0 Gbaud
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	95
 | 
			
		||||
	path_bandwidth: 	60.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 4
 | 
			
		||||
	source: 	trx Rennes_STA
 | 
			
		||||
	destination:	trx Lannion_CAS
 | 
			
		||||
	trx type:	vendorA_trx-type1
 | 
			
		||||
	trx mode:	None
 | 
			
		||||
	baud_rate:	None Gbaud
 | 
			
		||||
	bit_rate:	None Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	3.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	63
 | 
			
		||||
	path_bandwidth: 	150.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 5
 | 
			
		||||
	source: 	trx Rennes_STA
 | 
			
		||||
	destination:	trx Lannion_CAS
 | 
			
		||||
	trx type:	vendorA_trx-type1
 | 
			
		||||
	trx mode:	mode 2
 | 
			
		||||
	baud_rate:	66.0 Gbaud
 | 
			
		||||
	bit_rate:	200.0 Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	3.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	63
 | 
			
		||||
	path_bandwidth: 	20.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 7 | 6
 | 
			
		||||
	source: 	trx Lannion_CAS
 | 
			
		||||
	destination:	trx Lorient_KMA
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	mode 1
 | 
			
		||||
	baud_rate:	32.0 Gbaud
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	76
 | 
			
		||||
	path_bandwidth: 	700.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 7b
 | 
			
		||||
	source: 	trx Lannion_CAS
 | 
			
		||||
	destination:	trx Lorient_KMA
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	mode 1
 | 
			
		||||
	baud_rate:	32.0 Gbaud
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	50
 | 
			
		||||
	path_bandwidth: 	400.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,28 @@
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
 | 
			
		||||
WARNING  gnpy.tools.json_io:json_io.py 
 | 
			
		||||
	WARNING missing type_variety attribute in eqpt_config.json[Roadm]
 | 
			
		||||
	default value is type_variety = default
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py List of disjunctions:
 | 
			
		||||
[]
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py The following services have been requested:
 | 
			
		||||
[PathRequest 0
 | 
			
		||||
	source: 	trx Abilene
 | 
			
		||||
	destination:	trx Albany
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	mode 3
 | 
			
		||||
	baud_rate:	44.0 Gbaud
 | 
			
		||||
	bit_rate:	300.0 Gb/s
 | 
			
		||||
	spacing:	62.50000000000001 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	76
 | 
			
		||||
	path_bandwidth: 	100.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
]
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Propagating on selected path
 | 
			
		||||
INFO     gnpy.topology.request:request.py 
 | 
			
		||||
	request 0
 | 
			
		||||
	Computing path from trx Abilene to trx Albany
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										378
									
								
								tests/invocation/logs_power_sweep_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								tests/invocation/logs_power_sweep_example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,378 @@
 | 
			
		||||
WARNING  gnpy.tools.json_io:json_io.py 
 | 
			
		||||
	WARNING missing type_variety attribute in eqpt_config.json[Roadm]
 | 
			
		||||
	default value is type_variety = default
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py source = 'trx Brest_KLA'
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'trx Rennes_STA'
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Lannion_CAS to Stbrieuc
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Lannion_CAS to Morlaix
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Brest_KLA to Morlaix
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Lorient_KMA to Loudeac
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node west edfa in Lannion_CAS to Corlay
 | 
			
		||||
	is above user specified amplifier test
 | 
			
		||||
	max flat gain: 25dB ; required gain: 28.0dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Lorient_KMA to Vannes_KBE
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Vannes_KBE to Lorient_KMA
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Lorient_KMA to Quimper
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Quimper to Lorient_KMA
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Brest_KLA to Quimper
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Vannes_KBE to Lorient_KMA
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Lorient_KMA to Vannes_KBE
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Vannes_KBE to Ploermel
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Ploermel to Vannes_KBE
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Rennes_STA to Ploermel
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Rennes_STA to Stbrieuc
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Stbrieuc to Rennes_STA
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Lannion_CAS to Stbrieuc
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Rennes_STA to Ploermel
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Vannes_KBE to Ploermel
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Brest_KLA to Morlaix
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Brest_KLA to Quimper
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Quimper to Lorient_KMA
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Lorient_KMA to Quimper
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in a to b
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in b to a
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in a to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in c to a
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in b to a
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in a to b
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in b to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in f to b
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in c to a
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in a to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in d to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in c to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in f to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in d to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in c to d
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in d to e
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in e to d
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in e to d
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in d to e
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in e to g
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in g to e
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in f to c
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in c to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in f to b
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in b to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in f to h
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in h to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in g to e
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in e to g
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in g to h
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in h to g
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in h to f
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in f to h
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in h to g
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in g to h
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.78 is applied
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Brest_KLA and trx Rennes_STA
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
@@ -1,5 +1,9 @@
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py source = 'lannion'
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'lorient'
 | 
			
		||||
WARNING  gnpy.tools.json_io:json_io.py 
 | 
			
		||||
	WARNING missing type_variety attribute in eqpt_config.json[Roadm]
 | 
			
		||||
	default value is type_variety = default
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py source = 'trx Lannion_CAS'
 | 
			
		||||
INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'trx Lorient_KMA'
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
@@ -8,7 +12,7 @@ WARNING  gnpy.core.network:network.py
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Lannion_CAS to Stbrieuc
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 23.0dB. Please check amplifier type.
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
 | 
			
		||||
@@ -18,7 +22,7 @@ WARNING  gnpy.core.network:network.py
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Lannion_CAS to Morlaix
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 23.5dB. Please check amplifier type.
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node west edfa in Brest_KLA to Morlaix
 | 
			
		||||
@@ -33,7 +37,7 @@ WARNING  gnpy.core.network:network.py
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node west edfa in Lannion_CAS to Corlay
 | 
			
		||||
	is above user specified amplifier test
 | 
			
		||||
	max flat gain: 25dB ; required gain: 29.82dB. Please check amplifier type.
 | 
			
		||||
	max flat gain: 25dB ; required gain: 28.0dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Lorient_KMA to Vannes_KBE
 | 
			
		||||
@@ -118,7 +122,7 @@ WARNING  gnpy.core.network:network.py
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: effective gain in Node east edfa in Brest_KLA to Quimper
 | 
			
		||||
	is above user specified amplifier std_low_gain
 | 
			
		||||
	max flat gain: 16dB ; required gain: 23.0dB. Please check amplifier type.
 | 
			
		||||
	max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
			
		||||
 | 
			
		||||
WARNING  gnpy.core.network:network.py 
 | 
			
		||||
	WARNING: target gain and power in node east edfa in Quimper to Lorient_KMA
 | 
			
		||||
@@ -305,3 +309,10 @@ WARNING  gnpy.core.network:network.py
 | 
			
		||||
	is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
			
		||||
	a power reduction of -1.82 is applied
 | 
			
		||||
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Lannion_CAS and trx Lorient_KMA
 | 
			
		||||
INFO     gnpy.tools.worker_utils:worker_utils.py 
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 96)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										294
									
								
								tests/invocation/multiband_transmission
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								tests/invocation/multiband_transmission
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,294 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 3 fiber spans over 240 km between trx Site_A and trx Site_D
 | 
			
		||||
 | 
			
		||||
Now propagating between trx Site_A and trx Site_D:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = cband: 0.00, lband: 0.00dB,
 | 
			
		||||
                       spacing = cband: 50.00, lband: 50.00GHz,
 | 
			
		||||
                       transceiver output power = cband: 0.00, lband: 0.00dBm,
 | 
			
		||||
                       nb_channels = 149)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver trx Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          cband: 40.00, lband: 40.00
 | 
			
		||||
  GSNR (signal bw, dB):      cband: 35.92, lband: 35.92
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      cband: 40.00, lband: 40.00
 | 
			
		||||
  OSNR ASE (signal bw, dB):  cband: 35.92, lband: 35.92
 | 
			
		||||
  CD (ps/nm):                0.00
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      cband: 0.00, lband: 0.00
 | 
			
		||||
Roadm roadm Site_A
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        cband: 20.00, lband: 20.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    cband: -20.00, lband: -20.00
 | 
			
		||||
Multiband_amplifier east edfa in Site_A to Site_B
 | 
			
		||||
  type_variety:           std_medium_gain_multiband
 | 
			
		||||
  type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L  
 | 
			
		||||
  effective gain(dB):     20.90                effective gain(dB):     22.19              
 | 
			
		||||
  (before att_in and before output VOA)        (before att_in and before output VOA)      
 | 
			
		||||
  tilt-target(dB)         0.00                 tilt-target(dB)         0.00               
 | 
			
		||||
  noise figure (dB):      6.38                 noise figure (dB):      6.19               
 | 
			
		||||
  (including att_in)                           (including att_in)                         
 | 
			
		||||
  pad att_in (dB):        0.00                 pad att_in (dB):        0.00               
 | 
			
		||||
  Power In (dBm):         -1.08                Power In (dBm):         -1.49              
 | 
			
		||||
  Power Out (dBm):        19.83                Power Out (dBm):        20.71              
 | 
			
		||||
  Delta_P (dB):           0.90                 Delta_P (dB):           2.19               
 | 
			
		||||
  target pch (dBm):       0.90                 target pch (dBm):       3.00               
 | 
			
		||||
  actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.80              
 | 
			
		||||
  output VOA (dB):        3.00                 output VOA (dB):        3.00               
 | 
			
		||||
Fiber          fiber (Site_A → Site_B)-
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 75.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             15.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -17.10
 | 
			
		||||
  actual pch out (dBm):        cband: -17.09, lband: -15.80
 | 
			
		||||
Multiband_amplifier east edfa in Site_B to Site_C
 | 
			
		||||
  type_variety:           std_medium_gain_multiband
 | 
			
		||||
  type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L  
 | 
			
		||||
  effective gain(dB):     18.00                effective gain(dB):     18.00              
 | 
			
		||||
  (before att_in and before output VOA)        (before att_in and before output VOA)      
 | 
			
		||||
  tilt-target(dB)         0.00                 tilt-target(dB)         0.00               
 | 
			
		||||
  noise figure (dB):      7.38                 noise figure (dB):      7.38               
 | 
			
		||||
  (including att_in)                           (including att_in)                         
 | 
			
		||||
  pad att_in (dB):        0.00                 pad att_in (dB):        0.00               
 | 
			
		||||
  Power In (dBm):         1.83                 Power In (dBm):         2.71               
 | 
			
		||||
  Power Out (dBm):        19.84                Power Out (dBm):        20.72              
 | 
			
		||||
  Delta_P (dB):           0.90                 Delta_P (dB):           2.19               
 | 
			
		||||
  target pch (dBm):       0.90                 target pch (dBm):       3.00               
 | 
			
		||||
  actual pch out (dBm):   -2.09                actual pch out (dBm):   -0.79              
 | 
			
		||||
  output VOA (dB):        3.00                 output VOA (dB):        3.00               
 | 
			
		||||
Fiber          fiber (Site_B → Site_C)-
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.80
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -18.90
 | 
			
		||||
  actual pch out (dBm):        cband: -18.88, lband: -17.59
 | 
			
		||||
Multiband_amplifier east edfa in Site_C to Site_D
 | 
			
		||||
  type_variety:           std_medium_gain_multiband
 | 
			
		||||
  type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L  
 | 
			
		||||
  effective gain(dB):     19.80                effective gain(dB):     19.80              
 | 
			
		||||
  (before att_in and before output VOA)        (before att_in and before output VOA)      
 | 
			
		||||
  tilt-target(dB)         0.00                 tilt-target(dB)         0.00               
 | 
			
		||||
  noise figure (dB):      6.63                 noise figure (dB):      6.63               
 | 
			
		||||
  (including att_in)                           (including att_in)                         
 | 
			
		||||
  pad att_in (dB):        0.00                 pad att_in (dB):        0.00               
 | 
			
		||||
  Power In (dBm):         0.04                 Power In (dBm):         0.92               
 | 
			
		||||
  Power Out (dBm):        19.84                Power Out (dBm):        20.72              
 | 
			
		||||
  Delta_P (dB):           0.90                 Delta_P (dB):           2.19               
 | 
			
		||||
  target pch (dBm):       0.90                 target pch (dBm):       3.00               
 | 
			
		||||
  actual pch out (dBm):   -2.08                actual pch out (dBm):   -0.79              
 | 
			
		||||
  output VOA (dB):        3.00                 output VOA (dB):        3.00               
 | 
			
		||||
Fiber          fiber (Site_C → Site_D)-
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 85.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             18.70
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -20.80
 | 
			
		||||
  actual pch out (dBm):        cband: -20.78, lband: -19.49
 | 
			
		||||
Multiband_amplifier west edfa in Site_D to Site_C
 | 
			
		||||
  type_variety:           std_medium_gain_multiband
 | 
			
		||||
  type_variety:           std_medium_gain_C    type_variety:           std_medium_gain_L  
 | 
			
		||||
  effective gain(dB):     21.70                effective gain(dB):     21.70              
 | 
			
		||||
  (before att_in and before output VOA)        (before att_in and before output VOA)      
 | 
			
		||||
  tilt-target(dB)         0.00                 tilt-target(dB)         0.00               
 | 
			
		||||
  noise figure (dB):      6.25                 noise figure (dB):      6.25               
 | 
			
		||||
  (including att_in)                           (including att_in)                         
 | 
			
		||||
  pad att_in (dB):        0.00                 pad att_in (dB):        0.00               
 | 
			
		||||
  Power In (dBm):         -1.85                Power In (dBm):         -0.97              
 | 
			
		||||
  Power Out (dBm):        19.85                Power Out (dBm):        20.73              
 | 
			
		||||
  Delta_P (dB):           0.90                 Delta_P (dB):           2.19               
 | 
			
		||||
  target pch (dBm):       0.90                 target pch (dBm):       3.00               
 | 
			
		||||
  actual pch out (dBm):   -2.07                actual pch out (dBm):   -0.78              
 | 
			
		||||
  output VOA (dB):        3.00                 output VOA (dB):        3.00               
 | 
			
		||||
Roadm roadm Site_D
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     17.90
 | 
			
		||||
  Actual loss (dB):        cband: 17.93, lband: 19.22
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    cband: -20.00, lband: -20.00
 | 
			
		||||
Transceiver trx Site_D
 | 
			
		||||
  GSNR (0.1nm, dB):          cband: 24.89, lband: 25.36
 | 
			
		||||
  GSNR (signal bw, dB):      cband: 20.80, lband: 21.28
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      cband: 25.55, lband: 26.51
 | 
			
		||||
  OSNR ASE (signal bw, dB):  cband: 21.47, lband: 22.43
 | 
			
		||||
  CD (ps/nm):                4008.00
 | 
			
		||||
  PMD (ps):                  0.62
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              1.18
 | 
			
		||||
  Actual pch out (dBm):      cband: 0.00, lband: 0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m25.11 dB[0m
 | 
			
		||||
 | 
			
		||||
The GSNR per channel at the end of the line is:
 | 
			
		||||
Ch. #   Channel frequency (THz)       Channel power (dBm)    OSNR ASE (signal bw, dB)     SNR NLI (signal bw, dB)        GSNR (signal bw, dB)
 | 
			
		||||
    1                 186.55000                    -20.03                       22.46                       29.10                       21.61
 | 
			
		||||
    2                 186.60000                    -20.03                       22.46                       28.59                       21.51
 | 
			
		||||
    3                 186.65000                    -20.03                       22.46                       28.36                       21.47
 | 
			
		||||
    4                 186.70000                    -20.03                       22.46                       28.22                       21.44
 | 
			
		||||
    5                 186.75000                    -20.03                       22.46                       28.12                       21.41
 | 
			
		||||
    6                 186.80000                    -20.03                       22.46                       28.04                       21.40
 | 
			
		||||
    7                 186.85000                    -20.03                       22.46                       27.98                       21.38
 | 
			
		||||
    8                 186.90000                    -20.03                       22.45                       27.92                       21.37
 | 
			
		||||
    9                 186.95000                    -20.03                       22.45                       27.88                       21.36
 | 
			
		||||
   10                 187.00000                    -20.03                       22.45                       27.84                       21.35
 | 
			
		||||
   11                 187.05000                    -20.03                       22.45                       27.80                       21.34
 | 
			
		||||
   12                 187.10000                    -20.03                       22.45                       27.77                       21.33
 | 
			
		||||
   13                 187.15000                    -20.03                       22.45                       27.74                       21.32
 | 
			
		||||
   14                 187.20000                    -20.03                       22.45                       27.71                       21.32
 | 
			
		||||
   15                 187.25000                    -20.03                       22.45                       27.69                       21.31
 | 
			
		||||
   16                 187.30000                    -20.03                       22.45                       27.67                       21.31
 | 
			
		||||
   17                 187.35000                    -20.03                       22.45                       27.65                       21.30
 | 
			
		||||
   18                 187.40000                    -20.03                       22.44                       27.63                       21.29
 | 
			
		||||
   19                 187.45000                    -20.03                       22.44                       27.61                       21.29
 | 
			
		||||
   20                 187.50000                    -20.03                       22.44                       27.60                       21.29
 | 
			
		||||
   21                 187.55000                    -20.03                       22.44                       27.58                       21.28
 | 
			
		||||
   22                 187.60000                    -20.03                       22.44                       27.57                       21.28
 | 
			
		||||
   23                 187.65000                    -20.03                       22.44                       27.55                       21.27
 | 
			
		||||
   24                 187.70000                    -20.03                       22.44                       27.54                       21.27
 | 
			
		||||
   25                 187.75000                    -20.03                       22.44                       27.53                       21.27
 | 
			
		||||
   26                 187.80000                    -20.03                       22.44                       27.52                       21.26
 | 
			
		||||
   27                 187.85000                    -20.03                       22.44                       27.51                       21.26
 | 
			
		||||
   28                 187.90000                    -20.03                       22.43                       27.50                       21.26
 | 
			
		||||
   29                 187.95000                    -20.03                       22.43                       27.49                       21.25
 | 
			
		||||
   30                 188.00000                    -20.03                       22.43                       27.48                       21.25
 | 
			
		||||
   31                 188.05000                    -20.03                       22.43                       27.47                       21.25
 | 
			
		||||
   32                 188.10000                    -20.03                       22.43                       27.47                       21.25
 | 
			
		||||
   33                 188.15000                    -20.03                       22.43                       27.46                       21.24
 | 
			
		||||
   34                 188.20000                    -20.03                       22.43                       27.45                       21.24
 | 
			
		||||
   35                 188.25000                    -20.03                       22.43                       27.45                       21.24
 | 
			
		||||
   36                 188.30000                    -20.03                       22.43                       27.44                       21.24
 | 
			
		||||
   37                 188.35000                    -20.03                       22.43                       27.44                       21.23
 | 
			
		||||
   38                 188.40000                    -20.03                       22.42                       27.43                       21.23
 | 
			
		||||
   39                 188.45000                    -20.03                       22.42                       27.43                       21.23
 | 
			
		||||
   40                 188.50000                    -20.03                       22.42                       27.43                       21.23
 | 
			
		||||
   41                 188.55000                    -20.03                       22.42                       27.42                       21.23
 | 
			
		||||
   42                 188.60000                    -20.03                       22.42                       27.42                       21.23
 | 
			
		||||
   43                 188.65000                    -20.03                       22.42                       27.42                       21.23
 | 
			
		||||
   44                 188.70000                    -20.03                       22.42                       27.42                       21.22
 | 
			
		||||
   45                 188.75000                    -20.03                       22.42                       27.42                       21.22
 | 
			
		||||
   46                 188.80000                    -20.03                       22.42                       27.42                       21.22
 | 
			
		||||
   47                 188.85000                    -20.03                       22.41                       27.42                       21.22
 | 
			
		||||
   48                 188.90000                    -20.03                       22.41                       27.42                       21.22
 | 
			
		||||
   49                 188.95000                    -20.03                       22.41                       27.42                       21.22
 | 
			
		||||
   50                 189.00000                    -20.03                       22.41                       27.43                       21.22
 | 
			
		||||
   51                 189.05000                    -20.03                       22.41                       27.43                       21.22
 | 
			
		||||
   52                 189.10000                    -20.03                       22.41                       27.44                       21.22
 | 
			
		||||
   53                 189.15000                    -20.03                       22.41                       27.44                       21.22
 | 
			
		||||
   54                 189.20000                    -20.03                       22.41                       27.45                       21.22
 | 
			
		||||
   55                 189.25000                    -20.03                       22.41                       27.46                       21.23
 | 
			
		||||
   56                 189.30000                    -20.03                       22.41                       27.46                       21.23
 | 
			
		||||
   57                 189.35000                    -20.03                       22.40                       27.47                       21.23
 | 
			
		||||
   58                 189.40000                    -20.03                       22.40                       27.49                       21.23
 | 
			
		||||
   59                 189.45000                    -20.03                       22.40                       27.50                       21.23
 | 
			
		||||
   60                 189.50000                    -20.03                       22.40                       27.51                       21.24
 | 
			
		||||
   61                 189.55000                    -20.03                       22.40                       27.53                       21.24
 | 
			
		||||
   62                 189.60000                    -20.03                       22.40                       27.55                       21.24
 | 
			
		||||
   63                 189.65000                    -20.03                       22.40                       27.58                       21.25
 | 
			
		||||
   64                 189.70000                    -20.03                       22.40                       27.60                       21.25
 | 
			
		||||
   65                 189.75000                    -20.03                       22.40                       27.63                       21.26
 | 
			
		||||
   66                 189.80000                    -20.03                       22.40                       27.67                       21.27
 | 
			
		||||
   67                 189.85000                    -20.03                       22.39                       27.72                       21.28
 | 
			
		||||
   68                 189.90000                    -20.03                       22.39                       27.78                       21.29
 | 
			
		||||
   69                 189.95000                    -20.03                       22.39                       27.86                       21.31
 | 
			
		||||
   70                 190.00000                    -20.03                       22.39                       27.97                       21.33
 | 
			
		||||
   71                 190.05000                    -20.03                       22.39                       28.21                       21.38
 | 
			
		||||
   72                 191.25000                    -20.03                       21.51                       28.66                       20.74
 | 
			
		||||
   73                 191.30000                    -20.03                       21.51                       28.96                       20.79
 | 
			
		||||
   74                 191.35000                    -20.03                       21.51                       29.16                       20.82
 | 
			
		||||
   75                 191.40000                    -20.03                       21.50                       29.32                       20.84
 | 
			
		||||
   76                 191.45000                    -20.03                       21.50                       29.51                       20.87
 | 
			
		||||
   77                 191.50000                    -20.03                       21.50                       29.75                       20.90
 | 
			
		||||
   78                 191.55000                    -20.03                       21.50                       30.22                       20.95
 | 
			
		||||
   79                 191.60000                    -20.03                       21.50                       30.96                       21.03
 | 
			
		||||
   80                 191.65000                    -20.03                       21.50                       30.46                       20.98
 | 
			
		||||
   81                 191.70000                    -20.03                       21.50                       30.23                       20.95
 | 
			
		||||
   82                 191.75000                    -20.03                       21.50                       30.08                       20.93
 | 
			
		||||
   83                 191.80000                    -20.03                       21.50                       29.97                       20.92
 | 
			
		||||
   84                 191.85000                    -20.03                       21.50                       29.88                       20.91
 | 
			
		||||
   85                 191.90000                    -20.03                       21.49                       29.81                       20.90
 | 
			
		||||
   86                 191.95000                    -20.03                       21.49                       29.75                       20.89
 | 
			
		||||
   87                 192.00000                    -20.03                       21.49                       29.70                       20.88
 | 
			
		||||
   88                 192.05000                    -20.03                       21.49                       29.65                       20.87
 | 
			
		||||
   89                 192.10000                    -20.03                       21.49                       29.61                       20.87
 | 
			
		||||
   90                 192.15000                    -20.03                       21.49                       29.57                       20.86
 | 
			
		||||
   91                 192.20000                    -20.03                       21.49                       29.54                       20.86
 | 
			
		||||
   92                 192.25000                    -20.03                       21.49                       29.50                       20.85
 | 
			
		||||
   93                 192.30000                    -20.03                       21.49                       29.47                       20.85
 | 
			
		||||
   94                 192.35000                    -20.03                       21.49                       29.44                       20.84
 | 
			
		||||
   95                 192.40000                    -20.03                       21.48                       29.42                       20.84
 | 
			
		||||
   96                 192.45000                    -20.03                       21.48                       29.39                       20.83
 | 
			
		||||
   97                 192.50000                    -20.03                       21.48                       29.37                       20.83
 | 
			
		||||
   98                 192.55000                    -20.03                       21.48                       29.35                       20.82
 | 
			
		||||
   99                 192.60000                    -20.03                       21.48                       29.33                       20.82
 | 
			
		||||
  100                 192.65000                    -20.03                       21.48                       29.31                       20.82
 | 
			
		||||
  101                 192.70000                    -20.03                       21.48                       29.29                       20.81
 | 
			
		||||
  102                 192.75000                    -20.03                       21.48                       29.27                       20.81
 | 
			
		||||
  103                 192.80000                    -20.03                       21.48                       29.25                       20.81
 | 
			
		||||
  104                 192.85000                    -20.03                       21.47                       29.23                       20.80
 | 
			
		||||
  105                 192.90000                    -20.03                       21.47                       29.22                       20.80
 | 
			
		||||
  106                 192.95000                    -20.03                       21.47                       29.20                       20.80
 | 
			
		||||
  107                 193.00000                    -20.03                       21.47                       29.18                       20.79
 | 
			
		||||
  108                 193.05000                    -20.03                       21.47                       29.17                       20.79
 | 
			
		||||
  109                 193.10000                    -20.03                       21.47                       29.16                       20.79
 | 
			
		||||
  110                 193.15000                    -20.03                       21.47                       29.14                       20.78
 | 
			
		||||
  111                 193.20000                    -20.03                       21.47                       29.13                       20.78
 | 
			
		||||
  112                 193.25000                    -20.03                       21.47                       29.12                       20.78
 | 
			
		||||
  113                 193.30000                    -20.03                       21.47                       29.10                       20.78
 | 
			
		||||
  114                 193.35000                    -20.03                       21.46                       29.09                       20.77
 | 
			
		||||
  115                 193.40000                    -20.03                       21.46                       29.08                       20.77
 | 
			
		||||
  116                 193.45000                    -20.03                       21.46                       29.07                       20.77
 | 
			
		||||
  117                 193.50000                    -20.03                       21.46                       29.06                       20.77
 | 
			
		||||
  118                 193.55000                    -20.03                       21.46                       29.05                       20.76
 | 
			
		||||
  119                 193.60000                    -20.03                       21.46                       29.04                       20.76
 | 
			
		||||
  120                 193.65000                    -20.03                       21.46                       29.03                       20.76
 | 
			
		||||
  121                 193.70000                    -20.03                       21.46                       29.02                       20.76
 | 
			
		||||
  122                 193.75000                    -20.03                       21.46                       29.01                       20.75
 | 
			
		||||
  123                 193.80000                    -20.03                       21.46                       29.00                       20.75
 | 
			
		||||
  124                 193.85000                    -20.03                       21.45                       28.99                       20.75
 | 
			
		||||
  125                 193.90000                    -20.03                       21.45                       28.99                       20.75
 | 
			
		||||
  126                 193.95000                    -20.03                       21.45                       28.98                       20.75
 | 
			
		||||
  127                 194.00000                    -20.03                       21.45                       28.97                       20.74
 | 
			
		||||
  128                 194.05000                    -20.03                       21.45                       28.97                       20.74
 | 
			
		||||
  129                 194.10000                    -20.03                       21.45                       28.96                       20.74
 | 
			
		||||
  130                 194.15000                    -20.03                       21.45                       28.96                       20.74
 | 
			
		||||
  131                 194.20000                    -20.03                       21.45                       28.96                       20.74
 | 
			
		||||
  132                 194.25000                    -20.03                       21.45                       28.95                       20.74
 | 
			
		||||
  133                 194.30000                    -20.03                       21.45                       28.95                       20.74
 | 
			
		||||
  134                 194.35000                    -20.03                       21.44                       28.95                       20.73
 | 
			
		||||
  135                 194.40000                    -20.03                       21.44                       28.95                       20.73
 | 
			
		||||
  136                 194.45000                    -20.03                       21.44                       28.95                       20.73
 | 
			
		||||
  137                 194.50000                    -20.03                       21.44                       28.96                       20.73
 | 
			
		||||
  138                 194.55000                    -20.03                       21.44                       28.96                       20.73
 | 
			
		||||
  139                 194.60000                    -20.03                       21.44                       28.97                       20.73
 | 
			
		||||
  140                 194.65000                    -20.03                       21.44                       28.98                       20.73
 | 
			
		||||
  141                 194.70000                    -20.03                       21.44                       28.99                       20.74
 | 
			
		||||
  142                 194.75000                    -20.03                       21.44                       29.01                       20.74
 | 
			
		||||
  143                 194.80000                    -20.03                       21.44                       29.04                       20.74
 | 
			
		||||
  144                 194.85000                    -20.03                       21.43                       29.07                       20.74
 | 
			
		||||
  145                 194.90000                    -20.03                       21.43                       29.12                       20.75
 | 
			
		||||
  146                 194.95000                    -20.03                       21.43                       29.18                       20.76
 | 
			
		||||
  147                 195.00000                    -20.03                       21.43                       29.28                       20.77
 | 
			
		||||
  148                 195.05000                    -20.03                       21.43                       29.44                       20.79
 | 
			
		||||
  149                 195.10000                    -20.03                       21.43                       29.84                       20.84
 | 
			
		||||
 | 
			
		||||
(Invalid source node 'Site_A' replaced with trx Site_A)
 | 
			
		||||
 | 
			
		||||
(Invalid destination node 'Site_D' replaced with trx Site_D)
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 96 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg
 | 
			
		||||
 | 
			
		||||
Now propagating between trx_Stockholm and trx_Gothenburg:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 2.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 96)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m2.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 2.00dBm,
 | 
			
		||||
                       nb_channels = 96)
 | 
			
		||||
Input optical power reference in span = [1;36;40m2.00 dBm[0m:
 | 
			
		||||
Transceiver trx_Stockholm
 | 
			
		||||
  GSNR (0.1nm, dB):          35.00
 | 
			
		||||
  GSNR (signal bw, dB):      30.98
 | 
			
		||||
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      2.00
 | 
			
		||||
Roadm roadm_Stockholm
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -31,7 +41,6 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
@@ -47,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  type_variety:           openroadm_ila_low_noise
 | 
			
		||||
  effective gain(dB):     16.33
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.01
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -54,8 +64,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  actual pch out (dBm):   2.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
@@ -65,29 +74,32 @@ Fiber          fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -14.33
 | 
			
		||||
  actual pch out (dBm):        -14.29
 | 
			
		||||
  actual pch out (dBm):        -14.30
 | 
			
		||||
Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp
 | 
			
		||||
  effective gain(dB):     16.33
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      12.59
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         5.53
 | 
			
		||||
  Power Out (dBm):        21.87
 | 
			
		||||
  Power In (dBm):         5.52
 | 
			
		||||
  Power Out (dBm):        21.86
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.04
 | 
			
		||||
  actual pch out (dBm):   2.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Norrköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.03
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -95,7 +107,6 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Norrköping → Linköping)
 | 
			
		||||
@@ -111,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp
 | 
			
		||||
  effective gain(dB):     11.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      16.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -118,17 +130,19 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
			
		||||
  Power Out (dBm):        21.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Linköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.01
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -136,7 +150,6 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Linköping → Jönköping)
 | 
			
		||||
@@ -152,24 +165,27 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp
 | 
			
		||||
  effective gain(dB):     26.80
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.09
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -4.97
 | 
			
		||||
  Power Out (dBm):        21.86
 | 
			
		||||
  Power Out (dBm):        21.87
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.04
 | 
			
		||||
  actual pch out (dBm):   2.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Jönköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.05
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -177,7 +193,6 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Jönköping → Borås)
 | 
			
		||||
@@ -193,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp
 | 
			
		||||
  effective gain(dB):     17.82
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      11.94
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -200,17 +216,19 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Borås
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.02
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -218,7 +236,6 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Borås → Gothenburg)
 | 
			
		||||
@@ -234,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp
 | 
			
		||||
  effective gain(dB):     13.53
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      13.78
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -241,13 +259,14 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Gothenburg
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.02
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Transceiver trx_Gothenburg
 | 
			
		||||
  GSNR (0.1nm, dB):          18.89
 | 
			
		||||
  GSNR (signal bw, dB):      14.86
 | 
			
		||||
@@ -257,8 +276,9 @@ Transceiver trx_Gothenburg
 | 
			
		||||
  PMD (ps):                  7.99
 | 
			
		||||
  PDL (dB):                  3.74
 | 
			
		||||
  Latency (ms):              2.45
 | 
			
		||||
  Actual pch out (dBm):      2.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 2.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 2.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m18.89 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked trx_Stockholm)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 96 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg
 | 
			
		||||
 | 
			
		||||
Now propagating between trx_Stockholm and trx_Gothenburg:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 2.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 96)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m2.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 2.00dBm,
 | 
			
		||||
                       nb_channels = 96)
 | 
			
		||||
Input optical power reference in span = [1;36;40m2.00 dBm[0m:
 | 
			
		||||
Transceiver trx_Stockholm
 | 
			
		||||
  GSNR (0.1nm, dB):          35.00
 | 
			
		||||
  GSNR (signal bw, dB):      30.98
 | 
			
		||||
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      2.00
 | 
			
		||||
Roadm roadm_Stockholm
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -31,7 +41,6 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
@@ -47,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  type_variety:           openroadm_ila_low_noise
 | 
			
		||||
  effective gain(dB):     16.33
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.01
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -54,8 +64,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  actual pch out (dBm):   2.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
@@ -65,29 +74,32 @@ Fiber          fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -14.33
 | 
			
		||||
  actual pch out (dBm):        -14.29
 | 
			
		||||
  actual pch out (dBm):        -14.30
 | 
			
		||||
Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp_worstcase_ver5
 | 
			
		||||
  effective gain(dB):     16.33
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  noise figure (dB):      11.44
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      11.43
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         5.53
 | 
			
		||||
  Power Out (dBm):        21.86
 | 
			
		||||
  Power In (dBm):         5.52
 | 
			
		||||
  Power Out (dBm):        21.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.04
 | 
			
		||||
  actual pch out (dBm):   2.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Norrköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.03
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -95,7 +107,6 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Norrköping → Linköping)
 | 
			
		||||
@@ -111,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp_worstcase_ver5
 | 
			
		||||
  effective gain(dB):     11.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      16.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -118,17 +130,19 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
			
		||||
  Power Out (dBm):        21.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Linköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.01
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -136,7 +150,6 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Linköping → Jönköping)
 | 
			
		||||
@@ -152,24 +165,27 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp_worstcase_ver5
 | 
			
		||||
  effective gain(dB):     26.80
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.01
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -4.97
 | 
			
		||||
  Power Out (dBm):        21.86
 | 
			
		||||
  Power Out (dBm):        21.87
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Jönköping
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.04
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -177,7 +193,6 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Jönköping → Borås)
 | 
			
		||||
@@ -193,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp_worstcase_ver5
 | 
			
		||||
  effective gain(dB):     17.82
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      10.54
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -200,17 +216,19 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.01
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Borås
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.02
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_booster
 | 
			
		||||
  effective gain(dB):     22.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      -inf
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -218,7 +236,6 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
			
		||||
  Power Out (dBm):        21.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.00
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Borås → Gothenburg)
 | 
			
		||||
@@ -234,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
			
		||||
  type_variety:           openroadm_mw_mw_preamp_worstcase_ver5
 | 
			
		||||
  effective gain(dB):     13.53
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      13.54
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -241,13 +259,14 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
			
		||||
  Power Out (dBm):        21.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       2.00
 | 
			
		||||
  effective pch (dBm):    2.00
 | 
			
		||||
  actual pch out (dBm):   2.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm_Gothenburg
 | 
			
		||||
  effective loss (dB):     22.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     22.00
 | 
			
		||||
  Actual loss (dB):        22.02
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Transceiver trx_Gothenburg
 | 
			
		||||
  GSNR (0.1nm, dB):          19.25
 | 
			
		||||
  GSNR (signal bw, dB):      15.23
 | 
			
		||||
@@ -257,8 +276,9 @@ Transceiver trx_Gothenburg
 | 
			
		||||
  PMD (ps):                  7.99
 | 
			
		||||
  PDL (dB):                  3.74
 | 
			
		||||
  Latency (ms):              2.45
 | 
			
		||||
  Actual pch out (dBm):      2.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 2.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 2.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m19.25 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked trx_Stockholm)
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@
 | 
			
		||||
	node-diverse: True
 | 
			
		||||
	request-id-numbers: ['4', '5']
 | 
			
		||||
]
 | 
			
		||||
[1;34;40mAggregating similar requests[0m
 | 
			
		||||
[1;34;40mThe following services have been requested:[0m
 | 
			
		||||
[PathRequest 0
 | 
			
		||||
	source: 	trx Lorient_KMA
 | 
			
		||||
@@ -21,6 +20,7 @@
 | 
			
		||||
	bit_rate:	None Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	1.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	80
 | 
			
		||||
	path_bandwidth: 	100.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
@@ -34,6 +34,7 @@
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	1.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	95
 | 
			
		||||
	path_bandwidth: 	200.0 Gbit/s
 | 
			
		||||
	nodes-list:	['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
			
		||||
@@ -47,6 +48,7 @@
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	95
 | 
			
		||||
	path_bandwidth: 	60.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
@@ -60,6 +62,7 @@
 | 
			
		||||
	bit_rate:	None Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	3.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	63
 | 
			
		||||
	path_bandwidth: 	150.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
@@ -73,11 +76,12 @@
 | 
			
		||||
	bit_rate:	200.0 Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	3.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	63
 | 
			
		||||
	path_bandwidth: 	20.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 7 | 6
 | 
			
		||||
, PathRequest 6
 | 
			
		||||
	source: 	trx Lannion_CAS
 | 
			
		||||
	destination:	trx Lorient_KMA
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
@@ -86,8 +90,23 @@
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	76
 | 
			
		||||
	path_bandwidth: 	700.0 Gbit/s
 | 
			
		||||
	path_bandwidth: 	300.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 7
 | 
			
		||||
	source: 	trx Lannion_CAS
 | 
			
		||||
	destination:	trx Lorient_KMA
 | 
			
		||||
	trx type:	Voyager
 | 
			
		||||
	trx mode:	mode 1
 | 
			
		||||
	baud_rate:	32.0 Gbaud
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	50.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	76
 | 
			
		||||
	path_bandwidth: 	400.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
, PathRequest 7b
 | 
			
		||||
@@ -99,13 +118,12 @@
 | 
			
		||||
	bit_rate:	100.0 Gb/s
 | 
			
		||||
	spacing:	75.0 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	50
 | 
			
		||||
	path_bandwidth: 	400.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
]
 | 
			
		||||
[1;34;40mComputing all paths with constraints[0m
 | 
			
		||||
[1;34;40mPropagating on selected path[0m
 | 
			
		||||
[1;34;40mResult summary[0m
 | 
			
		||||
req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason 
 | 
			
		||||
0       trx Lorient_KMA to trx Vannes_KBE :             24.83                    28.92                      14                     mode 1                   100.0                      1                   ([-284],[4])      
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
[1;34;40mList of disjunctions[0m
 | 
			
		||||
[]
 | 
			
		||||
[1;34;40mAggregating similar requests[0m
 | 
			
		||||
[1;34;40mThe following services have been requested:[0m
 | 
			
		||||
[PathRequest 0
 | 
			
		||||
	source: 	trx Abilene
 | 
			
		||||
@@ -11,13 +10,12 @@
 | 
			
		||||
	bit_rate:	300.0 Gb/s
 | 
			
		||||
	spacing:	62.50000000000001 GHz
 | 
			
		||||
	power:  	0.0 dBm
 | 
			
		||||
	tx_power_dbm:  	0.0 dBm
 | 
			
		||||
	nb channels: 	76
 | 
			
		||||
	path_bandwidth: 	100.0 Gbit/s
 | 
			
		||||
	nodes-list:	[]
 | 
			
		||||
	loose-list:	[]
 | 
			
		||||
]
 | 
			
		||||
[1;34;40mComputing all paths with constraints[0m
 | 
			
		||||
[1;34;40mPropagating on selected path[0m
 | 
			
		||||
[1;34;40mResult summary[0m
 | 
			
		||||
req id   demand                       GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason 
 | 
			
		||||
0       trx Abilene to trx Albany :             9.04                     14.5                      -                      mode 3                   100.0                      -                MODE_NOT_FEASIBLE    
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										161
									
								
								tests/invocation/power_sweep_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								tests/invocation/power_sweep_example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,161 @@
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 4 fiber spans over 200 km between trx Brest_KLA and trx Rennes_STA
 | 
			
		||||
 | 
			
		||||
Now propagating between trx Brest_KLA and trx Rennes_STA:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 3.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 95)
 | 
			
		||||
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 95)
 | 
			
		||||
Input optical power reference in span = [1;36;40m-3.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          23.73
 | 
			
		||||
  GSNR (signal bw, dB):      19.65
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      23.99
 | 
			
		||||
  OSNR ASE (signal bw, dB):  19.91
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-2.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.01
 | 
			
		||||
  GSNR (signal bw, dB):      19.93
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      24.37
 | 
			
		||||
  OSNR ASE (signal bw, dB):  20.29
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-2.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.25
 | 
			
		||||
  GSNR (signal bw, dB):      20.17
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      24.74
 | 
			
		||||
  OSNR ASE (signal bw, dB):  20.66
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-1.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.44
 | 
			
		||||
  GSNR (signal bw, dB):      20.36
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      25.10
 | 
			
		||||
  OSNR ASE (signal bw, dB):  21.01
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-1.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.57
 | 
			
		||||
  GSNR (signal bw, dB):      20.49
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      25.44
 | 
			
		||||
  OSNR ASE (signal bw, dB):  21.36
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-0.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.63
 | 
			
		||||
  GSNR (signal bw, dB):      20.55
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      25.77
 | 
			
		||||
  OSNR ASE (signal bw, dB):  21.69
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m-0.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.60
 | 
			
		||||
  GSNR (signal bw, dB):      20.52
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.09
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.00
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.42
 | 
			
		||||
  GSNR (signal bw, dB):      20.34
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.29
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.20
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m1.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.16
 | 
			
		||||
  GSNR (signal bw, dB):      20.08
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.47
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.39
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m1.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.02
 | 
			
		||||
  GSNR (signal bw, dB):      19.93
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.55
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.47
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m2.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.02
 | 
			
		||||
  GSNR (signal bw, dB):      19.93
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.55
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.47
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m2.50 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.02
 | 
			
		||||
  GSNR (signal bw, dB):      19.93
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.55
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.47
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Input optical power reference in span = [1;36;40m3.00 dBm[0m:
 | 
			
		||||
Transceiver trx Rennes_STA
 | 
			
		||||
  GSNR (0.1nm, dB):          24.02
 | 
			
		||||
  GSNR (signal bw, dB):      19.93
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      26.55
 | 
			
		||||
  OSNR ASE (signal bw, dB):  22.47
 | 
			
		||||
  CD (ps/nm):                3340.00
 | 
			
		||||
  PMD (ps):                  0.57
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.98
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
 | 
			
		||||
(Invalid source node 'brest' replaced with trx Brest_KLA)
 | 
			
		||||
 | 
			
		||||
(Invalid destination node 'rennes' replaced with trx Rennes_STA)
 | 
			
		||||
@@ -1,13 +1,19 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
There are 76 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA
 | 
			
		||||
 | 
			
		||||
Now propagating between trx Lannion_CAS and trx Lorient_KMA:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 0.00dBm,
 | 
			
		||||
                       nb_channels = 76)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver trx Lannion_CAS
 | 
			
		||||
  GSNR (0.1nm, dB):          40.00
 | 
			
		||||
  GSNR (signal bw, dB):      35.92
 | 
			
		||||
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
Roadm roadm Lannion_CAS
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa east edfa in Lannion_CAS to Corlay
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     21.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.36
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -32,7 +42,6 @@ Edfa east edfa in Lannion_CAS to Corlay
 | 
			
		||||
  Power Out (dBm):        19.82
 | 
			
		||||
  Delta_P (dB):           1.00
 | 
			
		||||
  target pch (dBm):       1.00
 | 
			
		||||
  effective pch (dBm):    1.00
 | 
			
		||||
  actual pch out (dBm):   1.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Lannion_CAS → Corlay)-F061
 | 
			
		||||
@@ -70,6 +79,7 @@ Edfa west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
  type_variety:           std_high_gain
 | 
			
		||||
  effective gain(dB):     28.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      5.92
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -77,13 +87,14 @@ Edfa west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
  Power Out (dBm):        19.85
 | 
			
		||||
  Delta_P (dB):           1.00
 | 
			
		||||
  target pch (dBm):       1.00
 | 
			
		||||
  effective pch (dBm):    1.00
 | 
			
		||||
  actual pch out (dBm):   1.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Lorient_KMA
 | 
			
		||||
  effective loss (dB):     21.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     21.00
 | 
			
		||||
  Actual loss (dB):        21.05
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Transceiver trx Lorient_KMA
 | 
			
		||||
  GSNR (0.1nm, dB):          23.61
 | 
			
		||||
  GSNR (signal bw, dB):      19.53
 | 
			
		||||
@@ -93,8 +104,9 @@ Transceiver trx Lorient_KMA
 | 
			
		||||
  PMD (ps):                  0.46
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.64
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 0.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked trx Lannion_CAS)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,19 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
There are 60 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA
 | 
			
		||||
 | 
			
		||||
Now propagating between trx Lannion_CAS and trx Lorient_KMA:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
 | 
			
		||||
                       spacing = mode_1: 50.00, mode_2: 75.00GHz,
 | 
			
		||||
                       transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
 | 
			
		||||
                       nb_channels = 60)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver trx Lannion_CAS
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
Roadm roadm Lannion_CAS
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.00, mode_2: 20.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Edfa east edfa in Lannion_CAS to Corlay
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     21.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.36
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -32,7 +42,6 @@ Edfa east edfa in Lannion_CAS to Corlay
 | 
			
		||||
  Power Out (dBm):        18.79
 | 
			
		||||
  Delta_P (dB):           1.00
 | 
			
		||||
  target pch (dBm):       1.00
 | 
			
		||||
  effective pch (dBm):    1.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 1.01, mode_2: 1.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Lannion_CAS → Corlay)-F061
 | 
			
		||||
@@ -70,6 +79,7 @@ Edfa west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
  type_variety:           std_high_gain
 | 
			
		||||
  effective gain(dB):     28.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      5.92
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -77,13 +87,14 @@ Edfa west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
  Power Out (dBm):        18.84
 | 
			
		||||
  Delta_P (dB):           1.00
 | 
			
		||||
  target pch (dBm):       1.00
 | 
			
		||||
  effective pch (dBm):    1.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 1.04, mode_2: 1.09
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Lorient_KMA
 | 
			
		||||
  effective loss (dB):     21.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     21.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 21.04, mode_2: 21.09
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Transceiver trx Lorient_KMA
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 23.66, mode_2: 23.81
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 19.58, mode_2: 16.72
 | 
			
		||||
@@ -93,8 +104,9 @@ Transceiver trx Lorient_KMA
 | 
			
		||||
  PMD (ps):                  0.46
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.64
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 0.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m23.72 dB[0m
 | 
			
		||||
 | 
			
		||||
The GSNR per channel at the end of the line is:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										474
									
								
								tests/invocation/transmission_long_pow
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										474
									
								
								tests/invocation/transmission_long_pow
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,474 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 96)
 | 
			
		||||
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
 | 
			
		||||
                       spacing = mode_1: 50.00, mode_2: 75.00GHz,
 | 
			
		||||
                       transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
 | 
			
		||||
                       nb_channels = 60)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  CD (ps/nm):                0.00
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
Roadm roadm Site A
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.00, mode_2: 20.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Edfa booster A
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -2.22
 | 
			
		||||
  Power Out (dBm):        17.79
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span1
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
			
		||||
Edfa Edfa1
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.80
 | 
			
		||||
  Power Out (dBm):        17.80
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span2
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
			
		||||
Edfa Edfa2
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.81
 | 
			
		||||
  Power Out (dBm):        17.81
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span3
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
			
		||||
Edfa Edfa3
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.82
 | 
			
		||||
  Power Out (dBm):        17.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span4
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -15.94
 | 
			
		||||
Edfa Edfa4
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.83
 | 
			
		||||
  Power Out (dBm):        17.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.07
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span5
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -15.93
 | 
			
		||||
Edfa Edfa5
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.84
 | 
			
		||||
  Power Out (dBm):        17.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 0.08
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site C
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.05, mode_2: 20.08
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Edfa booster C
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -2.22
 | 
			
		||||
  Power Out (dBm):        17.79
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span6
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
			
		||||
Edfa Edfa6
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.80
 | 
			
		||||
  Power Out (dBm):        17.80
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span7
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
			
		||||
Edfa Edfa7
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.81
 | 
			
		||||
  Power Out (dBm):        17.81
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span8
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
			
		||||
Edfa Edfa8
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.82
 | 
			
		||||
  Power Out (dBm):        17.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span9
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -15.94
 | 
			
		||||
Edfa Edfa9
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.83
 | 
			
		||||
  Power Out (dBm):        17.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.07
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span10
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -15.93
 | 
			
		||||
Edfa Edfa10
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.84
 | 
			
		||||
  Power Out (dBm):        17.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 0.08
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site D
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.05, mode_2: 20.08
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Edfa booster D
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -2.22
 | 
			
		||||
  Power Out (dBm):        17.79
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span11
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
			
		||||
Edfa Edfa11
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.80
 | 
			
		||||
  Power Out (dBm):        17.80
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span12
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
			
		||||
Edfa Edfa12
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.81
 | 
			
		||||
  Power Out (dBm):        17.81
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site E
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.03, mode_2: 20.04
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Edfa booster E
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -2.22
 | 
			
		||||
  Power Out (dBm):        17.79
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span13
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
			
		||||
Edfa Edfa13
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.80
 | 
			
		||||
  Power Out (dBm):        17.80
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span14
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
			
		||||
Edfa Edfa14
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         1.81
 | 
			
		||||
  Power Out (dBm):        17.81
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span15
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
			
		||||
Edfa Edfa15
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         1.82
 | 
			
		||||
  Power Out (dBm):        17.82
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site B
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.03, mode_2: 20.05
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 18.11, mode_2: 19.18
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 14.02, mode_2: 12.09
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 19.69, mode_2: 19.62
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 15.61, mode_2: 12.53
 | 
			
		||||
  CD (ps/nm):                20040.00
 | 
			
		||||
  PMD (ps):                  1.39
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              5.88
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m18.56 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 | 
			
		||||
(No destination node specified: picked Site_B)
 | 
			
		||||
							
								
								
									
										474
									
								
								tests/invocation/transmission_long_psd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										474
									
								
								tests/invocation/transmission_long_psd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,474 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 95)
 | 
			
		||||
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
 | 
			
		||||
                       spacing = mode_1: 50.00, mode_2: 75.00GHz,
 | 
			
		||||
                       transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
 | 
			
		||||
                       nb_channels = 60)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  CD (ps/nm):                0.00
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
Roadm roadm Site A
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.00, mode_2: 16.99
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
			
		||||
Edfa booster A
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -0.71
 | 
			
		||||
  Power Out (dBm):        19.30
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span1
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
			
		||||
Edfa Edfa1
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.31
 | 
			
		||||
  Power Out (dBm):        19.31
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span2
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
			
		||||
Edfa Edfa2
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.32
 | 
			
		||||
  Power Out (dBm):        19.32
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span3
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.95
 | 
			
		||||
Edfa Edfa3
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.33
 | 
			
		||||
  Power Out (dBm):        19.33
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span4
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -12.94
 | 
			
		||||
Edfa Edfa4
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.34
 | 
			
		||||
  Power Out (dBm):        19.34
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 3.06
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span5
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -12.93
 | 
			
		||||
Edfa Edfa5
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.35
 | 
			
		||||
  Power Out (dBm):        19.35
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.06, mode_2: 3.07
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site C
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.06, mode_2: 20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
			
		||||
Edfa booster C
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -0.71
 | 
			
		||||
  Power Out (dBm):        19.30
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span6
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
			
		||||
Edfa Edfa6
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.31
 | 
			
		||||
  Power Out (dBm):        19.31
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span7
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
			
		||||
Edfa Edfa7
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.32
 | 
			
		||||
  Power Out (dBm):        19.32
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span8
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.95
 | 
			
		||||
Edfa Edfa8
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.33
 | 
			
		||||
  Power Out (dBm):        19.33
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span9
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -12.94
 | 
			
		||||
Edfa Edfa9
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.34
 | 
			
		||||
  Power Out (dBm):        19.34
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 3.06
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span10
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -12.93
 | 
			
		||||
Edfa Edfa10
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.35
 | 
			
		||||
  Power Out (dBm):        19.35
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.06, mode_2: 3.07
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site D
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.06, mode_2: 20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
			
		||||
Edfa booster D
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -0.71
 | 
			
		||||
  Power Out (dBm):        19.30
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span11
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
			
		||||
Edfa Edfa11
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.31
 | 
			
		||||
  Power Out (dBm):        19.31
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span12
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
			
		||||
Edfa Edfa12
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.32
 | 
			
		||||
  Power Out (dBm):        19.32
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site E
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.03, mode_2: 20.03
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
			
		||||
Edfa booster E
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -0.71
 | 
			
		||||
  Power Out (dBm):        19.30
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span13
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
			
		||||
Edfa Edfa13
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.31
 | 
			
		||||
  Power Out (dBm):        19.31
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span14
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
			
		||||
Edfa Edfa14
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         3.32
 | 
			
		||||
  Power Out (dBm):        19.32
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span15
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.96
 | 
			
		||||
Edfa Edfa15
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         3.33
 | 
			
		||||
  Power Out (dBm):        19.33
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site B
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.04, mode_2: 20.04
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 17.91, mode_2: 20.37
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 13.83, mode_2: 13.28
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 19.69, mode_2: 22.55
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 15.61, mode_2: 15.46
 | 
			
		||||
  CD (ps/nm):                20040.00
 | 
			
		||||
  PMD (ps):                  1.39
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              5.88
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 | 
			
		||||
(No destination node specified: picked Site_B)
 | 
			
		||||
							
								
								
									
										474
									
								
								tests/invocation/transmission_long_psw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										474
									
								
								tests/invocation/transmission_long_psw
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,474 @@
 | 
			
		||||
User input for spectrum used for propagation instead of SI
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 95)
 | 
			
		||||
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
 | 
			
		||||
                       spacing = mode_1: 50.00, mode_2: 75.00GHz,
 | 
			
		||||
                       transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
 | 
			
		||||
                       nb_channels = 60)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 40.00, mode_2: 40.00
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 35.92, mode_2: 32.91
 | 
			
		||||
  CD (ps/nm):                0.00
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
Roadm roadm Site A
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.00, mode_2: 18.24
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -18.24
 | 
			
		||||
Edfa booster A
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -1.40
 | 
			
		||||
  Power Out (dBm):        18.61
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 1.77
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span1
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -14.22
 | 
			
		||||
Edfa Edfa1
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.62
 | 
			
		||||
  Power Out (dBm):        18.62
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 1.78
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span2
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -14.21
 | 
			
		||||
Edfa Edfa2
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.63
 | 
			
		||||
  Power Out (dBm):        18.63
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 1.79
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span3
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -14.20
 | 
			
		||||
Edfa Edfa3
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.64
 | 
			
		||||
  Power Out (dBm):        18.64
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 1.80
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span4
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -14.19
 | 
			
		||||
Edfa Edfa4
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.65
 | 
			
		||||
  Power Out (dBm):        18.65
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 1.81
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span5
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -14.18
 | 
			
		||||
Edfa Edfa5
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.66
 | 
			
		||||
  Power Out (dBm):        18.66
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 1.82
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site C
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.05, mode_2: 20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -18.24
 | 
			
		||||
Edfa booster C
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -1.40
 | 
			
		||||
  Power Out (dBm):        18.61
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 1.77
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span6
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -14.23
 | 
			
		||||
Edfa Edfa6
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.62
 | 
			
		||||
  Power Out (dBm):        18.62
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 1.78
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span7
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -14.21
 | 
			
		||||
Edfa Edfa7
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.63
 | 
			
		||||
  Power Out (dBm):        18.63
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 1.79
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span8
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -14.20
 | 
			
		||||
Edfa Edfa8
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.64
 | 
			
		||||
  Power Out (dBm):        18.64
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 1.80
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span9
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.96, mode_2: -14.19
 | 
			
		||||
Edfa Edfa9
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.65
 | 
			
		||||
  Power Out (dBm):        18.65
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.04, mode_2: 1.81
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span10
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.95, mode_2: -14.18
 | 
			
		||||
Edfa Edfa10
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.66
 | 
			
		||||
  Power Out (dBm):        18.66
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.05, mode_2: 1.82
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site D
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.05, mode_2: 20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -18.24
 | 
			
		||||
Edfa booster D
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -1.40
 | 
			
		||||
  Power Out (dBm):        18.61
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 1.77
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span11
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -14.23
 | 
			
		||||
Edfa Edfa11
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.62
 | 
			
		||||
  Power Out (dBm):        18.62
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 1.78
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span12
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -14.21
 | 
			
		||||
Edfa Edfa12
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.63
 | 
			
		||||
  Power Out (dBm):        18.63
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 1.79
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site E
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.03, mode_2: 20.03
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -18.24
 | 
			
		||||
Edfa booster E
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -1.40
 | 
			
		||||
  Power Out (dBm):        18.61
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.01, mode_2: 1.77
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span13
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.99, mode_2: -14.23
 | 
			
		||||
Edfa Edfa13
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.62
 | 
			
		||||
  Power Out (dBm):        18.62
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.02, mode_2: 1.78
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span14
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.98, mode_2: -14.22
 | 
			
		||||
Edfa Edfa14
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
  Power In (dBm):         2.63
 | 
			
		||||
  Power Out (dBm):        18.63
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 1.79
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span15
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
  pad att_in (dB):             0.00
 | 
			
		||||
  total loss (dB):             16.00
 | 
			
		||||
  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -16.00
 | 
			
		||||
  actual pch out (dBm):        mode_1: -15.97, mode_2: -14.20
 | 
			
		||||
Edfa Edfa15
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         2.64
 | 
			
		||||
  Power Out (dBm):        18.64
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  actual pch out (dBm):   mode_1: 0.03, mode_2: 1.80
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site B
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        mode_1: 20.03, mode_2: 20.04
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    mode_1: -20.00, mode_2: -18.24
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
  GSNR (0.1nm, dB):          mode_1: 18.02, mode_2: 20.22
 | 
			
		||||
  GSNR (signal bw, dB):      mode_1: 13.94, mode_2: 13.12
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      mode_1: 19.69, mode_2: 21.35
 | 
			
		||||
  OSNR ASE (signal bw, dB):  mode_1: 15.61, mode_2: 14.26
 | 
			
		||||
  CD (ps/nm):                20040.00
 | 
			
		||||
  PMD (ps):                  1.39
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              5.88
 | 
			
		||||
  Actual pch out (dBm):      mode_1: 0.00, mode_2: 0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 | 
			
		||||
(No destination node specified: picked Site_B)
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 76 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 1 fiber spans over 80 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 0.00dBm,
 | 
			
		||||
                       nb_channels = 76)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          40.00
 | 
			
		||||
  GSNR (signal bw, dB):      35.92
 | 
			
		||||
@@ -16,6 +22,7 @@ Transceiver Site_A
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
Fiber          Span1
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
@@ -29,6 +36,7 @@ Edfa Edfa1
 | 
			
		||||
  type_variety:           std_low_gain
 | 
			
		||||
  effective gain(dB):     15.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.62
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -36,7 +44,6 @@ Edfa Edfa1
 | 
			
		||||
  Power Out (dBm):        16.82
 | 
			
		||||
  Delta_P (dB):           -2.00
 | 
			
		||||
  target pch (dBm):       -2.00
 | 
			
		||||
  effective pch (dBm):    -2.00
 | 
			
		||||
  actual pch out (dBm):   -1.99
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
@@ -48,8 +55,9 @@ Transceiver Site_B
 | 
			
		||||
  PMD (ps):                  0.36
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.39
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 0.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m31.18 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 76 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 1 fiber spans over 80 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 76)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 0.00dBm,
 | 
			
		||||
                       nb_channels = 76)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          40.00
 | 
			
		||||
  GSNR (signal bw, dB):      35.92
 | 
			
		||||
@@ -16,6 +22,7 @@ Transceiver Site_A
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
RamanFiber          Span1
 | 
			
		||||
  type_variety:                SSMF
 | 
			
		||||
  length (km):                 80.00
 | 
			
		||||
@@ -25,113 +32,116 @@ RamanFiber          Span1
 | 
			
		||||
  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
			
		||||
  reference pch out (dBm):     -7.20
 | 
			
		||||
  actual pch out (dBm):        -7.47
 | 
			
		||||
  reference gain (dB):         9.74
 | 
			
		||||
  actual gain (dB):            9.8
 | 
			
		||||
Fused Fused1
 | 
			
		||||
  loss (dB): 0.00
 | 
			
		||||
Edfa Edfa1
 | 
			
		||||
  type_variety:           std_low_gain
 | 
			
		||||
  effective gain(dB):     5.20
 | 
			
		||||
  effective gain(dB):     5.26
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  noise figure (dB):      13.80
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      13.74
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        2.80
 | 
			
		||||
  pad att_in (dB):        2.74
 | 
			
		||||
  Power In (dBm):         11.61
 | 
			
		||||
  Power Out (dBm):        16.81
 | 
			
		||||
  Power Out (dBm):        16.87
 | 
			
		||||
  Delta_P (dB):           -2.00
 | 
			
		||||
  target pch (dBm):       -2.00
 | 
			
		||||
  effective pch (dBm):    -2.00
 | 
			
		||||
  actual pch out (dBm):   -2.26
 | 
			
		||||
  actual pch out (dBm):   -2.21
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
  GSNR (0.1nm, dB):          31.42
 | 
			
		||||
  GSNR (signal bw, dB):      27.34
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      34.21
 | 
			
		||||
  OSNR ASE (signal bw, dB):  30.13
 | 
			
		||||
  GSNR (0.1nm, dB):          31.44
 | 
			
		||||
  GSNR (signal bw, dB):      27.35
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      34.24
 | 
			
		||||
  OSNR ASE (signal bw, dB):  30.16
 | 
			
		||||
  CD (ps/nm):                1336.00
 | 
			
		||||
  PMD (ps):                  0.36
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.39
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m31.42 dB[0m
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m31.44 dB[0m
 | 
			
		||||
 | 
			
		||||
The GSNR per channel at the end of the line is:
 | 
			
		||||
Ch. #   Channel frequency (THz)       Channel power (dBm)    OSNR ASE (signal bw, dB)     SNR NLI (signal bw, dB)        GSNR (signal bw, dB)
 | 
			
		||||
    1                 191.35000                      0.22                       31.64                       31.55                       28.58
 | 
			
		||||
    2                 191.40000                      0.18                       31.62                       31.46                       28.53
 | 
			
		||||
    3                 191.45000                      0.15                       31.60                       31.37                       28.47
 | 
			
		||||
    4                 191.50000                      0.11                       31.58                       31.28                       28.42
 | 
			
		||||
    5                 191.55000                      0.05                       31.54                       31.20                       28.36
 | 
			
		||||
    6                 191.60000                     -0.01                       31.51                       31.11                       28.30
 | 
			
		||||
    7                 191.65000                     -0.07                       31.48                       31.03                       28.24
 | 
			
		||||
    8                 191.70000                     -0.12                       31.45                       30.95                       28.18
 | 
			
		||||
    9                 191.75000                     -0.18                       31.42                       30.87                       28.13
 | 
			
		||||
   10                 191.80000                     -0.25                       31.38                       30.79                       28.07
 | 
			
		||||
   11                 191.85000                     -0.31                       31.35                       30.72                       28.01
 | 
			
		||||
   12                 191.90000                     -0.38                       31.31                       30.64                       27.95
 | 
			
		||||
   13                 191.95000                     -0.44                       31.27                       30.57                       27.90
 | 
			
		||||
   14                 192.00000                     -0.51                       31.24                       30.50                       27.84
 | 
			
		||||
   15                 192.05000                     -0.58                       31.20                       30.42                       27.78
 | 
			
		||||
   16                 192.10000                     -0.64                       31.16                       30.35                       27.73
 | 
			
		||||
   17                 192.15000                     -0.71                       31.12                       30.29                       27.67
 | 
			
		||||
   18                 192.20000                     -0.78                       31.08                       30.22                       27.62
 | 
			
		||||
   19                 192.25000                     -0.85                       31.04                       30.22                       27.60
 | 
			
		||||
   20                 192.30000                     -0.93                       31.00                       30.22                       27.58
 | 
			
		||||
   21                 192.35000                     -1.00                       30.96                       30.23                       27.57
 | 
			
		||||
   22                 192.40000                     -1.08                       30.91                       30.23                       27.55
 | 
			
		||||
   23                 192.45000                     -1.16                       30.87                       30.23                       27.53
 | 
			
		||||
   24                 192.50000                     -1.23                       30.82                       30.24                       27.51
 | 
			
		||||
   25                 192.55000                     -1.30                       30.78                       30.24                       27.49
 | 
			
		||||
   26                 192.60000                     -1.37                       30.74                       30.24                       27.47
 | 
			
		||||
   27                 192.65000                     -1.44                       30.70                       30.25                       27.46
 | 
			
		||||
   28                 192.70000                     -1.52                       30.65                       30.25                       27.44
 | 
			
		||||
   29                 192.75000                     -1.59                       30.61                       30.25                       27.42
 | 
			
		||||
   30                 192.80000                     -1.66                       30.57                       30.26                       27.40
 | 
			
		||||
   31                 192.85000                     -1.73                       30.52                       30.26                       27.38
 | 
			
		||||
   32                 192.90000                     -1.80                       30.48                       30.26                       27.36
 | 
			
		||||
   33                 192.95000                     -1.87                       30.43                       30.27                       27.34
 | 
			
		||||
   34                 193.00000                     -1.94                       30.39                       30.27                       27.32
 | 
			
		||||
   35                 193.05000                     -2.01                       30.35                       30.27                       27.30
 | 
			
		||||
   36                 193.10000                     -2.08                       30.30                       30.28                       27.28
 | 
			
		||||
   37                 193.15000                     -2.15                       30.26                       30.28                       27.26
 | 
			
		||||
   38                 193.20000                     -2.22                       30.22                       30.29                       27.24
 | 
			
		||||
   39                 193.25000                     -2.29                       30.17                       30.31                       27.23
 | 
			
		||||
   40                 193.30000                     -2.36                       30.13                       30.32                       27.21
 | 
			
		||||
   41                 193.35000                     -2.43                       30.08                       30.33                       27.19
 | 
			
		||||
   42                 193.40000                     -2.50                       30.04                       30.35                       27.18
 | 
			
		||||
   43                 193.45000                     -2.56                       29.99                       30.36                       27.16
 | 
			
		||||
   44                 193.50000                     -2.63                       29.95                       30.37                       27.14
 | 
			
		||||
   45                 193.55000                     -2.71                       29.90                       30.39                       27.12
 | 
			
		||||
   46                 193.60000                     -2.78                       29.85                       30.40                       27.11
 | 
			
		||||
   47                 193.65000                     -2.85                       29.80                       30.41                       27.09
 | 
			
		||||
   48                 193.70000                     -2.93                       29.75                       30.43                       27.07
 | 
			
		||||
   49                 193.75000                     -3.00                       29.70                       30.44                       27.05
 | 
			
		||||
   50                 193.80000                     -3.07                       29.65                       30.45                       27.02
 | 
			
		||||
   51                 193.85000                     -3.15                       29.60                       30.47                       27.00
 | 
			
		||||
   52                 193.90000                     -3.22                       29.55                       30.48                       26.98
 | 
			
		||||
   53                 193.95000                     -3.29                       29.50                       30.50                       26.96
 | 
			
		||||
   54                 194.00000                     -3.37                       29.45                       30.51                       26.94
 | 
			
		||||
   55                 194.05000                     -3.44                       29.40                       30.52                       26.92
 | 
			
		||||
   56                 194.10000                     -3.52                       29.35                       30.54                       26.89
 | 
			
		||||
   57                 194.15000                     -3.59                       29.30                       30.59                       26.89
 | 
			
		||||
   58                 194.20000                     -3.66                       29.25                       30.64                       26.88
 | 
			
		||||
   59                 194.25000                     -3.74                       29.19                       30.70                       26.87
 | 
			
		||||
   60                 194.30000                     -3.81                       29.14                       30.75                       26.86
 | 
			
		||||
   61                 194.35000                     -3.89                       29.09                       30.81                       26.86
 | 
			
		||||
   62                 194.40000                     -3.96                       29.04                       30.87                       26.85
 | 
			
		||||
   63                 194.45000                     -4.04                       28.98                       30.93                       26.84
 | 
			
		||||
   64                 194.50000                     -4.11                       28.93                       30.98                       26.83
 | 
			
		||||
   65                 194.55000                     -4.18                       28.88                       31.04                       26.82
 | 
			
		||||
   66                 194.60000                     -4.25                       28.83                       31.10                       26.81
 | 
			
		||||
   67                 194.65000                     -4.31                       28.78                       31.17                       26.80
 | 
			
		||||
   68                 194.70000                     -4.38                       28.74                       31.23                       26.79
 | 
			
		||||
   69                 194.75000                     -4.45                       28.69                       31.29                       26.79
 | 
			
		||||
   70                 194.80000                     -4.51                       28.64                       31.35                       26.78
 | 
			
		||||
   71                 194.85000                     -4.58                       28.59                       31.42                       26.77
 | 
			
		||||
   72                 194.90000                     -4.65                       28.54                       31.48                       26.76
 | 
			
		||||
   73                 194.95000                     -4.71                       28.49                       31.55                       26.74
 | 
			
		||||
   74                 195.00000                     -4.78                       28.44                       31.62                       26.73
 | 
			
		||||
   75                 195.05000                     -4.85                       28.39                       31.69                       26.72
 | 
			
		||||
   76                 195.10000                     -4.91                       28.34                       31.69                       26.69
 | 
			
		||||
    1                 191.35000                      0.27                       31.66                       31.55                       28.60
 | 
			
		||||
    2                 191.40000                      0.24                       31.64                       31.46                       28.54
 | 
			
		||||
    3                 191.45000                      0.20                       31.62                       31.37                       28.48
 | 
			
		||||
    4                 191.50000                      0.17                       31.60                       31.28                       28.43
 | 
			
		||||
    5                 191.55000                      0.11                       31.57                       31.20                       28.37
 | 
			
		||||
    6                 191.60000                      0.05                       31.54                       31.11                       28.31
 | 
			
		||||
    7                 191.65000                     -0.01                       31.51                       31.03                       28.25
 | 
			
		||||
    8                 191.70000                     -0.07                       31.47                       30.95                       28.20
 | 
			
		||||
    9                 191.75000                     -0.13                       31.44                       30.87                       28.14
 | 
			
		||||
   10                 191.80000                     -0.19                       31.41                       30.79                       28.08
 | 
			
		||||
   11                 191.85000                     -0.26                       31.37                       30.72                       28.02
 | 
			
		||||
   12                 191.90000                     -0.32                       31.34                       30.64                       27.97
 | 
			
		||||
   13                 191.95000                     -0.39                       31.30                       30.57                       27.91
 | 
			
		||||
   14                 192.00000                     -0.45                       31.26                       30.50                       27.85
 | 
			
		||||
   15                 192.05000                     -0.52                       31.23                       30.42                       27.80
 | 
			
		||||
   16                 192.10000                     -0.59                       31.19                       30.35                       27.74
 | 
			
		||||
   17                 192.15000                     -0.66                       31.15                       30.29                       27.69
 | 
			
		||||
   18                 192.20000                     -0.72                       31.11                       30.22                       27.63
 | 
			
		||||
   19                 192.25000                     -0.79                       31.07                       30.22                       27.62
 | 
			
		||||
   20                 192.30000                     -0.87                       31.03                       30.22                       27.60
 | 
			
		||||
   21                 192.35000                     -0.95                       30.99                       30.23                       27.58
 | 
			
		||||
   22                 192.40000                     -1.02                       30.94                       30.23                       27.56
 | 
			
		||||
   23                 192.45000                     -1.10                       30.90                       30.23                       27.54
 | 
			
		||||
   24                 192.50000                     -1.18                       30.85                       30.24                       27.52
 | 
			
		||||
   25                 192.55000                     -1.25                       30.81                       30.24                       27.51
 | 
			
		||||
   26                 192.60000                     -1.32                       30.77                       30.24                       27.49
 | 
			
		||||
   27                 192.65000                     -1.39                       30.73                       30.25                       27.47
 | 
			
		||||
   28                 192.70000                     -1.46                       30.68                       30.25                       27.45
 | 
			
		||||
   29                 192.75000                     -1.53                       30.64                       30.25                       27.43
 | 
			
		||||
   30                 192.80000                     -1.60                       30.60                       30.26                       27.41
 | 
			
		||||
   31                 192.85000                     -1.67                       30.55                       30.26                       27.39
 | 
			
		||||
   32                 192.90000                     -1.74                       30.51                       30.26                       27.37
 | 
			
		||||
   33                 192.95000                     -1.81                       30.47                       30.27                       27.35
 | 
			
		||||
   34                 193.00000                     -1.89                       30.42                       30.27                       27.33
 | 
			
		||||
   35                 193.05000                     -1.95                       30.38                       30.27                       27.32
 | 
			
		||||
   36                 193.10000                     -2.02                       30.34                       30.28                       27.30
 | 
			
		||||
   37                 193.15000                     -2.09                       30.29                       30.28                       27.28
 | 
			
		||||
   38                 193.20000                     -2.16                       30.25                       30.29                       27.26
 | 
			
		||||
   39                 193.25000                     -2.23                       30.20                       30.31                       27.24
 | 
			
		||||
   40                 193.30000                     -2.30                       30.16                       30.32                       27.23
 | 
			
		||||
   41                 193.35000                     -2.37                       30.11                       30.33                       27.21
 | 
			
		||||
   42                 193.40000                     -2.44                       30.07                       30.35                       27.20
 | 
			
		||||
   43                 193.45000                     -2.51                       30.02                       30.36                       27.18
 | 
			
		||||
   44                 193.50000                     -2.58                       29.98                       30.37                       27.16
 | 
			
		||||
   45                 193.55000                     -2.65                       29.93                       30.39                       27.14
 | 
			
		||||
   46                 193.60000                     -2.72                       29.88                       30.40                       27.12
 | 
			
		||||
   47                 193.65000                     -2.80                       29.83                       30.41                       27.10
 | 
			
		||||
   48                 193.70000                     -2.87                       29.79                       30.43                       27.08
 | 
			
		||||
   49                 193.75000                     -2.94                       29.74                       30.44                       27.06
 | 
			
		||||
   50                 193.80000                     -3.02                       29.69                       30.45                       27.04
 | 
			
		||||
   51                 193.85000                     -3.09                       29.64                       30.47                       27.02
 | 
			
		||||
   52                 193.90000                     -3.16                       29.59                       30.48                       27.00
 | 
			
		||||
   53                 193.95000                     -3.24                       29.54                       30.50                       26.98
 | 
			
		||||
   54                 194.00000                     -3.31                       29.49                       30.51                       26.96
 | 
			
		||||
   55                 194.05000                     -3.38                       29.44                       30.52                       26.94
 | 
			
		||||
   56                 194.10000                     -3.46                       29.39                       30.54                       26.91
 | 
			
		||||
   57                 194.15000                     -3.53                       29.33                       30.59                       26.91
 | 
			
		||||
   58                 194.20000                     -3.61                       29.28                       30.64                       26.90
 | 
			
		||||
   59                 194.25000                     -3.68                       29.23                       30.70                       26.89
 | 
			
		||||
   60                 194.30000                     -3.76                       29.18                       30.75                       26.89
 | 
			
		||||
   61                 194.35000                     -3.83                       29.13                       30.81                       26.88
 | 
			
		||||
   62                 194.40000                     -3.91                       29.07                       30.87                       26.87
 | 
			
		||||
   63                 194.45000                     -3.98                       29.02                       30.93                       26.86
 | 
			
		||||
   64                 194.50000                     -4.05                       28.97                       30.98                       26.85
 | 
			
		||||
   65                 194.55000                     -4.12                       28.92                       31.04                       26.84
 | 
			
		||||
   66                 194.60000                     -4.19                       28.87                       31.10                       26.84
 | 
			
		||||
   67                 194.65000                     -4.26                       28.82                       31.17                       26.83
 | 
			
		||||
   68                 194.70000                     -4.32                       28.77                       31.23                       26.82
 | 
			
		||||
   69                 194.75000                     -4.39                       28.72                       31.29                       26.81
 | 
			
		||||
   70                 194.80000                     -4.46                       28.68                       31.35                       26.80
 | 
			
		||||
   71                 194.85000                     -4.52                       28.63                       31.42                       26.79
 | 
			
		||||
   72                 194.90000                     -4.59                       28.58                       31.48                       26.78
 | 
			
		||||
   73                 194.95000                     -4.66                       28.53                       31.55                       26.77
 | 
			
		||||
   74                 195.00000                     -4.72                       28.48                       31.62                       26.76
 | 
			
		||||
   75                 195.05000                     -4.79                       28.43                       31.69                       26.75
 | 
			
		||||
   76                 195.10000                     -4.86                       28.38                       31.69                       26.71
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 96 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
			
		||||
 | 
			
		||||
Now propagating between Site_A and Site_B:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 0.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 96)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 0.00dBm,
 | 
			
		||||
                       nb_channels = 96)
 | 
			
		||||
Input optical power reference in span = [1;36;40m0.00 dBm[0m:
 | 
			
		||||
Transceiver Site_A
 | 
			
		||||
  GSNR (0.1nm, dB):          100.00
 | 
			
		||||
  GSNR (signal bw, dB):      95.92
 | 
			
		||||
@@ -16,14 +22,18 @@ Transceiver Site_A
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
Roadm roadm Site A
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa booster A
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -31,7 +41,6 @@ Edfa booster A
 | 
			
		||||
  Power Out (dBm):        19.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span1
 | 
			
		||||
@@ -47,6 +56,7 @@ Edfa Edfa1
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -54,7 +64,6 @@ Edfa Edfa1
 | 
			
		||||
  Power Out (dBm):        19.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span2
 | 
			
		||||
@@ -70,6 +79,7 @@ Edfa Edfa2
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -77,7 +87,6 @@ Edfa Edfa2
 | 
			
		||||
  Power Out (dBm):        19.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span3
 | 
			
		||||
@@ -93,6 +102,7 @@ Edfa Edfa3
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -100,7 +110,6 @@ Edfa Edfa3
 | 
			
		||||
  Power Out (dBm):        19.86
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span4
 | 
			
		||||
@@ -116,6 +125,7 @@ Edfa Edfa4
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -123,7 +133,6 @@ Edfa Edfa4
 | 
			
		||||
  Power Out (dBm):        19.87
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span5
 | 
			
		||||
@@ -139,6 +148,7 @@ Edfa Edfa5
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -146,17 +156,19 @@ Edfa Edfa5
 | 
			
		||||
  Power Out (dBm):        19.88
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.06
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site C
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa booster C
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -164,7 +176,6 @@ Edfa booster C
 | 
			
		||||
  Power Out (dBm):        19.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span6
 | 
			
		||||
@@ -180,6 +191,7 @@ Edfa Edfa6
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -187,7 +199,6 @@ Edfa Edfa6
 | 
			
		||||
  Power Out (dBm):        19.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span7
 | 
			
		||||
@@ -203,6 +214,7 @@ Edfa Edfa7
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -210,7 +222,6 @@ Edfa Edfa7
 | 
			
		||||
  Power Out (dBm):        19.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span8
 | 
			
		||||
@@ -226,6 +237,7 @@ Edfa Edfa8
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -233,7 +245,6 @@ Edfa Edfa8
 | 
			
		||||
  Power Out (dBm):        19.86
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span9
 | 
			
		||||
@@ -249,6 +260,7 @@ Edfa Edfa9
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -256,7 +268,6 @@ Edfa Edfa9
 | 
			
		||||
  Power Out (dBm):        19.87
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.05
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span10
 | 
			
		||||
@@ -272,6 +283,7 @@ Edfa Edfa10
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -279,17 +291,19 @@ Edfa Edfa10
 | 
			
		||||
  Power Out (dBm):        19.88
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.06
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site D
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.06
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa booster D
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -297,7 +311,6 @@ Edfa booster D
 | 
			
		||||
  Power Out (dBm):        19.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span11
 | 
			
		||||
@@ -313,6 +326,7 @@ Edfa Edfa11
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -320,7 +334,6 @@ Edfa Edfa11
 | 
			
		||||
  Power Out (dBm):        19.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span12
 | 
			
		||||
@@ -336,6 +349,7 @@ Edfa Edfa12
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -343,17 +357,19 @@ Edfa Edfa12
 | 
			
		||||
  Power Out (dBm):        19.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site E
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.03
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa booster E
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     20.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.58
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -361,7 +377,6 @@ Edfa booster E
 | 
			
		||||
  Power Out (dBm):        19.83
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.01
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span13
 | 
			
		||||
@@ -377,6 +392,7 @@ Edfa Edfa13
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -384,7 +400,6 @@ Edfa Edfa13
 | 
			
		||||
  Power Out (dBm):        19.84
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.02
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span14
 | 
			
		||||
@@ -400,6 +415,7 @@ Edfa Edfa14
 | 
			
		||||
  type_variety:           test_fixed_gain
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      9.00
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        4.00
 | 
			
		||||
@@ -407,7 +423,6 @@ Edfa Edfa14
 | 
			
		||||
  Power Out (dBm):        19.85
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.03
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          Span15
 | 
			
		||||
@@ -423,6 +438,7 @@ Edfa Edfa15
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     16.00
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      8.86
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
@@ -430,13 +446,14 @@ Edfa Edfa15
 | 
			
		||||
  Power Out (dBm):        19.86
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       0.00
 | 
			
		||||
  effective pch (dBm):    0.00
 | 
			
		||||
  actual pch out (dBm):   0.04
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Site B
 | 
			
		||||
  effective loss (dB):     20.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     20.00
 | 
			
		||||
  Actual loss (dB):        20.04
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Transceiver Site_B
 | 
			
		||||
  GSNR (0.1nm, dB):          17.84
 | 
			
		||||
  GSNR (signal bw, dB):      13.76
 | 
			
		||||
@@ -446,8 +463,9 @@ Transceiver Site_B
 | 
			
		||||
  PMD (ps):                  1.39
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              5.88
 | 
			
		||||
  Actual pch out (dBm):      0.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 0.00 dBm:
 | 
			
		||||
Transmission result for input optical power reference in span = 0.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m17.84 dB[0m
 | 
			
		||||
 | 
			
		||||
(No source node specified: picked Site_A)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
There are 96 channels propagating
 | 
			
		||||
Power mode is set to True
 | 
			
		||||
=> it can be modified in eqpt_config.json - Span
 | 
			
		||||
 | 
			
		||||
There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA
 | 
			
		||||
 | 
			
		||||
Now propagating between trx Lannion_CAS and trx Lorient_KMA:
 | 
			
		||||
Reference used for design: (Input optical power reference in span = 3.00dBm,
 | 
			
		||||
                            spacing = 50.00GHz
 | 
			
		||||
                            nb_channels = 96)
 | 
			
		||||
 | 
			
		||||
Propagating with input power = [1;36;40m3.00 dBm[0m:
 | 
			
		||||
Channels propagating: (Input optical power deviation in span = 0.00dB,
 | 
			
		||||
                       spacing = 50.00GHz,
 | 
			
		||||
                       transceiver output power = 3.00dBm,
 | 
			
		||||
                       nb_channels = 96)
 | 
			
		||||
Input optical power reference in span = [1;36;40m3.00 dBm[0m:
 | 
			
		||||
Transceiver trx Lannion_CAS
 | 
			
		||||
  GSNR (0.1nm, dB):          100.00
 | 
			
		||||
  GSNR (signal bw, dB):      95.92
 | 
			
		||||
@@ -16,22 +22,25 @@ Transceiver trx Lannion_CAS
 | 
			
		||||
  PMD (ps):                  0.00
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.00
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
Roadm roadm Lannion_CAS
 | 
			
		||||
  effective loss (dB):     23.00
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     23.00
 | 
			
		||||
  Actual loss (dB):        23.00
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Edfa east edfa in Lannion_CAS to Corlay
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  effective gain(dB):     21.18
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      6.13
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -0.18
 | 
			
		||||
  Power Out (dBm):        21.01
 | 
			
		||||
  Delta_P (dB):           0.00
 | 
			
		||||
  target pch (dBm):       3.00
 | 
			
		||||
  effective pch (dBm):    1.18
 | 
			
		||||
  Delta_P (dB):           -1.82
 | 
			
		||||
  target pch (dBm):       1.18
 | 
			
		||||
  actual pch out (dBm):   1.18
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Fiber          fiber (Lannion_CAS → Corlay)-F061
 | 
			
		||||
@@ -66,35 +75,38 @@ Fiber          fiber (Loudeac → Lorient_KMA)-F054
 | 
			
		||||
  reference pch out (dBm):     -26.82
 | 
			
		||||
  actual pch out (dBm):        -26.81
 | 
			
		||||
Edfa west edfa in Lorient_KMA to Loudeac
 | 
			
		||||
  type_variety:           test
 | 
			
		||||
  type_variety:           std_medium_gain
 | 
			
		||||
  effective gain(dB):     27.99
 | 
			
		||||
  (before att_in and before output VOA)
 | 
			
		||||
  noise figure (dB):      5.76
 | 
			
		||||
  tilt-target(dB)         0.00
 | 
			
		||||
  noise figure (dB):      5.98
 | 
			
		||||
  (including att_in)
 | 
			
		||||
  pad att_in (dB):        0.00
 | 
			
		||||
  Power In (dBm):         -6.99
 | 
			
		||||
  Power Out (dBm):        21.03
 | 
			
		||||
  Delta_P (dB):           -1.82
 | 
			
		||||
  target pch (dBm):       1.18
 | 
			
		||||
  effective pch (dBm):    1.17
 | 
			
		||||
  actual pch out (dBm):   1.21
 | 
			
		||||
  output VOA (dB):        0.00
 | 
			
		||||
Roadm roadm Lorient_KMA
 | 
			
		||||
  effective loss (dB):     21.17
 | 
			
		||||
  reference pch out (dBm): -20.00
 | 
			
		||||
  actual pch out (dBm):    -20.00
 | 
			
		||||
  Type_variety:            default
 | 
			
		||||
  Reference loss (dB):     21.18
 | 
			
		||||
  Actual loss (dB):        21.21
 | 
			
		||||
  Reference pch out (dBm): -20.00
 | 
			
		||||
  Actual pch out (dBm):    -20.00
 | 
			
		||||
Transceiver trx Lorient_KMA
 | 
			
		||||
  GSNR (0.1nm, dB):          23.93
 | 
			
		||||
  GSNR (signal bw, dB):      19.85
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      24.29
 | 
			
		||||
  OSNR ASE (signal bw, dB):  20.20
 | 
			
		||||
  GSNR (0.1nm, dB):          23.77
 | 
			
		||||
  GSNR (signal bw, dB):      19.69
 | 
			
		||||
  OSNR ASE (0.1nm, dB):      24.11
 | 
			
		||||
  OSNR ASE (signal bw, dB):  20.03
 | 
			
		||||
  CD (ps/nm):                2171.00
 | 
			
		||||
  PMD (ps):                  0.46
 | 
			
		||||
  PDL (dB):                  0.00
 | 
			
		||||
  Latency (ms):              0.64
 | 
			
		||||
  Actual pch out (dBm):      3.00
 | 
			
		||||
 | 
			
		||||
Transmission result for input power = 3.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m23.93 dB[0m
 | 
			
		||||
Transmission result for input optical power reference in span = 3.00 dBm:
 | 
			
		||||
  Final GSNR (0.1 nm): [1;36;40m23.77 dB[0m
 | 
			
		||||
 | 
			
		||||
(Invalid source node 'lannion' replaced with trx Lannion_CAS)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
build>=1.0.3,<2
 | 
			
		||||
pytest>=7.4.3,<8
 | 
			
		||||
# pandas 2.1 removed support for Python 3.8
 | 
			
		||||
pandas>=2.0.3,<3
 | 
			
		||||
 | 
			
		||||
# flake v6 killed the --diff option
 | 
			
		||||
flake8>=5.0.4,<6
 | 
			
		||||
@@ -4,11 +4,12 @@
 | 
			
		||||
# @Date:   2018-02-02 14:06:55
 | 
			
		||||
 | 
			
		||||
from numpy import zeros, array
 | 
			
		||||
from gnpy.core.elements import Transceiver, Edfa
 | 
			
		||||
from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, ReferenceCarrier
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment
 | 
			
		||||
from numpy.testing import assert_allclose
 | 
			
		||||
from gnpy.core.elements import Transceiver, Edfa, Fiber
 | 
			
		||||
from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions, dbm2watt, watt2dbm
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information
 | 
			
		||||
from gnpy.core.network import build_network, set_amplifier_voa
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment, load_json, _equipment_from_json, network_from_json
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
@@ -73,9 +74,8 @@ def si(nch_and_spacing, bw):
 | 
			
		||||
    nb_channel, spacing = nch_and_spacing
 | 
			
		||||
    f_min = 191.3e12
 | 
			
		||||
    f_max = automatic_fmax(f_min, spacing, nb_channel)
 | 
			
		||||
    return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw, power=1e-3,
 | 
			
		||||
                                             spacing=spacing, tx_osnr=40.0,
 | 
			
		||||
                                             ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
 | 
			
		||||
    return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw,
 | 
			
		||||
                                             spacing=spacing, tx_osnr=40.0, tx_power=1e-3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)])
 | 
			
		||||
@@ -86,7 +86,7 @@ def test_variable_gain_nf(gain, nf_expected, setup_edfa_variable_gain, si):
 | 
			
		||||
    si.nli /= db2lin(gain)
 | 
			
		||||
    si.ase /= db2lin(gain)
 | 
			
		||||
    edfa.operational.gain_target = gain
 | 
			
		||||
    si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
 | 
			
		||||
    edfa.effective_gain = gain
 | 
			
		||||
    edfa.interpol_params(si)
 | 
			
		||||
    result = edfa.nf
 | 
			
		||||
    assert pytest.approx(nf_expected, abs=0.01) == result[0]
 | 
			
		||||
@@ -100,7 +100,7 @@ def test_fixed_gain_nf(gain, nf_expected, setup_edfa_fixed_gain, si):
 | 
			
		||||
    si.nli /= db2lin(gain)
 | 
			
		||||
    si.ase /= db2lin(gain)
 | 
			
		||||
    edfa.operational.gain_target = gain
 | 
			
		||||
    si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
 | 
			
		||||
    edfa.effective_gain = gain
 | 
			
		||||
    edfa.interpol_params(si)
 | 
			
		||||
    assert pytest.approx(nf_expected, abs=0.01) == edfa.nf[0]
 | 
			
		||||
 | 
			
		||||
@@ -124,8 +124,8 @@ def test_compare_nf_models(gain, setup_edfa_variable_gain, si):
 | 
			
		||||
    si.nli /= db2lin(gain)
 | 
			
		||||
    si.ase /= db2lin(gain)
 | 
			
		||||
    edfa.operational.gain_target = gain
 | 
			
		||||
    edfa.effective_gain = gain
 | 
			
		||||
    # edfa is variable gain type
 | 
			
		||||
    si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
 | 
			
		||||
    edfa.interpol_params(si)
 | 
			
		||||
    nf_model = edfa.nf[0]
 | 
			
		||||
 | 
			
		||||
@@ -180,7 +180,6 @@ def test_ase_noise(gain, si, setup_trx, bw):
 | 
			
		||||
    si = span(si)
 | 
			
		||||
    print(span)
 | 
			
		||||
 | 
			
		||||
    si.pref = si.pref._replace(p_span0=0, p_spani=-gain)
 | 
			
		||||
    edfa.interpol_params(si)
 | 
			
		||||
    nf = edfa.nf
 | 
			
		||||
    print('nf', nf)
 | 
			
		||||
@@ -196,3 +195,313 @@ def test_ase_noise(gain, si, setup_trx, bw):
 | 
			
		||||
    si = trx(si)
 | 
			
		||||
    osnr = trx.osnr_ase_01nm[0]
 | 
			
		||||
    assert pytest.approx(osnr_expected, abs=0.01) == osnr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('delta_p', [0, None, 2])
 | 
			
		||||
@pytest.mark.parametrize('tilt_target', [0, -4])
 | 
			
		||||
def test_amp_behaviour(tilt_target, delta_p):
 | 
			
		||||
    """Check that amp correctly applies saturation, when there is tilt
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [{
 | 
			
		||||
            "uid": "Edfa1",
 | 
			
		||||
            "type": "Edfa",
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "operational": {
 | 
			
		||||
                "delta_p": delta_p,
 | 
			
		||||
                "gain_target": 20 + delta_p if delta_p else 20,
 | 
			
		||||
                "tilt_target": tilt_target,
 | 
			
		||||
                "out_voa": 0
 | 
			
		||||
            }
 | 
			
		||||
        }, {
 | 
			
		||||
            "uid": "Span1",
 | 
			
		||||
            "type": "Fiber",
 | 
			
		||||
            "type_variety": "SSMF",
 | 
			
		||||
            "params": {
 | 
			
		||||
                "length": 100,
 | 
			
		||||
                "loss_coef": 0.2,
 | 
			
		||||
                "length_units": "km"
 | 
			
		||||
            }
 | 
			
		||||
        }],
 | 
			
		||||
        "connections": []
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(eqpt_library)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    edfa = [n for n in network.nodes() if isinstance(n, Edfa)][0]
 | 
			
		||||
    fiber = [n for n in network.nodes() if isinstance(n, Fiber)][0]
 | 
			
		||||
    fiber.params.con_in = 0
 | 
			
		||||
    fiber.params.con_out = 0
 | 
			
		||||
    fiber.ref_pch_in_dbm = 0.0
 | 
			
		||||
    si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9,
 | 
			
		||||
                                           spacing=75e9, tx_osnr=None, tx_power=1e-3)
 | 
			
		||||
    si = fiber(si)
 | 
			
		||||
    total_sig_powerin = sum(si.signal)
 | 
			
		||||
    sig_in = lin2db(si.signal)
 | 
			
		||||
    si = edfa(si)
 | 
			
		||||
    sig_out = lin2db(si.signal)
 | 
			
		||||
    total_sig_powerout = sum(si.signal)
 | 
			
		||||
    gain = lin2db(total_sig_powerout / total_sig_powerin)
 | 
			
		||||
    expected_total_power_out = total_sig_powerin * 100 * db2lin(delta_p) if delta_p else total_sig_powerin * 100
 | 
			
		||||
    assert pytest.approx(total_sig_powerout, abs=1e-6) == min(expected_total_power_out, dbm2watt(21))
 | 
			
		||||
    assert pytest.approx(edfa.effective_gain, 1e-5) == gain
 | 
			
		||||
    assert watt2dbm(sum(si.signal + si.nli + si.ase)) <= 21.01
 | 
			
		||||
    # If there is no tilt on the amp: the gain is identical for all carriers
 | 
			
		||||
    if tilt_target == 0:
 | 
			
		||||
        assert_allclose(sig_in + gain, sig_out, rtol=1e-13)
 | 
			
		||||
    else:
 | 
			
		||||
        if delta_p != 2:
 | 
			
		||||
            expected_sig_out = [
 | 
			
		||||
                -31.95025022, -31.88168886, -31.81178634, -31.73838831, -31.66318631,
 | 
			
		||||
                -31.58762141, -31.51156294, -31.43760161, -31.38124626, -31.34245197,
 | 
			
		||||
                -31.30629475, -31.26970711, -31.22566555, -31.17412914, -31.11806869,
 | 
			
		||||
                -31.05122228, -30.97358131, -30.90658619, -30.86616148, -30.83854197,
 | 
			
		||||
                -30.81115028, -30.78403337, -30.7570206, -30.73002834, -30.70088634,
 | 
			
		||||
                -30.66844432, -30.63427939, -30.59364514, -30.54659009, -30.49180643,
 | 
			
		||||
                -30.41406352, -30.31434813, -30.22984104, -30.18249387, -30.1516453,
 | 
			
		||||
                -30.12082034, -30.08970494, -30.05779424, -30.02543415, -29.99309889,
 | 
			
		||||
                -29.96078803, -29.92798594, -29.89002127, -29.84689015, -29.79726968,
 | 
			
		||||
                -29.72927112, -29.64485972, -29.55578693, -29.45569694, -29.35111795,
 | 
			
		||||
                -29.24662471, -29.12148491, -28.94244964, -28.73421833, -28.53930479,
 | 
			
		||||
                -28.36231261, -28.19361236, -28.04376778, -27.91280403, -27.79433658,
 | 
			
		||||
                -27.7065072, -27.64495288, -27.59798975]
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            expected_sig_out = [
 | 
			
		||||
                -29.95025022, -29.88168886, -29.81178634, -29.73838831, -29.66318631,
 | 
			
		||||
                -29.58762141, -29.51156294, -29.43760161, -29.38124626, -29.34245197,
 | 
			
		||||
                -29.30629475, -29.26970711, -29.22566555, -29.17412914, -29.11806869,
 | 
			
		||||
                -29.05122228, -28.97358131, -28.90658619, -28.86616148, -28.83854197,
 | 
			
		||||
                -28.81115028, -28.78403337, -28.7570206, -28.73002834, -28.70088634,
 | 
			
		||||
                -28.66844432, -28.63427939, -28.59364514, -28.54659009, -28.49180643,
 | 
			
		||||
                -28.41406352, -28.31434813, -28.22984104, -28.18249387, -28.1516453,
 | 
			
		||||
                -28.12082034, -28.08970494, -28.05779424, -28.02543415, -27.99309889,
 | 
			
		||||
                -27.96078803, -27.92798594, -27.89002127, -27.84689015, -27.79726968,
 | 
			
		||||
                -27.72927112, -27.64485972, -27.55578693, -27.45569694, -27.35111795,
 | 
			
		||||
                -27.24662471, -27.12148491, -26.94244964, -26.73421833, -26.53930479,
 | 
			
		||||
                -26.36231261, -26.19361236, -26.04376778, -25.91280403, -25.79433658,
 | 
			
		||||
                -25.7065072, -25.64495288, -25.59798975]
 | 
			
		||||
 | 
			
		||||
        print(sig_out)
 | 
			
		||||
        assert_allclose(sig_out, expected_sig_out, rtol=1e-9)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('delta_p', [0, None, 20])
 | 
			
		||||
@pytest.mark.parametrize('base_power', [0, 20])
 | 
			
		||||
@pytest.mark.parametrize('delta_pdb_per_channel',
 | 
			
		||||
                         [[0, 1, 3, 0.5, -2],
 | 
			
		||||
                          [0, 0, 0, 0, 0],
 | 
			
		||||
                          [-2, -2, -2, -2, -2],
 | 
			
		||||
                          [0, 2, -2, -5, 4],
 | 
			
		||||
                          [0, 1, 3, 0.5, -2], ])
 | 
			
		||||
def test_amp_saturation(delta_pdb_per_channel, base_power, delta_p):
 | 
			
		||||
    """Check that amp correctly applies saturation
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [{
 | 
			
		||||
            "uid": "Edfa1",
 | 
			
		||||
            "type": "Edfa",
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "operational": {
 | 
			
		||||
                "delta_p": delta_p,
 | 
			
		||||
                "gain_target": 20,
 | 
			
		||||
                "tilt_target": 0,
 | 
			
		||||
                "out_voa": 0
 | 
			
		||||
            }
 | 
			
		||||
        }],
 | 
			
		||||
        "connections": []
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(eqpt_library)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    edfa = [n for n in network.nodes()][0]
 | 
			
		||||
    frequency = 193e12 + array([0, 50e9, 150e9, 225e9, 275e9])
 | 
			
		||||
    slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
 | 
			
		||||
    baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
 | 
			
		||||
    signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]) + array(delta_pdb_per_channel) + base_power)
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                               signal=signal, baud_rate=baud_rate, roll_off=0.15,
 | 
			
		||||
                                               delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                               tx_osnr=None, tx_power=None)
 | 
			
		||||
    total_sig_powerin = sum(si.signal)
 | 
			
		||||
    sig_in = lin2db(si.signal)
 | 
			
		||||
    si = edfa(si)
 | 
			
		||||
    sig_out = lin2db(si.signal)
 | 
			
		||||
    total_sig_powerout = sum(si.signal)
 | 
			
		||||
    gain = lin2db(total_sig_powerout / total_sig_powerin)
 | 
			
		||||
    assert watt2dbm(sum(si.signal + si.nli + si.ase)) <= 21.02
 | 
			
		||||
    assert pytest.approx(edfa.effective_gain, 1e-13) == gain
 | 
			
		||||
    assert_allclose(sig_in + gain, sig_out, rtol=1e-13)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_set_out_voa():
 | 
			
		||||
    """Check that out_voa is correctly set if out_voa_auto is true
 | 
			
		||||
    gain is maximized to obtain better NF:
 | 
			
		||||
    if optimum input power in next span is -3 + pref_ch_db then total power at optimum is 19 -3 = 16dBm.
 | 
			
		||||
    since amp has 21 dBm p_max, power out of amp can be set to 21dBm increasing out_voa by 5 to keep
 | 
			
		||||
    same input power in the fiber. Since the optimisation contains a hard coded margin of 1 to account for
 | 
			
		||||
    possible degradation on max power, the expected voa value is 4, and delta_p and gain are corrected
 | 
			
		||||
    accordingly.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [{
 | 
			
		||||
            "uid": "Edfa1",
 | 
			
		||||
            "type": "Edfa",
 | 
			
		||||
            "type_variety": "test",
 | 
			
		||||
            "operational": {
 | 
			
		||||
                "delta_p": -3,
 | 
			
		||||
                "gain_target": 20,
 | 
			
		||||
                "tilt_target": 0
 | 
			
		||||
            }
 | 
			
		||||
        }],
 | 
			
		||||
        "connections": []
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(eqpt_library)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    amp = [n for n in network.nodes()][0]
 | 
			
		||||
    print(amp.out_voa)
 | 
			
		||||
    power_target = 19 + amp.delta_p
 | 
			
		||||
    power_mode = True
 | 
			
		||||
    amp.params.out_voa_auto = True
 | 
			
		||||
    set_amplifier_voa(amp, power_target, power_mode)
 | 
			
		||||
    assert amp.out_voa == 4.0
 | 
			
		||||
    assert amp.effective_gain == 20.0 + 4.0
 | 
			
		||||
    assert amp.delta_p == -3.0 + 4.0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_multiband():
 | 
			
		||||
 | 
			
		||||
    equipment_json = load_json(eqpt_library)
 | 
			
		||||
    # add some multiband amplifiers
 | 
			
		||||
    amps = [
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_C",
 | 
			
		||||
            "f_min": 191.25e12,
 | 
			
		||||
            "f_max": 196.15e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": False,
 | 
			
		||||
            "allowed_for_design": True},
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_L",
 | 
			
		||||
            "f_min": 186.55e12,
 | 
			
		||||
            "f_max": 190.05e12,
 | 
			
		||||
            "type_def": "variable_gain",
 | 
			
		||||
            "gain_flatmax": 26,
 | 
			
		||||
            "gain_min": 15,
 | 
			
		||||
            "p_max": 21,
 | 
			
		||||
            "nf_min": 6,
 | 
			
		||||
            "nf_max": 10,
 | 
			
		||||
            "out_voa_auto": False,
 | 
			
		||||
            "allowed_for_design": True},
 | 
			
		||||
        {
 | 
			
		||||
            "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
            "type_def": "multi_band",
 | 
			
		||||
            "amplifiers": [
 | 
			
		||||
                "std_medium_gain_C",
 | 
			
		||||
                "std_medium_gain_L"
 | 
			
		||||
            ],
 | 
			
		||||
            "allowed_for_design": False
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
    equipment_json['Edfa'].extend(amps)
 | 
			
		||||
 | 
			
		||||
    equipment = _equipment_from_json(equipment_json, eqpt_library)
 | 
			
		||||
 | 
			
		||||
    el_config = {
 | 
			
		||||
        "uid": "Edfa1",
 | 
			
		||||
        "type": "Multiband_amplifier",
 | 
			
		||||
        "type_variety": "std_medium_gain_multiband",
 | 
			
		||||
        "amplifiers": [
 | 
			
		||||
            {
 | 
			
		||||
                "type_variety": "std_medium_gain_C",
 | 
			
		||||
                "operational": {
 | 
			
		||||
                    "gain_target": 22.55,
 | 
			
		||||
                    "delta_p": 0.9,
 | 
			
		||||
                    "out_voa": 3.0,
 | 
			
		||||
                    "tilt_target": 0.0,
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "type_variety": "std_medium_gain_L",
 | 
			
		||||
                "operational": {
 | 
			
		||||
                    "gain_target": 21,
 | 
			
		||||
                    "delta_p": 3.0,
 | 
			
		||||
                    "out_voa": 3.0,
 | 
			
		||||
                    "tilt_target": 0.0,
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
    fused_config = {
 | 
			
		||||
        "uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300",
 | 
			
		||||
        "type": "Fused",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "loss": 20
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [
 | 
			
		||||
            el_config,
 | 
			
		||||
            fused_config
 | 
			
		||||
        ],
 | 
			
		||||
        "connections": []
 | 
			
		||||
    }
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    amp = next(n for n in network.nodes() if n.uid == 'Edfa1')
 | 
			
		||||
    fused = next(n for n in network.nodes() if n.uid == '[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300')
 | 
			
		||||
    si = create_input_spectral_information(f_min=186e12, f_max=196e12, roll_off=0.15, baud_rate=32e9, tx_power=1e-3,
 | 
			
		||||
                                           spacing=50e9, tx_osnr=40.0)
 | 
			
		||||
    assert si.number_of_channels == 200
 | 
			
		||||
    si = fused(si)
 | 
			
		||||
    si = amp(si)
 | 
			
		||||
    # assert nb of channel after mux/demux
 | 
			
		||||
    assert si.number_of_channels == 164    # computed based on amp bands
 | 
			
		||||
    # Check that multiband amp is correctly created with correct __str__
 | 
			
		||||
    actual_c_amp = amp.amplifiers["CBAND"].__str__()
 | 
			
		||||
    expected_c_amp = '\n'.join([
 | 
			
		||||
        'Edfa Edfa1',
 | 
			
		||||
        '  type_variety:           std_medium_gain_C',
 | 
			
		||||
        '  effective gain(dB):     21.22',
 | 
			
		||||
        '  (before att_in and before output VOA)',
 | 
			
		||||
        '  tilt-target(dB)         0.00',
 | 
			
		||||
        '  noise figure (dB):      6.32',
 | 
			
		||||
        '  (including att_in)',
 | 
			
		||||
        '  pad att_in (dB):        0.00',
 | 
			
		||||
        '  Power In (dBm):         -0.22',
 | 
			
		||||
        '  Power Out (dBm):        21.01',
 | 
			
		||||
        '  Delta_P (dB):           0.90',
 | 
			
		||||
        '  target pch (dBm):       None',
 | 
			
		||||
        '  actual pch out (dBm):   -1.77',
 | 
			
		||||
        '  output VOA (dB):        3.00'])
 | 
			
		||||
    assert actual_c_amp == expected_c_amp
 | 
			
		||||
    actual_l_amp = amp.amplifiers["LBAND"].__str__()
 | 
			
		||||
    expected_l_amp = '\n'.join([
 | 
			
		||||
        'Edfa Edfa1',
 | 
			
		||||
        '  type_variety:           std_medium_gain_L',
 | 
			
		||||
        '  effective gain(dB):     21.00',
 | 
			
		||||
        '  (before att_in and before output VOA)',
 | 
			
		||||
        '  tilt-target(dB)         0.00',
 | 
			
		||||
        '  noise figure (dB):      6.36',
 | 
			
		||||
        '  (including att_in)',
 | 
			
		||||
        '  pad att_in (dB):        0.00',
 | 
			
		||||
        '  Power In (dBm):         -1.61',
 | 
			
		||||
        '  Power Out (dBm):        19.40',
 | 
			
		||||
        '  Delta_P (dB):           3.00',
 | 
			
		||||
        '  target pch (dBm):       None',
 | 
			
		||||
        '  actual pch out (dBm):   -1.99',
 | 
			
		||||
        '  output VOA (dB):        3.00'])
 | 
			
		||||
    assert actual_l_amp == expected_l_amp
 | 
			
		||||
 | 
			
		||||
    # check that f_min, f_max of si are within amp band
 | 
			
		||||
    assert amp.amplifiers["LBAND"].params.f_min == 186.55e12
 | 
			
		||||
    assert si.frequency[0] >= amp.amplifiers["LBAND"].params.f_min
 | 
			
		||||
    assert amp.amplifiers["CBAND"].params.f_max == 196.15e12
 | 
			
		||||
    assert si.frequency[-1] <= amp.amplifiers["CBAND"].params.f_max
 | 
			
		||||
    for freq in si.frequency:
 | 
			
		||||
        if freq > 190.05e12:
 | 
			
		||||
            assert freq >= 191.25e12
 | 
			
		||||
        if freq < 191.25e12:
 | 
			
		||||
            assert freq <= 190.25e12
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,17 @@ checks that empty info on mode, power, nbchannel in service file are supported
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from logging import INFO
 | 
			
		||||
from numpy.testing import assert_allclose
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.core.utils import automatic_nch, lin2db
 | 
			
		||||
from gnpy.core.utils import automatic_nch, lin2db, watt2dbm
 | 
			
		||||
from gnpy.core.elements import Roadm
 | 
			
		||||
from gnpy.topology.request import compute_path_dsjctn, propagate, propagate_and_optimize_mode, correct_json_route_list
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests, load_json, \
 | 
			
		||||
    _equipment_from_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
network_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
 | 
			
		||||
service_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
 | 
			
		||||
@@ -30,7 +35,9 @@ eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
 | 
			
		||||
@pytest.mark.parametrize("net", [network_file_name])
 | 
			
		||||
@pytest.mark.parametrize("eqpt", [eqpt_library_name])
 | 
			
		||||
@pytest.mark.parametrize("serv", [service_file_name])
 | 
			
		||||
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2', 'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1', 'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
 | 
			
		||||
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2',
 | 
			
		||||
                                            'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1',
 | 
			
		||||
                                            'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
 | 
			
		||||
def test_automaticmodefeature(net, eqpt, serv, expected_mode):
 | 
			
		||||
    equipment = load_equipment(eqpt)
 | 
			
		||||
    network = load_network(net, equipment)
 | 
			
		||||
@@ -83,3 +90,89 @@ def test_automaticmodefeature(net, eqpt, serv, expected_mode):
 | 
			
		||||
                path_res_list.append('nok')
 | 
			
		||||
    print(path_res_list)
 | 
			
		||||
    assert path_res_list == expected_mode
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_propagate_and_optimize_mode(caplog):
 | 
			
		||||
    """Checks that the automatic mode returns the last explored mode
 | 
			
		||||
 | 
			
		||||
    Mode are explored with descending baud_rate order and descending bitrate, so the last explored mode must be mode 1
 | 
			
		||||
    Mode 1 GSNR is OK but pdl penalty are not OK due to high ROADM PDL. so the last explored mode is not OK
 | 
			
		||||
    Then the propagate_and_optimize_mode must return mode 1 and the blocking reason must be 'NO_FEASIBLE_MODE'
 | 
			
		||||
    """
 | 
			
		||||
    caplog.set_level(INFO)
 | 
			
		||||
    json_data = load_json(eqpt_library_name)
 | 
			
		||||
    voyager = next(e for e in json_data['Transceiver'] if e['type_variety'] == 'Voyager')
 | 
			
		||||
    # expected path min GSNR is 22.11
 | 
			
		||||
    # Change Voyager modes so that:
 | 
			
		||||
    # - highest baud rate has min OSNR > path GSNR
 | 
			
		||||
    # - lower baudrate with highest bitrate has min OSNR > path GSNR
 | 
			
		||||
    # - lower baudrate with lower bitrate has has min OSNR < path GSNR but PDL penalty is infinite
 | 
			
		||||
    voyager['mode'] = [
 | 
			
		||||
        {
 | 
			
		||||
            "format": "mode 1",
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "OSNR": 12,
 | 
			
		||||
            "bit_rate": 100e9,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 45,
 | 
			
		||||
            "min_spacing": 50e9,
 | 
			
		||||
            "penalties": [
 | 
			
		||||
                {
 | 
			
		||||
                    "chromatic_dispersion": 4e3,
 | 
			
		||||
                    "penalty_value": 0
 | 
			
		||||
                }, {
 | 
			
		||||
                    "chromatic_dispersion": 40e3,
 | 
			
		||||
                    "penalty_value": 0
 | 
			
		||||
                }, {
 | 
			
		||||
                    "pdl": 0.5,
 | 
			
		||||
                    "penalty_value": 1
 | 
			
		||||
                }, {
 | 
			
		||||
                    "pmd": 30,
 | 
			
		||||
                    "penalty_value": 0
 | 
			
		||||
                }],
 | 
			
		||||
            "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "format": "mode 3",
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "OSNR": 30,
 | 
			
		||||
            "bit_rate": 300e9,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 45,
 | 
			
		||||
            "min_spacing": 50e9,
 | 
			
		||||
            "cost": 1
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "format": "mode 2",
 | 
			
		||||
            "baud_rate": 66e9,
 | 
			
		||||
            "OSNR": 25,
 | 
			
		||||
            "bit_rate": 400e9,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 45,
 | 
			
		||||
            "min_spacing": 75e9,
 | 
			
		||||
            "cost": 1
 | 
			
		||||
        }]
 | 
			
		||||
    # change default ROADM PDL so that crossing 2 ROADMs leasd to inifinte penalty for mode 1
 | 
			
		||||
    eqpt_roadm = next(r for r in json_data['Roadm'] if 'type_variety' not in r)
 | 
			
		||||
    eqpt_roadm['pdl'] = 0.5
 | 
			
		||||
    equipment = _equipment_from_json(json_data, eqpt_library_name)
 | 
			
		||||
    network = load_network(network_file_name, equipment)
 | 
			
		||||
    data = load_requests(filename=Path(__file__).parent.parent / 'tests/data/testTopology_services_expected.json',
 | 
			
		||||
                         eqpt=eqpt_library_name, bidir=False, network=network, network_filename=network_file_name)
 | 
			
		||||
    # remove the mode from request, change it to larger spacing
 | 
			
		||||
    data['path-request'][1]['path-constraints']['te-bandwidth']['trx_mode'] = None
 | 
			
		||||
    data['path-request'][1]['path-constraints']['te-bandwidth']['spacing'] = 75e9
 | 
			
		||||
    assert_allclose(watt2dbm(data['path-request'][1]['path-constraints']['te-bandwidth']['output-power']), 1, rtol=1e-9)
 | 
			
		||||
    # use the request power for design, or there will be inconsistencies with the gain
 | 
			
		||||
    build_network(network, equipment, 1, 21)
 | 
			
		||||
 | 
			
		||||
    rqs = requests_from_json(data, equipment)
 | 
			
		||||
    rqs = correct_json_route_list(network, rqs)
 | 
			
		||||
    [path] = compute_path_dsjctn(network, equipment, [rqs[1]], [])
 | 
			
		||||
    total_path, mode = propagate_and_optimize_mode(path, rqs[1], equipment)
 | 
			
		||||
    assert round(min(path[-1].snr_01nm), 2) == 22.22
 | 
			
		||||
    assert mode['format'] == 'mode 1'
 | 
			
		||||
    assert rqs[1].blocking_reason == 'NO_FEASIBLE_MODE'
 | 
			
		||||
    expected_mesg = '\tWarning! Request 1: no mode satisfies path SNR requirement.'
 | 
			
		||||
    # Last log records mustcontain the message about the las explored mode
 | 
			
		||||
    assert expected_mesg in caplog.records[-1].message
 | 
			
		||||
 
 | 
			
		||||
@@ -119,8 +119,9 @@ def create_rq(equipment, srce, dest, bdir, node_list, loose_list, rqid='test_req
 | 
			
		||||
        'nodes_list': node_list,
 | 
			
		||||
        'loose_list': loose_list,
 | 
			
		||||
        'path_bandwidth': 100.0e9,
 | 
			
		||||
        'power': 1.0,
 | 
			
		||||
        'effective_freq_slot': None,
 | 
			
		||||
        'power': 1.0e-3,
 | 
			
		||||
        'tx_power': 1.0e-3,
 | 
			
		||||
        'effective_freq_slot': None
 | 
			
		||||
    }
 | 
			
		||||
    params['format'] = params['trx_mode']
 | 
			
		||||
    trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
			
		||||
@@ -258,7 +259,8 @@ def request_set():
 | 
			
		||||
        'f_min': 191.1e12,
 | 
			
		||||
        'f_max': 196.3e12,
 | 
			
		||||
        'nb_channel': None,
 | 
			
		||||
        'power': 0,
 | 
			
		||||
        'power': 1e-3,
 | 
			
		||||
        'tx_power': 1e-3,
 | 
			
		||||
        'path_bandwidth': 200e9}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,13 +17,14 @@ from copy import deepcopy
 | 
			
		||||
from gnpy.core.utils import lin2db, automatic_nch, dbm2watt, power_dbm_to_psd_mw_ghz, watt2dbm, psd2powerdbm
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.core.elements import Roadm
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, Pref, create_arbitrary_spectral_information, \
 | 
			
		||||
    ReferenceCarrier
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, ReferenceCarrier, \
 | 
			
		||||
    carriers_to_spectral_information
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.core.exceptions import ConfigurationError
 | 
			
		||||
from gnpy.tools.json_io import network_from_json, load_equipment, load_network, _spectrum_from_json, load_json, \
 | 
			
		||||
    Transceiver, requests_from_json
 | 
			
		||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate, propagate_and_optimize_mode
 | 
			
		||||
from gnpy.topology.spectrum_assignment import build_oms_list
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
@@ -55,6 +56,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
 | 
			
		||||
 | 
			
		||||
    roadm_config = {
 | 
			
		||||
        "uid": "roadm Lannion_CAS",
 | 
			
		||||
        "type_variety": "default",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "per_degree_pch_out_db": {
 | 
			
		||||
                "east edfa in Lannion_CAS to Corlay": -16
 | 
			
		||||
@@ -69,23 +71,27 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
            },
 | 
			
		||||
            "roadm-path-impairments": [],
 | 
			
		||||
            "design_bands": None
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    roadm = Roadm(**roadm_config)
 | 
			
		||||
    roadm.set_roadm_paths(from_degree='tata', to_degree=degree, path_type='express')
 | 
			
		||||
    roadm.ref_pch_in_dbm['tata'] = 0
 | 
			
		||||
    roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
 | 
			
		||||
    slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9])
 | 
			
		||||
    baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
 | 
			
		||||
    signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
 | 
			
		||||
    ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    pref = Pref(p_span0=0, p_spani=0, ref_carrier=ref_carrier)
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                               signal=signal, baud_rate=baud_rate, roll_off=0.15,
 | 
			
		||||
                                               delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                               tx_osnr=None, ref_power=pref)
 | 
			
		||||
                                               tx_osnr=None)
 | 
			
		||||
    to_json_before_propagation = {
 | 
			
		||||
        'uid': 'roadm Lannion_CAS',
 | 
			
		||||
        'type': 'Roadm',
 | 
			
		||||
        "type_variety": "default",
 | 
			
		||||
        'params': {
 | 
			
		||||
            equalization_type: target,
 | 
			
		||||
            'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []},
 | 
			
		||||
@@ -98,7 +104,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
 | 
			
		||||
        'metadata': {'location': {'latitude': 0, 'longitude': 0, 'city': None, 'region': None}}
 | 
			
		||||
    }
 | 
			
		||||
    assert roadm.to_json == to_json_before_propagation
 | 
			
		||||
    si = roadm(si, degree)
 | 
			
		||||
    si = roadm(si, degree=degree, from_degree='tata')
 | 
			
		||||
    assert roadm.ref_pch_out_dbm == pytest.approx(expected_pch_out_dbm, rel=1e-4)
 | 
			
		||||
    assert_allclose(expected_si, roadm.get_per_degree_power(degree, spectral_info=si), rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
@@ -119,7 +125,8 @@ def test_wrong_element_config(equalization_type):
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
            },
 | 
			
		||||
            "design_bands": None
 | 
			
		||||
        },
 | 
			
		||||
        "metadata": {
 | 
			
		||||
            "location": {
 | 
			
		||||
@@ -215,12 +222,10 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
    baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
 | 
			
		||||
    signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
 | 
			
		||||
    target = target_out + array(delta_pdb_per_channel)
 | 
			
		||||
    ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    pref = Pref(p_span0=0, p_spani=-20, ref_carrier=ref_carrier)
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                               signal=signal, baud_rate=baud_rate, roll_off=0.15,
 | 
			
		||||
                                               delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                               tx_osnr=None, ref_power=pref)
 | 
			
		||||
                                               tx_osnr=None)
 | 
			
		||||
    roadm_config = {
 | 
			
		||||
        "uid": "roadm Brest_KLA",
 | 
			
		||||
        "params": {
 | 
			
		||||
@@ -232,7 +237,9 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
            },
 | 
			
		||||
            "roadm-path-impairments": [],
 | 
			
		||||
            "design_bands": None
 | 
			
		||||
        },
 | 
			
		||||
        "metadata": {
 | 
			
		||||
            "location": {
 | 
			
		||||
@@ -244,7 +251,10 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    roadm = Roadm(**roadm_config)
 | 
			
		||||
    si = roadm(si, 'toto')
 | 
			
		||||
    roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
 | 
			
		||||
    roadm.ref_pch_in_dbm['tata'] = 0
 | 
			
		||||
    roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    si = roadm(si, degree='toto', from_degree='tata')
 | 
			
		||||
    assert_allclose(watt2dbm(si.signal), target - correction, rtol=1e-5)
 | 
			
		||||
    # in other words check that if target is below input power, target is applied else power is unchanged
 | 
			
		||||
    assert_allclose((watt2dbm(signal) >= target) * target + (watt2dbm(signal) < target) * watt2dbm(signal),
 | 
			
		||||
@@ -267,12 +277,10 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
    baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
 | 
			
		||||
    signal = dbm2watt(array([-20.0, -18.0, -22.0, -25.0, -16.0]))
 | 
			
		||||
    target = psd2powerdbm(target_out, baud_rate) + array(delta_pdb_per_channel)
 | 
			
		||||
    ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    pref = Pref(p_span0=0, p_spani=-20, ref_carrier=ref_carrier)
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                               signal=signal, baud_rate=baud_rate, roll_off=0.15,
 | 
			
		||||
                                               delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                               tx_osnr=None, ref_power=pref)
 | 
			
		||||
                                               tx_osnr=None)
 | 
			
		||||
    roadm_config = {
 | 
			
		||||
        "uid": "roadm Brest_KLA",
 | 
			
		||||
        "params": {
 | 
			
		||||
@@ -284,7 +292,9 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
            },
 | 
			
		||||
            "roadm-path-impairments": [],
 | 
			
		||||
            "design_bands": None
 | 
			
		||||
        },
 | 
			
		||||
        "metadata": {
 | 
			
		||||
            "location": {
 | 
			
		||||
@@ -296,15 +306,18 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    roadm = Roadm(**roadm_config)
 | 
			
		||||
    si = roadm(si, 'toto')
 | 
			
		||||
    roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
 | 
			
		||||
    roadm.ref_pch_in_dbm['tata'] = 0
 | 
			
		||||
    roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    si = roadm(si, degree='toto', from_degree='tata')
 | 
			
		||||
    assert_allclose(watt2dbm(si.signal), target - correction, rtol=1e-5)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def net_setup(equipment):
 | 
			
		||||
def net_setup(equipment, deltap=0):
 | 
			
		||||
    """common setup for tests: builds network, equipment and oms only once"""
 | 
			
		||||
    network = load_network(NETWORK_FILENAME, equipment)
 | 
			
		||||
    spectrum = equipment['SI']['default']
 | 
			
		||||
    p_db = spectrum.power_dbm
 | 
			
		||||
    p_db = spectrum.power_dbm + deltap
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(spectrum.f_min, spectrum.f_max, spectrum.spacing))
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    return network
 | 
			
		||||
@@ -323,10 +336,11 @@ def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, m
 | 
			
		||||
              'nodes_list': nodes_list,
 | 
			
		||||
              'loose_list': loose_list,
 | 
			
		||||
              'path_bandwidth': 100.0e9,
 | 
			
		||||
              'effective_freq_slot': None}
 | 
			
		||||
              'effective_freq_slot': None,
 | 
			
		||||
              'power': 1e-3,
 | 
			
		||||
              'tx_power': 1e-3}
 | 
			
		||||
    trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
    params['power'] = dbm2watt(power_dbm) if power_dbm else dbm2watt(equipment['SI']['default'].power_dbm)
 | 
			
		||||
    f_min = params['f_min']
 | 
			
		||||
    f_max_from_si = params['f_max']
 | 
			
		||||
    params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
			
		||||
@@ -361,9 +375,9 @@ def test_initial_spectrum(mode, slot_width, power_dbm):
 | 
			
		||||
    assert_array_equal(infos_expected.frequency, infos_actual.frequency)
 | 
			
		||||
    assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
 | 
			
		||||
    assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
 | 
			
		||||
    assert_array_equal(infos_expected.signal, infos_actual.signal)
 | 
			
		||||
    assert_array_equal(infos_expected.nli, infos_actual.nli)
 | 
			
		||||
    assert_array_equal(infos_expected.ase, infos_actual.ase)
 | 
			
		||||
    assert_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
 | 
			
		||||
    assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
 | 
			
		||||
    assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
 | 
			
		||||
    assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
 | 
			
		||||
    assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
 | 
			
		||||
    assert_array_equal(infos_expected.pmd, infos_actual.pmd)
 | 
			
		||||
@@ -447,14 +461,14 @@ def ref_network():
 | 
			
		||||
    return network
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('deltap', [0, +1.2, -0.5])
 | 
			
		||||
@pytest.mark.parametrize('deltap', [0, +1.18, -0.5])
 | 
			
		||||
def test_target_psd_out_mwperghz_deltap(deltap):
 | 
			
		||||
    """checks that if target_psd_out_mWperGHz is defined, delta_p of amps is correctly updated
 | 
			
		||||
 | 
			
		||||
    Power over 1.2dBm saturate amp with this test: TODO add a test on this saturation
 | 
			
		||||
    Power over 1.18dBm saturate amp with this test: TODO add a test on this saturation
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_FILENAME)
 | 
			
		||||
    network = net_setup(equipment)
 | 
			
		||||
    network = net_setup(equipment, deltap)
 | 
			
		||||
    req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
 | 
			
		||||
                             'mode 1', 50e9, deltap)
 | 
			
		||||
    temp = [{
 | 
			
		||||
@@ -508,7 +522,6 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
 | 
			
		||||
    # boosters = ['east edfa in Brest_KLA to Quimper', 'east edfa in Lorient_KMA to Loudeac',
 | 
			
		||||
    #             'east edfa in Lannion_CAS to Stbrieuc']
 | 
			
		||||
    target_psd = power_dbm_to_psd_mw_ghz(target, 32e9)
 | 
			
		||||
    ref = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
 | 
			
		||||
    if case == 'SI':
 | 
			
		||||
        delattr(equipment['Roadm']['default'], 'target_pch_out_db')
 | 
			
		||||
        setattr(equipment['Roadm']['default'], equalization, target_psd)
 | 
			
		||||
@@ -533,11 +546,11 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
 | 
			
		||||
            assert getattr(roadm, equalization) == target_psd
 | 
			
		||||
    path = compute_constrained_path(network, req)
 | 
			
		||||
    si = create_input_spectral_information(
 | 
			
		||||
        f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate, power=req.power,
 | 
			
		||||
        spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref)
 | 
			
		||||
        f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate,
 | 
			
		||||
        spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.power)
 | 
			
		||||
    for i, el in enumerate(path):
 | 
			
		||||
        if isinstance(el, Roadm):
 | 
			
		||||
            si = el(si, degree=path[i + 1].uid)
 | 
			
		||||
            si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
 | 
			
		||||
            if case in ['SI', 'nodes', 'degrees']:
 | 
			
		||||
                if equalization == 'target_psd_out_mWperGHz':
 | 
			
		||||
                    assert_allclose(power_dbm_to_psd_mw_ghz(watt2dbm(si.signal + si.ase + si.nli), si.baud_rate),
 | 
			
		||||
@@ -577,9 +590,9 @@ def test_power_option(req_power):
 | 
			
		||||
    infos_actual = propagate(path2, req, equipment)
 | 
			
		||||
    assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
 | 
			
		||||
    assert_array_equal(infos_expected.slot_width, infos_actual.slot_width)
 | 
			
		||||
    assert_array_equal(infos_expected.signal, infos_actual.signal)
 | 
			
		||||
    assert_array_equal(infos_expected.nli, infos_actual.nli)
 | 
			
		||||
    assert_array_equal(infos_expected.ase, infos_actual.ase)
 | 
			
		||||
    assert_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
 | 
			
		||||
    assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
 | 
			
		||||
    assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
 | 
			
		||||
    assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
 | 
			
		||||
    assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
 | 
			
		||||
    assert_array_equal(infos_expected.pmd, infos_actual.pmd)
 | 
			
		||||
@@ -835,3 +848,103 @@ def test_power_offset_automatic_mode_selection(slot_width, value, equalization,
 | 
			
		||||
    _, mode = propagate_and_optimize_mode(path, free_req, equipment)
 | 
			
		||||
    assert mode['format'] == expected_mode
 | 
			
		||||
    assert_allclose(path_expected[-1].snr_01nm, path[-1].snr_01nm, rtol=1e-5)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('tx_power_dbm', [-10, -8, 0, 10])
 | 
			
		||||
def test_tx_power(tx_power_dbm):
 | 
			
		||||
    """If carrier add power is below equalization target + ROADM add max loss, then equalizatio
 | 
			
		||||
    can not be applied.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = load_json(NETWORK_FILENAME)
 | 
			
		||||
    for el in json_data['elements']:
 | 
			
		||||
        if el['uid'] == 'roadm Lannion_CAS':
 | 
			
		||||
            el['type_variety'] = 'example_detailed_impairments'
 | 
			
		||||
    equipment = load_equipment(EQPT_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    default_spectrum = equipment['SI']['default']
 | 
			
		||||
    p_db = default_spectrum.power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(default_spectrum.f_min, default_spectrum.f_max, default_spectrum.spacing))
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    build_oms_list(network, equipment)
 | 
			
		||||
    expected_roadm_lannion = {
 | 
			
		||||
        "uid": "roadm Lannion_CAS",
 | 
			
		||||
        "type": "Roadm",
 | 
			
		||||
        "type_variety": "example_detailed_impairments",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            },
 | 
			
		||||
           'per_degree_pch_out_db': {'east edfa in Lannion_CAS to Corlay': -20,
 | 
			
		||||
                                     'east edfa in Lannion_CAS to Morlaix': -20,
 | 
			
		||||
                                     'east edfa in Lannion_CAS to Stbrieuc': -20},
 | 
			
		||||
            "target_pch_out_db": -20
 | 
			
		||||
        },
 | 
			
		||||
        'metadata': {
 | 
			
		||||
            'location': {
 | 
			
		||||
                'city': 'Lannion_CAS',
 | 
			
		||||
                'latitude': 2.0,
 | 
			
		||||
                'longitude': 0.0,
 | 
			
		||||
                'region': 'RLD'
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
 | 
			
		||||
    assert roadm.to_json == expected_roadm_lannion
 | 
			
		||||
    spectrum = _spectrum_from_json([
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 191.35e12,
 | 
			
		||||
            "f_max": 191.35e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 193.15e12,
 | 
			
		||||
            "f_max": 193.15e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40,
 | 
			
		||||
            "tx_power_dbm": tx_power_dbm
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "f_min": 193.2e12,
 | 
			
		||||
            "f_max": 193.2e12,
 | 
			
		||||
            "baud_rate": 32e9,
 | 
			
		||||
            "slot_width": 50e9,
 | 
			
		||||
            "power_dbm": 0,
 | 
			
		||||
            "roll_off": 0.15,
 | 
			
		||||
            "tx_osnr": 40}])
 | 
			
		||||
    power = 1.0e-3
 | 
			
		||||
    si = carriers_to_spectral_information(initial_spectrum=spectrum,
 | 
			
		||||
                                          power=power)
 | 
			
		||||
    si = roadm(si, "east edfa in Lannion_CAS to Corlay", "trx Lannion_CAS")
 | 
			
		||||
    # Checks that if tx_power on add port is below min required power, its equalization target can not be met
 | 
			
		||||
    add_max_loss = next(e for e in getattr(equipment['Roadm']['example_detailed_impairments'], 'roadm-path-impairments')
 | 
			
		||||
                        if 'roadm-add-path' in e)['roadm-add-path'][0]['roadm-maxloss']
 | 
			
		||||
    min_required_add_power = -20 + add_max_loss
 | 
			
		||||
    power_reduction = max(0, min_required_add_power - tx_power_dbm)
 | 
			
		||||
    assert_allclose(si.signal, dbm2watt(array([-20, -20 - power_reduction, -20])), rtol=1e-5)
 | 
			
		||||
    path = ['trx Lannion_CAS',
 | 
			
		||||
            'roadm Lannion_CAS',
 | 
			
		||||
            'east edfa in Lannion_CAS to Stbrieuc',
 | 
			
		||||
            'fiber (Lannion_CAS → Stbrieuc)-F056',
 | 
			
		||||
            'east edfa in Stbrieuc to Rennes_STA',
 | 
			
		||||
            'fiber (Stbrieuc → Rennes_STA)-F057',
 | 
			
		||||
            'west edfa in Rennes_STA to Stbrieuc',
 | 
			
		||||
            'roadm Rennes_STA',
 | 
			
		||||
            'trx Rennes_STA']
 | 
			
		||||
 | 
			
		||||
    si = carriers_to_spectral_information(initial_spectrum=spectrum,
 | 
			
		||||
                                          power=power)
 | 
			
		||||
    for i, uid in enumerate(path):
 | 
			
		||||
        node = next(n for n in network.nodes() if n.uid == uid)
 | 
			
		||||
        if isinstance(node, Roadm):
 | 
			
		||||
            si = node(si, path[i + 1], path[i - 1])
 | 
			
		||||
        else:
 | 
			
		||||
            si = node(si)
 | 
			
		||||
    assert_allclose(watt2dbm(si.signal + si.ase + si.nli), array([-20, -20, -20]), rtol=1e-5)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								tests/test_gain_mode.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								tests/test_gain_mode.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# @Author: Esther Le Rouzic
 | 
			
		||||
# @Date:   2019-05-22
 | 
			
		||||
"""
 | 
			
		||||
@author: esther.lerouzic
 | 
			
		||||
checks behaviour of gain mode
 | 
			
		||||
- if all amps have their gains set, check that these gains are used, even if power_dbm or req_power change
 | 
			
		||||
- check that saturation is correct in gain mode
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from numpy.testing import assert_array_equal, assert_allclose
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from gnpy.core.utils import lin2db, automatic_nch, dbm2watt
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.tools.json_io import load_equipment, load_network
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
 | 
			
		||||
NETWORK_FILENAME = TEST_DIR / 'data/perdegreemeshTopologyExampleV2_auto_design_expected.json'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def net_setup(equipment):
 | 
			
		||||
    """Common setup for tests: builds network, equipment
 | 
			
		||||
    """
 | 
			
		||||
    network = load_network(NETWORK_FILENAME, equipment)
 | 
			
		||||
    spectrum = equipment['SI']['default']
 | 
			
		||||
    p_db = spectrum.power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(spectrum.f_min, spectrum.f_max, spectrum.spacing))
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    return network
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_rq(equipment, srce, dest, bdir, nd_list, ls_list, mode, power_dbm):
 | 
			
		||||
    """Create the usual request list according to parameters
 | 
			
		||||
    """
 | 
			
		||||
    params = {
 | 
			
		||||
        'request_id': 'test_request',
 | 
			
		||||
        'source': srce,
 | 
			
		||||
        'bidir': bdir,
 | 
			
		||||
        'destination': dest,
 | 
			
		||||
        'trx_type': 'Voyager',
 | 
			
		||||
        'trx_mode': mode,
 | 
			
		||||
        'format': mode,
 | 
			
		||||
        'nodes_list': nd_list,
 | 
			
		||||
        'loose_list': ls_list,
 | 
			
		||||
        'effective_freq_slot': None,
 | 
			
		||||
        'path_bandwidth': 100000000000.0,
 | 
			
		||||
        'spacing': 50e9 if mode == 'mode 1' else 75e9,
 | 
			
		||||
        'power': dbm2watt(power_dbm),
 | 
			
		||||
        'tx_power': dbm2watt(power_dbm)
 | 
			
		||||
    }
 | 
			
		||||
    trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
    f_min = params['f_min']
 | 
			
		||||
    f_max_from_si = params['f_max']
 | 
			
		||||
    params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
			
		||||
    return PathRequest(**params)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize("power_dbm", [0, -2, 3])
 | 
			
		||||
@pytest.mark.parametrize("req_power", [1e-3, 0.5e-3, 2e-3])
 | 
			
		||||
def test_gain_mode(req_power, power_dbm):
 | 
			
		||||
    """ Gains are all set on the selected path, so that since the design is made for 0dBm,
 | 
			
		||||
    in gain mode, whatever the value of equipment power_dbm or request power, the network is unchanged
 | 
			
		||||
    and the propagation remains the same as for power mode and 0dBm
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_FILENAME)
 | 
			
		||||
    network = net_setup(equipment)
 | 
			
		||||
    req = create_rq(equipment, 'trx Brest_KLA', 'trx Rennes_STA', False,
 | 
			
		||||
                    ['Edfa0_roadm Brest_KLA', 'roadm Lannion_CAS', 'trx Rennes_STA'],
 | 
			
		||||
                    ['STRICT', 'STRICT', 'STRICT'], 'mode 1', 0)
 | 
			
		||||
    path = compute_constrained_path(network, req)
 | 
			
		||||
    # Propagation in power_mode
 | 
			
		||||
    infos_expected = propagate(path, req, equipment)
 | 
			
		||||
    # Now set to gain mode
 | 
			
		||||
    setattr(equipment['Span']['default'], 'power_mode', False)
 | 
			
		||||
    setattr(equipment['SI']['default'], 'power_dbm', power_dbm)
 | 
			
		||||
    req.power = req_power
 | 
			
		||||
    network2 = net_setup(equipment)
 | 
			
		||||
    path2 = compute_constrained_path(network2, req)
 | 
			
		||||
    infos_actual = propagate(path2, req, equipment)
 | 
			
		||||
 | 
			
		||||
    assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate)
 | 
			
		||||
    assert_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-14)
 | 
			
		||||
    assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-14)
 | 
			
		||||
    assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-14)
 | 
			
		||||
    assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
 | 
			
		||||
    assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
 | 
			
		||||
    assert_array_equal(infos_expected.pmd, infos_actual.pmd)
 | 
			
		||||
    assert_array_equal(infos_expected.channel_number, infos_actual.channel_number)
 | 
			
		||||
    assert_array_equal(infos_expected.number_of_channels, infos_actual.number_of_channels)
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
import pytest
 | 
			
		||||
from numpy import array, zeros, ones
 | 
			
		||||
from numpy.testing import assert_array_equal
 | 
			
		||||
from gnpy.core.info import create_arbitrary_spectral_information, Pref
 | 
			
		||||
from gnpy.core.info import create_arbitrary_spectral_information
 | 
			
		||||
from gnpy.core.exceptions import SpectrumError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -12,8 +12,7 @@ def test_create_arbitrary_spectral_information():
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12],
 | 
			
		||||
                                               baud_rate=32e9, signal=[1, 1, 1],
 | 
			
		||||
                                               delta_pdb_per_channel=[1, 1, 1],
 | 
			
		||||
                                               tx_osnr=40.0,
 | 
			
		||||
                                               ref_power=Pref(1, 1, None))
 | 
			
		||||
                                               tx_osnr=40.0, tx_power=[1, 1, 1])
 | 
			
		||||
    assert_array_equal(si.baud_rate, array([32e9, 32e9, 32e9]))
 | 
			
		||||
    assert_array_equal(si.slot_width, array([37.5e9, 37.5e9, 37.5e9]))
 | 
			
		||||
    assert_array_equal(si.signal, ones(3))
 | 
			
		||||
@@ -34,8 +33,7 @@ def test_create_arbitrary_spectral_information():
 | 
			
		||||
    si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]),
 | 
			
		||||
                                               slot_width=array([50e9, 50e9, 50e9]),
 | 
			
		||||
                                               baud_rate=32e9, signal=array([1, 2, 3]),
 | 
			
		||||
                                               tx_osnr=40.0,
 | 
			
		||||
                                               ref_power=Pref(1, 1, None))
 | 
			
		||||
                                               tx_osnr=40.0, tx_power=array([1, 2, 3]))
 | 
			
		||||
 | 
			
		||||
    assert_array_equal(si.signal, array([3, 2, 1]))
 | 
			
		||||
 | 
			
		||||
@@ -43,17 +41,16 @@ def test_create_arbitrary_spectral_information():
 | 
			
		||||
                                            r'larger than the slot width for channels: \[1, 3\].'):
 | 
			
		||||
        create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1,
 | 
			
		||||
                                              baud_rate=[64e9, 32e9, 64e9], slot_width=50e9,
 | 
			
		||||
                                              tx_osnr=40.0,
 | 
			
		||||
                                              ref_power=Pref(1, 1, None))
 | 
			
		||||
                                              tx_osnr=40.0, tx_power=1)
 | 
			
		||||
    with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
 | 
			
		||||
                                            r'distances between channels: \[\(1, 2\), \(3, 4\)\].'):
 | 
			
		||||
        create_arbitrary_spectral_information(frequency=[193.26e12, 193.3e12, 193.35e12, 193.39e12], signal=1,
 | 
			
		||||
                                              tx_osnr=40.0, baud_rate=32e9, slot_width=50e9, ref_power=Pref(1, 1, None))
 | 
			
		||||
                                              tx_osnr=40.0, baud_rate=32e9, slot_width=50e9, tx_power=1)
 | 
			
		||||
    with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
 | 
			
		||||
                                            r'distances between channels: \[\(1, 2\), \(2, 3\)\].'):
 | 
			
		||||
        create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9,
 | 
			
		||||
                                              tx_osnr=40.0, roll_off=0.1, ref_power=Pref(1, 1, None))
 | 
			
		||||
                                              tx_osnr=40.0, roll_off=0.1, tx_power=1)
 | 
			
		||||
    with pytest.raises(SpectrumError,
 | 
			
		||||
                       match='Dimension mismatch in input fields.'):
 | 
			
		||||
        create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=[1, 2], baud_rate=49e9,
 | 
			
		||||
                                              tx_osnr=40.0, ref_power=Pref(1, 1, None))
 | 
			
		||||
                                              tx_osnr=40.0, tx_power=1)
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -29,6 +29,17 @@ SRC_ROOT = Path(__file__).parent.parent
 | 
			
		||||
     ['--spectrum', 'gnpy/example-data/initial_spectrum2.json', 'gnpy/example-data/meshTopologyExampleV2.xls', '--show-channels', ]),
 | 
			
		||||
    ('path_requests_run_CD_PMD_PDL_missing', 'logs_path_requests_run_CD_PMD_PDL_missing', path_requests_run,
 | 
			
		||||
     ['tests/data/CORONET_Global_Topology_expected.json', 'tests/data/CORONET_services.json', '-v']),
 | 
			
		||||
    ('power_sweep_example', 'logs_power_sweep_example', transmission_main_example,
 | 
			
		||||
     ['tests/data/testTopology_expected.json', 'brest', 'rennes', '-e', 'tests/data/eqpt_config_sweep.json', '--pow', '3']),
 | 
			
		||||
    ('transmission_long_pow', None, transmission_main_example,
 | 
			
		||||
     ['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json']),
 | 
			
		||||
    ('transmission_long_psd', None, transmission_main_example,
 | 
			
		||||
     ['-e', 'tests/data/eqpt_config_psd.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
 | 
			
		||||
    ('transmission_long_psw', None, transmission_main_example,
 | 
			
		||||
     ['-e', 'tests/data/eqpt_config_psw.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
 | 
			
		||||
    ('multiband_transmission', None, transmission_main_example,
 | 
			
		||||
     ['gnpy/example-data/multiband_example_network.json', 'Site_A', 'Site_D', '-e', 'gnpy/example-data/eqpt_config_multiband.json',
 | 
			
		||||
      '--spectrum', 'gnpy/example-data/multiband_spectrum.json', '--show-channels'])
 | 
			
		||||
))
 | 
			
		||||
def test_example_invocation(capfd, caplog, output, log, handler, args):
 | 
			
		||||
    """Make sure that our examples produce useful output"""
 | 
			
		||||
 
 | 
			
		||||
@@ -34,8 +34,8 @@ def test_jsonthing(caplog):
 | 
			
		||||
        "sys_margins": 2
 | 
			
		||||
    }
 | 
			
		||||
    _ = SI(**json_data)
 | 
			
		||||
    expected_msg = 'WARNING missing f_min attribute in eqpt_config.json[SI]\n ' \
 | 
			
		||||
                   + 'default value is f_min = 191350000000000.0'
 | 
			
		||||
    expected_msg = '\n\tWARNING missing f_min attribute in eqpt_config.json[SI]\n' \
 | 
			
		||||
                   + '\tdefault value is f_min = 191350000000000.0'
 | 
			
		||||
    assert expected_msg in caplog.text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -181,7 +181,7 @@ def wrong_requests():
 | 
			
		||||
            }]
 | 
			
		||||
        },
 | 
			
		||||
        'expected_msg': 'Equipment Config error in imposed_mode: '
 | 
			
		||||
                        + 'Could not find transponder "test_offset" with mode "mode 3" in equipment library'
 | 
			
		||||
                        + 'Could not find transponder "test_offset" in equipment library'
 | 
			
		||||
    })
 | 
			
		||||
    data.append({
 | 
			
		||||
        'error': ServiceError,
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,20 @@
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import pytest
 | 
			
		||||
from gnpy.core.exceptions import NetworkTopologyError
 | 
			
		||||
from gnpy.core.network import span_loss
 | 
			
		||||
from gnpy.tools.json_io import load_equipment, load_network
 | 
			
		||||
from numpy.testing import assert_allclose
 | 
			
		||||
 | 
			
		||||
from gnpy.core.exceptions import NetworkTopologyError, ConfigurationError
 | 
			
		||||
from gnpy.core.network import span_loss, build_network, select_edfa, get_node_restrictions, \
 | 
			
		||||
    estimate_srs_power_deviation, add_missing_elements_in_network, get_next_node
 | 
			
		||||
from gnpy.tools.json_io import load_equipment, load_network, network_from_json, load_json
 | 
			
		||||
from gnpy.core.utils import lin2db, automatic_nch, merge_amplifier_restrictions
 | 
			
		||||
from gnpy.core.elements import Fiber, Edfa, Roadm, Multiband_amplifier
 | 
			
		||||
from gnpy.core.parameters import SimParams, EdfaParams, MultiBandParams
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
 | 
			
		||||
EQPT_MULTBAND_FILENAME = TEST_DIR / 'data/eqpt_config_multiband.json'
 | 
			
		||||
NETWORK_FILENAME = TEST_DIR / 'data/bugfixiteratortopo.json'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +56,7 @@ def test_span_loss(node, attenuation):
 | 
			
		||||
    network = load_network(NETWORK_FILENAME, equipment)
 | 
			
		||||
    for x in network.nodes():
 | 
			
		||||
        if x.uid == node:
 | 
			
		||||
            assert attenuation == span_loss(network, x)
 | 
			
		||||
            assert attenuation == span_loss(network, x, equipment)
 | 
			
		||||
            return
 | 
			
		||||
    assert not f'node "{node}" referenced from test but not found in the topology'  # pragma: no cover
 | 
			
		||||
 | 
			
		||||
@@ -61,4 +68,684 @@ def test_span_loss_unconnected(node):
 | 
			
		||||
    network = load_network(NETWORK_FILENAME, equipment)
 | 
			
		||||
    x = next(x for x in network.nodes() if x.uid == node)
 | 
			
		||||
    with pytest.raises(NetworkTopologyError):
 | 
			
		||||
        span_loss(network, x)
 | 
			
		||||
        span_loss(network, x, equipment)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('typ, expected_loss',
 | 
			
		||||
                         [('Edfa', [11, 11]),
 | 
			
		||||
                          ('Fused', [11, 10])])
 | 
			
		||||
def test_eol(typ, expected_loss):
 | 
			
		||||
    """Check that EOL is added only once on spans. One span can be one fiber or several fused fibers
 | 
			
		||||
    EOL is then added on the first fiber only.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "trx SITE1",
 | 
			
		||||
                "type": "Transceiver"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "trx SITE2",
 | 
			
		||||
                "type": "Transceiver"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "roadm SITE1",
 | 
			
		||||
                "type": "Roadm"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "roadm SITE2",
 | 
			
		||||
                "type": "Roadm"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "fiber (SITE1 → ILA1)",
 | 
			
		||||
                "type": "Fiber",
 | 
			
		||||
                "type_variety": "SSMF",
 | 
			
		||||
                "params": {
 | 
			
		||||
                    "length": 50.0,
 | 
			
		||||
                    "loss_coef": 0.2,
 | 
			
		||||
                    "length_units": "km"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "fiber (ILA1 → SITE2)",
 | 
			
		||||
                "type": "Fiber",
 | 
			
		||||
                "type_variety": "SSMF",
 | 
			
		||||
                "params": {
 | 
			
		||||
                    "length": 50.0,
 | 
			
		||||
                    "loss_coef": 0.2,
 | 
			
		||||
                    "length_units": "km"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "east edfa in SITE1 to ILA1",
 | 
			
		||||
                "type": "Edfa"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "west edfa in SITE2 to ILA1",
 | 
			
		||||
                "type": typ
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "east edfa in ILA1 to SITE2",
 | 
			
		||||
                "type": "Edfa"
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "connections": [
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "trx SITE1",
 | 
			
		||||
                "to_node": "roadm SITE1"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "roadm SITE1",
 | 
			
		||||
                "to_node": "east edfa in SITE1 to ILA1"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "east edfa in SITE1 to ILA1",
 | 
			
		||||
                "to_node": "fiber (SITE1 → ILA1)"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "fiber (SITE1 → ILA1)",
 | 
			
		||||
                "to_node": "east edfa in ILA1 to SITE2"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "east edfa in ILA1 to SITE2",
 | 
			
		||||
                "to_node": "fiber (ILA1 → SITE2)"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "fiber (ILA1 → SITE2)",
 | 
			
		||||
                "to_node": "west edfa in SITE2 to ILA1"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "west edfa in SITE2 to ILA1",
 | 
			
		||||
                "to_node": "roadm SITE2"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "roadm SITE2",
 | 
			
		||||
                "to_node": "trx SITE2"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(EQPT_FILENAME)
 | 
			
		||||
    equipment['Span']['default'].EOL = 1
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    fibers = [f for f in network.nodes() if isinstance(f, Fiber)]
 | 
			
		||||
    for i in range(2):
 | 
			
		||||
        assert fibers[i].loss == expected_loss[i]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('p_db, power_mode, elem1, elem2, expected_gain, expected_delta_p, expected_voa', [
 | 
			
		||||
    (-17, True, 'edfa', 'fiber', 15.0, 15, 15.0),
 | 
			
		||||
    (-17, True, 'fiber', 'edfa', 15.0, 5.0, 5.0),
 | 
			
		||||
    (-17, False, 'edfa', 'fiber', 0.0, None, 0.0),
 | 
			
		||||
    (-17, False, 'fiber', 'edfa', 10.0, None, 0.0),
 | 
			
		||||
    (10, True, 'edfa', 'fiber', -9.0, -9.0, 0.0),
 | 
			
		||||
    (10, True, 'fiber', 'edfa', 1.0, -9.0, 0.0),
 | 
			
		||||
    (10, False, 'edfa', 'fiber', -9.0, None, 0.0),
 | 
			
		||||
    (10, False, 'fiber', 'edfa', 1.0, None, 0.0)])
 | 
			
		||||
def test_design_non_amplified_link(elem1, elem2, expected_gain, expected_delta_p, expected_voa, power_mode, p_db):
 | 
			
		||||
    """Check that the delta_p, gain computed on an amplified link that starts from a transceiver are correct
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "trx SITE1",
 | 
			
		||||
                "type": "Transceiver"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "trx SITE2",
 | 
			
		||||
                "type": "Transceiver"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "edfa",
 | 
			
		||||
                "type": "Edfa",
 | 
			
		||||
                "type_variety": "std_low_gain"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "uid": "fiber",
 | 
			
		||||
                "type": "Fiber",
 | 
			
		||||
                "type_variety": "SSMF",
 | 
			
		||||
                "params": {
 | 
			
		||||
                    "length": 50.0,
 | 
			
		||||
                    "loss_coef": 0.2,
 | 
			
		||||
                    "length_units": "km"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "connections": [
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": "trx SITE1",
 | 
			
		||||
                "to_node": elem1
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": elem1,
 | 
			
		||||
                "to_node": elem2
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "from_node": elem2,
 | 
			
		||||
                "to_node": "trx SITE2"
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(EQPT_FILENAME)
 | 
			
		||||
    equipment['Span']['default'].power_mode = power_mode
 | 
			
		||||
    equipment['SI']['default'].power_dbm = p_db
 | 
			
		||||
    equipment['SI']['default'].tx_power_dbm = p_db
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    edfa = next(a for a in network.nodes() if a.uid == 'edfa')
 | 
			
		||||
    edfa.params.out_voa_auto = True
 | 
			
		||||
    p_total_db = p_db + 20.0
 | 
			
		||||
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    amps = [a for a in network.nodes() if isinstance(a, Edfa)]
 | 
			
		||||
    for amp in amps:
 | 
			
		||||
        assert amp.out_voa == expected_voa
 | 
			
		||||
        assert amp.delta_p == expected_delta_p
 | 
			
		||||
        # max power of std_low_gain is 21 dBm
 | 
			
		||||
        assert amp.effective_gain == expected_gain
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def network_base(case, site_type, length=50.0, amplifier_type='Multiband_amplifier'):
 | 
			
		||||
    base_network = {
 | 
			
		||||
        'elements': [
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'trx SITE1',
 | 
			
		||||
                'type': 'Transceiver'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'trx SITE2',
 | 
			
		||||
                'type': 'Transceiver'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'roadm SITE1',
 | 
			
		||||
                'type': 'Roadm'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'roadm SITE2',
 | 
			
		||||
                'type': 'Roadm'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (SITE1 → ILA1)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': length,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (ILA1 → ILA2)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': 50.0,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (ILA2 → SITE2)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': 50.0,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'east edfa in SITE1 to ILA1',
 | 
			
		||||
                'type': amplifier_type
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'east edfa or fused in ILA1',
 | 
			
		||||
                'type': site_type
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'east edfa in ILA2',
 | 
			
		||||
                'type': amplifier_type
 | 
			
		||||
            }, {
 | 
			
		||||
                'uid': 'west edfa in SITE2 to ILA1',
 | 
			
		||||
                'type': amplifier_type
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        'connections': [
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'trx SITE1',
 | 
			
		||||
                'to_node': 'roadm SITE1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'roadm SITE1',
 | 
			
		||||
                'to_node': 'east edfa in SITE1 to ILA1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'east edfa in SITE1 to ILA1',
 | 
			
		||||
                'to_node': 'fiber (SITE1 → ILA1)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (SITE1 → ILA1)',
 | 
			
		||||
                'to_node': 'east edfa or fused in ILA1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'east edfa or fused in ILA1',
 | 
			
		||||
                'to_node': 'fiber (ILA1 → ILA2)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (ILA1 → ILA2)',
 | 
			
		||||
                'to_node': 'east edfa in ILA2'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'east edfa in ILA2',
 | 
			
		||||
                'to_node': 'fiber (ILA2 → SITE2)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (ILA2 → SITE2)',
 | 
			
		||||
                'to_node': 'west edfa in SITE2 to ILA1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'west edfa in SITE2 to ILA1',
 | 
			
		||||
                'to_node': 'roadm SITE2'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'roadm SITE2',
 | 
			
		||||
                'to_node': 'trx SITE2'
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
    multiband_amps = [e for e in base_network['elements'] if e['type'] == 'Multiband_amplifier']
 | 
			
		||||
    edfa2 = next(e for e in base_network['elements'] if e['uid'] == 'east edfa in ILA2')
 | 
			
		||||
    roadm1 = next(e for e in base_network['elements'] if e['uid'] == 'roadm SITE1')
 | 
			
		||||
    fused = [e for e in base_network['elements'] if e['type'] == 'Fused']
 | 
			
		||||
    if case == 'monoband_no_design_band':
 | 
			
		||||
        pass
 | 
			
		||||
    elif case == 'monoband_roadm':
 | 
			
		||||
        roadm1['params'] = {
 | 
			
		||||
            'design_bands': [
 | 
			
		||||
                {'f_min': 192.3e12, 'f_max': 196.0e12}
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    elif case == 'monoband_per_degree':
 | 
			
		||||
        roadm1['params'] = {
 | 
			
		||||
            'per_degree_design_bands': {
 | 
			
		||||
                'east edfa in SITE1 to ILA1': [
 | 
			
		||||
                    {'f_min': 191.5e12, 'f_max': 195.0e12}
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    elif case == 'monoband_design':
 | 
			
		||||
        edfa2['type_variety'] = 'std_medium_gain'
 | 
			
		||||
    elif case == 'design':
 | 
			
		||||
        for elem in multiband_amps:
 | 
			
		||||
            elem['type_variety'] = 'std_medium_gain_multiband'
 | 
			
		||||
            elem['amplifiers'] = [{
 | 
			
		||||
                'type_variety': 'std_medium_gain',
 | 
			
		||||
                'operational': {
 | 
			
		||||
                    'delta_p': 0,
 | 
			
		||||
                    'tilt_target': 0
 | 
			
		||||
                }
 | 
			
		||||
            }, {
 | 
			
		||||
                'type_variety': 'std_medium_gain_L',
 | 
			
		||||
                'operational': {
 | 
			
		||||
                    'delta_p': -1,
 | 
			
		||||
                    'tilt_target': 0
 | 
			
		||||
                }
 | 
			
		||||
            }]
 | 
			
		||||
        for elem in fused:
 | 
			
		||||
            elem['params'] = {'loss': 0.0}
 | 
			
		||||
    elif case == 'no_design':
 | 
			
		||||
        # user must indicate the bands otherwise SI band (single band is assumed) and this is not
 | 
			
		||||
        # consistent with multiband amps.
 | 
			
		||||
        roadm1['params'] = {
 | 
			
		||||
            'per_degree_design_bands': {
 | 
			
		||||
                'east edfa in SITE1 to ILA1': [
 | 
			
		||||
                    {'f_min': 191.3e12, 'f_max': 196.0e12},
 | 
			
		||||
                    {'f_min': 187.0e12, 'f_max': 190.0e12}
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    elif case == 'type_variety':
 | 
			
		||||
        # bands are implicit based on amplifiers type_varieties
 | 
			
		||||
        for elem in multiband_amps:
 | 
			
		||||
            elem['type_variety'] = 'std_medium_gain_multiband'
 | 
			
		||||
    return base_network
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands', [
 | 
			
		||||
    ('monoband_no_design_band', 'Edfa', 'Edfa',
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]),
 | 
			
		||||
    ('monoband_roadm', 'Edfa', 'Edfa',
 | 
			
		||||
     [{'f_min': 192.3e12, 'f_max': 196.0e12}], [{'f_min': 192.3e12, 'f_max': 196.0e12}]),
 | 
			
		||||
    ('monoband_per_degree', 'Edfa', 'Edfa',
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.5e12, 'f_max': 195.0e12}]),
 | 
			
		||||
    ('monoband_design', 'Edfa', 'Edfa',
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]),
 | 
			
		||||
    ('design', 'Fused', 'Multiband_amplifier',
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.1e12}],
 | 
			
		||||
     [{'f_min': 186.55e12, 'f_max': 190.05e12}, {'f_min': 191.25e12, 'f_max': 196.15e12}]),
 | 
			
		||||
    ('no_design', 'Fused', 'Multiband_amplifier',
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.1e12}],
 | 
			
		||||
     [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}])])
 | 
			
		||||
def test_design_band(case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands):
 | 
			
		||||
    """Check design_band is the one defined:
 | 
			
		||||
    - in SI if nothing is defined,
 | 
			
		||||
    - in ROADM if no design_band is defined for degree
 | 
			
		||||
    - in per_degree
 | 
			
		||||
    - if no design is defined,
 | 
			
		||||
        - if type variety is defined: use it for determining bands
 | 
			
		||||
        - if no type_variety autodesign is as expected, design uses OMS defined set of bands
 | 
			
		||||
    EOL is added only once on spans. One span can be one fiber or several fused fibers
 | 
			
		||||
    EOL is then added on the first fiber only.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = network_base(case, site_type, amplifier_type=amplifier_type)
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1')
 | 
			
		||||
    assert roadm1.design_bands == expected_design_bands
 | 
			
		||||
    assert roadm1.per_degree_design_bands['east edfa in SITE1 to ILA1'] == expected_per_degree_design_bands
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection', [
 | 
			
		||||
    (False, 20, 20, 3, False, ('test_fixed_gain', 0)),
 | 
			
		||||
    (False, 20, 25, 3, False, ('test_fixed_gain', -4)),
 | 
			
		||||
    (False, 10, 15, 3, False, ('std_low_gain_bis', 0)),
 | 
			
		||||
    (False, 5, 15, 3, "is below all available amplifiers min gain", ('std_low_gain_bis', 0)),
 | 
			
		||||
    (False, 30, 15, 3, "is beyond all available amplifiers capabilities", ('std_medium_gain', -1)),
 | 
			
		||||
])
 | 
			
		||||
def test_select_edfa(caplog, raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection):
 | 
			
		||||
    """
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    edfa_eqpt = {n: a for n, a in equipment['Edfa'].items() if a.type_def != 'multi_band'}
 | 
			
		||||
    selection = select_edfa(raman_allowed, gain_target, power_target, edfa_eqpt, "toto", target_extended_gain, verbose=True)
 | 
			
		||||
    assert selection == expected_selection
 | 
			
		||||
    if warning:
 | 
			
		||||
        assert warning in caplog.text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('cls, defaultparams, variety_list, booster_list, band, expected_restrictions', [
 | 
			
		||||
    (Edfa, EdfaParams, [], [],
 | 
			
		||||
     {'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
 | 
			
		||||
     ['std_medium_gain_L', 'std_low_gain_L_ter', 'std_low_gain_L']),
 | 
			
		||||
    (Edfa, EdfaParams, [], [],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
 | 
			
		||||
     ['CienaDB_medium_gain', 'std_medium_gain', 'std_low_gain', 'std_low_gain_bis', 'test', 'test_fixed_gain']),
 | 
			
		||||
    (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
 | 
			
		||||
     ['std_medium_gain']),   # name in variety list does not exist in library
 | 
			
		||||
    (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [],
 | 
			
		||||
     {'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
 | 
			
		||||
     []),   # restrictions inconsistency with bands
 | 
			
		||||
    (Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], ['std_booster'],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
 | 
			
		||||
     ['std_medium_gain']),  # variety list takes precedence over booster constraint
 | 
			
		||||
    (Edfa, EdfaParams, [], ['std_booster'],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
 | 
			
		||||
     ['std_booster']),
 | 
			
		||||
    (Multiband_amplifier, MultiBandParams, [], [],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
 | 
			
		||||
     ['std_medium_gain_multiband', 'std_low_gain_multiband_bis']),
 | 
			
		||||
    (Multiband_amplifier, MultiBandParams, [], ['std_booster_multiband', 'std_booster'],
 | 
			
		||||
     {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
 | 
			
		||||
     ['std_booster_multiband'])
 | 
			
		||||
])
 | 
			
		||||
def test_get_node_restrictions(cls, defaultparams, variety_list, booster_list, band, expected_restrictions):
 | 
			
		||||
    """Check that all combinations of restrictions are correctly captured
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    edfa_config = {"uid": "Edfa1"}
 | 
			
		||||
    if cls == Multiband_amplifier:
 | 
			
		||||
        edfa_config['amplifiers'] = {}
 | 
			
		||||
    edfa_config['params'] = defaultparams.default_values
 | 
			
		||||
    edfa_config['variety_list'] = variety_list
 | 
			
		||||
    node = cls(**edfa_config)
 | 
			
		||||
    roadm_config = {
 | 
			
		||||
        "uid": "roadm Brest_KLA",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "per_degree_pch_out_db": {},
 | 
			
		||||
            "target_pch_out_dbm": -18,
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 0,
 | 
			
		||||
            "pdl": 0,
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": booster_list
 | 
			
		||||
            },
 | 
			
		||||
            "roadm-path-impairments": []
 | 
			
		||||
        },
 | 
			
		||||
        "metadata": {
 | 
			
		||||
            "location": {
 | 
			
		||||
                "city": "Brest_KLA",
 | 
			
		||||
                "region": "RLD",
 | 
			
		||||
                "latitude": 4.0,
 | 
			
		||||
                "longitude": 0.0
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    prev_node = Roadm(**roadm_config)
 | 
			
		||||
    fiber_config = {
 | 
			
		||||
        "uid": "fiber (SITE1 → ILA1)",
 | 
			
		||||
        "type_variety": "SSMF",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "length": 100.0,
 | 
			
		||||
            "loss_coef": 0.2,
 | 
			
		||||
            "length_units": "km"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    extra_params = equipment['Fiber']['SSMF'].__dict__
 | 
			
		||||
 | 
			
		||||
    fiber_config['params'] = merge_amplifier_restrictions(fiber_config['params'], extra_params)
 | 
			
		||||
    next_node = Fiber(**fiber_config)
 | 
			
		||||
    restrictions = get_node_restrictions(node, prev_node, next_node, equipment, band)
 | 
			
		||||
    assert restrictions == expected_restrictions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.usefixtures('set_sim_params')
 | 
			
		||||
@pytest.mark.parametrize('case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params', [
 | 
			
		||||
    ('design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False),
 | 
			
		||||
    ('no_design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_low_gain_multiband_bis', False),
 | 
			
		||||
    ('type_variety', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False),
 | 
			
		||||
    ('design', 'Multiband_amplifier', 'LBAND', 9.344985, 0.0, 'std_medium_gain_multiband', True),
 | 
			
		||||
    ('no_design', 'Multiband_amplifier', 'LBAND', 9.344985, -0.938676, 'std_low_gain_multiband_bis', True),
 | 
			
		||||
    ('no_design', 'Multiband_amplifier', 'CBAND', 10.977065, -1.600193, 'std_low_gain_multiband_bis', True),
 | 
			
		||||
    ('no_design', 'Fused', 'LBAND', 21.0, 0.0, 'std_medium_gain_multiband', False),
 | 
			
		||||
    ('no_design', 'Fused', 'LBAND', 20.344985, -0.819176, 'std_medium_gain_multiband', True),
 | 
			
		||||
    ('no_design', 'Fused', 'CBAND', 21.770319, -1.40032, 'std_medium_gain_multiband', True),
 | 
			
		||||
    ('design', 'Fused', 'CBAND', 21.21108, 0.0, 'std_medium_gain_multiband', True),
 | 
			
		||||
    ('design', 'Multiband_amplifier', 'CBAND', 11.041037, 0.0, 'std_medium_gain_multiband', True)])
 | 
			
		||||
def test_multiband(case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params):
 | 
			
		||||
    """Check:
 | 
			
		||||
    - if amplifiers are defined in multiband they are used for design,
 | 
			
		||||
    - if no design is defined,
 | 
			
		||||
        - if type variety is defined: use it for determining bands
 | 
			
		||||
        - if no type_variety autodesign is as expected, design uses OMS defined set of bands
 | 
			
		||||
    EOL is added only once on spans. One span can be one fiber or several fused fibers
 | 
			
		||||
    EOL is then added on the first fiber only.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = network_base(case, site_type)
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
 | 
			
		||||
    if sim_params:
 | 
			
		||||
        SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    amp2 = next(n for n in network.nodes() if n.uid == 'east edfa in ILA2')
 | 
			
		||||
    # restore simParams
 | 
			
		||||
    save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(),
 | 
			
		||||
                       "nli_params": SimParams._shared_dict['nli_params'].to_json()}
 | 
			
		||||
    SimParams.set_params(save_sim_params)
 | 
			
		||||
    print(amp2.to_json)
 | 
			
		||||
    assert_allclose(amp2.amplifiers[band].effective_gain, expected_gain, atol=1e-5)
 | 
			
		||||
    assert_allclose(amp2.amplifiers[band].tilt_target, expected_tilt, atol=1e-5)
 | 
			
		||||
    assert amp2.type_variety == expected_variety
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_tilt_fused():
 | 
			
		||||
    """check that computed tilt is the same for one span 100km as 2 spans 30 +70 km
 | 
			
		||||
    """
 | 
			
		||||
    design_bands = {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12},
 | 
			
		||||
                    'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}
 | 
			
		||||
    save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(),
 | 
			
		||||
                       "nli_params": SimParams._shared_dict['nli_params'].to_json()}
 | 
			
		||||
    SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
 | 
			
		||||
    input_powers = {'CBAND': 0.001, 'LBAND': 0.001}
 | 
			
		||||
    json_data = network_base("design", "Multiband_amplifier", length=100)
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    node = next(n for n in network.nodes() if n.uid == 'fiber (SITE1 → ILA1)')
 | 
			
		||||
    tilt_db, tilt_target = estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers)
 | 
			
		||||
    json_data = network_base("design", "Fused", length=50)
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    node = next(n for n in network.nodes() if n.uid == 'fiber (ILA1 → ILA2)')
 | 
			
		||||
    fused_tilt_db, fused_tilt_target = \
 | 
			
		||||
        estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers)
 | 
			
		||||
    # restore simParams
 | 
			
		||||
    SimParams.set_params(save_sim_params)
 | 
			
		||||
    for key in tilt_db:
 | 
			
		||||
        assert_allclose(tilt_db[key], fused_tilt_db[key], rtol=1e-3)
 | 
			
		||||
    for key in tilt_target:
 | 
			
		||||
        assert_allclose(tilt_target[key], fused_tilt_target[key], rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def network_wo_booster(site_type, bands):
 | 
			
		||||
    return {
 | 
			
		||||
        'elements': [
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'trx SITE1',
 | 
			
		||||
                'type': 'Transceiver'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'trx SITE2',
 | 
			
		||||
                'type': 'Transceiver'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'roadm SITE1',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'design_bands': bands
 | 
			
		||||
                },
 | 
			
		||||
                'type': 'Roadm'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'roadm SITE2',
 | 
			
		||||
                'type': 'Roadm'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (SITE1 → ILA1)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': 50.0,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (ILA1 → ILA2)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': 50.0,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'fiber (ILA2 → SITE2)',
 | 
			
		||||
                'type': 'Fiber',
 | 
			
		||||
                'type_variety': 'SSMF',
 | 
			
		||||
                'params': {
 | 
			
		||||
                    'length': 50.0,
 | 
			
		||||
                    'loss_coef': 0.2,
 | 
			
		||||
                    'length_units': 'km'
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'uid': 'east edfa or fused in ILA1',
 | 
			
		||||
                'type': site_type
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        'connections': [
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'trx SITE1',
 | 
			
		||||
                'to_node': 'roadm SITE1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'roadm SITE1',
 | 
			
		||||
                'to_node': 'fiber (SITE1 → ILA1)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (SITE1 → ILA1)',
 | 
			
		||||
                'to_node': 'east edfa or fused in ILA1'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'east edfa or fused in ILA1',
 | 
			
		||||
                'to_node': 'fiber (ILA1 → ILA2)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (ILA1 → ILA2)',
 | 
			
		||||
                'to_node': 'fiber (ILA2 → SITE2)'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'fiber (ILA2 → SITE2)',
 | 
			
		||||
                'to_node': 'roadm SITE2'
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                'from_node': 'roadm SITE2',
 | 
			
		||||
                'to_node': 'trx SITE2'
 | 
			
		||||
            }
 | 
			
		||||
        ]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('site_type, expected_type, bands, expected_bands', [
 | 
			
		||||
    ('Multiband_amplifier', Multiband_amplifier,
 | 
			
		||||
     [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}],
 | 
			
		||||
     [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]),
 | 
			
		||||
    ('Edfa', Edfa,
 | 
			
		||||
     [{'f_min': 191.4e12, 'f_max': 196.1e12}],
 | 
			
		||||
     [{'f_min': 191.4e12, 'f_max': 196.1e12}]),
 | 
			
		||||
    ('Edfa', Edfa,
 | 
			
		||||
     [{'f_min': 191.2e12, 'f_max': 196.0e12}],
 | 
			
		||||
     []),
 | 
			
		||||
    ('Fused', Multiband_amplifier,
 | 
			
		||||
     [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}],
 | 
			
		||||
     [{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]),
 | 
			
		||||
    ('Fused', Edfa,
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.0e12}],
 | 
			
		||||
     [{'f_min': 191.3e12, 'f_max': 196.0e12}])])
 | 
			
		||||
def test_insert_amp(site_type, expected_type, bands, expected_bands):
 | 
			
		||||
    """Check:
 | 
			
		||||
    - if amplifiers are defined in multiband they are used for design,
 | 
			
		||||
    - if no design is defined,
 | 
			
		||||
        - if type variety is defined: use it for determining bands
 | 
			
		||||
        - if no type_variety autodesign is as expected, design uses OMS defined set of bands
 | 
			
		||||
    EOL is added only once on spans. One span can be one fiber or several fused fibers
 | 
			
		||||
    EOL is then added on the first fiber only.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = network_wo_booster(site_type, bands)
 | 
			
		||||
    equipment = load_equipment(EQPT_MULTBAND_FILENAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
    add_missing_elements_in_network(network, equipment)
 | 
			
		||||
    if not expected_bands:
 | 
			
		||||
        with pytest.raises(ConfigurationError):
 | 
			
		||||
            build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    else:
 | 
			
		||||
        build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
        roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1')
 | 
			
		||||
        amp1 = get_next_node(roadm1, network)
 | 
			
		||||
        assert isinstance(amp1, expected_type)
 | 
			
		||||
        assert roadm1.per_degree_design_bands['Edfa_booster_roadm SITE1_to_fiber (SITE1 → ILA1)'] == expected_bands
 | 
			
		||||
 
 | 
			
		||||
@@ -40,17 +40,18 @@ def test_fiber_parameters():
 | 
			
		||||
    fiber_dict_cr.update(Fiber(**fiber_dict_cr).__dict__)
 | 
			
		||||
    fiber_params_cr = FiberParams(**fiber_dict_cr)
 | 
			
		||||
 | 
			
		||||
    raman_coefficient_explicit_g0 = fiber_params_explicit_g0.raman_coefficient
 | 
			
		||||
    raman_coefficient_explicit_g0 =\
 | 
			
		||||
        raman_coefficient_explicit_g0.normalized_gamma_raman * fiber_params_explicit_g0._raman_reference_frequency
 | 
			
		||||
    norm_gamma_raman_explicit_g0 = fiber_params_explicit_g0.raman_coefficient.normalized_gamma_raman
 | 
			
		||||
    norm_gamma_raman_default_g0 = fiber_params_default_g0.raman_coefficient.normalized_gamma_raman
 | 
			
		||||
 | 
			
		||||
    raman_coefficient_default_g0 = fiber_params_default_g0.raman_coefficient
 | 
			
		||||
    raman_coefficient_default_g0 = \
 | 
			
		||||
        raman_coefficient_default_g0.normalized_gamma_raman * fiber_params_default_g0._raman_reference_frequency
 | 
			
		||||
    norm_gamma_raman_cr = fiber_params_cr.raman_coefficient.normalized_gamma_raman
 | 
			
		||||
 | 
			
		||||
    raman_coefficient_cr = fiber_params_cr.raman_coefficient
 | 
			
		||||
    raman_coefficient_cr = \
 | 
			
		||||
        raman_coefficient_cr.normalized_gamma_raman * fiber_params_cr._raman_reference_frequency
 | 
			
		||||
    assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0, rtol=1e-10)
 | 
			
		||||
    assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_cr, rtol=1e-10)
 | 
			
		||||
 | 
			
		||||
    assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_default_g0, rtol=1e-10)
 | 
			
		||||
    assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_cr, rtol=1e-10)
 | 
			
		||||
    # Change Effective Area
 | 
			
		||||
    fiber_dict_default_g0['effective_area'] = 100e-12
 | 
			
		||||
    no_ssmf_fiber_params = FiberParams(**fiber_dict_default_g0)
 | 
			
		||||
 | 
			
		||||
    norm_gamma_raman_default_g0_no_ssmf = no_ssmf_fiber_params.raman_coefficient.normalized_gamma_raman
 | 
			
		||||
 | 
			
		||||
    assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0_no_ssmf, rtol=1e-10)
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ from xlrd import open_workbook
 | 
			
		||||
import pytest
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from gnpy.core.utils import automatic_nch, lin2db
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.core.exceptions import ServiceError
 | 
			
		||||
from gnpy.core.network import build_network, add_missing_elements_in_network
 | 
			
		||||
from gnpy.core.exceptions import ServiceError, ConfigurationError
 | 
			
		||||
from gnpy.topology.request import (jsontocsv, requests_aggregation, compute_path_dsjctn, deduplicate_disjunctions,
 | 
			
		||||
                                   compute_path_with_disjunction, ResultElement, PathRequest)
 | 
			
		||||
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum
 | 
			
		||||
@@ -71,6 +71,7 @@ def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json
 | 
			
		||||
    """tests generation of topology json and that the build network gives correct results in gain mode"""
 | 
			
		||||
    equipment = load_equipment(eqpt_filename)
 | 
			
		||||
    network = load_network(xls_input, equipment)
 | 
			
		||||
    add_missing_elements_in_network(network, equipment)
 | 
			
		||||
    # in order to test the Eqpt sheet and load gain target,
 | 
			
		||||
    # change the power-mode to False (to be in gain mode)
 | 
			
		||||
    equipment['Span']['default'].power_mode = False
 | 
			
		||||
@@ -109,6 +110,7 @@ def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
 | 
			
		||||
    p_db = equipment['SI']['default'].power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
			
		||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
			
		||||
    add_missing_elements_in_network(network, equipment)
 | 
			
		||||
    build_network(network, equipment, p_db, p_total_db)
 | 
			
		||||
    actual_json_output = tmpdir / json_input.with_name(json_input.stem + '_auto_design').with_suffix('.json').name
 | 
			
		||||
    save_network(network, actual_json_output)
 | 
			
		||||
@@ -230,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 = []
 | 
			
		||||
@@ -350,6 +352,7 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
 | 
			
		||||
        'cost': None,
 | 
			
		||||
        'roll_off': 0,
 | 
			
		||||
        'tx_osnr': 0,
 | 
			
		||||
        'tx_power': 0,
 | 
			
		||||
        'penalties': None,
 | 
			
		||||
        'min_spacing': None,
 | 
			
		||||
        'nb_channel': 0,
 | 
			
		||||
@@ -563,3 +566,52 @@ def test_service_json_constraint_order():
 | 
			
		||||
    rqs = requests_from_json(data, equipment)
 | 
			
		||||
    assert rqs[0].nodes_list == ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
			
		||||
    assert rqs[0].loose_list == ['STRICT', 'LOOSE', 'STRICT', 'STRICT']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('type_variety, target_pch_out_db, correct_variety', [(None, -20, True),
 | 
			
		||||
                                                                              ('example_test', -18, True),
 | 
			
		||||
                                                                              ('example', None, False)])
 | 
			
		||||
def test_roadm_type_variety(type_variety, target_pch_out_db, correct_variety):
 | 
			
		||||
    """Checks that if element has no variety, the default one is applied, and if it has one
 | 
			
		||||
    that the type_variety is correctly applied
 | 
			
		||||
    """
 | 
			
		||||
    json_data = {
 | 
			
		||||
        "elements": [{
 | 
			
		||||
            "uid": "roadm Oakland",
 | 
			
		||||
            "type": "Roadm",
 | 
			
		||||
        }],
 | 
			
		||||
        "connections": []
 | 
			
		||||
    }
 | 
			
		||||
    expected_roadm = {
 | 
			
		||||
        "uid": "roadm Oakland",
 | 
			
		||||
        "type": "Roadm",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "restrictions": {
 | 
			
		||||
                "preamp_variety_list": [],
 | 
			
		||||
                "booster_variety_list": []
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        'metadata': {
 | 
			
		||||
            'location': {
 | 
			
		||||
                'city': None,
 | 
			
		||||
                'latitude': 0,
 | 
			
		||||
                'longitude': 0,
 | 
			
		||||
                'region': None
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if type_variety is not None:
 | 
			
		||||
        json_data['elements'][0]['type_variety'] = type_variety
 | 
			
		||||
        expected_roadm['type_variety'] = type_variety
 | 
			
		||||
    else:
 | 
			
		||||
        # Do not add type variety in json_data to test that it creates a 'default' type_variety
 | 
			
		||||
        expected_roadm['type_variety'] = 'default'
 | 
			
		||||
    expected_roadm['params']['target_pch_out_db'] = target_pch_out_db
 | 
			
		||||
    equipment = load_equipment(eqpt_filename)
 | 
			
		||||
    if correct_variety:
 | 
			
		||||
        network = network_from_json(json_data, equipment)
 | 
			
		||||
        roadm = [n for n in network.nodes()][0]
 | 
			
		||||
        assert roadm.to_json == expected_roadm
 | 
			
		||||
    else:
 | 
			
		||||
        with pytest.raises(ConfigurationError):
 | 
			
		||||
            network = network_from_json(json_data, equipment)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,14 +4,19 @@
 | 
			
		||||
# @Date:   2018-02-02 14:06:55
 | 
			
		||||
 | 
			
		||||
import pytest
 | 
			
		||||
from gnpy.core.elements import Transceiver, Fiber, Edfa, Roadm
 | 
			
		||||
from gnpy.core.utils import db2lin
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, ReferenceCarrier
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from networkx import dijkstra_path
 | 
			
		||||
from numpy import mean, sqrt, ones
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
from gnpy.core.exceptions import SpectrumError
 | 
			
		||||
from gnpy.core.elements import Transceiver, Fiber, Edfa, Roadm
 | 
			
		||||
from gnpy.core.utils import db2lin
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.tools.json_io import load_network, load_equipment, network_from_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
network_file_name = Path(__file__).parent.parent / 'tests/LinkforTest.json'
 | 
			
		||||
eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
 | 
			
		||||
@@ -28,7 +33,6 @@ def nch_and_spacing(request):
 | 
			
		||||
def propagation(input_power, con_in, con_out, dest):
 | 
			
		||||
    equipment = load_equipment(eqpt_library_name)
 | 
			
		||||
    network = load_network(network_file_name, equipment)
 | 
			
		||||
    build_network(network, equipment, 0, 20)
 | 
			
		||||
 | 
			
		||||
    # parametrize the network elements with the con losses and adapt gain
 | 
			
		||||
    # (assumes all spans are identical)
 | 
			
		||||
@@ -40,14 +44,16 @@ def propagation(input_power, con_in, con_out, dest):
 | 
			
		||||
        if isinstance(e, Edfa):
 | 
			
		||||
            e.operational.gain_target = loss + con_in + con_out
 | 
			
		||||
 | 
			
		||||
    build_network(network, equipment, 0, 20)
 | 
			
		||||
 | 
			
		||||
    transceivers = {n.uid: n for n in network.nodes() if isinstance(n, Transceiver)}
 | 
			
		||||
 | 
			
		||||
    p = input_power
 | 
			
		||||
    p = db2lin(p) * 1e-3
 | 
			
		||||
    spacing = 50e9  # THz
 | 
			
		||||
    si = create_input_spectral_information(f_min=191.3e12, f_max=191.3e12 + 79 * spacing, roll_off=0.15,
 | 
			
		||||
                                           baud_rate=32e9, power=p, spacing=spacing, tx_osnr=None,
 | 
			
		||||
                                           ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
 | 
			
		||||
                                           baud_rate=32e9, spacing=spacing, tx_osnr=None,
 | 
			
		||||
                                           tx_power=p)
 | 
			
		||||
    source = next(transceivers[uid] for uid in transceivers if uid == 'trx A')
 | 
			
		||||
    sink = next(transceivers[uid] for uid in transceivers if uid == dest)
 | 
			
		||||
    path = dijkstra_path(network, source, sink)
 | 
			
		||||
@@ -125,6 +131,62 @@ def test_dgd(dgd_test, dest):
 | 
			
		||||
    assert pmd == pytest.approx(expected_pmd)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def wrong_element_propagate():
 | 
			
		||||
    """
 | 
			
		||||
    """
 | 
			
		||||
    data = []
 | 
			
		||||
    data.append({
 | 
			
		||||
        "error": SpectrumError,
 | 
			
		||||
        "json_data": {
 | 
			
		||||
            "elements": [{
 | 
			
		||||
                "uid": "Elem",
 | 
			
		||||
                "type": "Fiber",
 | 
			
		||||
                "type_variety": "SSMF",
 | 
			
		||||
                "params": {
 | 
			
		||||
                    "dispersion_per_frequency": {
 | 
			
		||||
                        "frequency": [
 | 
			
		||||
                            185.49234135667396e12,
 | 
			
		||||
                            186.05251641137855e12,
 | 
			
		||||
                            188.01312910284463e12,
 | 
			
		||||
                            189.99124726477024e12],
 | 
			
		||||
                        "value": [
 | 
			
		||||
                            1.60e-05,
 | 
			
		||||
                            1.67e-05,
 | 
			
		||||
                            1.7e-05,
 | 
			
		||||
                            1.8e-05]
 | 
			
		||||
                    },
 | 
			
		||||
                    "length": 1.02,
 | 
			
		||||
                    "loss_coef": 2.85,
 | 
			
		||||
                    "length_units": "km",
 | 
			
		||||
                    "att_in": 0.0,
 | 
			
		||||
                    "con_in": 0.0,
 | 
			
		||||
                    "con_out": 0.0
 | 
			
		||||
                }
 | 
			
		||||
            }],
 | 
			
		||||
            "connections": []
 | 
			
		||||
        },
 | 
			
		||||
        "expected_msg": 'The spectrum bandwidth exceeds the frequency interval used to define the fiber Chromatic '
 | 
			
		||||
                        + 'Dispersion in "Fiber Elem".\nSpectrum f_min-f_max: 191.35-196.1\nChromatic Dispersion '
 | 
			
		||||
                        + 'f_min-f_max: 185.49-189.99'
 | 
			
		||||
    })
 | 
			
		||||
    return data
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('error, json_data, expected_msg',
 | 
			
		||||
                         [(e['error'], e['json_data'], e['expected_msg']) for e in wrong_element_propagate()])
 | 
			
		||||
def test_json_element(error, json_data, expected_msg):
 | 
			
		||||
    """
 | 
			
		||||
    Check that a missing key is correctly raisong the logger
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(eqpt_library_name)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    elem = next(e for e in network.nodes() if e.uid == 'Elem')
 | 
			
		||||
    si = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
 | 
			
		||||
                                           baud_rate=32e9, tx_power=1.0e-3, spacing=50.0e9, tx_osnr=45)
 | 
			
		||||
    with pytest.raises(error, match=re.escape(expected_msg)):
 | 
			
		||||
        _ = elem(si)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    from logging import getLogger, basicConfig, INFO
 | 
			
		||||
    logger = getLogger(__name__)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,15 +13,19 @@ checks that restrictions in roadms are correctly applied during autodesign
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import pytest
 | 
			
		||||
from numpy.testing import assert_allclose
 | 
			
		||||
 | 
			
		||||
from numpy import ndarray, mean
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
from gnpy.core.utils import lin2db, automatic_nch
 | 
			
		||||
from gnpy.core.elements import Fused, Roadm, Edfa
 | 
			
		||||
from gnpy.core.network import build_network
 | 
			
		||||
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp
 | 
			
		||||
from gnpy.core.elements import Fused, Roadm, Edfa, Transceiver, EdfaOperational, EdfaParams, Fiber
 | 
			
		||||
from gnpy.core.parameters import FiberParams, RoadmParams, FusedParams
 | 
			
		||||
from gnpy.core.network import build_network, design_network
 | 
			
		||||
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp, _equipment_from_json
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.topology.request import PathRequest, compute_constrained_path, ref_carrier
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information
 | 
			
		||||
from gnpy.core.utils import db2lin
 | 
			
		||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, Carrier
 | 
			
		||||
from gnpy.core.utils import db2lin, dbm2watt, merge_amplifier_restrictions
 | 
			
		||||
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
EQPT_LIBRARY_NAME = TEST_DIR / 'data/eqpt_config.json'
 | 
			
		||||
@@ -209,18 +213,23 @@ def test_restrictions(restrictions, equipment):
 | 
			
		||||
                    raise AssertionError()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('roadm_type_variety, roadm_b_maxloss', [('default', 0),
 | 
			
		||||
                                                                 ('example_detailed_impairments', 16.5)])
 | 
			
		||||
@pytest.mark.parametrize('power_dbm', [0, +1, -2])
 | 
			
		||||
@pytest.mark.parametrize('prev_node_type, effective_pch_out_db', [('edfa', -20.0), ('fused', -22.0)])
 | 
			
		||||
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
 | 
			
		||||
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm, roadm_type_variety, roadm_b_maxloss):
 | 
			
		||||
    """Check that egress power of roadm is equal to target power if input power is greater
 | 
			
		||||
    than target power else, that it is equal to input power. Use a simple two hops A-B-C topology
 | 
			
		||||
    for the test where the prev_node in ROADM B is either an amplifier or a fused, so that the target
 | 
			
		||||
    power can not be met in this last case.
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    equipment['SI']['default'].power_dbm = power_dbm
 | 
			
		||||
    json_network = load_json(TEST_DIR / 'data/twohops_roadm_power_test.json')
 | 
			
		||||
    prev_node = next(n for n in json_network['elements'] if n['uid'] == 'west edfa in node B to ila2')
 | 
			
		||||
    json_network['elements'].remove(prev_node)
 | 
			
		||||
    roadm_b = next(element for element in json_network['elements'] if element['uid'] == 'roadm node B')
 | 
			
		||||
    roadm_b['type_variety'] = roadm_type_variety
 | 
			
		||||
    if prev_node_type == 'edfa':
 | 
			
		||||
        prev_node = {'uid': 'west edfa in node B to ila2', 'type': 'Edfa'}
 | 
			
		||||
    elif prev_node_type == 'fused':
 | 
			
		||||
@@ -245,7 +254,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
 | 
			
		||||
              'format': '',
 | 
			
		||||
              'path_bandwidth': 100e9,
 | 
			
		||||
              'effective_freq_slot': None,
 | 
			
		||||
              'nb_channel': nb_channel
 | 
			
		||||
              'nb_channel': nb_channel,
 | 
			
		||||
              'power': dbm2watt(power_dbm),
 | 
			
		||||
              'tx_power': dbm2watt(power_dbm)
 | 
			
		||||
              }
 | 
			
		||||
    trx_params = trx_mode_params(equipment)
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
@@ -254,32 +265,447 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
 | 
			
		||||
    path = compute_constrained_path(network, req)
 | 
			
		||||
    si = create_input_spectral_information(
 | 
			
		||||
        f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate,
 | 
			
		||||
        power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment))
 | 
			
		||||
        spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power)
 | 
			
		||||
    for i, el in enumerate(path):
 | 
			
		||||
        if isinstance(el, Roadm):
 | 
			
		||||
            power_in_roadm = si.signal + si.ase + si.nli
 | 
			
		||||
            si = el(si, degree=path[i + 1].uid)
 | 
			
		||||
            si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
 | 
			
		||||
            power_out_roadm = si.signal + si.ase + si.nli
 | 
			
		||||
            if el.uid == 'roadm node B':
 | 
			
		||||
                # if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its
 | 
			
		||||
                # target power (as specified in equipment ie -20 dBm)
 | 
			
		||||
                # if it is a Fused, the input power to the ROADM is smaller than the target power, and the
 | 
			
		||||
                # ROADM cannot apply this target. In this case, it is assumed that the ROADM has 0 dB loss
 | 
			
		||||
                # so the output power will be the same as the input power, which for this particular case
 | 
			
		||||
                # corresponds to -22dBm + power_dbm
 | 
			
		||||
                # next step (for ROADM modelling) will be to apply a minimum loss for ROADMs !
 | 
			
		||||
                # ROADM cannot apply this target. If the ROADM has 0 dB loss the output power will be the same
 | 
			
		||||
                # as the input power, which for this particular case corresponds to -22dBm + power_dbm.
 | 
			
		||||
                # If ROADM has a minimum losss, then output power will be -22dBm + power_dbm - ROADM loss. !
 | 
			
		||||
                if prev_node_type == 'edfa':
 | 
			
		||||
                    # edfa prev_node sets input power to roadm to a high enough value:
 | 
			
		||||
                    # check that target power is correctly set in the ROADM
 | 
			
		||||
                    assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db, rtol=1e-3)
 | 
			
		||||
                    # Check that egress power of roadm is equal to target power
 | 
			
		||||
                    assert_allclose(power_out_roadm, db2lin(effective_pch_out_db - 30), rtol=1e-3)
 | 
			
		||||
                elif prev_node_type == 'fused':
 | 
			
		||||
                    # fused prev_node does reamplfy power after fiber propagation, so input power
 | 
			
		||||
                if prev_node_type == 'fused':
 | 
			
		||||
                    # fused prev_node does not reamplify power after fiber propagation, so input power
 | 
			
		||||
                    # to roadm is low.
 | 
			
		||||
                    # check that target power correctly reports power_dbm from previous propagation
 | 
			
		||||
                    assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm, rtol=1e-3)
 | 
			
		||||
                    # Check that egress power of roadm is not equalized power out is the same as power in.
 | 
			
		||||
                    assert_allclose(power_out_roadm, power_in_roadm, rtol=1e-3)
 | 
			
		||||
                    assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm - roadm_b_maxloss, rtol=1e-3)
 | 
			
		||||
                    # Check that egress power of roadm is not equalized:
 | 
			
		||||
                    # power out is the same as power in minus the ROADM loss.
 | 
			
		||||
                    assert_allclose(power_out_roadm, power_in_roadm / db2lin(roadm_b_maxloss), rtol=1e-3)
 | 
			
		||||
                    assert effective_pch_out_db + power_dbm ==\
 | 
			
		||||
                        pytest.approx(lin2db(min(power_in_roadm) * 1e3), rel=1e-3)
 | 
			
		||||
        else:
 | 
			
		||||
            si = el(si)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_per_oms_request(network, eqpt, req_power):
 | 
			
		||||
    """Create requests between every adjacent ROADMs + one additional request crossing several ROADMs
 | 
			
		||||
    """
 | 
			
		||||
    nb_channel = automatic_nch(eqpt['SI']['default'].f_min, eqpt['SI']['default'].f_max,
 | 
			
		||||
                               eqpt['SI']['default'].spacing)
 | 
			
		||||
    params = {
 | 
			
		||||
        'trx_type': '',
 | 
			
		||||
        'trx_mode': '',
 | 
			
		||||
        'bidir': False,
 | 
			
		||||
        'loose_list': ['strict', 'strict'],
 | 
			
		||||
        'format': '',
 | 
			
		||||
        'path_bandwidth': 100e9,
 | 
			
		||||
        'effective_freq_slot': None,
 | 
			
		||||
        'nb_channel': nb_channel,
 | 
			
		||||
        'power': dbm2watt(req_power),
 | 
			
		||||
        'tx_power': dbm2watt(req_power)
 | 
			
		||||
    }
 | 
			
		||||
    trx_params = trx_mode_params(eqpt)
 | 
			
		||||
    params.update(trx_params)
 | 
			
		||||
    trxs = [e for e in network if isinstance(e, Transceiver)]
 | 
			
		||||
    req_list = []
 | 
			
		||||
    req_id = 0
 | 
			
		||||
    for trx in trxs:
 | 
			
		||||
        source = trx.uid
 | 
			
		||||
        roadm = next(n for n in network.successors(trx) if isinstance(n, Roadm))
 | 
			
		||||
        for degree in roadm.per_degree_pch_out_dbm.keys():
 | 
			
		||||
            node = next(n for n in network.nodes() if n.uid == degree)
 | 
			
		||||
            # find next roadm
 | 
			
		||||
            while not isinstance(node, Roadm):
 | 
			
		||||
                node = next(n for n in network.successors(node))
 | 
			
		||||
            next_roadm = node
 | 
			
		||||
            destination = next(n.uid for n in network.successors(next_roadm) if isinstance(n, Transceiver))
 | 
			
		||||
            params['request_id'] = req_id
 | 
			
		||||
            req_id += 1
 | 
			
		||||
            params['source'] = source
 | 
			
		||||
            params['destination'] = destination
 | 
			
		||||
            params['nodes_list'] = [degree, destination]
 | 
			
		||||
            req = PathRequest(**params)
 | 
			
		||||
            req.power = dbm2watt(req_power)
 | 
			
		||||
            carrier = {key: getattr(req, key) for key in ['baud_rate', 'roll_off', 'tx_osnr']}
 | 
			
		||||
            carrier['label'] = ""
 | 
			
		||||
            carrier['slot_width'] = req.spacing
 | 
			
		||||
            carrier['delta_pdb'] = 0
 | 
			
		||||
            carrier['tx_power'] = 1e-3
 | 
			
		||||
            req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier)
 | 
			
		||||
                                    for f in range(1, req.nb_channel + 1)}
 | 
			
		||||
            req_list.append(req)
 | 
			
		||||
    # add one additional request crossing several roadms to have a complete view
 | 
			
		||||
    params['source'] = 'trx Rennes_STA'
 | 
			
		||||
    params['destination'] = 'trx Vannes_KBE'
 | 
			
		||||
    params['nodes_list'] = ['roadm Lannion_CAS', 'trx Vannes_KBE']
 | 
			
		||||
    params['bidir'] = True
 | 
			
		||||
    req = PathRequest(**params)
 | 
			
		||||
    req.power = dbm2watt(req_power)
 | 
			
		||||
    carrier = {key: getattr(req, key) for key in ['baud_rate', 'roll_off', 'tx_osnr']}
 | 
			
		||||
    carrier['label'] = ""
 | 
			
		||||
    carrier['slot_width'] = req.spacing
 | 
			
		||||
    carrier['delta_pdb'] = 0
 | 
			
		||||
    carrier['tx_power'] = 1e-3
 | 
			
		||||
    req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier) for f in range(1, req.nb_channel + 1)}
 | 
			
		||||
    req_list.append(req)
 | 
			
		||||
    return req_list
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def list_element_attr(element):
 | 
			
		||||
    """Return the list of keys to be checked depending on element type. List only the keys that are not
 | 
			
		||||
    created upon element effective propagation
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    if isinstance(element, Roadm):
 | 
			
		||||
        return ['uid', 'name', 'metadata', 'operational', 'type_variety', 'target_pch_out_dbm',
 | 
			
		||||
                'passive', 'restrictions', 'per_degree_pch_out_dbm',
 | 
			
		||||
                'target_psd_out_mWperGHz', 'per_degree_pch_psd']
 | 
			
		||||
        # Dynamically created: 'effective_loss',
 | 
			
		||||
    if isinstance(element, RoadmParams):
 | 
			
		||||
        return ['target_pch_out_dbm', 'target_psd_out_mWperGHz', 'per_degree_pch_out_db', 'per_degree_pch_psd',
 | 
			
		||||
                'add_drop_osnr', 'pmd', 'restrictions']
 | 
			
		||||
    if isinstance(element, Edfa):
 | 
			
		||||
        return ['variety_list', 'uid', 'name', 'params', 'metadata', 'operational',
 | 
			
		||||
                'passive', 'effective_gain', 'delta_p', 'tilt_target', 'out_voa']
 | 
			
		||||
        # TODO this exhaustive test highlighted that type_variety is not correctly updated from EdfaParams to
 | 
			
		||||
        # attributes in preamps
 | 
			
		||||
        # Dynamically created only with channel propagation: 'att_in', 'channel_freq', 'effective_pch_out_db'
 | 
			
		||||
        # 'gprofile', 'interpol_dgt', 'interpol_gain_ripple', 'interpol_nf_ripple', 'nch',  'nf', 'pin_db', 'pout_db',
 | 
			
		||||
        # 'target_pch_out_db',
 | 
			
		||||
    if isinstance(element, FusedParams):
 | 
			
		||||
        return ['loss']
 | 
			
		||||
    if isinstance(element, EdfaOperational):
 | 
			
		||||
        return ['delta_p', 'gain_target', 'out_voa', 'tilt_target']
 | 
			
		||||
    if isinstance(element, EdfaParams):
 | 
			
		||||
        return ['f_min', 'f_max', 'type_variety', 'type_def', 'gain_flatmax', 'gain_min', 'p_max', 'nf_model',
 | 
			
		||||
                'dual_stage_model', 'nf_fit_coeff', 'nf_ripple', 'dgt', 'gain_ripple', 'out_voa_auto',
 | 
			
		||||
                'allowed_for_design', 'raman']
 | 
			
		||||
    if isinstance(element, Fiber):
 | 
			
		||||
 | 
			
		||||
        return ['uid', 'name', 'params', 'metadata', 'operational', 'type_variety', 'passive',
 | 
			
		||||
                'lumped_losses', 'z_lumped_losses']
 | 
			
		||||
        # Dynamically created 'output_total_power', 'pch_out_db'
 | 
			
		||||
    if isinstance(element, FiberParams):
 | 
			
		||||
        return ['_length', '_att_in', '_con_in', '_con_out', '_ref_frequency', '_ref_wavelength',
 | 
			
		||||
                '_dispersion', '_dispersion_slope', '_dispersion', '_f_dispersion_ref',
 | 
			
		||||
                '_gamma', '_pmd_coef', '_loss_coef',
 | 
			
		||||
                '_f_loss_ref', '_lumped_losses']
 | 
			
		||||
    if isinstance(element, Fused):
 | 
			
		||||
        return ['uid', 'name', 'params', 'metadata', 'operational', 'loss', 'passive']
 | 
			
		||||
    if isinstance(element, FusedParams):
 | 
			
		||||
        return ['loss']
 | 
			
		||||
    return ['should never come here']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# all initial delta_p are null in topo file, so add random places to change this value
 | 
			
		||||
@pytest.mark.parametrize('amp_with_deltap_one', [[],
 | 
			
		||||
                                                 ['east edfa in Lorient_KMA to Vannes_KBE',
 | 
			
		||||
                                                  'east edfa in Stbrieuc to Rennes_STA',
 | 
			
		||||
                                                  'west edfa in Lannion_CAS to Morlaix',
 | 
			
		||||
                                                  'east edfa in a to b',
 | 
			
		||||
                                                  'west edfa in b to a']])
 | 
			
		||||
@pytest.mark.parametrize('power_dbm, req_power', [(0, 0), (0, -3), (3, 3), (0, 3), (3, 0),
 | 
			
		||||
                                                  (3, 1), (3, 5), (3, 2), (3, 4), (2, 4)])
 | 
			
		||||
def test_compare_design_propagation_settings(power_dbm, req_power, amp_with_deltap_one):
 | 
			
		||||
    """Check that network design does not change after propagation except for gain in
 | 
			
		||||
    case of power_saturation during design and/or during propagation:
 | 
			
		||||
    - in power mode only:
 | 
			
		||||
        expected behaviour: target power out of roadm does not change
 | 
			
		||||
        so gain of booster should be reduced/augmented by the exact power difference;
 | 
			
		||||
        the following amplifiers on the OMS have unchanged gain except if augmentation
 | 
			
		||||
        of channel power on booster leads to total_power above amplifier max power,
 | 
			
		||||
        ie if amplifier saturates.
 | 
			
		||||
 | 
			
		||||
                          roadm -----booster (pmax 21dBm, 96 channels= 19.82dB)
 | 
			
		||||
        pdesign=0dBm pch= 0dBm,         ^ -20dBm  ^G=20dB, Pch=0dBm, Ptot=19.82dBm
 | 
			
		||||
        pdesign=0dBm pch= -3dBm         ^ -20dBm  ^G=17dB, Pch=-3dBm, Ptot=16.82dBm
 | 
			
		||||
        pdesign=3dBm pch= 3dBm          ^ -20dBm  ^G=23-1.82dB, Pch=1.18dBm, Ptot=21dBm
 | 
			
		||||
            amplifier can not handle 96x3dBm channels, amplifier saturation is considered
 | 
			
		||||
            for the choice of amplifier during design
 | 
			
		||||
        pdesign=0dBm pch= 3dBm          ^ -20dBm  ^G=23-1.82dB, Pch=1.18dBm, Ptot=21dBm
 | 
			
		||||
            amplifier can not handle 96x3dBm channels during propagation, amplifier selection
 | 
			
		||||
            has been done for 0dBm. Saturation is applied for all amps only during propagation
 | 
			
		||||
 | 
			
		||||
        Design applies a saturation verification on amplifiers.
 | 
			
		||||
        This saturation leads to a power reduction to the max power in the amp library, which
 | 
			
		||||
        is also applied on the amp delta_p and independantly from propagation.
 | 
			
		||||
 | 
			
		||||
        After design, upon propagation, the amplifier gain and applied delta_p may also change
 | 
			
		||||
        if total power exceeds max power (eg not the same nb of channels, not the same power per channel
 | 
			
		||||
        compared to design).
 | 
			
		||||
 | 
			
		||||
        This test also checks all the possible combinations and expected before/after propagation
 | 
			
		||||
        gain differences. It also checks delta_p applied due to saturation during design.
 | 
			
		||||
    """
 | 
			
		||||
    eqpt = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    eqpt['SI']['default'].power_dbm = power_dbm
 | 
			
		||||
    json_network = load_json(NETWORK_FILE_NAME)
 | 
			
		||||
    for element in json_network['elements']:
 | 
			
		||||
        # Initialize a value for delta_p
 | 
			
		||||
        if element['type'] == 'Edfa':
 | 
			
		||||
            element['operational']['delta_p'] = 0 + element['operational']['out_voa'] \
 | 
			
		||||
                if element['operational']['out_voa'] is not None else 0
 | 
			
		||||
            # apply a 1 dB delta_p on the set of amps
 | 
			
		||||
            if element['uid'] in amp_with_deltap_one:
 | 
			
		||||
                element['operational']['delta_p'] = 1
 | 
			
		||||
 | 
			
		||||
    network = network_from_json(json_network, eqpt)
 | 
			
		||||
    # Build the network once using the default power defined in SI in eqpt config
 | 
			
		||||
    p_db = power_dbm
 | 
			
		||||
    p_total_db = p_db + lin2db(automatic_nch(eqpt['SI']['default'].f_min,
 | 
			
		||||
                                             eqpt['SI']['default'].f_max,
 | 
			
		||||
                                             eqpt['SI']['default'].spacing))
 | 
			
		||||
    build_network(network, eqpt, p_db, p_total_db, verbose=False)
 | 
			
		||||
    # record network settings before propagating
 | 
			
		||||
    # propagate on each oms
 | 
			
		||||
    req_list = create_per_oms_request(network, eqpt, req_power)
 | 
			
		||||
    paths = [compute_constrained_path(network, r) for r in req_list]
 | 
			
		||||
 | 
			
		||||
    # systematic comparison of elements settings before and after propagation
 | 
			
		||||
    # all amps have 21 dBm max power
 | 
			
		||||
    pch_max = 21 - lin2db(96)
 | 
			
		||||
    for path, req in zip(paths, req_list):
 | 
			
		||||
        # check all elements except source and destination trx
 | 
			
		||||
        # in order to have clean initialization, use deecopy of paths
 | 
			
		||||
        design_network(req, network, eqpt, verbose=False)
 | 
			
		||||
        network_copy = deepcopy(network)
 | 
			
		||||
        pth = deepcopy(path)
 | 
			
		||||
        _ = propagate(pth, req, eqpt)
 | 
			
		||||
        for i, element in enumerate(pth[1:-1]):
 | 
			
		||||
            element_is_first_amp = False
 | 
			
		||||
            # index of previous element in path is i
 | 
			
		||||
            if (isinstance(element, Edfa) and isinstance(pth[i], Roadm)) or element.uid == 'west edfa in d to c':
 | 
			
		||||
                # oms c to d has no booster but one preamp: the power difference is hold there
 | 
			
		||||
                element_is_first_amp = True
 | 
			
		||||
            # find the element with the same id in the network_copy
 | 
			
		||||
            element_copy = next(n for n in network_copy.nodes() if n.uid == element.uid)
 | 
			
		||||
            for key in list_element_attr(element):
 | 
			
		||||
                if not isinstance(getattr(element, key),
 | 
			
		||||
                                  (EdfaOperational, EdfaParams, FiberParams, RoadmParams, FusedParams)):
 | 
			
		||||
                    if not key == 'effective_gain':
 | 
			
		||||
                        # for all keys, before and after design should be the same except for gain (in power mode)
 | 
			
		||||
                        if isinstance(getattr(element, key), ndarray):
 | 
			
		||||
                            if len(getattr(element, key)) > 0:
 | 
			
		||||
                                assert getattr(element, key) == getattr(element_copy, key)
 | 
			
		||||
                            else:
 | 
			
		||||
                                assert len(getattr(element_copy, key)) == 0
 | 
			
		||||
                        else:
 | 
			
		||||
                            assert getattr(element, key) == getattr(element_copy, key)
 | 
			
		||||
                    else:
 | 
			
		||||
                        dp = element.out_voa if element.uid not in amp_with_deltap_one else element.out_voa + 1
 | 
			
		||||
                        # check that target power is correctly set
 | 
			
		||||
                        assert element.target_pch_out_dbm == req_power + dp
 | 
			
		||||
                        # check that designed gain is exactly applied except if target power exceeds max power, then
 | 
			
		||||
                        # gain is slightly less than the one computed during design for the noiseless reference,
 | 
			
		||||
                        # because during propagation, noise has accumulated, additing to signal.
 | 
			
		||||
                        # check that delta_p is unchanged unless for saturation
 | 
			
		||||
                        if element.target_pch_out_dbm > pch_max:
 | 
			
		||||
                            assert element.effective_gain == pytest.approx(element_copy.effective_gain, abs=2e-2)
 | 
			
		||||
                        else:
 | 
			
		||||
                            assert element.effective_gain == element_copy.effective_gain
 | 
			
		||||
                        # check that delta_p is unchanged unless for saturation
 | 
			
		||||
                        assert element.delta_p == element_copy.delta_p
 | 
			
		||||
                        if element_is_first_amp:
 | 
			
		||||
                            # if element is first amp on path, then it is the one that will saturate if req_power is
 | 
			
		||||
                            # too high
 | 
			
		||||
                            assert mean(element.pch_out_dbm) ==\
 | 
			
		||||
                                pytest.approx(min(pch_max, req_power + element.delta_p - element.out_voa), abs=2e-2)
 | 
			
		||||
                        # check that delta_p is unchanged unless due to saturation
 | 
			
		||||
                        assert element.delta_p == pytest.approx(min(req_power + dp, pch_max) - req_power, abs=1e-2)
 | 
			
		||||
                        # check that delta_p is unchanged unless for saturation
 | 
			
		||||
                else:
 | 
			
		||||
                    # for all subkeys, before and after design should be the same
 | 
			
		||||
                    for subkey in list_element_attr(getattr(element, key)):
 | 
			
		||||
                        if isinstance(getattr(getattr(element, key), subkey), list):
 | 
			
		||||
                            assert getattr(getattr(element, key), subkey) == getattr(getattr(element_copy, key), subkey)
 | 
			
		||||
                        elif isinstance(getattr(getattr(element, key), subkey), dict):
 | 
			
		||||
                            for value1, value2 in zip(getattr(getattr(element, key), subkey).values(),
 | 
			
		||||
                                                      getattr(getattr(element_copy, key), subkey).values()):
 | 
			
		||||
                                assert all(value1 == value2)
 | 
			
		||||
                        elif isinstance(getattr(getattr(element, key), subkey), ndarray):
 | 
			
		||||
                            assert_allclose(getattr(getattr(element, key), subkey),
 | 
			
		||||
                                            getattr(getattr(element_copy, key), subkey), rtol=1e-12)
 | 
			
		||||
                        else:
 | 
			
		||||
                            assert getattr(getattr(element, key), subkey) == getattr(getattr(element_copy, key), subkey)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize("restrictions, fail", [
 | 
			
		||||
    ({'preamp_variety_list': [], 'booster_variety_list':[]}, False),
 | 
			
		||||
    ({'preamp_variety_list': ['std_medium_gain', 'std_low_gain'], 'booster_variety_list':['std_medium_gain']}, False),
 | 
			
		||||
    # the two next amp type_variety do not exist
 | 
			
		||||
    ({'preamp_variety_list': [], 'booster_variety_list':['booster_medium_gain']}, True),
 | 
			
		||||
    ({'preamp_variety_list': ['std_medium_gain', 'preamp_high_gain'], 'booster_variety_list':[]}, True)])
 | 
			
		||||
def test_wrong_restrictions(restrictions, fail):
 | 
			
		||||
    """Check that sanity_check correctly raises an error when restriction is incorrect and that library
 | 
			
		||||
    correctly includes restrictions.
 | 
			
		||||
    """
 | 
			
		||||
    json_data = load_json(EQPT_LIBRARY_NAME)
 | 
			
		||||
    # define wrong restriction
 | 
			
		||||
    json_data['Roadm'][0]['restrictions'] = restrictions
 | 
			
		||||
    if fail:
 | 
			
		||||
        with pytest.raises(ConfigurationError):
 | 
			
		||||
            _ = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
 | 
			
		||||
    else:
 | 
			
		||||
        equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
 | 
			
		||||
        assert equipment['Roadm']['example_test'].restrictions == restrictions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('roadm, from_degree, to_degree, expected_impairment_id, expected_type', [
 | 
			
		||||
    ('roadm Lannion_CAS', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
 | 
			
		||||
    ('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', 0, 'express'),
 | 
			
		||||
    ('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'trx Lannion_CAS', 2, 'drop'),
 | 
			
		||||
    ('roadm h', 'west edfa in h to g', 'trx h', None, 'drop')
 | 
			
		||||
])
 | 
			
		||||
def test_roadm_impairments(roadm, from_degree, to_degree, expected_impairment_id, expected_type):
 | 
			
		||||
    """Check that impairment id and types are correct
 | 
			
		||||
    """
 | 
			
		||||
    json_data = load_json(NETWORK_FILE_NAME)
 | 
			
		||||
    for el in json_data['elements']:
 | 
			
		||||
        if el['uid'] == 'roadm Lannion_CAS':
 | 
			
		||||
            el['type_variety'] = 'example_detailed_impairments'
 | 
			
		||||
    equipment = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    build_network(network, equipment, 0.0, 20.0)
 | 
			
		||||
    roadm = next(n for n in network.nodes() if n.uid == roadm)
 | 
			
		||||
    assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
 | 
			
		||||
    assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == expected_impairment_id
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('type_variety, from_degree, to_degree, impairment_id, expected_type', [
 | 
			
		||||
    (None, 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
 | 
			
		||||
    ('default', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 3, 'add'),
 | 
			
		||||
    (None, 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', None, 'express')
 | 
			
		||||
])
 | 
			
		||||
def test_roadm_per_degree_impairments(type_variety, from_degree, to_degree, impairment_id, expected_type):
 | 
			
		||||
    """Check that impairment type is correct also if per degree impairment is defined
 | 
			
		||||
    """
 | 
			
		||||
    json_data = load_json(EQPT_LIBRARY_NAME)
 | 
			
		||||
    assert 'type_variety' not in json_data['Roadm'][2]
 | 
			
		||||
    json_data['Roadm'][2]['roadm-path-impairments'] = [
 | 
			
		||||
        {
 | 
			
		||||
            "roadm-path-impairments-id": 1,
 | 
			
		||||
            "roadm-add-path": [{
 | 
			
		||||
                "frequency-range": {
 | 
			
		||||
                    "lower-frequency": 191.3e12,
 | 
			
		||||
                    "upper-frequency": 196.1e12
 | 
			
		||||
                },
 | 
			
		||||
                "roadm-osnr": 41,
 | 
			
		||||
            }]
 | 
			
		||||
        }, {
 | 
			
		||||
            "roadm-path-impairments-id": 3,
 | 
			
		||||
            "roadm-add-path": [{
 | 
			
		||||
                "frequency-range": {
 | 
			
		||||
                    "lower-frequency": 191.3e12,
 | 
			
		||||
                    "upper-frequency": 196.1e12
 | 
			
		||||
                },
 | 
			
		||||
                "roadm-inband-crosstalk": 0,
 | 
			
		||||
                "roadm-osnr": 20,
 | 
			
		||||
                "roadm-noise-figure": 23
 | 
			
		||||
            }]
 | 
			
		||||
        }]
 | 
			
		||||
    equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
 | 
			
		||||
    assert equipment['Roadm']['default'].type_variety == 'default'
 | 
			
		||||
 | 
			
		||||
    json_data = load_json(NETWORK_FILE_NAME)
 | 
			
		||||
    for el in json_data['elements']:
 | 
			
		||||
        if el['uid'] == 'roadm Lannion_CAS' and type_variety is not None:
 | 
			
		||||
            el['type_variety'] = type_variety
 | 
			
		||||
            el['params'] = {
 | 
			
		||||
                "per_degree_impairments": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "from_degree": from_degree,
 | 
			
		||||
                        "to_degree": to_degree,
 | 
			
		||||
                        "impairment_id": impairment_id
 | 
			
		||||
                    }]
 | 
			
		||||
            }
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    build_network(network, equipment, 0.0, 20.0)
 | 
			
		||||
    roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
 | 
			
		||||
    assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
 | 
			
		||||
    assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == impairment_id
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('from_degree, to_degree, impairment_id, error, message', [
 | 
			
		||||
    ('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 2, NetworkTopologyError,
 | 
			
		||||
     'Roadm roadm Lannion_CAS path_type is defined as drop but it should be add'),  # wrong path_type
 | 
			
		||||
    ('trx Lannion_CAS', 'east edfa toto', 1, ConfigurationError,
 | 
			
		||||
     'Roadm roadm Lannion_CAS has wrong from-to degree uid trx Lannion_CAS - east edfa toto'),  # wrong degree
 | 
			
		||||
    ('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 11, NetworkTopologyError,
 | 
			
		||||
     'ROADM roadm Lannion_CAS: impairment profile id 11 is not defined in library')  # wrong impairment_id
 | 
			
		||||
])
 | 
			
		||||
def test_wrong_roadm_per_degree_impairments(from_degree, to_degree, impairment_id, error, message):
 | 
			
		||||
    """Check that wrong per degree definitions are correctly catched
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    json_data = load_json(NETWORK_FILE_NAME)
 | 
			
		||||
    for el in json_data['elements']:
 | 
			
		||||
        if el['uid'] == 'roadm Lannion_CAS':
 | 
			
		||||
            el['type_variety'] = 'example_detailed_impairments'
 | 
			
		||||
            el['params'] = {
 | 
			
		||||
                "per_degree_impairments": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "from_degree": from_degree,
 | 
			
		||||
                        "to_degree": to_degree,
 | 
			
		||||
                        "impairment_id": impairment_id
 | 
			
		||||
                    }]
 | 
			
		||||
            }
 | 
			
		||||
    network = network_from_json(json_data, equipment)
 | 
			
		||||
    with pytest.raises(error, match=message):
 | 
			
		||||
        build_network(network, equipment, 0.0, 20.0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq', [
 | 
			
		||||
    ('express', 'default', 5.0e-12, 0.5, None, [191.3e12]),  # roadm instance parameters pre-empts library
 | 
			
		||||
    ('express', 'example_test', 5.0e-12, 0.5, None, [191.3e12]),
 | 
			
		||||
    ('express', 'example_detailed_impairments', 0, 0, None, [191.3e12]),  # detailed parameters pre-empts global ones
 | 
			
		||||
    ('add', 'default', 5.0e-12, 0.5, None, [191.3e12]),
 | 
			
		||||
    ('add', 'example_test', 5.0e-12, 0.5, None, [191.3e12]),
 | 
			
		||||
    ('add', 'example_detailed_impairments', 0, 0, 41, [191.3e12]),
 | 
			
		||||
    ('add', 'example_detailed_impairments', [0, 0], [0.5, 0], [35, 41], [188.5e12, 191.3e12])])
 | 
			
		||||
def test_impairment_initialization(path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq):
 | 
			
		||||
    """Check that impairments are correctly initialized, with this order:
 | 
			
		||||
    - use equipment roadm impairments if no impairment are set in the ROADM instance
 | 
			
		||||
    - use roadm global impairment if roadm global impairment are set
 | 
			
		||||
    - use roadm detailed impairment for the corresponding path_type if roadm type_variety has detailed impairments
 | 
			
		||||
    - use roadm per degree impairment if they are defined
 | 
			
		||||
    """
 | 
			
		||||
    equipment = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    extra_params = equipment['Roadm'][type_variety].__dict__
 | 
			
		||||
    roadm_config = {
 | 
			
		||||
        "uid": "roadm Lannion_CAS",
 | 
			
		||||
        "params": {
 | 
			
		||||
            "add_drop_osnr": 38,
 | 
			
		||||
            "pmd": 5.0e-12,
 | 
			
		||||
            "pdl": 0.5
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if type_variety != 'default':
 | 
			
		||||
        roadm_config["type_variety"] = type_variety
 | 
			
		||||
    roadm_config['params'] = merge_amplifier_restrictions(roadm_config['params'], extra_params)
 | 
			
		||||
    roadm = Roadm(**roadm_config)
 | 
			
		||||
    roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type=path_type)
 | 
			
		||||
    assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').path_type == path_type
 | 
			
		||||
    assert_allclose(roadm.get_impairment('roadm-pmd', freq, from_degree='tata', degree='toto'),
 | 
			
		||||
                    expected_pmd, rtol=1e-12)
 | 
			
		||||
    assert_allclose(roadm.get_impairment('roadm-pdl', freq, from_degree='tata', degree='toto'),
 | 
			
		||||
                    expected_pdl, rtol=1e-12)
 | 
			
		||||
    if path_type == 'add':
 | 
			
		||||
        # we assume for simplicity that add contribution is the same as drop contribution
 | 
			
		||||
        # add_drop_osnr_db = 10log10(1/add_osnr + 1/drop_osnr)
 | 
			
		||||
        if type_variety in ['default', 'example_test']:
 | 
			
		||||
            assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'),
 | 
			
		||||
                            roadm.params.add_drop_osnr + lin2db(2), rtol=1e-12)
 | 
			
		||||
        else:
 | 
			
		||||
            assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'),
 | 
			
		||||
                            expected_osnr, rtol=1e-12)
 | 
			
		||||
 
 | 
			
		||||
@@ -10,10 +10,10 @@ from pathlib import Path
 | 
			
		||||
from pandas import read_csv
 | 
			
		||||
from numpy.testing import assert_allclose
 | 
			
		||||
from numpy import array
 | 
			
		||||
from copy import deepcopy
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, Pref, \
 | 
			
		||||
    ReferenceCarrier
 | 
			
		||||
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information
 | 
			
		||||
from gnpy.core.elements import Fiber, RamanFiber
 | 
			
		||||
from gnpy.core.parameters import SimParams
 | 
			
		||||
from gnpy.tools.json_io import load_json
 | 
			
		||||
@@ -23,15 +23,15 @@ from gnpy.core.science_utils import RamanSolver
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.usefixtures('set_sim_params')
 | 
			
		||||
def test_fiber():
 | 
			
		||||
    """Test the accuracy of propagating the Fiber."""
 | 
			
		||||
    fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
 | 
			
		||||
 | 
			
		||||
    fiber.ref_pch_in_dbm = 0.0
 | 
			
		||||
    # fix grid spectral information generation
 | 
			
		||||
    spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
 | 
			
		||||
                                                            baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            ref_carrier=
 | 
			
		||||
                                                            ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
 | 
			
		||||
                                                            baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            tx_power=1e-3)
 | 
			
		||||
    # propagation
 | 
			
		||||
    spectral_info_out = fiber(spectral_info_input)
 | 
			
		||||
 | 
			
		||||
@@ -48,13 +48,11 @@ def test_fiber():
 | 
			
		||||
    baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9])
 | 
			
		||||
    signal = 1e-3 + array([0, -1e-4, 3e-4, -2e-4, +2e-4])
 | 
			
		||||
    delta_pdb_per_channel = [0, 0, 0, 0, 0]
 | 
			
		||||
    pref = Pref(p_span0=0, p_spani=0, ref_carrier=None)
 | 
			
		||||
    spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
 | 
			
		||||
                                                                signal=signal, baud_rate=baud_rate, roll_off=0.15,
 | 
			
		||||
                                                                delta_pdb_per_channel=delta_pdb_per_channel,
 | 
			
		||||
                                                                tx_osnr=40.0, ref_power=pref)
 | 
			
		||||
 | 
			
		||||
    # propagation
 | 
			
		||||
                                                                tx_osnr=40.0, tx_power=1e-3)
 | 
			
		||||
    # propagation without Raman
 | 
			
		||||
    spectral_info_out = fiber(spectral_info_input)
 | 
			
		||||
 | 
			
		||||
    p_signal = spectral_info_out.signal
 | 
			
		||||
@@ -64,17 +62,29 @@ def test_fiber():
 | 
			
		||||
    assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
 | 
			
		||||
    assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
    # propagation with Raman
 | 
			
		||||
    SimParams.set_params({'raman_params': {'flag': True}})
 | 
			
		||||
    spectral_info_out = fiber(spectral_info_input)
 | 
			
		||||
 | 
			
		||||
    p_signal = spectral_info_out.signal
 | 
			
		||||
    p_nli = spectral_info_out.nli
 | 
			
		||||
 | 
			
		||||
    expected_results = read_csv(TEST_DIR / 'data' / 'test_fiber_flex_expected_with_raman_results.csv')
 | 
			
		||||
    assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
 | 
			
		||||
    assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.usefixtures('set_sim_params')
 | 
			
		||||
def test_raman_fiber():
 | 
			
		||||
    """Test the accuracy of propagating the RamanFiber."""
 | 
			
		||||
    # spectral information generation
 | 
			
		||||
    spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
 | 
			
		||||
                                                            baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
 | 
			
		||||
                                                            baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            tx_power=1e-3)
 | 
			
		||||
    SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
 | 
			
		||||
    SimParams().raman_params.solver_spatial_resolution = 5
 | 
			
		||||
    fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
 | 
			
		||||
 | 
			
		||||
    fiber.ref_pch_in_dbm = 0.0
 | 
			
		||||
    # propagation
 | 
			
		||||
    spectral_info_out = fiber(spectral_info_input)
 | 
			
		||||
 | 
			
		||||
@@ -108,27 +118,25 @@ def test_fiber_lumped_losses_srs(set_sim_params):
 | 
			
		||||
    """Test the accuracy of Fiber with lumped losses propagation."""
 | 
			
		||||
    # spectral information generation
 | 
			
		||||
    spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
 | 
			
		||||
                                                            baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            ref_carrier=
 | 
			
		||||
                                                            ReferenceCarrier(baud_rate=32e9, slot_width=50e9))
 | 
			
		||||
                                                            baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            tx_power=1e-3)
 | 
			
		||||
 | 
			
		||||
    SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
 | 
			
		||||
    fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json'))
 | 
			
		||||
    raman_fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json'))
 | 
			
		||||
 | 
			
		||||
    # propagation
 | 
			
		||||
    # without Raman pumps
 | 
			
		||||
    stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
 | 
			
		||||
        spectral_info_input, fiber)
 | 
			
		||||
    SimParams.set_params({'raman_params': {'flag': True, 'order': 2}})
 | 
			
		||||
    stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, fiber)
 | 
			
		||||
    power_profile = stimulated_raman_scattering.power_profile
 | 
			
		||||
    expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', header=None)
 | 
			
		||||
    expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv').values
 | 
			
		||||
    assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
    # with Raman pumps
 | 
			
		||||
    expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv', header=None)
 | 
			
		||||
    stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
 | 
			
		||||
        spectral_info_input, raman_fiber)
 | 
			
		||||
    SimParams.set_params({'raman_params': {'flag': True, 'order': 1, 'solver_spatial_resolution': 5}})
 | 
			
		||||
    stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, raman_fiber)
 | 
			
		||||
    power_profile = stimulated_raman_scattering.power_profile
 | 
			
		||||
    expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv').values
 | 
			
		||||
    assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
    # without Stimulated Raman Scattering
 | 
			
		||||
@@ -136,3 +144,26 @@ def test_fiber_lumped_losses_srs(set_sim_params):
 | 
			
		||||
    stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info_input, fiber)
 | 
			
		||||
    power_profile = stimulated_raman_scattering.power_profile
 | 
			
		||||
    assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.usefixtures('set_sim_params')
 | 
			
		||||
def test_nli_solver():
 | 
			
		||||
    """Test the accuracy of NLI solver."""
 | 
			
		||||
    fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
 | 
			
		||||
    fiber.ref_pch_in_dbm = 0.0
 | 
			
		||||
    # fix grid spectral information generation
 | 
			
		||||
    spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
 | 
			
		||||
                                                            baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
 | 
			
		||||
                                                            tx_power=1e-3)
 | 
			
		||||
 | 
			
		||||
    SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
 | 
			
		||||
    sim_params = SimParams()
 | 
			
		||||
 | 
			
		||||
    spectral_info_output = fiber(deepcopy(spectral_info_input))
 | 
			
		||||
 | 
			
		||||
    sim_params.nli_params.method = 'ggn_approx'
 | 
			
		||||
    sim_params.raman_params.result_spatial_resolution = 10e3
 | 
			
		||||
    spectral_info_output_approx = fiber(deepcopy(spectral_info_input))
 | 
			
		||||
 | 
			
		||||
    assert_allclose(spectral_info_output.nli, spectral_info_output_approx.nli, rtol=1e-1)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ SERVICE_FILENAME = DATA_DIR / 'testTopology_services_expected.json'
 | 
			
		||||
 | 
			
		||||
grid = 0.00625e12
 | 
			
		||||
slot = 0.0125e12
 | 
			
		||||
guardband = 0.15e12
 | 
			
		||||
guardband = 25.0e9
 | 
			
		||||
cband_freq_min = 191.3e12
 | 
			
		||||
cband_freq_max = 196.1e12
 | 
			
		||||
 | 
			
		||||
@@ -101,14 +101,15 @@ def test_wrong_values(nval, mval, setup):
 | 
			
		||||
def test_aligned(nmin, nmax, setup):
 | 
			
		||||
    """Checks that the OMS grid is correctly aligned
 | 
			
		||||
 | 
			
		||||
    Note that bitmap index uses guardband on both ends so that if nmin, nmax = -200, +200,
 | 
			
		||||
    Note that bitmap index uses guardband on both ends so that if center frequencies nmin, nmax = -200, +200,
 | 
			
		||||
    min/max navalue in bitmap are -224, +223, which makes 223 -(-224) +1 frequencies.
 | 
			
		||||
    """
 | 
			
		||||
    network, oms_list = setup
 | 
			
		||||
    nguard = guardband / grid
 | 
			
		||||
    center = 193.1e12
 | 
			
		||||
    freq_min = center + nmin * grid
 | 
			
		||||
    freq_max = center + nmax * grid
 | 
			
		||||
    # amplification band
 | 
			
		||||
    freq_min = center + nmin * grid - guardband
 | 
			
		||||
    freq_max = center + nmax * grid + guardband
 | 
			
		||||
    random_oms = oms_list[10]
 | 
			
		||||
 | 
			
		||||
    # We're always starting with full C-band
 | 
			
		||||
@@ -116,9 +117,9 @@ def test_aligned(nmin, nmax, setup):
 | 
			
		||||
    assert pytest.approx(nvalue_to_frequency(random_oms.spectrum_bitmap.freq_index_max) * 1e-12, abs=1e-12) == 196.1
 | 
			
		||||
    ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1
 | 
			
		||||
 | 
			
		||||
    # "inner" frequencies, without the guard baand
 | 
			
		||||
    # "inner" frequencies, without the guard band
 | 
			
		||||
    inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard
 | 
			
		||||
    inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1
 | 
			
		||||
    inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard
 | 
			
		||||
    assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min
 | 
			
		||||
    assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max
 | 
			
		||||
    assert inner_n_min == -288
 | 
			
		||||
@@ -136,7 +137,7 @@ def test_aligned(nmin, nmax, setup):
 | 
			
		||||
 | 
			
		||||
    ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1
 | 
			
		||||
    inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard
 | 
			
		||||
    inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1
 | 
			
		||||
    inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard
 | 
			
		||||
    assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min
 | 
			
		||||
    assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max
 | 
			
		||||
 | 
			
		||||
@@ -198,18 +199,20 @@ def test_assign_and_sum(nval1, nval2, setup):
 | 
			
		||||
 | 
			
		||||
def test_bitmap_assignment(setup):
 | 
			
		||||
    """test that a bitmap can be assigned"""
 | 
			
		||||
    network, oms_list = setup
 | 
			
		||||
    _, oms_list = setup
 | 
			
		||||
    random_oms = oms_list[2]
 | 
			
		||||
    random_oms.assign_spectrum(13, 7)
 | 
			
		||||
 | 
			
		||||
    btmp = deepcopy(random_oms.spectrum_bitmap.bitmap)
 | 
			
		||||
    # try a first assignment that must pass
 | 
			
		||||
    spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp)
 | 
			
		||||
    freq_min = nvalue_to_frequency(random_oms.spectrum_bitmap.n_min)
 | 
			
		||||
    freq_max = nvalue_to_frequency(random_oms.spectrum_bitmap.n_max)
 | 
			
		||||
    _ = Bitmap(freq_min, freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp)
 | 
			
		||||
 | 
			
		||||
    # try a wrong assignment that should not pass
 | 
			
		||||
    btmp = btmp[1:-1]
 | 
			
		||||
    with pytest.raises(SpectrumError):
 | 
			
		||||
        spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp)
 | 
			
		||||
        _ = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture()
 | 
			
		||||
@@ -288,6 +291,7 @@ def request_set():
 | 
			
		||||
        'cost': 1,
 | 
			
		||||
        'roll_off': 0.15,
 | 
			
		||||
        'tx_osnr': 38,
 | 
			
		||||
        'tx_power': 0.001,
 | 
			
		||||
        'penalties': {},
 | 
			
		||||
        'min_spacing': 37.5e9,
 | 
			
		||||
        'nb_channel': None,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										156
									
								
								tests/test_trx_mode_params.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								tests/test_trx_mode_params.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,156 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# @Author: Esther Le Rouzic
 | 
			
		||||
# @Date:   2023-09-29
 | 
			
		||||
"""
 | 
			
		||||
@author: esther.lerouzic
 | 
			
		||||
checks all possibilities of this function
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from gnpy.core.equipment import trx_mode_params
 | 
			
		||||
from gnpy.core.exceptions import EquipmentConfigError
 | 
			
		||||
from gnpy.tools.json_io import load_equipment, load_json, _equipment_from_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_DIR = Path(__file__).parent
 | 
			
		||||
EQPT_LIBRARY_NAME = TEST_DIR / 'data/eqpt_config.json'
 | 
			
		||||
NETWORK_FILE_NAME = TEST_DIR / 'data/testTopology_expected.json'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('trx_type, trx_mode, error_message, no_error, expected_result',
 | 
			
		||||
    [('', '', False, True, "SI"),
 | 
			
		||||
     ('', '', True, False, 'Could not find transponder "" in equipment library'),
 | 
			
		||||
     ('vendorA_trx-type1', '', True, False,
 | 
			
		||||
      'Could not find transponder "vendorA_trx-type1" with mode "" in equipment library'),
 | 
			
		||||
     ('vendorA_trx-type1', '', False, True, "SI"),
 | 
			
		||||
     ('', 'mode 1', True, False, 'Could not find transponder "" in equipment library'),
 | 
			
		||||
     ('', 'mode 1', False, True, "SI"),
 | 
			
		||||
     ('vendorA_trx-type1', 'mode 2', True, True, 'mode 2'),
 | 
			
		||||
     ('vendorA_trx-type1', 'mode 2', False, True, 'mode 2'),
 | 
			
		||||
     ('wrong type', '', True, False, 'Could not find transponder "wrong type" in equipment library'),
 | 
			
		||||
     ('wrong type', '', False, True, 'SI'),
 | 
			
		||||
     ('vendorA_trx-type1', 'wrong mode', True, False,
 | 
			
		||||
      'Could not find transponder "vendorA_trx-type1" with mode "wrong mode" in equipment library'),
 | 
			
		||||
     ('vendorA_trx-type1', 'wrong mode', False, True, 'SI'),
 | 
			
		||||
     ('wrong type', 'wrong mode', True, False, 'Could not find transponder "wrong type" in equipment library'),
 | 
			
		||||
     ('wrong type', 'wrong mode', False, True, 'SI'),
 | 
			
		||||
     ('vendorA_trx-type1', None, True, True, 'None'),
 | 
			
		||||
     ('vendorA_trx-type1', None, False, True, 'None'),
 | 
			
		||||
     (None, None, True, False, 'Could not find transponder "None" in equipment library'),
 | 
			
		||||
     (None, None, False, True, 'SI'),
 | 
			
		||||
     (None, 'mode 2', True, False, 'Could not find transponder "None" in equipment library'),
 | 
			
		||||
     (None, 'mode 2', False, True, 'SI'),
 | 
			
		||||
     ])
 | 
			
		||||
def test_trx_mode_params(trx_type, trx_mode, error_message, no_error, expected_result):
 | 
			
		||||
    """Checks all combinations of trx_type and mode
 | 
			
		||||
    """
 | 
			
		||||
    possible_results = {}
 | 
			
		||||
    possible_results["SI"] = {
 | 
			
		||||
        'OSNR': None,
 | 
			
		||||
        'baud_rate': 32000000000.0,
 | 
			
		||||
        'bit_rate': None,
 | 
			
		||||
        'cost': None,
 | 
			
		||||
        'equalization_offset_db': 0,
 | 
			
		||||
        'f_max': 196100000000000.0,
 | 
			
		||||
        'f_min': 191300000000000.0,
 | 
			
		||||
        'min_spacing': None,
 | 
			
		||||
        'penalties': {},
 | 
			
		||||
        'roll_off': 0.15,
 | 
			
		||||
        'spacing': 50000000000.0,
 | 
			
		||||
        'tx_osnr': 100,
 | 
			
		||||
    }
 | 
			
		||||
    possible_results["mode 2"] = {
 | 
			
		||||
        'format': 'mode 2',
 | 
			
		||||
        'baud_rate': 64e9,
 | 
			
		||||
        'OSNR': 15,
 | 
			
		||||
        'bit_rate': 200e9,
 | 
			
		||||
        'roll_off': 0.15,
 | 
			
		||||
        'tx_osnr': 100,
 | 
			
		||||
        'equalization_offset_db': 0,
 | 
			
		||||
        'min_spacing': 75e9,
 | 
			
		||||
        'f_max': 196100000000000.0,
 | 
			
		||||
        'f_min': 191350000000000.0,
 | 
			
		||||
        'penalties': {},
 | 
			
		||||
        'cost': 1
 | 
			
		||||
    }
 | 
			
		||||
    possible_results["None"] = {
 | 
			
		||||
        'format': 'undetermined',
 | 
			
		||||
        'baud_rate': None,
 | 
			
		||||
        'OSNR': None,
 | 
			
		||||
        'bit_rate': None,
 | 
			
		||||
        'roll_off': None,
 | 
			
		||||
        'tx_osnr': None,
 | 
			
		||||
        'equalization_offset_db': 0,
 | 
			
		||||
        'min_spacing': None,
 | 
			
		||||
        'f_max': 196100000000000.0,
 | 
			
		||||
        'f_min': 191350000000000.0,
 | 
			
		||||
        'penalties': None,
 | 
			
		||||
        'cost': None
 | 
			
		||||
    }
 | 
			
		||||
    equipment = load_equipment(EQPT_LIBRARY_NAME)
 | 
			
		||||
    if no_error:
 | 
			
		||||
        trx_params = trx_mode_params(equipment, trx_type, trx_mode, error_message)
 | 
			
		||||
        print(trx_params)
 | 
			
		||||
        assert trx_params == possible_results[expected_result]
 | 
			
		||||
    else:
 | 
			
		||||
        with pytest.raises(EquipmentConfigError, match=expected_result):
 | 
			
		||||
            _ = trx_mode_params(equipment, trx_type, trx_mode, error_message)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize('baudrate, spacing, error_message',
 | 
			
		||||
    [(60e9, 50e9, 'Inconsistency in equipment library:\n Transponder "vendorB_trx-type1" mode "wrong mode" '
 | 
			
		||||
                  + 'has baud rate 60.00 GHz greater than min_spacing 50.00.'),
 | 
			
		||||
     (32e9, 50, 'Inconsistency in equipment library:\n Transponder "vendorB_trx-type1" mode "wrong mode" '
 | 
			
		||||
                + 'has baud rate 32.00 GHz greater than min_spacing 0.00.')])
 | 
			
		||||
def test_wrong_baudrate_spacing(baudrate, spacing, error_message):
 | 
			
		||||
    """Checks wrong values for baudrate and spacing correctly raise an error
 | 
			
		||||
    """
 | 
			
		||||
    json_data = load_json(EQPT_LIBRARY_NAME)
 | 
			
		||||
    wrong_transceiver = {
 | 
			
		||||
        'type_variety': 'vendorB_trx-type1',
 | 
			
		||||
        'frequency': {
 | 
			
		||||
            'min': 191.35e12,
 | 
			
		||||
            'max': 196.1e12
 | 
			
		||||
        },
 | 
			
		||||
        'mode': [{
 | 
			
		||||
            'format': 'PS_SP64_1',
 | 
			
		||||
            'baud_rate': 32e9,
 | 
			
		||||
            'OSNR': 11,
 | 
			
		||||
            'bit_rate': 100e9,
 | 
			
		||||
            'roll_off': 0.15,
 | 
			
		||||
            'tx_osnr': 100,
 | 
			
		||||
            'min_spacing': 50e9,
 | 
			
		||||
            'cost': 1,
 | 
			
		||||
            'penalties': [{
 | 
			
		||||
                'chromatic_dispersion': 80000,
 | 
			
		||||
                'penalty_value': 0.5
 | 
			
		||||
            }, {
 | 
			
		||||
                'pmd': 120,
 | 
			
		||||
                'penalty_value': 0.5}],
 | 
			
		||||
            'equalization_offset_db': 0
 | 
			
		||||
        }, {
 | 
			
		||||
            'format': 'wrong mode',
 | 
			
		||||
            'baud_rate': baudrate,
 | 
			
		||||
            'OSNR': 11,
 | 
			
		||||
            'bit_rate': 100e9,
 | 
			
		||||
            'roll_off': 0.15,
 | 
			
		||||
            'tx_osnr': 40,
 | 
			
		||||
            'min_spacing': spacing,
 | 
			
		||||
            'cost': 1,
 | 
			
		||||
            'penalties': [{
 | 
			
		||||
                'chromatic_dispersion': 80000,
 | 
			
		||||
                'penalty_value': 0.5
 | 
			
		||||
            }, {
 | 
			
		||||
                'pmd': 120,
 | 
			
		||||
                'penalty_value': 0.5}],
 | 
			
		||||
            'equalization_offset_db': 0}]
 | 
			
		||||
    }
 | 
			
		||||
    json_data['Transceiver'].append(wrong_transceiver)
 | 
			
		||||
    equipment = _equipment_from_json(json_data, EQPT_LIBRARY_NAME)
 | 
			
		||||
 | 
			
		||||
    with pytest.raises(EquipmentConfigError, match=error_message):
 | 
			
		||||
        _ = trx_mode_params(equipment, 'vendorB_trx-type1', 'wrong mode', error_message=False)
 | 
			
		||||
							
								
								
									
										10
									
								
								tox.ini
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								tox.ini
									
									
									
									
									
								
							@@ -2,9 +2,8 @@
 | 
			
		||||
skipsdist = True
 | 
			
		||||
 | 
			
		||||
[testenv]
 | 
			
		||||
extras = tests
 | 
			
		||||
deps =
 | 
			
		||||
	-r{toxinidir}/requirements.txt
 | 
			
		||||
	-r{toxinidir}/tests/requirements.txt
 | 
			
		||||
	cover: pytest-cov
 | 
			
		||||
	linters: flake8
 | 
			
		||||
	linters: pep8-naming
 | 
			
		||||
@@ -22,9 +21,8 @@ commands =
 | 
			
		||||
	python -m build
 | 
			
		||||
 | 
			
		||||
[testenv:docs]
 | 
			
		||||
deps =
 | 
			
		||||
	-r{toxinidir}/docs/requirements.txt
 | 
			
		||||
whitelist_externals =
 | 
			
		||||
extras = docs
 | 
			
		||||
allowlist_externals =
 | 
			
		||||
	/bin/sh
 | 
			
		||||
commands =
 | 
			
		||||
	sphinx-build -E -W --keep-going -q -b html docs/ doc/build/html
 | 
			
		||||
@@ -35,7 +33,7 @@ commands =
 | 
			
		||||
	flake8 {posargs}
 | 
			
		||||
 | 
			
		||||
[testenv:linters-diff-ci]
 | 
			
		||||
whitelist_externals = bash
 | 
			
		||||
allowlist_externals = bash
 | 
			
		||||
commands =
 | 
			
		||||
	flake8 {posargs} --format html --htmldir linters --exit-zero
 | 
			
		||||
	bash -c "git diff -U0 origin/$(git rev-parse --abbrev-ref HEAD) | flake8 --diff {posargs}"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user