mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2025-10-30 17:47:50 +00:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b6f8c60cf | ||
|
|
3a733b1fd5 | ||
|
|
2d68b94a46 | ||
|
|
bc71823bd0 | ||
|
|
5481b93728 | ||
|
|
05e301182d | ||
|
|
47c89626e3 | ||
|
|
7a032a63b5 | ||
|
|
f195d5f496 | ||
|
|
56569f866f | ||
|
|
bf1f293043 | ||
|
|
28871c6f2d | ||
|
|
d7c1a6b75e | ||
|
|
c69c2a3af2 | ||
|
|
fb29d72906 | ||
|
|
30a06da6b1 | ||
|
|
139c8cc1e7 | ||
|
|
7034d4c686 | ||
|
|
10164495b9 | ||
|
|
87211b35e9 | ||
|
|
e9f9ddb4d6 | ||
|
|
8ea13bb4d6 | ||
|
|
b45829d2df | ||
|
|
6ac3a517cf | ||
|
|
2f2920a716 | ||
|
|
07fd89351b | ||
|
|
7c60b000b5 | ||
|
|
537eb017b5 | ||
|
|
9c514e8086 | ||
|
|
78efb6c650 | ||
|
|
3510d59250 | ||
|
|
41d9d156a6 | ||
|
|
e9d5e748e4 | ||
|
|
5a5bed56c2 | ||
|
|
22de1b1281 | ||
|
|
73e1485b47 | ||
|
|
22ee05ea6f | ||
|
|
31824f318d | ||
|
|
b0cb604e91 | ||
|
|
79102e283a | ||
|
|
db5e63d51b | ||
|
|
af42699133 | ||
|
|
4ba77d0a0a | ||
|
|
064d3af8e0 | ||
|
|
4ab5bac45f | ||
|
|
bbe5fb7821 | ||
|
|
edf1eec072 | ||
|
|
88ac41f721 | ||
|
|
c20e6fb320 | ||
|
|
05500c7047 | ||
|
|
86a39f4b5e | ||
|
|
2b25609255 | ||
|
|
7e0b95bcfd | ||
|
|
f0a52dcc8a | ||
|
|
3bea4b3c9f | ||
|
|
f2cc9f7225 | ||
|
|
e79f9f51b6 | ||
|
|
7fd7f94efe | ||
|
|
0acdf9d9f6 | ||
|
|
a3edb20142 | ||
|
|
33cc11b85c | ||
|
|
5d079ab261 | ||
|
|
a3b1157e38 | ||
|
|
70731b64d6 | ||
|
|
4ea0180caf | ||
|
|
eb2363a3d4 | ||
|
|
41b94cc888 | ||
|
|
1eeb6a0583 | ||
|
|
215c20e245 | ||
|
|
76e9146043 | ||
|
|
2a07eec966 | ||
|
|
cc994bf118 | ||
|
|
37e70e622c | ||
|
|
7d9a508955 | ||
|
|
185adabd77 |
35
.github/workflows/main.yml
vendored
35
.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 }}
|
||||
@@ -29,7 +29,8 @@ jobs:
|
||||
- py38
|
||||
- py39
|
||||
- py310
|
||||
- py311-cover
|
||||
- py311
|
||||
- py312-cover
|
||||
include:
|
||||
- tox_env: docs
|
||||
dnf_install: graphviz
|
||||
@@ -46,7 +47,7 @@ jobs:
|
||||
- uses: actions/setup-python@v4
|
||||
name: Install Python
|
||||
with:
|
||||
python-version: '3.11'
|
||||
python-version: '3.12'
|
||||
- uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95
|
||||
with:
|
||||
password: ${{ secrets.PYPI_API_TOKEN }}
|
||||
@@ -105,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
|
||||
@@ -116,5 +116,30 @@ jobs:
|
||||
python_version: "3.10"
|
||||
- os: windows-2022
|
||||
python_version: "3.11"
|
||||
- os: windows-2022
|
||||
python_version: "3.12"
|
||||
- os: macos-12
|
||||
python_version: "3.11"
|
||||
- os: macos-13
|
||||
python_version: "3.12"
|
||||
|
||||
paywalled-platforms:
|
||||
name: Tests on paywalled platforms
|
||||
if: github.repository_owner == 'Telecominfraproject'
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python_version }}
|
||||
- run: |
|
||||
pip install --editable .[tests]
|
||||
pytest -vv
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: macos-13-xlarge # Apple M1 CPU
|
||||
python_version: "3.12"
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
version: 2
|
||||
build:
|
||||
image: latest
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.12"
|
||||
|
||||
python:
|
||||
version: 3.8
|
||||
requirements_file: docs/requirements.txt
|
||||
install:
|
||||
- method: pip
|
||||
path: .
|
||||
extra_requirements:
|
||||
- docs
|
||||
|
||||
sphinx:
|
||||
configuration: docs/conf.py
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
[](https://github.com/Telecominfraproject/oopt-gnpy/graphs/contributors)
|
||||
[](https://codecov.io/gh/Telecominfraproject/oopt-gnpy)
|
||||
[](https://doi.org/10.5281/zenodo.3458319)
|
||||
[](https://matrix.to/#/%23oopt-gnpy%3Afoss.wtf?via=matrix.org&via=foss.wtf)
|
||||
[](https://matrix.to/#/%23oopt-gnpy%3Amatrix.org?via=matrix.org)
|
||||
|
||||
GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks.
|
||||
We are a consortium of operators, vendors, and academic researchers sponsored via the [Telecom Infra Project](http://telecominfraproject.com)'s [OOPT/PSE](https://telecominfraproject.com/open-optical-packet-transport) working group.
|
||||
|
||||
@@ -1848,3 +1848,15 @@ month={Sept},}
|
||||
title = {Telecom Infra Project},
|
||||
url = {https://www.telecominfraproject.com},
|
||||
}
|
||||
|
||||
@ARTICLE{DAmicoJLT2022,
|
||||
author={D’Amico, Andrea and Correia, Bruno and London, Elliot and Virgillito,
|
||||
Emanuele and Borraccini, Giacomo and Napoli, Antonio and Curri, Vittorio},
|
||||
journal={Journal of Lightwave Technology},
|
||||
title={Scalable and Disaggregated GGN Approximation Applied to a C+L+S Optical Network},
|
||||
year={2022},
|
||||
volume={40},
|
||||
number={11},
|
||||
pages={3499-3511},
|
||||
doi={10.1109/JLT.2022.3162134}
|
||||
}
|
||||
|
||||
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'
|
||||
|
||||
|
||||
@@ -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
|
||||
==================
|
||||
|
||||
178
docs/json.rst
178
docs/json.rst
@@ -61,40 +61,69 @@ Fiber
|
||||
|
||||
The fiber library currently describes SSMF and NZDF but additional fiber types can be entered by the user following the same model:
|
||||
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| field | type | description |
|
||||
+======================+===========+==========================================+
|
||||
| ``type_variety`` | (string) | a unique name to ID the fiber in the |
|
||||
| | | JSON or Excel template topology input |
|
||||
| | | file |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``dispersion`` | (number) | In :math:`s \times m^{-1} \times m^{-1}`.|
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``dispersion_slope`` | (number) | In :math:`s \times m^{-1} \times m^{-1} |
|
||||
| | | \times m^{-1}` |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``effective_area`` | (number) | Effective area of the fiber (not just |
|
||||
| | | the MFD circle). This is the |
|
||||
| | | :math:`A_{eff}`, see e.g., the |
|
||||
| | | `Corning whitepaper on MFD/EA`_. |
|
||||
| | | Specified in :math:`m^{2}`. |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``gamma`` | (number) | Coefficient :math:`\gamma = 2\pi\times |
|
||||
| | | n^2/(\lambda*A_{eff})`. |
|
||||
| | | If not provided, this will be derived |
|
||||
| | | from the ``effective_area`` |
|
||||
| | | :math:`A_{eff}`. |
|
||||
| | | In :math:`w^{-1} \times m^{-1}`. |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``pmd_coef`` | (number) | Polarization mode dispersion (PMD) |
|
||||
| | | coefficient. In |
|
||||
| | | :math:`s\times\sqrt{m}^{-1}`. |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
| ``lumped_losses`` | (array) | Places along the fiber length with extra |
|
||||
| | | losses. Specified as a loss in dB at |
|
||||
| | | each relevant position (in km): |
|
||||
| | | ``{"position": 10, "loss": 1.5}``) |
|
||||
+----------------------+-----------+------------------------------------------+
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| field | type | description |
|
||||
+==============================+=================+================================================+
|
||||
| ``type_variety`` | (string) | a unique name to ID the fiber in the |
|
||||
| | | JSON or Excel template topology input |
|
||||
| | | file |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``dispersion`` | (number) | In :math:`s \times m^{-1} \times m^{-1}`. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``dispersion_slope`` | (number) | In :math:`s \times m^{-1} \times m^{-1} |
|
||||
| | | \times m^{-1}` |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``dispersion_per_frequency`` | (dict) | Dictionary of dispersion values evaluated at |
|
||||
| | | various frequencies, as follows: |
|
||||
| | | ``{"value": [], "frequency": []}``. |
|
||||
| | | ``value`` in |
|
||||
| | | :math:`s \times m^{-1} \times m^{-1}` and |
|
||||
| | | ``frequency`` in Hz. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``effective_area`` | (number) | Effective area of the fiber (not just |
|
||||
| | | the MFD circle). This is the |
|
||||
| | | :math:`A_{eff}`, see e.g., the |
|
||||
| | | `Corning whitepaper on MFD/EA`_. |
|
||||
| | | Specified in :math:`m^{2}`. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``gamma`` | (number) | Coefficient :math:`\gamma = 2\pi\times |
|
||||
| | | n^2/(\lambda*A_{eff})`. |
|
||||
| | | If not provided, this will be derived |
|
||||
| | | from the ``effective_area`` |
|
||||
| | | :math:`A_{eff}`. |
|
||||
| | | In :math:`w^{-1} \times m^{-1}`. |
|
||||
| | | This quantity is evaluated at the |
|
||||
| | | reference frequency and it is scaled |
|
||||
| | | along frequency accordingly to the |
|
||||
| | | effective area scaling. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``pmd_coef`` | (number) | Polarization mode dispersion (PMD) |
|
||||
| | | coefficient. In |
|
||||
| | | :math:`s\times\sqrt{m}^{-1}`. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``lumped_losses`` | (array) | Places along the fiber length with extra |
|
||||
| | | losses. Specified as a loss in dB at |
|
||||
| | | each relevant position (in km): |
|
||||
| | | ``{"position": 10, "loss": 1.5}``) |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
| ``raman_coefficient`` | (dict) | The fundamental parameter that describes |
|
||||
| | | the regulation of the power transfer |
|
||||
| | | between channels during fiber propagation |
|
||||
| | | is the Raman gain coefficient (see |
|
||||
| | | :cite:`DAmicoJLT2022` for further |
|
||||
| | | details); :math:`f_{ref}` represents the |
|
||||
| | | pump reference frequency used for the |
|
||||
| | | Raman gain coefficient profile |
|
||||
| | | measurement ("reference_frequency"), |
|
||||
| | | :math:`\Delta f` is the frequency shift |
|
||||
| | | between the pump and the specific Stokes |
|
||||
| | | wave, the Raman gain coefficient |
|
||||
| | | in terms of optical power |
|
||||
| | | :math:`g_0`, expressed in |
|
||||
| | | :math:`1/(m\;W)`. |
|
||||
| | | Default values measured for a SSMF are |
|
||||
| | | considered when not specified. |
|
||||
+------------------------------+-----------------+------------------------------------------------+
|
||||
|
||||
.. _Corning whitepaper on MFD/EA: https://www.corning.com/microsites/coc/oem/documents/specialty-fiber/WP7071-Mode-Field-Diam-and-Eff-Area.pdf
|
||||
|
||||
@@ -151,25 +180,60 @@ used to determine the service list path feasibility when running the
|
||||
|
||||
The modes are defined as follows:
|
||||
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| field | type | description |
|
||||
+======================+===========+=========================================+
|
||||
| ``format`` | (string) | a unique name to ID the mode |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``baud_rate`` | (number) | in Hz |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``OSNR`` | (number) | min required OSNR in 0.1nm (dB) |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``bit_rate`` | (number) | in bit/s |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``roll_off`` | (number) | Pure number between 0 and 1. TX signal |
|
||||
| | | roll-off shape. Used by Raman-aware |
|
||||
| | | simulation code. |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``tx_osnr`` | (number) | In dB. OSNR out from transponder. |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
| ``cost`` | (number) | Arbitrary unit |
|
||||
+----------------------+-----------+-----------------------------------------+
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| field | type | description |
|
||||
+============================+===========+=========================================+
|
||||
| ``format`` | (string) | a unique name to ID the mode |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``baud_rate`` | (number) | in Hz |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``OSNR`` | (number) | min required OSNR in 0.1nm (dB) |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``bit_rate`` | (number) | in bit/s |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``roll_off`` | (number) | Pure number between 0 and 1. TX signal |
|
||||
| | | roll-off shape. Used by Raman-aware |
|
||||
| | | simulation code. |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``tx_osnr`` | (number) | In dB. OSNR out from transponder. |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``equalization_offset_db`` | (number) | In dB. Deviation from the per channel |
|
||||
| | | equalization target in ROADM for this |
|
||||
| | | type of transceiver. |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``penalties`` | (list) | list of impairments as described in |
|
||||
| | | impairment table. |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
| ``cost`` | (number) | Arbitrary unit |
|
||||
+----------------------------+-----------+-----------------------------------------+
|
||||
|
||||
Penalties are linearly interpolated between given points and set to 'inf' outside interval.
|
||||
The accumulated penalties are substracted to the path GSNR before comparing with the min required OSNR.
|
||||
The penalties per impairment type are defined as a list of dict (impairment type - penalty values) as follows:
|
||||
|
||||
+-----------------------------+-----------+-----------------------------------------------+
|
||||
| field | type | description |
|
||||
+=============================+===========+===============================================+
|
||||
| ``chromatic_dispersion`` or | (number) | In ps/nm/. Value of chromatic dispersion. |
|
||||
| ``pdl`` or | | In dB. Value of polarization dependant loss. |
|
||||
| ``pmd`` | (string) | In ps. Value of polarization mode dispersion. |
|
||||
+-----------------------------+-----------+-----------------------------------------------+
|
||||
| ``penalty_value`` | (number) | in dB. Penalty on the transceiver min OSNR |
|
||||
| | | corresponding to the impairment level |
|
||||
+-----------------------------+-----------+-----------------------------------------------+
|
||||
|
||||
for example:
|
||||
|
||||
.. code-block:: json
|
||||
|
||||
"penalties": [{
|
||||
"chromatic_dispersion": 360000,
|
||||
"penalty_value": 0.5
|
||||
}, {
|
||||
"pmd": 110,
|
||||
"penalty_value": 0.5
|
||||
}
|
||||
]
|
||||
|
||||
ROADM
|
||||
~~~~~
|
||||
@@ -412,6 +476,11 @@ SpectralInformation
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
GNPy requires a description of all channels that are propagated through the network.
|
||||
|
||||
This block defines a reference channel (target input power in spans, nb of channels) which is used to design the network or correct the settings.
|
||||
It may be updated with different options --power.
|
||||
It also defines the channels to be propagated for the gnpy-transmission-example script unless a different definition is provided with ``--spectrum`` option.
|
||||
|
||||
Flexgrid channel partitioning is available since the 2.7 release via the extra ``--spectrum`` option.
|
||||
In the simplest case, homogeneous channel allocation can be defined via the ``SpectralInformation`` construct which defines a spectrum of N identical carriers:
|
||||
|
||||
@@ -434,7 +503,8 @@ In the simplest case, homogeneous channel allocation can be defined via the ``Sp
|
||||
+----------------------+-----------+-------------------------------------------+
|
||||
| ``tx_osnr`` | (number) | In dB. OSNR out from transponder. |
|
||||
+----------------------+-----------+-------------------------------------------+
|
||||
| ``power_dbm`` | (number) | Reference channel power, in dBm. |
|
||||
| ``power_dbm`` | (number) | In dBm. Target input power in spans to |
|
||||
| | | be considered for the design |
|
||||
| | | In gain mode |
|
||||
| | | (see spans/power_mode = false), if no |
|
||||
| | | gain is set in an amplifier, auto-design |
|
||||
|
||||
@@ -126,9 +126,9 @@ that can be easily evaluated extending the FWM theory from a set of discrete
|
||||
tones - the standard FWM theory introduced back in the 90s by Inoue
|
||||
:cite:`Innoue-FWM`- to a continuity of tones, possibly spectrally shaped.
|
||||
Signals propagating in the fiber are not equivalent to Gaussian noise, but
|
||||
thanks to the absence of in-line compensation for choromatic dispersion, the
|
||||
thanks to the absence of in-line compensation for chromatic dispersion, the
|
||||
become so, over short distances. So, the Gaussian noise model with incoherent
|
||||
accumulation of NLI has estensively proved to be a quick yet accurate and
|
||||
accumulation of NLI has extensively proved to be a quick yet accurate and
|
||||
conservative tool to estimate propagation impairments of fiber propagation.
|
||||
Note that the GN-model has not been derived with the aim of an *exact*
|
||||
performance estimation, but to pursue a conservative performance prediction.
|
||||
|
||||
96
docs/release-notes.rst
Normal file
96
docs/release-notes.rst
Normal file
@@ -0,0 +1,96 @@
|
||||
.. _release-notes:
|
||||
|
||||
Release change log
|
||||
==================
|
||||
|
||||
Each release introduces some changes and new features.
|
||||
|
||||
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**: Chromatic dispersion, effective area, Raman Gain coefficient,
|
||||
and nonlinear coefficient can now be defined with a scaling along 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
|
||||
@@ -1,8 +1,8 @@
|
||||
'''
|
||||
"""
|
||||
GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks. It is based on the Gaussian Noise Model.
|
||||
|
||||
Signal propagation is implemented in :py:mod:`.core`.
|
||||
Path finding and spectrum assignment is in :py:mod:`.topology`.
|
||||
Various tools and auxiliary code, including the JSON I/O handling, is in
|
||||
:py:mod:`.tools`.
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
'''
|
||||
"""
|
||||
Simulation of signal propagation in the DWDM network
|
||||
|
||||
Optical signals, as defined via :class:`.info.SpectralInformation`, enter
|
||||
@@ -6,4 +6,4 @@ Optical signals, as defined via :class:`.info.SpectralInformation`, enter
|
||||
through the :py:mod:`.network`.
|
||||
The simulation is controlled via :py:mod:`.parameters` and implemented mainly
|
||||
via :py:mod:`.science_utils`.
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.core.ansi_escapes
|
||||
======================
|
||||
|
||||
A random subset of ANSI terminal escape codes for colored messages
|
||||
'''
|
||||
"""
|
||||
|
||||
red = '\x1b[1;31;40m'
|
||||
blue = '\x1b[1;34;40m'
|
||||
|
||||
@@ -26,7 +26,7 @@ from scipy.constants import h, c
|
||||
from scipy.interpolate import interp1d
|
||||
from collections import namedtuple
|
||||
from typing import Union
|
||||
|
||||
from logging import getLogger
|
||||
|
||||
from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \
|
||||
watt2dbm, psd2powerdbm
|
||||
@@ -36,17 +36,20 @@ from gnpy.core.info import SpectralInformation, ReferenceCarrier
|
||||
from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError
|
||||
|
||||
|
||||
_logger = getLogger(__name__)
|
||||
|
||||
|
||||
class Location(namedtuple('Location', 'latitude longitude city region')):
|
||||
def __new__(cls, latitude=0, longitude=0, city=None, region=None):
|
||||
return super().__new__(cls, latitude, longitude, city, region)
|
||||
|
||||
|
||||
class _Node:
|
||||
'''Convenience class for providing common functionality of all network elements
|
||||
"""Convenience class for providing common functionality of all network elements
|
||||
|
||||
This class is just an internal implementation detail; do **not** assume that all network elements
|
||||
inherit from :class:`_Node`.
|
||||
'''
|
||||
"""
|
||||
def __init__(self, uid, name=None, params=None, metadata=None, operational=None, type_variety=None):
|
||||
if name is None:
|
||||
name = uid
|
||||
@@ -87,12 +90,13 @@ class Transceiver(_Node):
|
||||
self.chromatic_dispersion = None
|
||||
self.pmd = None
|
||||
self.pdl = None
|
||||
self.latency = None
|
||||
self.penalties = {}
|
||||
self.total_penalty = 0
|
||||
self.propagated_labels = [""]
|
||||
|
||||
def _calc_cd(self, spectral_info):
|
||||
""" Updates the Transceiver property with the CD of the received channels. CD in ps/nm.
|
||||
"""Updates the Transceiver property with the CD of the received channels. CD in ps/nm.
|
||||
"""
|
||||
self.chromatic_dispersion = spectral_info.chromatic_dispersion * 1e3
|
||||
|
||||
@@ -106,6 +110,11 @@ class Transceiver(_Node):
|
||||
"""
|
||||
self.pdl = spectral_info.pdl
|
||||
|
||||
def _calc_latency(self, spectral_info):
|
||||
"""Updates the Transceiver property with the latency of the received channels. Latency in ms.
|
||||
"""
|
||||
self.latency = spectral_info.latency * 1e3
|
||||
|
||||
def _calc_penalty(self, impairment_value, boundary_list):
|
||||
return interp(impairment_value, boundary_list['up_to_boundary'], boundary_list['penalty_value'],
|
||||
left=float('inf'), right=float('inf'))
|
||||
@@ -172,6 +181,7 @@ class Transceiver(_Node):
|
||||
f'chromatic_dispersion={self.chromatic_dispersion!r}, '
|
||||
f'pmd={self.pmd!r}, '
|
||||
f'pdl={self.pdl!r}, '
|
||||
f'latency={self.latency!r}, '
|
||||
f'penalties={self.penalties!r})')
|
||||
|
||||
def __str__(self):
|
||||
@@ -185,6 +195,7 @@ class Transceiver(_Node):
|
||||
cd = mean(self.chromatic_dispersion)
|
||||
pmd = mean(self.pmd)
|
||||
pdl = mean(self.pdl)
|
||||
latency = mean(self.latency)
|
||||
|
||||
result = '\n'.join([f'{type(self).__name__} {self.uid}',
|
||||
f' GSNR (0.1nm, dB): {pretty_summary_print(snr_01nm)}',
|
||||
@@ -193,7 +204,8 @@ class Transceiver(_Node):
|
||||
f' OSNR ASE (signal bw, dB): {pretty_summary_print(osnr_ase)}',
|
||||
f' CD (ps/nm): {cd:.2f}',
|
||||
f' PMD (ps): {pmd:.2f}',
|
||||
f' PDL (dB): {pdl:.2f}'])
|
||||
f' PDL (dB): {pdl:.2f}',
|
||||
f' Latency (ms): {latency:.2f}'])
|
||||
|
||||
cd_penalty = self.penalties.get('chromatic_dispersion')
|
||||
if cd_penalty is not None:
|
||||
@@ -212,6 +224,7 @@ class Transceiver(_Node):
|
||||
self._calc_cd(spectral_info)
|
||||
self._calc_pmd(spectral_info)
|
||||
self._calc_pdl(spectral_info)
|
||||
self._calc_latency(spectral_info)
|
||||
return spectral_info
|
||||
|
||||
|
||||
@@ -222,7 +235,8 @@ class Roadm(_Node):
|
||||
try:
|
||||
super().__init__(*args, params=RoadmParams(**params), **kwargs)
|
||||
except ParametersError as e:
|
||||
raise ParametersError(f'Config error in {kwargs["uid"]}: {e}') from e
|
||||
msg = f'Config error in {kwargs["uid"]}: {e}'
|
||||
raise ParametersError(msg) from e
|
||||
|
||||
# Target output power for the reference carrier, can only be computed on the fly, because it depends
|
||||
# on the path, since it depends on the equalization definition on the degree.
|
||||
@@ -244,6 +258,8 @@ 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
|
||||
|
||||
@property
|
||||
def to_json(self):
|
||||
@@ -288,8 +304,7 @@ class Roadm(_Node):
|
||||
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
|
||||
@@ -311,22 +326,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
|
||||
@@ -336,9 +351,11 @@ class Roadm(_Node):
|
||||
return self.per_degree_pch_out_dbm[degree]
|
||||
elif degree in self.per_degree_pch_psd:
|
||||
return psd2powerdbm(self.per_degree_pch_psd[degree], spectral_info.baud_rate)
|
||||
elif degree in self.per_degree_pch_psw:
|
||||
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
|
||||
@@ -349,20 +366,20 @@ class Roadm(_Node):
|
||||
# TODO maybe add a minimum loss for the ROADM
|
||||
|
||||
# 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)
|
||||
self.ref_pch_out_dbm = min(self.ref_pch_in_dbm[from_degree], 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
|
||||
self.ref_effective_loss = self.ref_pch_in_dbm[from_degree] - self.ref_pch_out_dbm
|
||||
input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase
|
||||
target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
|
||||
# Computation of the per channel target power according to equalization policy
|
||||
@@ -391,17 +408,8 @@ class Roadm(_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):
|
||||
"""Update Reference power
|
||||
|
||||
This modifies the spectral info in-place. Only the `pref` is updated with new p_spani,
|
||||
while p_span0 is not changed.
|
||||
"""
|
||||
spectral_info.pref = spectral_info.pref._replace(p_spani=self.ref_pch_out_dbm)
|
||||
|
||||
def __call__(self, spectral_info, degree):
|
||||
self.propagate(spectral_info, degree=degree)
|
||||
self.update_pref(spectral_info)
|
||||
def __call__(self, spectral_info, degree, from_degree):
|
||||
self.propagate(spectral_info, degree=degree, from_degree=from_degree)
|
||||
return spectral_info
|
||||
|
||||
|
||||
@@ -435,13 +443,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
|
||||
|
||||
|
||||
@@ -449,21 +452,14 @@ class Fiber(_Node):
|
||||
def __init__(self, *args, params=None, **kwargs):
|
||||
if not params:
|
||||
params = {}
|
||||
super().__init__(*args, params=FiberParams(**params), **kwargs)
|
||||
try:
|
||||
super().__init__(*args, params=FiberParams(**params), **kwargs)
|
||||
except ParametersError as e:
|
||||
msg = f'Config error in {kwargs["uid"]}: {e}'
|
||||
raise ParametersError(msg) from e
|
||||
self.pch_out_db = None
|
||||
self.passive = True
|
||||
self.propagated_labels = [""]
|
||||
# Raman efficiency matrix function of the delta frequency constructed such that each row is related to a
|
||||
# fixed frequency: positive elements represent a gain (from higher frequency) and negative elements represent
|
||||
# a loss (to lower frequency)
|
||||
if self.params.raman_efficiency:
|
||||
frequency_offset = self.params.raman_efficiency['frequency_offset']
|
||||
frequency_offset = append(-flip(frequency_offset[1:]), frequency_offset)
|
||||
cr = self.params.raman_efficiency['cr']
|
||||
cr = append(- flip(cr[1:]), cr)
|
||||
self._cr_function = lambda frequency: interp(frequency, frequency_offset, cr)
|
||||
else:
|
||||
self._cr_function = lambda frequency: zeros(squeeze(frequency).shape)
|
||||
|
||||
# Lumped losses
|
||||
z_lumped_losses = array([lumped['position'] for lumped in self.params.lumped_losses]) # km
|
||||
@@ -473,6 +469,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):
|
||||
@@ -513,28 +510,39 @@ class Fiber(_Node):
|
||||
f' reference pch out (dBm): {self.pch_out_db:.2f}',
|
||||
f' actual pch out (dBm): {total_pch}'])
|
||||
|
||||
def interpolate_parameter_over_spectrum(self, parameter, ref_frequency, spectrum_frequency, name):
|
||||
try:
|
||||
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(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)}')
|
||||
|
||||
def loss_coef_func(self, frequency):
|
||||
frequency = asarray(frequency)
|
||||
if self.params.loss_coef.size > 1:
|
||||
try:
|
||||
loss_coef = interp1d(self.params.f_loss_ref, self.params.loss_coef)(frequency)
|
||||
except ValueError:
|
||||
raise SpectrumError('The spectrum bandwidth exceeds the frequency interval used to define the fiber '
|
||||
f'loss coefficient in "{type(self).__name__} {self.uid}".'
|
||||
f'\nSpectrum f_min-f_max: {round(frequency[0]*1e-12,2)}-'
|
||||
f'{round(frequency[-1]*1e-12,2)}'
|
||||
f'\nLoss coefficient f_min-f_max: {round(self.params.f_loss_ref[0]*1e-12,2)}-'
|
||||
f'{round(self.params.f_loss_ref[-1]*1e-12,2)}')
|
||||
loss_coef = self.interpolate_parameter_over_spectrum(self.params.loss_coef, self.params.f_loss_ref,
|
||||
frequency, 'Loss Coefficient')
|
||||
else:
|
||||
loss_coef = full(frequency.size, self.params.loss_coef)
|
||||
return squeeze(loss_coef)
|
||||
|
||||
|
||||
@property
|
||||
def loss(self):
|
||||
"""total loss including padding att_in: useful for polymorphism with roadm loss"""
|
||||
return self.loss_coef_func(self.params.ref_frequency) * self.params.length + \
|
||||
self.params.con_in + self.params.con_out + self.params.att_in
|
||||
self.params.con_in + self.params.con_out + self.params.att_in + sum(lin2db(1 / self.lumped_losses))
|
||||
|
||||
def alpha(self, frequency):
|
||||
"""Returns the linear exponent attenuation coefficient such that
|
||||
@@ -545,16 +553,71 @@ class Fiber(_Node):
|
||||
"""
|
||||
return self.loss_coef_func(frequency) / (10 * log10(exp(1)))
|
||||
|
||||
def beta2(self, frequency=None):
|
||||
"""Returns the beta2 chromatic dispersion coefficient as the second order term of the beta function
|
||||
expanded as a Taylor series evaluated at the given frequency
|
||||
|
||||
:param frequency: the frequency at which alpha is computed [Hz]
|
||||
:return: beta2: beta2 chromatic dispersion coefficient for f in frequency # 1/(m * Hz^2)
|
||||
"""
|
||||
frequency = asarray(self.params.ref_frequency if frequency is None else frequency)
|
||||
if self.params.dispersion.size > 1:
|
||||
dispersion = self.interpolate_parameter_over_spectrum(self.params.dispersion, self.params.f_dispersion_ref,
|
||||
frequency, 'Chromatic Dispersion')
|
||||
else:
|
||||
if self.params.dispersion_slope is None:
|
||||
dispersion = (frequency / self.params.f_dispersion_ref) ** 2 * self.params.dispersion
|
||||
else:
|
||||
wavelength = c / frequency
|
||||
dispersion = self.params.dispersion + self.params.dispersion_slope * \
|
||||
(wavelength - c / self.params.f_dispersion_ref)
|
||||
beta2 = -((c / frequency) ** 2 * dispersion) / (2 * pi * c)
|
||||
return beta2
|
||||
|
||||
def beta3(self, frequency=None):
|
||||
"""Returns the beta3 chromatic dispersion coefficient as the third order term of the beta function
|
||||
expanded as a Taylor series evaluated at the given frequency
|
||||
|
||||
:param frequency: the frequency at which alpha is computed [Hz]
|
||||
:return: beta3: beta3 chromatic dispersion coefficient for f in frequency # 1/(m * Hz^3)
|
||||
"""
|
||||
frequency = asarray(self.params.ref_frequency if frequency is None else frequency)
|
||||
if self.params.dispersion.size > 1:
|
||||
beta3 = polyfit(self.params.f_dispersion_ref - self.params.ref_frequency,
|
||||
self.beta2(self.params.f_dispersion_ref), 2)[1] / (2*pi)
|
||||
beta3 = full(frequency.size, beta3)
|
||||
else:
|
||||
if self.params.dispersion_slope is None:
|
||||
beta3 = zeros(frequency.size)
|
||||
else:
|
||||
dispersion_slope = self.params.dispersion_slope
|
||||
beta2 = self.beta2(frequency)
|
||||
beta3 = (dispersion_slope - (4 * pi * frequency ** 3 / c ** 2) * beta2) / (
|
||||
2 * pi * frequency ** 2 / c) ** 2
|
||||
return beta3
|
||||
|
||||
def gamma(self, frequency=None):
|
||||
"""Returns the nonlinear interference coefficient such that
|
||||
:math: `gamma(f) = 2 pi f n_2 c^{-1} A_{eff}^{-1}`
|
||||
|
||||
:param frequency: the frequency at which gamma is computed [Hz]
|
||||
:return: gamma: nonlinear interference coefficient for f in frequency [1/(W m)]
|
||||
"""
|
||||
frequency = self.params.ref_frequency if frequency is None else frequency
|
||||
return self.params.gamma_scaling(frequency)
|
||||
|
||||
def cr(self, frequency):
|
||||
"""Returns the raman efficiency matrix including the vibrational loss
|
||||
"""Returns the raman gain coefficient matrix including the vibrational loss
|
||||
|
||||
:param frequency: the frequency at which cr is computed [Hz]
|
||||
:return: cr: raman efficiency matrix [1 / (W m)]
|
||||
:return: cr: raman gain coefficient matrix [1 / (W m)]
|
||||
"""
|
||||
df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
|
||||
cr = self._cr_function(df)
|
||||
effective_area_overlap = self.params.effective_area_overlap(frequency, frequency)
|
||||
cr = interp(df, self.params.raman_coefficient.frequency_offset,
|
||||
self.params.raman_coefficient.normalized_gamma_raman) * frequency / effective_area_overlap
|
||||
vibrational_loss = outer(frequency, ones(frequency.shape)) / outer(ones(frequency.shape), frequency)
|
||||
return cr * (cr >= 0) + cr * (cr < 0) * vibrational_loss # Raman efficiency [1/(W m)]
|
||||
return cr * (cr >= 0) + cr * (cr < 0) * vibrational_loss # [1/(W m)]
|
||||
|
||||
def chromatic_dispersion(self, freq=None):
|
||||
"""Returns accumulated chromatic dispersion (CD).
|
||||
@@ -563,8 +626,8 @@ class Fiber(_Node):
|
||||
:return: chromatic dispersion: the accumulated dispersion [s/m]
|
||||
"""
|
||||
freq = self.params.ref_frequency if freq is None else freq
|
||||
beta2 = self.params.beta2
|
||||
beta3 = self.params.beta3
|
||||
beta2 = self.beta2(freq)
|
||||
beta3 = self.beta3(freq)
|
||||
ref_f = self.params.ref_frequency
|
||||
length = self.params.length
|
||||
beta = beta2 + 2 * pi * beta3 * (freq - ref_f)
|
||||
@@ -594,6 +657,9 @@ class Fiber(_Node):
|
||||
spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency)
|
||||
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2)
|
||||
|
||||
# latency
|
||||
spectral_info.latency += self.params.latency
|
||||
|
||||
# apply the attenuation due to the fiber losses
|
||||
attenuation_fiber = stimulated_raman_scattering.loss_profile[:, -1]
|
||||
spectral_info.apply_attenuation_lin(attenuation_fiber)
|
||||
@@ -604,21 +670,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
|
||||
|
||||
|
||||
@@ -667,6 +728,9 @@ class RamanFiber(Fiber):
|
||||
spectral_info.chromatic_dispersion += self.chromatic_dispersion(spectral_info.frequency)
|
||||
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.pmd ** 2)
|
||||
|
||||
# latency
|
||||
spectral_info.latency += self.params.latency
|
||||
|
||||
# apply the attenuation due to the fiber losses
|
||||
attenuation_fiber = stimulated_raman_scattering.loss_profile[:spectral_info.number_of_channels, -1]
|
||||
|
||||
@@ -697,12 +761,19 @@ 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.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
|
||||
self.out_voa = self.operational.out_voa
|
||||
self.propagated_labels = [""]
|
||||
@@ -749,9 +820,10 @@ class Edfa(_Node):
|
||||
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}'])
|
||||
|
||||
@@ -779,20 +851,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()
|
||||
@@ -1028,12 +1092,6 @@ 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
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.core.equipment
|
||||
===================
|
||||
|
||||
This module contains functionality for specifying equipment.
|
||||
'''
|
||||
"""
|
||||
|
||||
from gnpy.core.utils import automatic_nch, db2lin
|
||||
from gnpy.core.exceptions import EquipmentConfigError
|
||||
@@ -29,8 +29,11 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
|
||||
trx_params = {**mode_params}
|
||||
# sanity check: spacing baudrate must be smaller than min spacing
|
||||
if trx_params['baud_rate'] > trx_params['min_spacing']:
|
||||
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transpoder "{trx_type_variety}" mode "{trx_params["format"]}" ' +
|
||||
f'has baud rate {trx_params["baud_rate"]*1e-9} GHz greater than min_spacing {trx_params["min_spacing"]*1e-9}.')
|
||||
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}.')
|
||||
trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
|
||||
else:
|
||||
mode_params = {"format": "undetermined",
|
||||
"baud_rate": None,
|
||||
@@ -40,7 +43,8 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
|
||||
"roll_off": None,
|
||||
"tx_osnr": None,
|
||||
"min_spacing": None,
|
||||
"cost": 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']
|
||||
@@ -66,6 +70,7 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
|
||||
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
|
||||
|
||||
|
||||
@@ -27,36 +27,32 @@ class Power(namedtuple('Power', 'signal nli ase')):
|
||||
"""carriers power in W"""
|
||||
|
||||
|
||||
class Channel(namedtuple('Channel',
|
||||
'channel_number frequency baud_rate slot_width roll_off power chromatic_dispersion pmd pdl')):
|
||||
""" Class containing the parameters of a WDM signal.
|
||||
:param channel_number: channel number in the WDM grid
|
||||
:param frequency: central frequency of the signal (Hz)
|
||||
:param baud_rate: the symbol rate of the signal (Baud)
|
||||
:param slot_width: the slot width (Hz)
|
||||
:param roll_off: the roll off of the signal. It is a pure number between 0 and 1
|
||||
:param power (gnpy.core.info.Power): power of signal, ASE noise and NLI (W)
|
||||
:param chromatic_dispersion: chromatic dispersion (s/m)
|
||||
:param pmd: polarization mode dispersion (s)
|
||||
:param pdl: polarization dependent loss (dB)
|
||||
"""
|
||||
class Channel(
|
||||
namedtuple('Channel',
|
||||
'channel_number frequency baud_rate slot_width roll_off power chromatic_dispersion pmd pdl latency')):
|
||||
"""Class containing the parameters of a WDM signal.
|
||||
|
||||
|
||||
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
|
||||
:param channel_number: channel number in the WDM grid
|
||||
:param frequency: central frequency of the signal (Hz)
|
||||
:param baud_rate: the symbol rate of the signal (Baud)
|
||||
:param slot_width: the slot width (Hz)
|
||||
:param roll_off: the roll off of the signal. It is a pure number between 0 and 1
|
||||
:param power (gnpy.core.info.Power): power of signal, ASE noise and NLI (W)
|
||||
:param chromatic_dispersion: chromatic dispersion (s/m)
|
||||
:param pmd: polarization mode dispersion (s)
|
||||
:param pdl: polarization dependent loss (dB)
|
||||
:param latency: propagation latency (s)
|
||||
"""
|
||||
|
||||
|
||||
class SpectralInformation(object):
|
||||
""" Class containing the parameters of the entire WDM comb.
|
||||
"""Class containing the parameters of the entire WDM comb.
|
||||
|
||||
delta_pdb_per_channel: (per frequency) per channel delta power in dbm for the actual mix of channels"""
|
||||
|
||||
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, delta_pdb_per_channel: array,
|
||||
tx_osnr: array, ref_power: Pref, label: array):
|
||||
roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
|
||||
delta_pdb_per_channel: array, tx_osnr: array, label: array):
|
||||
indices = argsort(frequency)
|
||||
self._frequency = frequency[indices]
|
||||
self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
|
||||
@@ -81,20 +77,11 @@ class SpectralInformation(object):
|
||||
self._chromatic_dispersion = chromatic_dispersion[indices]
|
||||
self._pmd = pmd[indices]
|
||||
self._pdl = pdl[indices]
|
||||
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._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
|
||||
@@ -177,6 +164,14 @@ class SpectralInformation(object):
|
||||
def pdl(self, pdl):
|
||||
self._pdl = pdl
|
||||
|
||||
@property
|
||||
def latency(self):
|
||||
return self._latency
|
||||
|
||||
@latency.setter
|
||||
def latency(self, latency):
|
||||
self._latency = latency
|
||||
|
||||
@property
|
||||
def delta_pdb_per_channel(self):
|
||||
return self._delta_pdb_per_channel
|
||||
@@ -200,7 +195,7 @@ class SpectralInformation(object):
|
||||
@property
|
||||
def carriers(self):
|
||||
entries = zip(self.channel_number, self.frequency, self.baud_rate, self.slot_width,
|
||||
self.roll_off, self.powers, self.chromatic_dispersion, self.pmd, self.pdl)
|
||||
self.roll_off, self.powers, self.chromatic_dispersion, self.pmd, self.pdl, self.latency)
|
||||
return [Channel(*entry) for entry in entries]
|
||||
|
||||
def apply_attenuation_lin(self, attenuation_lin):
|
||||
@@ -223,12 +218,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),
|
||||
@@ -239,23 +228,22 @@ class SpectralInformation(object):
|
||||
other.chromatic_dispersion),
|
||||
pmd=append(self.pmd, other.pmd),
|
||||
pdl=append(self.pdl, other.pdl),
|
||||
latency=append(self.latency, other.latency),
|
||||
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),
|
||||
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])
|
||||
self.latency = array([c.latency for c in carriers])
|
||||
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
|
||||
|
||||
|
||||
@@ -269,7 +257,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
||||
chromatic_dispersion: Union[float, ndarray, Iterable] = 0.,
|
||||
pmd: Union[float, ndarray, Iterable] = 0.,
|
||||
pdl: Union[float, ndarray, Iterable] = 0.,
|
||||
ref_power: Pref = None,
|
||||
latency: Union[float, ndarray, Iterable] = 0.,
|
||||
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."""
|
||||
@@ -284,6 +272,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
||||
chromatic_dispersion = full(number_of_channels, chromatic_dispersion)
|
||||
pmd = full(number_of_channels, pmd)
|
||||
pdl = full(number_of_channels, pdl)
|
||||
latency = full(number_of_channels, latency)
|
||||
nli = zeros(number_of_channels)
|
||||
ase = zeros(number_of_channels)
|
||||
delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
|
||||
@@ -293,10 +282,9 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
|
||||
signal=signal, nli=nli, ase=ase,
|
||||
baud_rate=baud_rate, roll_off=roll_off,
|
||||
chromatic_dispersion=chromatic_dispersion,
|
||||
pmd=pmd, pdl=pdl,
|
||||
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, label=label)
|
||||
except ValueError as e:
|
||||
if 'could not broadcast' in str(e):
|
||||
raise SpectrumError('Dimension mismatch in input fields.')
|
||||
@@ -304,30 +292,24 @@ 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, ref_carrier=None):
|
||||
""" Creates a fixed slot width spectral information with flat power.
|
||||
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing, tx_osnr, 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 = zeros(number_of_channels)
|
||||
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,
|
||||
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, label=label)
|
||||
|
||||
|
||||
def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], power: float,
|
||||
ref_carrier: ReferenceCarrier) -> SpectralInformation:
|
||||
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.
|
||||
: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()]
|
||||
@@ -338,12 +320,9 @@ def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], pow
|
||||
tx_osnr = [c.tx_osnr 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)
|
||||
|
||||
|
||||
|
||||
@@ -1,19 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.core.network
|
||||
=================
|
||||
|
||||
Working with networks which consist of network elements
|
||||
'''
|
||||
"""
|
||||
|
||||
from copy import deepcopy
|
||||
from operator import attrgetter
|
||||
from gnpy.core import ansi_escapes, elements
|
||||
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
|
||||
from gnpy.core.utils import round2float, convert_length
|
||||
from gnpy.core.info import ReferenceCarrier
|
||||
from collections import namedtuple
|
||||
from logging import getLogger
|
||||
|
||||
from gnpy.core import elements
|
||||
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
|
||||
from gnpy.core.utils import round2float, convert_length, psd2powerdbm, lin2db, watt2dbm, dbm2watt
|
||||
from gnpy.core.info import ReferenceCarrier, create_input_spectral_information
|
||||
from gnpy.tools import json_io
|
||||
from gnpy.core.parameters import SimParams
|
||||
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
def edfa_nf(gain_target, variety_type, equipment):
|
||||
@@ -32,7 +40,7 @@ def edfa_nf(gain_target, variety_type, equipment):
|
||||
return amp._calc_nf(True)
|
||||
|
||||
|
||||
def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restrictions=None):
|
||||
def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restrictions=None, verbose=True):
|
||||
"""amplifer selection algorithm
|
||||
@Orange Jean-Luc Augé
|
||||
"""
|
||||
@@ -55,15 +63,8 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
|
||||
# power attribut include power AND gain limitations
|
||||
edfa_list = [Edfa_list(
|
||||
variety=edfa_variety,
|
||||
power=min(
|
||||
pin
|
||||
+ edfa.gain_flatmax
|
||||
+ TARGET_EXTENDED_GAIN,
|
||||
edfa.p_max
|
||||
)
|
||||
- power_target,
|
||||
gain_min=gain_target + 3
|
||||
- edfa.gain_min,
|
||||
power=min(pin + edfa.gain_flatmax + TARGET_EXTENDED_GAIN, edfa.p_max) - power_target,
|
||||
gain_min=gain_target + 3 - edfa.gain_min,
|
||||
nf=edfa_nf(gain_target, edfa_variety, equipment))
|
||||
for edfa_variety, edfa in edfa_dict.items()
|
||||
if ((edfa.allowed_for_design or restrictions is not None) and not edfa.raman)]
|
||||
@@ -72,15 +73,8 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
|
||||
# do not allow extended gain min for Raman
|
||||
raman_list = [Edfa_list(
|
||||
variety=edfa_variety,
|
||||
power=min(
|
||||
pin
|
||||
+ edfa.gain_flatmax
|
||||
+ TARGET_EXTENDED_GAIN,
|
||||
edfa.p_max
|
||||
)
|
||||
- power_target,
|
||||
gain_min=gain_target
|
||||
- edfa.gain_min,
|
||||
power=min(pin + edfa.gain_flatmax + TARGET_EXTENDED_GAIN, edfa.p_max) - power_target,
|
||||
gain_min=gain_target - edfa.gain_min,
|
||||
nf=edfa_nf(gain_target, edfa_variety, equipment))
|
||||
for edfa_variety, edfa in edfa_dict.items()
|
||||
if (edfa.allowed_for_design and edfa.raman)] \
|
||||
@@ -104,10 +98,10 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
|
||||
please increase span fiber padding')
|
||||
else:
|
||||
# TODO: convert to logging
|
||||
print(
|
||||
f'{ansi_escapes.red}WARNING:{ansi_escapes.reset} target gain in node {uid} is below all available amplifiers min gain: \
|
||||
amplifier input padding will be assumed, consider increase span fiber padding instead'
|
||||
)
|
||||
if verbose:
|
||||
logger.warning(f'\n\tWARNING: target gain in node {uid} is below all available amplifiers min gain: '
|
||||
+ '\n\tamplifier input padding will be assumed, consider increase span fiber padding '
|
||||
+ 'instead.\n')
|
||||
acceptable_gain_min_list = edfa_list
|
||||
|
||||
# filter on gain+power limitation:
|
||||
@@ -127,33 +121,34 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
|
||||
# =>chose the amp with the best NF among the acceptable ones:
|
||||
selected_edfa = min(acceptable_power_list, key=attrgetter('nf')) # filter on NF
|
||||
# check what are the gain and power limitations of this amp
|
||||
power_reduction = round(min(selected_edfa.power, 0), 2)
|
||||
if power_reduction < -0.5:
|
||||
print(
|
||||
f'{ansi_escapes.red}WARNING:{ansi_escapes.reset} target gain and power in node {uid}\n \
|
||||
is beyond all available amplifiers capabilities and/or extended_gain_range:\n\
|
||||
a power reduction of {power_reduction} is applied\n'
|
||||
)
|
||||
|
||||
power_reduction = min(selected_edfa.power, 0)
|
||||
if power_reduction < -0.5 and verbose:
|
||||
logger.warning(f'\n\tWARNING: target gain and power in node {uid}\n'
|
||||
+ '\tis beyond all available amplifiers capabilities and/or extended_gain_range:\n'
|
||||
+ f'\ta power reduction of {round(power_reduction, 2)} is applied\n')
|
||||
return selected_edfa.variety, power_reduction
|
||||
|
||||
|
||||
def target_power(network, node, equipment): # get_fiber_dp
|
||||
"""Computes target power using J. -L. Auge, V. Curri and E. Le Rouzic,
|
||||
Open Design for Multi-Vendor Optical Networks, OFC 2019.
|
||||
equation 4
|
||||
"""
|
||||
if isinstance(node, elements.Roadm):
|
||||
return 0
|
||||
|
||||
SPAN_LOSS_REF = 20
|
||||
POWER_SLOPE = 0.3
|
||||
dp_range = list(equipment['Span']['default'].delta_power_range_db)
|
||||
node_loss = span_loss(network, node)
|
||||
node_loss = span_loss(network, node, equipment)
|
||||
|
||||
try:
|
||||
dp = round2float((node_loss - SPAN_LOSS_REF) * POWER_SLOPE, dp_range[2])
|
||||
dp = max(dp_range[0], dp)
|
||||
dp = min(dp_range[1], dp)
|
||||
except IndexError:
|
||||
raise ConfigurationError(f'invalid delta_power_range_db definition in eqpt_config[Span]'
|
||||
f'delta_power_range_db: [lower_bound, upper_bound, step]')
|
||||
raise ConfigurationError('invalid delta_power_range_db definition in eqpt_config[Span]'
|
||||
'delta_power_range_db: [lower_bound, upper_bound, step]')
|
||||
|
||||
return dp
|
||||
|
||||
@@ -192,12 +187,64 @@ def next_node_generator(network, node):
|
||||
yield from next_node_generator(network, next_node)
|
||||
|
||||
|
||||
def span_loss(network, node):
|
||||
def estimate_raman_gain(node, equipment):
|
||||
"""If node is RamanFiber, then estimate the possible Raman gain if any
|
||||
for this purpose propagate a fake signal in a copy.
|
||||
to be accurate the nb of channel should be the same as in SI, but this increases computation time
|
||||
"""
|
||||
f_min = equipment['SI']['default'].f_min
|
||||
f_max = equipment['SI']['default'].f_max
|
||||
roll_off = equipment['SI']['default'].roll_off
|
||||
baud_rate = equipment['SI']['default'].baud_rate
|
||||
power_dbm = equipment['SI']['default'].power_dbm
|
||||
power = dbm2watt(equipment['SI']['default'].power_dbm)
|
||||
spacing = equipment['SI']['default'].spacing
|
||||
tx_osnr = equipment['SI']['default'].tx_osnr
|
||||
|
||||
sim_params = {
|
||||
"raman_params": {
|
||||
"flag": True,
|
||||
"result_spatial_resolution": 10e3,
|
||||
"solver_spatial_resolution": 50
|
||||
},
|
||||
"nli_params": {
|
||||
"method": "ggn_spectrally_separated",
|
||||
"dispersion_tolerance": 1,
|
||||
"phase_shift_tolerance": 0.1,
|
||||
"computed_channels": [1, 18, 37, 56, 75]
|
||||
}
|
||||
}
|
||||
if isinstance(node, elements.RamanFiber):
|
||||
# in order to take into account gain generated in RamanFiber, propagate in the RamanFiber with
|
||||
# SI reference channel.
|
||||
spectral_info_input = create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=roll_off,
|
||||
baud_rate=baud_rate, power=power, spacing=spacing,
|
||||
tx_osnr=tx_osnr)
|
||||
n_copy = deepcopy(node)
|
||||
# need to set ref_pch_in_dbm in order to correctly run propagate of the element, because this
|
||||
# setting has not yet been done by autodesign
|
||||
n_copy.ref_pch_in_dbm = power_dbm
|
||||
SimParams.set_params(sim_params)
|
||||
pin = watt2dbm(sum(spectral_info_input.signal))
|
||||
spectral_info_out = n_copy(spectral_info_input)
|
||||
pout = watt2dbm(sum(spectral_info_out.signal))
|
||||
estimated_gain = pout - pin + node.loss
|
||||
return round(estimated_gain, 2)
|
||||
else:
|
||||
return 0.0
|
||||
|
||||
|
||||
def span_loss(network, node, equipment):
|
||||
"""Total loss of a span (Fiber and Fused nodes) which contains the given node"""
|
||||
loss = node.loss if node.passive else 0
|
||||
loss += sum(n.loss for n in prev_node_generator(network, node))
|
||||
loss += sum(n.loss for n in next_node_generator(network, node))
|
||||
return loss
|
||||
# add the possible Raman gain
|
||||
gain = estimate_raman_gain(node, equipment)
|
||||
gain += sum(estimate_raman_gain(n, equipment) for n in prev_node_generator(network, node))
|
||||
gain += sum(estimate_raman_gain(n, equipment) for n in next_node_generator(network, node))
|
||||
|
||||
return loss - gain
|
||||
|
||||
|
||||
def find_first_node(network, node):
|
||||
@@ -234,22 +281,26 @@ def set_amplifier_voa(amp, power_target, power_mode):
|
||||
amp.out_voa = voa
|
||||
|
||||
|
||||
def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_db):
|
||||
""" this node can be a transceiver or a ROADM (same function called in both cases)
|
||||
def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_db, verbose):
|
||||
"""This node can be a transceiver or a ROADM (same function called in both cases).
|
||||
go through each link staring from this_node until next Roadm or Transceiver and
|
||||
set gain and delta_p according to configurations set by user.
|
||||
power_mode = True, set amplifiers delta_p and effective_gain
|
||||
power_mode = False, set amplifiers effective_gain and ignore delta_p config: set it to None
|
||||
"""
|
||||
power_mode = equipment['Span']['default'].power_mode
|
||||
ref_carrier = ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
|
||||
slot_width=equipment['SI']['default'].spacing)
|
||||
next_oms = (n for n in network.successors(this_node) if not isinstance(n, elements.Transceiver))
|
||||
for oms in next_oms:
|
||||
# go through all the OMS departing from the ROADM
|
||||
prev_node = this_node
|
||||
node = oms
|
||||
if isinstance(this_node, elements.Transceiver):
|
||||
this_node_out_power = 0.0 # default value if this_node is a transceiver
|
||||
# for the time being use the same power for the target of roadms and for transceivers
|
||||
# TODO: This should be changed when introducing a power parameter dedicated to transceivers
|
||||
this_node_out_power = pref_ch_db
|
||||
if isinstance(this_node, elements.Roadm):
|
||||
# get target power out from ROADM for the reference carrier based on equalization settings
|
||||
this_node_out_power = this_node.get_per_degree_ref_power(degree=node.uid, ref_carrier=ref_carrier)
|
||||
this_node_out_power = this_node.get_per_degree_ref_power(degree=node.uid)
|
||||
# use the target power on this degree
|
||||
prev_dp = this_node_out_power - pref_ch_db
|
||||
dp = prev_dp
|
||||
@@ -258,20 +309,18 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
|
||||
visited_nodes = []
|
||||
while not (isinstance(node, elements.Roadm) or isinstance(node, elements.Transceiver)):
|
||||
# go through all nodes in the OMS (loop until next Roadm instance)
|
||||
try:
|
||||
next_node = next(network.successors(node))
|
||||
except StopIteration:
|
||||
raise NetworkTopologyError(f'{type(node).__name__} {node.uid} is not properly connected, please check network topology')
|
||||
next_node = get_next_node(node, network)
|
||||
visited_nodes.append(node)
|
||||
if next_node in visited_nodes:
|
||||
raise NetworkTopologyError(f'Loop detected for {type(node).__name__} {node.uid}, please check network topology')
|
||||
raise NetworkTopologyError(f'Loop detected for {type(node).__name__} {node.uid}, '
|
||||
+ 'please check network topology')
|
||||
if isinstance(node, elements.Edfa):
|
||||
node_loss = span_loss(network, prev_node)
|
||||
node_loss = span_loss(network, prev_node, equipment)
|
||||
voa = node.out_voa if node.out_voa else 0
|
||||
if node.delta_p is None:
|
||||
if node.operational.delta_p is None:
|
||||
dp = target_power(network, next_node, equipment) + voa
|
||||
else:
|
||||
dp = node.delta_p
|
||||
dp = node.operational.delta_p
|
||||
if node.effective_gain is None or power_mode:
|
||||
gain_target = node_loss + dp - prev_dp + prev_voa
|
||||
else: # gain mode with effective_gain
|
||||
@@ -283,7 +332,7 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
|
||||
if isinstance(prev_node, elements.Fiber):
|
||||
max_fiber_lineic_loss_for_raman = \
|
||||
equipment['Span']['default'].max_fiber_lineic_loss_for_raman * 1e-3 # dB/m
|
||||
raman_allowed = prev_node.params.loss_coef < max_fiber_lineic_loss_for_raman
|
||||
raman_allowed = (prev_node.params.loss_coef < max_fiber_lineic_loss_for_raman).all()
|
||||
else:
|
||||
raman_allowed = False
|
||||
|
||||
@@ -298,33 +347,58 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
|
||||
restrictions = next_node.restrictions['preamp_variety_list']
|
||||
else:
|
||||
restrictions = None
|
||||
edfa_variety, power_reduction = select_edfa(raman_allowed, gain_target, power_target, equipment, node.uid, restrictions)
|
||||
edfa_variety, power_reduction = select_edfa(raman_allowed, gain_target, power_target, equipment,
|
||||
node.uid, restrictions, verbose)
|
||||
extra_params = equipment['Edfa'][edfa_variety]
|
||||
node.params.update_params(extra_params.__dict__)
|
||||
dp += power_reduction
|
||||
gain_target += power_reduction
|
||||
else:
|
||||
# Check power saturation also in this case
|
||||
p_max = equipment['Edfa'][node.params.type_variety].p_max
|
||||
if power_mode:
|
||||
power_reduction = min(0, p_max - (pref_total_db + dp))
|
||||
else:
|
||||
pout = pref_total_db + prev_dp - node_loss - prev_voa + gain_target
|
||||
power_reduction = min(0, p_max - pout)
|
||||
dp += power_reduction
|
||||
gain_target += power_reduction
|
||||
if node.params.raman and not raman_allowed:
|
||||
if isinstance(prev_node, elements.Fiber):
|
||||
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n '
|
||||
'but fiber lineic loss is above threshold\n')
|
||||
logger.warning(f'\n\tWARNING: raman is used in node {node.uid}\n '
|
||||
+ '\tbut fiber lineic loss is above threshold\n')
|
||||
else:
|
||||
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n '
|
||||
'but previous node is not a fiber\n')
|
||||
logger.critical(f'\n\tWARNING: raman is used in node {node.uid}\n '
|
||||
+ '\tbut previous node is not a fiber\n')
|
||||
# if variety is imposed by user, and if the gain_target (computed or imposed) is also above
|
||||
# variety max gain + extended range, then warn that gain > max_gain + extended range
|
||||
if gain_target - equipment['Edfa'][node.params.type_variety].gain_flatmax - \
|
||||
equipment['Span']['default'].target_extended_gain > 1e-2:
|
||||
equipment['Span']['default'].target_extended_gain > 1e-2 and verbose:
|
||||
# 1e-2 to allow a small margin according to round2float min step
|
||||
print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: '
|
||||
f'WARNING: effective gain in Node {node.uid} is above user '
|
||||
f'specified amplifier {node.params.type_variety}\n'
|
||||
f'max flat gain: {equipment["Edfa"][node.params.type_variety].gain_flatmax}dB ; '
|
||||
f'required gain: {gain_target}dB. Please check amplifier type.')
|
||||
logger.warning(f'\n\tWARNING: effective gain in Node {node.uid}\n'
|
||||
+ f'\tis above user specified amplifier {node.params.type_variety}\n'
|
||||
+ '\tmax flat gain: '
|
||||
+ f'{equipment["Edfa"][node.params.type_variety].gain_flatmax}dB ; '
|
||||
+ f'required gain: {round(gain_target, 2)}dB. Please check amplifier type.\n')
|
||||
|
||||
node.delta_p = dp if power_mode else None
|
||||
node.effective_gain = gain_target
|
||||
# if voa is not set, then set it and possibly optimize it with gain and update delta_p and
|
||||
# effective_gain values
|
||||
set_amplifier_voa(node, power_target, power_mode)
|
||||
# set_amplifier_voa may change delta_p in power_mode
|
||||
node._delta_p = node.delta_p if power_mode else dp
|
||||
|
||||
# target_pch_out_dbm records target power for design: If user defines one, then this is displayed,
|
||||
# else display the one computed during design
|
||||
if node.delta_p is not None and node.operational.delta_p is not None:
|
||||
# use the user defined target
|
||||
node.target_pch_out_dbm = round(node.operational.delta_p + pref_ch_db, 2)
|
||||
elif node.delta_p is not None:
|
||||
# use the design target if no target were set
|
||||
node.target_pch_out_dbm = round(node.delta_p + pref_ch_db, 2)
|
||||
elif node.delta_p is None:
|
||||
node.target_pch_out_dbm = None
|
||||
|
||||
prev_dp = dp
|
||||
prev_voa = voa
|
||||
@@ -332,6 +406,13 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
|
||||
node = next_node
|
||||
|
||||
|
||||
def set_roadm_ref_carrier(roadm, equipment):
|
||||
"""ref_carrier records carrier information used for design and usefull for equalization
|
||||
"""
|
||||
roadm.ref_carrier = ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
|
||||
slot_width=equipment['SI']['default'].spacing)
|
||||
|
||||
|
||||
def set_roadm_per_degree_targets(roadm, network):
|
||||
"""Set target powers/PSD on all degrees
|
||||
This is needed to populate per_degree_pch_out_dbm or per_degree_pch_psd or per_degree_pch_psw dicts when
|
||||
@@ -354,15 +435,101 @@ def set_roadm_per_degree_targets(roadm, network):
|
||||
raise ConfigurationError(roadm.uid, 'needs an equalization target')
|
||||
|
||||
|
||||
def set_roadm_input_powers(network, roadm, equipment, pref_ch_db):
|
||||
"""Set reference powers at ROADM input for a reference channel and based on the adjacent OMS.
|
||||
This supposes that there is no dependency on path. For example, the succession:
|
||||
node power out of element
|
||||
roadm A (target power -10dBm) -10dBm
|
||||
fiber A (16 dB loss) -26dBm
|
||||
roadm B (target power -12dBm) -26dBm
|
||||
fiber B (10 dB loss) -36dBm
|
||||
roadm C (target power -14dBm) -36dBm
|
||||
is not consistent because target powers in roadm B and roadm C can not be met.
|
||||
input power for the reference channel will be set -26 dBm in roadm B and -22dBm in roadm C,
|
||||
because at design time we can not know about path.
|
||||
The function raises a warning if target powers can not be met with the design.
|
||||
User should be aware that design was not successfull and that power reduction was applied.
|
||||
Note that this value is only used for visualisation purpose (to compute ROADM loss in elements).
|
||||
"""
|
||||
previous_elements = [n for n in network.predecessors(roadm)]
|
||||
roadm.ref_pch_in_dbm = {}
|
||||
for element in previous_elements:
|
||||
node = element
|
||||
loss = 0.0
|
||||
while isinstance(node, (elements.Fiber, elements.Fused, elements.RamanFiber)):
|
||||
# go through all predecessors until a power target is found either in an amplifier, a ROADM or a transceiver
|
||||
# then deduce power at ROADM input from this degree based on this target and crossed losses
|
||||
loss += node.loss
|
||||
previous_node = node
|
||||
node = next(network.predecessors(node))
|
||||
if isinstance(node, elements.Edfa):
|
||||
roadm.ref_pch_in_dbm[element.uid] = pref_ch_db + node._delta_p - node.out_voa - loss
|
||||
elif isinstance(node, elements.Roadm):
|
||||
roadm.ref_pch_in_dbm[element.uid] = \
|
||||
node.get_per_degree_ref_power(degree=previous_node.uid) - loss
|
||||
elif isinstance(node, elements.Transceiver):
|
||||
roadm.ref_pch_in_dbm[element.uid] = pref_ch_db - loss
|
||||
# check if target power can be met
|
||||
temp = []
|
||||
if roadm.per_degree_pch_out_dbm:
|
||||
temp.append(max([p for p in roadm.per_degree_pch_out_dbm.values()]))
|
||||
if roadm.per_degree_pch_psd:
|
||||
temp.append(max([psd2powerdbm(p, roadm.ref_carrier.baud_rate) for p in roadm.per_degree_pch_psd.values()]))
|
||||
if roadm.per_degree_pch_psw:
|
||||
temp.append(max([psd2powerdbm(p, roadm.ref_carrier.slot_width) for p in roadm.per_degree_pch_psw.values()]))
|
||||
if roadm.params.target_pch_out_db:
|
||||
temp.append(roadm.params.target_pch_out_db)
|
||||
if roadm.params.target_psd_out_mWperGHz:
|
||||
temp.append(psd2powerdbm(roadm.params.target_psd_out_mWperGHz, roadm.ref_carrier.baud_rate))
|
||||
if roadm.params.target_out_mWperSlotWidth:
|
||||
temp.append(psd2powerdbm(roadm.params.target_out_mWperSlotWidth, roadm.ref_carrier.slot_width))
|
||||
if not temp:
|
||||
raise ConfigurationError(f'Could not find target power/PSD/PSW in ROADM "{roadm.uid}"')
|
||||
target_to_be_supported = max(temp)
|
||||
for from_degree, in_power in roadm.ref_pch_in_dbm.items():
|
||||
if in_power < target_to_be_supported:
|
||||
logger.warning(
|
||||
f'WARNING: maximum target power {target_to_be_supported}dBm '
|
||||
+ f'in ROADM "{roadm.uid}" can not be met for at least one crossing path. Min input power '
|
||||
+ f'from "{from_degree}" direction is {round(in_power, 2)}dBm. Please correct input topology.'
|
||||
)
|
||||
|
||||
|
||||
def set_fiber_input_power(network, fiber, equipment, pref_ch_db):
|
||||
"""Set reference powers at fiber input for a reference channel.
|
||||
Supposes that target power out of ROADMs and amplifiers are consistent.
|
||||
This is only for visualisation purpose
|
||||
"""
|
||||
loss = 0.0
|
||||
node = next(network.predecessors(fiber))
|
||||
while isinstance(node, elements.Fused):
|
||||
loss += node.loss
|
||||
previous_node = node
|
||||
node = next(network.predecessors(node))
|
||||
if isinstance(node, (elements.Fiber, elements.RamanFiber)) and node.ref_pch_in_dbm is not None:
|
||||
fiber.ref_pch_in_dbm = node.ref_pch_in_dbm - loss - node.loss
|
||||
if isinstance(node, (elements.Fiber, elements.RamanFiber)) and node.ref_pch_in_dbm is None:
|
||||
set_fiber_input_power(network, node, equipment, pref_ch_db)
|
||||
fiber.ref_pch_in_dbm = node.ref_pch_in_dbm - loss - node.loss
|
||||
elif isinstance(node, elements.Roadm):
|
||||
fiber.ref_pch_in_dbm = \
|
||||
node.get_per_degree_ref_power(degree=previous_node.uid) - loss
|
||||
elif isinstance(node, elements.Edfa):
|
||||
fiber.ref_pch_in_dbm = pref_ch_db + node._delta_p - node.out_voa - loss
|
||||
elif isinstance(node, elements.Transceiver):
|
||||
fiber.ref_pch_in_dbm = pref_ch_db - loss
|
||||
|
||||
|
||||
def add_roadm_booster(network, roadm):
|
||||
next_nodes = [n for n in network.successors(roadm)
|
||||
if not (isinstance(n, elements.Transceiver) or isinstance(n, elements.Fused) or isinstance(n, elements.Edfa))]
|
||||
if not (isinstance(n, elements.Transceiver) or isinstance(n, elements.Fused)
|
||||
or isinstance(n, elements.Edfa))]
|
||||
# no amplification for fused spans or TRX
|
||||
for next_node in next_nodes:
|
||||
network.remove_edge(roadm, next_node)
|
||||
amp = elements.Edfa(
|
||||
uid=f'Edfa_booster_{roadm.uid}_to_{next_node.uid}',
|
||||
params={},
|
||||
params=json_io.Amp.default_values,
|
||||
metadata={
|
||||
'location': {
|
||||
'latitude': roadm.lat,
|
||||
@@ -388,7 +555,7 @@ def add_roadm_preamp(network, roadm):
|
||||
network.remove_edge(prev_node, roadm)
|
||||
amp = elements.Edfa(
|
||||
uid=f'Edfa_preamp_{roadm.uid}_from_{prev_node.uid}',
|
||||
params={},
|
||||
params=json_io.Amp.default_values,
|
||||
metadata={
|
||||
'location': {
|
||||
'latitude': roadm.lat,
|
||||
@@ -411,13 +578,13 @@ def add_roadm_preamp(network, roadm):
|
||||
|
||||
|
||||
def add_inline_amplifier(network, fiber):
|
||||
next_node = next(network.successors(fiber))
|
||||
next_node = get_next_node(fiber, network)
|
||||
if isinstance(next_node, elements.Fiber) or isinstance(next_node, elements.RamanFiber):
|
||||
# no amplification for fused spans or TRX
|
||||
network.remove_edge(fiber, next_node)
|
||||
amp = elements.Edfa(
|
||||
uid=f'Edfa_{fiber.uid}',
|
||||
params={},
|
||||
params=json_io.Amp.default_values,
|
||||
metadata={
|
||||
'location': {
|
||||
'latitude': (fiber.lat + next_node.lat) / 2,
|
||||
@@ -436,6 +603,9 @@ def add_inline_amplifier(network, fiber):
|
||||
|
||||
|
||||
def calculate_new_length(fiber_length, bounds, target_length):
|
||||
"""If fiber is over boundary, then assume this is a link "intent" and computes the set of
|
||||
identical fiber spans this link should be composed of.
|
||||
"""
|
||||
if fiber_length < bounds.stop:
|
||||
return fiber_length, 1
|
||||
|
||||
@@ -455,7 +625,21 @@ def calculate_new_length(fiber_length, bounds, target_length):
|
||||
return (length1, n_spans1)
|
||||
|
||||
|
||||
def split_fiber(network, fiber, bounds, target_length, equipment):
|
||||
def get_next_node(node, network):
|
||||
"""get_next node else raise tha appropriate error
|
||||
"""
|
||||
try:
|
||||
next_node = next(network.successors(node))
|
||||
return next_node
|
||||
except StopIteration:
|
||||
raise NetworkTopologyError(
|
||||
f'{type(node).__name__} {node.uid} is not properly connected, please check network topology')
|
||||
|
||||
|
||||
def split_fiber(network, fiber, bounds, target_length):
|
||||
"""If fiber length exceeds boundary then assume this is a link "intent", and replace this one-span link
|
||||
with an n_spans link, with identical fiber types.
|
||||
"""
|
||||
new_length, n_spans = calculate_new_length(fiber.params.length, bounds, target_length)
|
||||
if n_spans == 1:
|
||||
return
|
||||
@@ -498,11 +682,10 @@ def split_fiber(network, fiber, bounds, target_length, equipment):
|
||||
|
||||
|
||||
def add_connector_loss(network, fibers, default_con_in, default_con_out, EOL):
|
||||
"""Add default connector loss if no loss are defined. EOL repair margin is added as a connector loss
|
||||
"""
|
||||
for fiber in fibers:
|
||||
try:
|
||||
next_node = next(network.successors(fiber))
|
||||
except StopIteration:
|
||||
raise NetworkTopologyError(f'Fiber {fiber.uid} is not properly connected, please check network topology')
|
||||
next_node = get_next_node(fiber, network)
|
||||
if fiber.params.con_in is None:
|
||||
fiber.params.con_in = default_con_in
|
||||
if fiber.params.con_out is None:
|
||||
@@ -511,19 +694,14 @@ def add_connector_loss(network, fibers, default_con_in, default_con_out, EOL):
|
||||
fiber.params.con_out += EOL
|
||||
|
||||
|
||||
def add_fiber_padding(network, fibers, padding):
|
||||
"""last_fibers = (fiber for n in network.nodes()
|
||||
if not (isinstance(n, elements.Fiber) or isinstance(n, elements.Fused))
|
||||
for fiber in network.predecessors(n)
|
||||
if isinstance(fiber, elements.Fiber))"""
|
||||
def add_fiber_padding(network, fibers, padding, equipment):
|
||||
"""Add a padding att_in at the input of the 1st fiber of a succession of fibers and fused
|
||||
"""
|
||||
for fiber in fibers:
|
||||
try:
|
||||
next_node = next(network.successors(fiber))
|
||||
except StopIteration:
|
||||
raise NetworkTopologyError(f'Fiber {fiber.uid} is not properly connected, please check network topology')
|
||||
next_node = get_next_node(fiber, network)
|
||||
if isinstance(next_node, elements.Fused):
|
||||
continue
|
||||
this_span_loss = span_loss(network, fiber)
|
||||
this_span_loss = span_loss(network, fiber, equipment)
|
||||
if this_span_loss < padding:
|
||||
# add a padding att_in at the input of the 1st fiber:
|
||||
# address the case when several fibers are spliced together
|
||||
@@ -534,41 +712,65 @@ def add_fiber_padding(network, fibers, padding):
|
||||
first_fiber.params.att_in = first_fiber.params.att_in + padding - this_span_loss
|
||||
|
||||
|
||||
def build_network(network, equipment, pref_ch_db, pref_total_db, no_insert_edfas=False):
|
||||
def add_missing_elements_in_network(network, equipment):
|
||||
"""Autodesign network: add missing elements. split fibers if their length is too big
|
||||
add ROADM preamp or booster and inline amplifiers between fibers
|
||||
"""
|
||||
default_span_data = equipment['Span']['default']
|
||||
max_length = int(convert_length(default_span_data.max_length, default_span_data.length_units))
|
||||
min_length = max(int(default_span_data.padding / 0.2 * 1e3), 50_000)
|
||||
bounds = range(min_length, max_length)
|
||||
target_length = max(min_length, min(max_length, 90_000))
|
||||
fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
|
||||
for fiber in fibers:
|
||||
split_fiber(network, fiber, bounds, target_length)
|
||||
roadms = [r for r in network.nodes() if isinstance(r, elements.Roadm)]
|
||||
for roadm in roadms:
|
||||
add_roadm_preamp(network, roadm)
|
||||
add_roadm_booster(network, roadm)
|
||||
fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
|
||||
for fiber in fibers:
|
||||
add_inline_amplifier(network, fiber)
|
||||
|
||||
# set roadm loss for gain_mode before to build network
|
||||
|
||||
def add_missing_fiber_attributes(network, equipment):
|
||||
"""Fill in connector loss with default values. Add the padding loss is required.
|
||||
EOL is added as a connector loss
|
||||
"""
|
||||
default_span_data = equipment['Span']['default']
|
||||
fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
|
||||
add_connector_loss(network, fibers, default_span_data.con_in, default_span_data.con_out, default_span_data.EOL)
|
||||
# don't group split fiber and add amp in the same loop
|
||||
# =>for code clarity (at the expense of speed):
|
||||
add_fiber_padding(network, fibers, default_span_data.padding, equipment)
|
||||
|
||||
|
||||
def build_network(network, equipment, pref_ch_db, pref_total_db, set_connector_losses=True, verbose=True):
|
||||
"""Set roadm equalization target and amplifier gain and power
|
||||
"""
|
||||
roadms = [r for r in network.nodes() if isinstance(r, elements.Roadm)]
|
||||
transceivers = [t for t in network.nodes() if isinstance(t, elements.Transceiver)]
|
||||
|
||||
if not no_insert_edfas:
|
||||
for fiber in fibers:
|
||||
split_fiber(network, fiber, bounds, target_length, equipment)
|
||||
|
||||
for roadm in roadms:
|
||||
add_roadm_preamp(network, roadm)
|
||||
add_roadm_booster(network, roadm)
|
||||
|
||||
fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
|
||||
for fiber in fibers:
|
||||
add_inline_amplifier(network, fiber)
|
||||
|
||||
add_fiber_padding(network, fibers, default_span_data.padding)
|
||||
|
||||
if set_connector_losses:
|
||||
add_missing_fiber_attributes(network, equipment)
|
||||
# set roadm equalization targets first
|
||||
for roadm in roadms:
|
||||
set_roadm_ref_carrier(roadm, equipment)
|
||||
set_roadm_per_degree_targets(roadm, network)
|
||||
set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db)
|
||||
# then set amplifiers gain, delta_p and out_voa on each OMS
|
||||
for roadm in roadms + transceivers:
|
||||
set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db, verbose)
|
||||
for roadm in roadms:
|
||||
set_roadm_input_powers(network, roadm, equipment, pref_ch_db)
|
||||
for fiber in [f for f in network.nodes() if isinstance(f, (elements.Fiber, elements.RamanFiber))]:
|
||||
set_fiber_input_power(network, fiber, equipment, pref_ch_db)
|
||||
|
||||
trx = [t for t in network.nodes() if isinstance(t, elements.Transceiver)]
|
||||
for t in trx:
|
||||
next_node = next(network.successors(t), None)
|
||||
if next_node and not isinstance(next_node, elements.Roadm):
|
||||
set_egress_amplifier(network, t, equipment, 0, pref_total_db)
|
||||
|
||||
def design_network(reference_channel, network, equipment, set_connector_losses=True, verbose=True):
|
||||
"""Network is designed according to reference channel. Verbose indicate if the function should
|
||||
print all warnings or not
|
||||
"""
|
||||
pref_ch_db = watt2dbm(reference_channel.power) # reference channel power
|
||||
pref_total_db = pref_ch_db + lin2db(reference_channel.nb_channel) # reference total power
|
||||
build_network(network, equipment, pref_ch_db, pref_total_db, set_connector_losses=set_connector_losses,
|
||||
verbose=verbose)
|
||||
|
||||
@@ -7,9 +7,10 @@ gnpy.core.parameters
|
||||
|
||||
This module contains all parameters to configure standard network elements.
|
||||
"""
|
||||
from collections import namedtuple
|
||||
|
||||
from scipy.constants import c, pi
|
||||
from numpy import asarray, array
|
||||
from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full
|
||||
|
||||
from gnpy.core.utils import convert_length
|
||||
from gnpy.core.exceptions import ParametersError
|
||||
@@ -35,7 +36,8 @@ class PumpParams(Parameters):
|
||||
|
||||
class RamanParams(Parameters):
|
||||
def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50):
|
||||
""" Simulation parameters used within the Raman Solver
|
||||
"""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 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
|
||||
@@ -48,7 +50,8 @@ class RamanParams(Parameters):
|
||||
class NLIParams(Parameters):
|
||||
def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1,
|
||||
computed_channels=None):
|
||||
""" Simulation parameters used within the Nli Solver
|
||||
"""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
|
||||
@@ -63,20 +66,11 @@ class NLIParams(Parameters):
|
||||
class SimParams(Parameters):
|
||||
_shared_dict = {'nli_params': NLIParams(), 'raman_params': RamanParams()}
|
||||
|
||||
def __init__(self):
|
||||
if type(self) == SimParams:
|
||||
raise NotImplementedError('Instances of SimParams cannot be generated')
|
||||
|
||||
@classmethod
|
||||
def set_params(cls, sim_params):
|
||||
cls._shared_dict['nli_params'] = NLIParams(**sim_params.get('nli_params', {}))
|
||||
cls._shared_dict['raman_params'] = RamanParams(**sim_params.get('raman_params', {}))
|
||||
|
||||
@classmethod
|
||||
def get(cls):
|
||||
self = cls.__new__(cls)
|
||||
return self
|
||||
|
||||
@property
|
||||
def nli_params(self):
|
||||
return self._shared_dict['nli_params']
|
||||
@@ -113,26 +107,50 @@ class FusedParams(Parameters):
|
||||
self.loss = kwargs['loss'] if 'loss' in kwargs else 1
|
||||
|
||||
|
||||
# SSMF Raman coefficient profile normalized with respect to the effective area (Cr * A_eff)
|
||||
CR_NORM = array([
|
||||
0., 7.802e-16, 2.4236e-15, 4.0504e-15, 5.6606e-15, 6.8973e-15, 7.802e-15, 8.4162e-15, 8.8727e-15, 9.2877e-15,
|
||||
1.01011e-14, 1.05244e-14, 1.13295e-14, 1.2367e-14, 1.3695e-14, 1.5023e-14, 1.64091e-14, 1.81936e-14, 2.04927e-14,
|
||||
2.28167e-14, 2.48917e-14, 2.66098e-14, 2.82615e-14, 2.98136e-14, 3.1042e-14, 3.17558e-14, 3.18803e-14, 3.17558e-14,
|
||||
3.15566e-14, 3.11748e-14, 2.94567e-14, 3.14985e-14, 2.8552e-14, 2.43439e-14, 1.67992e-14, 9.6114e-15, 7.02180e-15,
|
||||
5.9262e-15, 5.6938e-15, 7.055e-15, 7.4119e-15, 7.4783e-15, 6.7645e-15, 5.5361e-15, 3.6271e-15, 2.7224e-15,
|
||||
2.4568e-15, 2.1995e-15, 2.1331e-15, 2.3323e-15, 2.5564e-15, 3.0461e-15, 4.8555e-15, 5.5029e-15, 5.2788e-15,
|
||||
4.565e-15, 3.3698e-15, 2.2991e-15, 2.0086e-15, 1.5521e-15, 1.328e-15, 1.162e-15, 9.379e-16, 8.715e-16, 8.134e-16,
|
||||
8.134e-16, 9.379e-16, 1.3612e-15, 1.6185e-15, 1.9754e-15, 1.8758e-15, 1.6849e-15, 1.2284e-15, 9.047e-16, 8.134e-16,
|
||||
8.715e-16, 9.711e-16, 1.0375e-15, 1.0043e-15, 9.047e-16, 8.134e-16, 6.806e-16, 5.478e-16, 3.901e-16, 2.241e-16,
|
||||
1.577e-16, 9.96e-17, 3.32e-17, 1.66e-17, 8.3e-18])
|
||||
DEFAULT_RAMAN_COEFFICIENT = {
|
||||
# SSMF Raman coefficient profile normalized with respect to the effective area overlap (g0 * A_eff(f_probe, f_pump))
|
||||
'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,
|
||||
1.88408911e-04, 2.05914127e-04, 2.24074028e-04, 2.47508283e-04, 2.77729174e-04, 3.08044243e-04, 3.34764439e-04,
|
||||
3.56481704e-04, 3.77127256e-04, 3.96269124e-04, 4.10955175e-04, 4.18718761e-04, 4.19511263e-04, 4.17025384e-04,
|
||||
4.13565369e-04, 4.07726048e-04, 3.83671291e-04, 4.08564283e-04, 3.69571936e-04, 3.14442090e-04, 2.16074535e-04,
|
||||
1.23097823e-04, 8.95457457e-05, 7.52470400e-05, 7.19806145e-05, 8.87961158e-05, 9.30812065e-05, 9.37058268e-05,
|
||||
8.45719619e-05, 6.90585286e-05, 4.50407159e-05, 3.36521245e-05, 3.02292475e-05, 2.69376939e-05, 2.60020897e-05,
|
||||
2.82958958e-05, 3.08667558e-05, 3.66024657e-05, 5.80610307e-05, 6.54797937e-05, 6.25022715e-05, 5.37806442e-05,
|
||||
3.94996621e-05, 2.68120644e-05, 2.33038554e-05, 1.79140757e-05, 1.52472424e-05, 1.32707565e-05, 1.06541760e-05,
|
||||
9.84649374e-06, 9.13999627e-06, 9.08971012e-06, 1.04227525e-05, 1.50419271e-05, 1.77838232e-05, 2.15810815e-05,
|
||||
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]
|
||||
|
||||
# Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
|
||||
FREQ_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
|
||||
# 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]
|
||||
|
||||
# Raman profile reference frequency
|
||||
'reference_frequency': 206184634112792 # [Hz] (1454 nm)}
|
||||
}
|
||||
|
||||
|
||||
class RamanGainCoefficient(namedtuple('RamanGainCoefficient', 'normalized_gamma_raman frequency_offset')):
|
||||
""" Raman Gain Coefficient Parameters
|
||||
|
||||
Based on:
|
||||
Andrea D’Amico, Bruno Correia, Elliot London, Emanuele Virgillito, Giacomo Borraccini, Antonio Napoli,
|
||||
and Vittorio Curri, "Scalable and Disaggregated GGN Approximation Applied to a C+L+S Optical Network,"
|
||||
J. Lightwave Technol. 40, 3499-3511 (2022)
|
||||
Section III.D
|
||||
"""
|
||||
|
||||
|
||||
class FiberParams(Parameters):
|
||||
@@ -146,6 +164,8 @@ class FiberParams(Parameters):
|
||||
# with default values from eqpt_config.json[Spans]
|
||||
self._con_in = kwargs.get('con_in')
|
||||
self._con_out = kwargs.get('con_out')
|
||||
|
||||
# Reference frequency (unique for all parameters: beta2, beta3, gamma, effective_area)
|
||||
if 'ref_wavelength' in kwargs:
|
||||
self._ref_wavelength = kwargs['ref_wavelength']
|
||||
self._ref_frequency = c / self._ref_wavelength
|
||||
@@ -155,35 +175,70 @@ class FiberParams(Parameters):
|
||||
else:
|
||||
self._ref_wavelength = 1550e-9 # conventional central C band wavelength [m]
|
||||
self._ref_frequency = c / self._ref_wavelength
|
||||
self._dispersion = kwargs['dispersion'] # s/m/m
|
||||
self._dispersion_slope = \
|
||||
kwargs.get('dispersion_slope', -2 * self._dispersion / self.ref_wavelength) # s/m/m/m
|
||||
self._beta2 = -(self.ref_wavelength ** 2) * self.dispersion / (2 * pi * c) # 1/(m * Hz^2)
|
||||
# Eq. (3.23) in Abramczyk, Halina. "Dispersion phenomena in optical fibers." Virtual European University
|
||||
# on Lasers. Available online: http://mitr.p.lodz.pl/evu/lectures/Abramczyk3.pdf
|
||||
# (accessed on 25 March 2018) (2005).
|
||||
self._beta3 = ((self.dispersion_slope - (4*pi*c/self.ref_wavelength**3) * self.beta2) /
|
||||
(2*pi*c/self.ref_wavelength**2)**2)
|
||||
|
||||
# Chromatic Dispersion
|
||||
if 'dispersion_per_frequency' in kwargs:
|
||||
# Frequency-dependent dispersion
|
||||
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
|
||||
self._dispersion = asarray(kwargs['dispersion']) # s/m/m
|
||||
self._dispersion_slope = kwargs.get('dispersion_slope') # s/m/m/m
|
||||
self._f_dispersion_ref = asarray(self._ref_frequency) # Hz
|
||||
else:
|
||||
# Default single value dispersion
|
||||
self._dispersion = asarray(1.67e-05) # s/m/m
|
||||
self._dispersion_slope = None
|
||||
self._f_dispersion_ref = asarray(self.ref_frequency) # Hz
|
||||
|
||||
# Effective Area and Nonlinear Coefficient
|
||||
self._effective_area = kwargs.get('effective_area') # m^2
|
||||
n2 = 2.6e-20 # m^2/W
|
||||
if self._effective_area:
|
||||
self._gamma = kwargs.get('gamma', 2 * pi * n2 / (self.ref_wavelength * self._effective_area)) # 1/W/m
|
||||
self._n1 = 1.468
|
||||
self._core_radius = 4.2e-6 # m
|
||||
self._n2 = 2.6e-20 # m^2/W
|
||||
if self._effective_area is not None:
|
||||
default_gamma = 2 * pi * self._n2 / (self._ref_wavelength * self._effective_area)
|
||||
self._gamma = kwargs.get('gamma', default_gamma) # 1/W/m
|
||||
elif 'gamma' in kwargs:
|
||||
self._gamma = kwargs['gamma'] # 1/W/m
|
||||
self._effective_area = 2 * pi * n2 / (self.ref_wavelength * self._gamma) # m^2
|
||||
self._effective_area = 2 * pi * self._n2 / (self._ref_wavelength * self._gamma) # m^2
|
||||
else:
|
||||
self._gamma = 0 # 1/W/m
|
||||
self._effective_area = 83e-12 # m^2
|
||||
default_raman_efficiency = {'cr': CR_NORM / self._effective_area, 'frequency_offset': FREQ_OFFSET}
|
||||
self._raman_efficiency = kwargs.get('raman_efficiency', default_raman_efficiency)
|
||||
self._gamma = 2 * pi * self._n2 / (self._ref_wavelength * self._effective_area) # 1/W/m
|
||||
self._contrast = 0.5 * (c / (2 * pi * self._ref_frequency * self._core_radius * self._n1) * exp(
|
||||
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 gain coefficient array of the frequency offset constructed such that positive frequency values
|
||||
# represent a positive power transfer from higher frequency and vice versa
|
||||
frequency_offset = append(-flip(frequency_offset[1:]), frequency_offset)
|
||||
normalized_gamma_raman = append(- flip(normalized_gamma_raman[1:]), normalized_gamma_raman)
|
||||
self._raman_coefficient = RamanGainCoefficient(normalized_gamma_raman, frequency_offset)
|
||||
|
||||
# Polarization Mode Dispersion
|
||||
self._pmd_coef = kwargs['pmd_coef'] # s/sqrt(m)
|
||||
if type(kwargs['loss_coef']) == dict:
|
||||
|
||||
# Loss Coefficient
|
||||
if isinstance(kwargs['loss_coef'], dict):
|
||||
self._loss_coef = asarray(kwargs['loss_coef']['value']) * 1e-3 # lineic loss dB/m
|
||||
self._f_loss_ref = asarray(kwargs['loss_coef']['frequency']) # Hz
|
||||
else:
|
||||
self._loss_coef = asarray(kwargs['loss_coef']) * 1e-3 # lineic loss dB/m
|
||||
self._f_loss_ref = asarray(self._ref_frequency) # Hz
|
||||
self._lumped_losses = kwargs['lumped_losses'] if 'lumped_losses' in kwargs else []
|
||||
# Lumped Losses
|
||||
self._lumped_losses = kwargs['lumped_losses'] if 'lumped_losses' in kwargs else array([])
|
||||
self._latency = self._length / (c / self._n1) # s
|
||||
except KeyError as e:
|
||||
raise ParametersError(f'Fiber configurations json must include {e}. Configuration: {kwargs}')
|
||||
|
||||
@@ -228,6 +283,10 @@ class FiberParams(Parameters):
|
||||
def dispersion(self):
|
||||
return self._dispersion
|
||||
|
||||
@property
|
||||
def f_dispersion_ref(self):
|
||||
return self._f_dispersion_ref
|
||||
|
||||
@property
|
||||
def dispersion_slope(self):
|
||||
return self._dispersion_slope
|
||||
@@ -236,6 +295,20 @@ class FiberParams(Parameters):
|
||||
def gamma(self):
|
||||
return self._gamma
|
||||
|
||||
def effective_area_scaling(self, frequency):
|
||||
V = 2 * pi * frequency / c * self._core_radius * self._n1 * sqrt(2 * self._contrast)
|
||||
w = self._core_radius / sqrt(log(V))
|
||||
return asarray(pi * w ** 2)
|
||||
|
||||
def effective_area_overlap(self, frequency_stokes_wave, frequency_pump):
|
||||
effective_area_stokes_wave = self.effective_area_scaling(frequency_stokes_wave)
|
||||
effective_area_pump = self.effective_area_scaling(frequency_pump)
|
||||
return squeeze(outer(effective_area_stokes_wave, ones(effective_area_pump.size)) + outer(
|
||||
ones(effective_area_stokes_wave.size), effective_area_pump)) / 2
|
||||
|
||||
def gamma_scaling(self, frequency):
|
||||
return asarray(2 * pi * self._n2 * frequency / (c * self.effective_area_scaling(frequency)))
|
||||
|
||||
@property
|
||||
def pmd_coef(self):
|
||||
return self._pmd_coef
|
||||
@@ -248,14 +321,6 @@ class FiberParams(Parameters):
|
||||
def ref_frequency(self):
|
||||
return self._ref_frequency
|
||||
|
||||
@property
|
||||
def beta2(self):
|
||||
return self._beta2
|
||||
|
||||
@property
|
||||
def beta3(self):
|
||||
return self._beta3
|
||||
|
||||
@property
|
||||
def loss_coef(self):
|
||||
return self._loss_coef
|
||||
@@ -265,36 +330,125 @@ class FiberParams(Parameters):
|
||||
return self._f_loss_ref
|
||||
|
||||
@property
|
||||
def raman_efficiency(self):
|
||||
return self._raman_efficiency
|
||||
def raman_coefficient(self):
|
||||
return self._raman_coefficient
|
||||
|
||||
@property
|
||||
def latency(self):
|
||||
return self._latency
|
||||
|
||||
def asdict(self):
|
||||
dictionary = super().asdict()
|
||||
dictionary['loss_coef'] = self.loss_coef * 1e3
|
||||
dictionary['length_units'] = 'm'
|
||||
if not self.lumped_losses:
|
||||
if len(self.lumped_losses) == 0:
|
||||
dictionary.pop('lumped_losses')
|
||||
if not self.raman_efficiency:
|
||||
dictionary.pop('raman_efficiency')
|
||||
if not self.raman_coefficient:
|
||||
dictionary.pop('raman_coefficient')
|
||||
else:
|
||||
raman_frequency_offset = \
|
||||
self.raman_coefficient.frequency_offset[self.raman_coefficient.frequency_offset >= 0]
|
||||
dictionary['raman_coefficient'] = {'g0': self._g0.tolist(),
|
||||
'frequency_offset': raman_frequency_offset.tolist(),
|
||||
'reference_frequency': self._raman_reference_frequency}
|
||||
return dictionary
|
||||
|
||||
|
||||
class EdfaParams:
|
||||
def __init__(self, **params):
|
||||
self.update_params(params)
|
||||
if params == {}:
|
||||
self.type_variety = ''
|
||||
self.type_def = ''
|
||||
# self.gain_flatmax = 0
|
||||
# self.gain_min = 0
|
||||
# self.p_max = 0
|
||||
# self.nf_model = None
|
||||
# self.nf_fit_coeff = None
|
||||
# self.nf_ripple = None
|
||||
# self.dgt = None
|
||||
# self.gain_ripple = None
|
||||
# self.out_voa_auto = False
|
||||
# self.allowed_for_design = None
|
||||
try:
|
||||
self.type_variety = params['type_variety']
|
||||
self.type_def = params['type_def']
|
||||
|
||||
# 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.f_ripple_ref = params['f_ripple_ref']
|
||||
|
||||
# Gain
|
||||
self.gain_flatmax = params['gain_flatmax']
|
||||
self.gain_min = params['gain_min']
|
||||
|
||||
gain_ripple = params['gain_ripple']
|
||||
if gain_ripple == 0:
|
||||
self.gain_ripple = asarray([0, 0])
|
||||
self.f_ripple_ref = asarray([self.f_min, self.f_max])
|
||||
else:
|
||||
self.gain_ripple = asarray(gain_ripple)
|
||||
if self.f_ripple_ref is not None:
|
||||
if (self.f_ripple_ref[0] != self.f_min) or (self.f_ripple_ref[-1] != self.f_max):
|
||||
raise ParametersError("The reference ripple frequency maximum and minimum have to coincide "
|
||||
"with the EDFA frequency maximum and minimum.")
|
||||
elif self.gain_ripple.size != self.f_ripple_ref.size:
|
||||
raise ParametersError("The reference ripple frequency and the gain ripple must have the same "
|
||||
"size.")
|
||||
else:
|
||||
self.f_ripple_ref = linspace(self.f_min, self.f_max, self.gain_ripple.size)
|
||||
|
||||
tilt_ripple = params['tilt_ripple']
|
||||
|
||||
if tilt_ripple == 0:
|
||||
self.tilt_ripple = full(self.gain_ripple.size, 0)
|
||||
else:
|
||||
self.tilt_ripple = asarray(tilt_ripple)
|
||||
if self.tilt_ripple.size != self.gain_ripple.size:
|
||||
raise ParametersError("The tilt ripple and the gain ripple must have the same size.")
|
||||
|
||||
# Power
|
||||
self.p_max = params['p_max']
|
||||
|
||||
# Noise Figure
|
||||
self.nf_model = params['nf_model']
|
||||
self.nf_min = params['nf_min']
|
||||
self.nf_max = params['nf_max']
|
||||
self.nf_coef = params['nf_coef']
|
||||
self.nf0 = params['nf0']
|
||||
self.nf_fit_coeff = params['nf_fit_coeff']
|
||||
|
||||
nf_ripple = params['nf_ripple']
|
||||
if nf_ripple == 0:
|
||||
self.nf_ripple = full(self.gain_ripple.size, 0)
|
||||
else:
|
||||
self.nf_ripple = asarray(nf_ripple)
|
||||
if self.nf_ripple.size != self.gain_ripple.size:
|
||||
raise ParametersError("The noise figure ripple and the gain ripple must have the same size.")
|
||||
|
||||
# VOA
|
||||
self.out_voa_auto = params['out_voa_auto']
|
||||
|
||||
# Dual Stage
|
||||
self.dual_stage_model = params['dual_stage_model']
|
||||
if self.dual_stage_model is not None:
|
||||
# Preamp
|
||||
self.preamp_variety = params['preamp_variety']
|
||||
self.preamp_type_def = params['preamp_type_def']
|
||||
self.preamp_nf_model = params['preamp_nf_model']
|
||||
self.preamp_nf_fit_coeff = params['preamp_nf_fit_coeff']
|
||||
self.preamp_gain_min = params['preamp_gain_min']
|
||||
self.preamp_gain_flatmax = params['preamp_gain_flatmax']
|
||||
|
||||
# Booster
|
||||
self.booster_variety = params['booster_variety']
|
||||
self.booster_type_def = params['booster_type_def']
|
||||
self.booster_nf_model = params['booster_nf_model']
|
||||
self.booster_nf_fit_coeff = params['booster_nf_fit_coeff']
|
||||
self.booster_gain_min = params['booster_gain_min']
|
||||
self.booster_gain_flatmax = params['booster_gain_flatmax']
|
||||
|
||||
# Others
|
||||
self.pmd = params['pmd']
|
||||
self.pdl = params['pdl']
|
||||
self.raman = params['raman']
|
||||
self.dgt = params['dgt']
|
||||
self.advance_configurations_from_json = params['advance_configurations_from_json']
|
||||
|
||||
# Design
|
||||
self.allowed_for_design = params['allowed_for_design']
|
||||
|
||||
except KeyError as e:
|
||||
raise ParametersError(f'Edfa configurations json must include {e}. Configuration: {params}')
|
||||
|
||||
def update_params(self, kwargs):
|
||||
for k, v in kwargs.items():
|
||||
|
||||
@@ -10,9 +10,9 @@ Solver definitions to calculate the Raman effect and the nonlinear interference
|
||||
The solvers take as input instances of the spectral information, the fiber and the simulation parameters
|
||||
"""
|
||||
|
||||
from numpy import interp, pi, zeros, shape, where, cos, array, append, ones, exp, arange, sqrt, trapz, arcsinh, \
|
||||
clip, abs, sum, concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, prod, argwhere, \
|
||||
unique, argsort, cumprod
|
||||
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
|
||||
from logging import getLogger
|
||||
from scipy.constants import k, h
|
||||
from scipy.interpolate import interp1d
|
||||
@@ -24,31 +24,30 @@ from gnpy.core.parameters import SimParams
|
||||
from gnpy.core.info import SpectralInformation
|
||||
|
||||
logger = getLogger(__name__)
|
||||
sim_params = SimParams.get()
|
||||
sim_params = SimParams()
|
||||
|
||||
def raised_cosine_comb(f, *carriers):
|
||||
""" Returns an array storing the PSD of a WDM comb of raised cosine shaped
|
||||
channels at the input frequencies defined in array f
|
||||
|
||||
:param f: numpy array of frequencies in Hz
|
||||
:param carriers: namedtuple describing the WDM comb
|
||||
:return: PSD of the WDM comb evaluated over f
|
||||
def raised_cosine(frequency, channel_frequency, channel_baud_rate, channel_roll_off):
|
||||
"""Returns a unitary raised cosine profile for the given parame
|
||||
|
||||
:param frequency: numpy array of frequencies in Hz for the resulting raised cosine
|
||||
:param channel_frequency: channel frequencies in Hz
|
||||
:param channel_baud_rate: channel baud rate in Hz
|
||||
:param channel_roll_off: channel roll off
|
||||
"""
|
||||
psd = zeros(shape(f))
|
||||
for carrier in carriers:
|
||||
f_nch = carrier.frequency
|
||||
g_ch = carrier.power.signal / carrier.baud_rate
|
||||
ts = 1 / carrier.baud_rate
|
||||
pass_band = (1 - carrier.roll_off) / (2 / carrier.baud_rate)
|
||||
stop_band = (1 + carrier.roll_off) / (2 / carrier.baud_rate)
|
||||
ff = abs(f - f_nch)
|
||||
tf = ff - pass_band
|
||||
if carrier.roll_off == 0:
|
||||
psd = where(tf <= 0, g_ch, 0.) + psd
|
||||
else:
|
||||
psd = g_ch * (where(tf <= 0, 1., 0.) + 1 / 2 * (1 + cos(pi * ts / carrier.roll_off * tf)) *
|
||||
where(tf > 0, 1., 0.) * where(abs(ff) <= stop_band, 1., 0.)) + psd
|
||||
return psd
|
||||
raised_cosine_mask = zeros(frequency.size)
|
||||
base_frequency = frequency - channel_frequency
|
||||
ts = 1 / channel_baud_rate
|
||||
pass_band = (1 - channel_roll_off) * channel_baud_rate / 2
|
||||
stop_band = (1 + channel_roll_off) * channel_baud_rate / 2
|
||||
|
||||
flat_condition = (abs(base_frequency) <= pass_band) == 1
|
||||
cosine_condition = (pass_band < abs(base_frequency)) * (abs(base_frequency) < stop_band) == 1
|
||||
|
||||
raised_cosine_mask[flat_condition] = 1
|
||||
raised_cosine_mask[cosine_condition] = \
|
||||
0.5 * (1 + cos(pi * ts / channel_roll_off * (abs(base_frequency[cosine_condition]) - pass_band)))
|
||||
return raised_cosine_mask
|
||||
|
||||
|
||||
class StimulatedRamanScattering:
|
||||
@@ -110,6 +109,7 @@ class RamanSolver:
|
||||
z_step = sim_params.raman_params.solver_spatial_resolution
|
||||
z = append(arange(0, fiber.params.length, z_step), fiber.params.length)
|
||||
z_final = append(arange(0, fiber.params.length, z_resolution), fiber.params.length)
|
||||
z_final = sort(unique(concatenate((fiber.z_lumped_losses, z_final))))
|
||||
|
||||
# Lumped losses array definition
|
||||
z, lumped_losses = RamanSolver._create_lumped_losses(z, fiber.lumped_losses, fiber.z_lumped_losses)
|
||||
@@ -190,13 +190,13 @@ class RamanSolver:
|
||||
|
||||
# calculate ase power
|
||||
ase = zeros(spectral_info.number_of_channels)
|
||||
cr = fiber.cr(srs.frequency)[:spectral_info.number_of_channels, spectral_info.number_of_channels:]
|
||||
for i, pump in enumerate(fiber.raman_pumps):
|
||||
pump_power = srs.power_profile[spectral_info.number_of_channels + i, :]
|
||||
df = pump.frequency - frequency
|
||||
eta = - 1 / (1 - exp(h * df / (k * fiber.temperature)))
|
||||
cr = fiber._cr_function(df)
|
||||
integral = trapz(pump_power / channels_loss, z, axis=1)
|
||||
ase += 2 * h * baud_rate * frequency * (1 + eta) * cr * (df > 0) * integral # 2 factor for double pol
|
||||
ase += 2 * h * baud_rate * frequency * (1 + eta) * cr[:, i] * (df > 0) * integral # 2 factor for double pol
|
||||
return ase
|
||||
|
||||
@staticmethod
|
||||
@@ -271,13 +271,16 @@ class RamanSolver:
|
||||
|
||||
|
||||
class NliSolver:
|
||||
""" This class implements the NLI models.
|
||||
Model and method can be specified in `sim_params.nli_params.method`.
|
||||
List of implemented methods:
|
||||
'gn_model_analytic': eq. 120 from arXiv:1209.0394
|
||||
'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225 spectrally separated
|
||||
"""This class implements the NLI models.
|
||||
Model and method can be specified in `sim_params.nli_params.method`.
|
||||
List of implemented methods:
|
||||
'gn_model_analytic': eq. 120 from arXiv:1209.0394
|
||||
'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225
|
||||
"""
|
||||
|
||||
SPM_WEIGHT = (16.0 / 27.0)
|
||||
XPM_WEIGHT = 2 * (16.0 / 27.0)
|
||||
|
||||
@staticmethod
|
||||
def effective_length(alpha, length):
|
||||
"""The effective length identify the region in which the NLI has a significant contribution to
|
||||
@@ -287,58 +290,81 @@ class NliSolver:
|
||||
|
||||
@staticmethod
|
||||
def compute_nli(spectral_info: SpectralInformation, srs: StimulatedRamanScattering, fiber):
|
||||
""" Compute NLI power generated by the WDM comb `*carriers` on the channel under test `carrier`
|
||||
"""Compute NLI power generated by the WDM comb `*carriers` on the channel under test `carrier`
|
||||
at the end of the fiber span.
|
||||
"""
|
||||
logger.debug('Start computing fiber NLI noise')
|
||||
# Physical fiber parameters
|
||||
alpha = fiber.alpha(spectral_info.frequency)
|
||||
beta2 = fiber.params.beta2
|
||||
beta3 = fiber.params.beta3
|
||||
f_ref_beta = fiber.params.ref_frequency
|
||||
gamma = fiber.params.gamma
|
||||
length = fiber.params.length
|
||||
|
||||
if 'gn_model_analytic' == sim_params.nli_params.method:
|
||||
nli = NliSolver._gn_analytic(spectral_info, alpha, beta2, gamma, length)
|
||||
eta = NliSolver._gn_analytic(spectral_info, fiber)
|
||||
|
||||
cut_power = outer(spectral_info.signal, ones(spectral_info.number_of_channels))
|
||||
pump_power = outer(ones(spectral_info.number_of_channels), spectral_info.signal)
|
||||
nli_matrix = cut_power * pump_power ** 2 * eta
|
||||
nli = sum(nli_matrix, 1)
|
||||
elif 'ggn_spectrally_separated' in sim_params.nli_params.method:
|
||||
nli = NliSolver._ggn_spectrally_separated(spectral_info, srs, alpha, beta2, beta3, f_ref_beta, gamma)
|
||||
if sim_params.nli_params.computed_channels is not None:
|
||||
cut_indices = array(sim_params.nli_params.computed_channels) - 1
|
||||
else:
|
||||
cut_indices = array(spectral_info.channel_number) - 1
|
||||
|
||||
eta = NliSolver._ggn_spectrally_separated(cut_indices, spectral_info, fiber, srs)
|
||||
|
||||
# Interpolation over the channels not indicated as compted 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.')
|
||||
|
||||
return nli
|
||||
|
||||
# Methods for computing GN-model
|
||||
# Methods for computing GN-model eta matrix
|
||||
@staticmethod
|
||||
def _gn_analytic(spectral_info: SpectralInformation, alpha, beta2, gamma, length):
|
||||
""" Computes the nonlinear interference power evaluated at the fiber input.
|
||||
def _gn_analytic(spectral_info, fiber, spm_weight=SPM_WEIGHT, xpm_weight=XPM_WEIGHT):
|
||||
"""Computes the nonlinear interference power evaluated at the fiber input.
|
||||
The method uses eq. 120 from arXiv:1209.0394
|
||||
"""
|
||||
spm_weight = (16.0 / 27.0) * gamma ** 2
|
||||
xpm_weight = 2 * (16.0 / 27.0) * gamma ** 2
|
||||
|
||||
# Spectral Features
|
||||
nch = spectral_info.number_of_channels
|
||||
frequency = spectral_info.frequency
|
||||
baud_rate = spectral_info.baud_rate
|
||||
delta_frequency = spectral_info.df
|
||||
|
||||
# Physical fiber parameters
|
||||
alpha = fiber.alpha(frequency)
|
||||
beta2 = fiber.beta2(frequency)
|
||||
gamma = outer(fiber.gamma(frequency), ones(nch))
|
||||
length = fiber.params.length
|
||||
|
||||
identity = diag(ones(nch))
|
||||
weight = spm_weight * identity + xpm_weight * (ones([nch, nch]) - identity)
|
||||
|
||||
effective_length = NliSolver.effective_length(alpha, length)
|
||||
asymptotic_length = 1 / alpha
|
||||
|
||||
df = spectral_info.df
|
||||
baud_rate = spectral_info.baud_rate
|
||||
cut_baud_rate = outer(baud_rate, ones(nch))
|
||||
pump_baud_rate = outer(ones(nch), baud_rate)
|
||||
|
||||
psd = spectral_info.signal / baud_rate
|
||||
ggg = outer(psd, psd**2)
|
||||
|
||||
psi = NliSolver._psi(df, baud_rate, beta2, effective_length, asymptotic_length)
|
||||
g_nli = sum(weight * ggg * psi, 1)
|
||||
nli = spectral_info.baud_rate * g_nli # Local white noise
|
||||
return nli
|
||||
psi = NliSolver._psi(delta_frequency, baud_rate, beta2, effective_length, asymptotic_length)
|
||||
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 _psi(df, baud_rate, beta2, effective_length, asymptotic_length):
|
||||
"""Calculates eq. 123 from `arXiv:1209.0394 <https://arxiv.org/abs/1209.0394>`__"""
|
||||
cut_baud_rate = outer(baud_rate, ones(baud_rate.size))
|
||||
cut_beta = outer(beta2, ones(baud_rate.size))
|
||||
pump_baud_rate = baud_rate
|
||||
pump_beta = outer(ones(baud_rate.size), beta2)
|
||||
beta2 = (cut_beta + pump_beta) / 2
|
||||
right_extreme = df + pump_baud_rate / 2
|
||||
left_extreme = df - pump_baud_rate / 2
|
||||
psi = (arcsinh(pi ** 2 * asymptotic_length * abs(beta2) * cut_baud_rate * right_extreme) -
|
||||
@@ -346,112 +372,133 @@ class NliSolver:
|
||||
psi *= effective_length ** 2 / (2 * pi * abs(beta2) * asymptotic_length)
|
||||
return psi
|
||||
|
||||
# Methods for computing the GGN-model
|
||||
# Methods for computing the GGN-model eta matrix
|
||||
@staticmethod
|
||||
def _ggn_spectrally_separated(spectral_info: SpectralInformation, srs: StimulatedRamanScattering,
|
||||
alpha, beta2, beta3, f_ref_beta, gamma):
|
||||
""" Computes the nonlinear interference power evaluated at the fiber input.
|
||||
def _ggn_spectrally_separated(cut_indices, spectral_info, fiber, srs, spm_weight=SPM_WEIGHT, xpm_weight=XPM_WEIGHT):
|
||||
"""Computes the nonlinear interference power evaluated at the fiber input.
|
||||
The method uses eq. 21 from arXiv: 1710.02225
|
||||
"""
|
||||
# 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
|
||||
|
||||
# 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
|
||||
slot_width = max(spectral_info.slot_width)
|
||||
max_slot_width = max(slot_width)
|
||||
delta_z = sim_params.raman_params.result_spatial_resolution
|
||||
spm_weight = (16.0 / 27.0) * gamma ** 2
|
||||
xpm_weight = 2 * (16.0 / 27.0) * gamma ** 2
|
||||
cuts = [carrier for carrier in spectral_info.carriers if carrier.channel_number
|
||||
in sim_params.nli_params.computed_channels] if sim_params.nli_params.computed_channels \
|
||||
else spectral_info.carriers
|
||||
|
||||
g_nli = array([])
|
||||
f_nli = array([])
|
||||
for cut_carrier in cuts:
|
||||
logger.debug(f'Start computing fiber NLI noise of cut: {cut_carrier}')
|
||||
f_eval = cut_carrier.frequency
|
||||
g_nli_computed = 0
|
||||
g_cut = (cut_carrier.power.signal / cut_carrier.baud_rate)
|
||||
for j, pump_carrier in enumerate(spectral_info.carriers):
|
||||
dn = abs(pump_carrier.channel_number - cut_carrier.channel_number)
|
||||
delta_f = abs(cut_carrier.frequency - pump_carrier.frequency)
|
||||
k_tol = dispersion_tolerance * abs(alpha[j])
|
||||
psi_cut_central_frequency = zeros([cut_indices.size, nch])
|
||||
for i, cut_index in enumerate(cut_indices):
|
||||
logger.debug(f'Start computing fiber NLI noise of cut: {cut_index + 1}')
|
||||
cut_frequency = frequency[cut_index]
|
||||
cut_baud_rate = baud_rate[cut_index]
|
||||
cut_roll_off = roll_off[cut_index]
|
||||
cut_number = cut_index + 1
|
||||
cut_beta2 = beta2[cut_index]
|
||||
cut_base_frequency = frequency - cut_frequency
|
||||
cut_beta_coefficients = polyfit(cut_base_frequency, beta2, 2)
|
||||
cut_beta3 = cut_beta_coefficients[1] / (2 * pi)
|
||||
|
||||
for pump_index in range(nch):
|
||||
pump_frequency = frequency[pump_index]
|
||||
pump_baud_rate = baud_rate[pump_index]
|
||||
pump_roll_off = roll_off[pump_index]
|
||||
pump_number = pump_index + 1
|
||||
pump_alpha = alpha[pump_index]
|
||||
dn = abs(pump_number - cut_number)
|
||||
delta_f = abs(cut_frequency - pump_frequency)
|
||||
k_tol = dispersion_tolerance * abs(alpha[pump_index])
|
||||
phi_tol = phase_shift_tolerance / delta_z
|
||||
f_cut_resolution = min(k_tol, phi_tol) / abs(beta2) / (4 * pi ** 2 * (1 + dn) * slot_width)
|
||||
f_pump_resolution = min(k_tol, phi_tol) / abs(beta2) / (4 * pi ** 2 * slot_width)
|
||||
if dn == 0: # SPM
|
||||
ggg = g_cut ** 3
|
||||
g_nli_computed += \
|
||||
spm_weight * ggg * NliSolver._generalized_psi(f_eval, cut_carrier, pump_carrier,
|
||||
f_cut_resolution, f_pump_resolution,
|
||||
srs, alpha[j], beta2, beta3, f_ref_beta)
|
||||
f_cut_resolution = min(k_tol, phi_tol) / abs(cut_beta2) / (4 * pi ** 2 * (1 + dn) * max_slot_width)
|
||||
f_pump_resolution = min(k_tol, phi_tol) / abs(cut_beta2) / (4 * pi ** 2 * max_slot_width)
|
||||
if cut_index == pump_index: # SPM
|
||||
psi_cut_central_frequency[i, pump_index] = \
|
||||
NliSolver._generalized_psi(cut_frequency, cut_frequency, cut_baud_rate, cut_roll_off,
|
||||
pump_frequency, pump_baud_rate, pump_roll_off, f_cut_resolution,
|
||||
f_pump_resolution, srs, pump_alpha, cut_beta2, cut_beta3,
|
||||
cut_frequency)
|
||||
else: # XPM
|
||||
g_pump = (pump_carrier.power.signal / pump_carrier.baud_rate)
|
||||
ggg = g_cut * g_pump ** 2
|
||||
frequency_offset_threshold = NliSolver._frequency_offset_threshold(beta2, pump_carrier.baud_rate)
|
||||
frequency_offset_threshold = NliSolver._frequency_offset_threshold(cut_beta2, pump_baud_rate)
|
||||
if abs(delta_f) <= frequency_offset_threshold:
|
||||
g_nli_computed += \
|
||||
xpm_weight * ggg * NliSolver._generalized_psi(f_eval, cut_carrier, pump_carrier,
|
||||
f_cut_resolution, f_pump_resolution,
|
||||
srs, alpha[j], beta2, beta3, f_ref_beta)
|
||||
psi_cut_central_frequency[i, pump_index] = \
|
||||
NliSolver._generalized_psi(cut_frequency, cut_frequency, cut_baud_rate, cut_roll_off,
|
||||
pump_frequency, pump_baud_rate, pump_roll_off, f_cut_resolution,
|
||||
f_pump_resolution, srs, pump_alpha, cut_beta2, cut_beta3,
|
||||
cut_frequency)
|
||||
else:
|
||||
g_nli_computed += \
|
||||
xpm_weight * ggg * NliSolver._fast_generalized_psi(f_eval, cut_carrier, pump_carrier,
|
||||
f_cut_resolution, srs, alpha[j], beta2,
|
||||
beta3, f_ref_beta)
|
||||
f_nli = append(f_nli, cut_carrier.frequency)
|
||||
g_nli = append(g_nli, g_nli_computed)
|
||||
g_nli = interp(spectral_info.frequency, f_nli, g_nli)
|
||||
nli = spectral_info.baud_rate * g_nli # Local white noise
|
||||
return nli
|
||||
psi_cut_central_frequency[i, pump_index] = \
|
||||
NliSolver._fast_generalized_psi(cut_frequency, cut_frequency, cut_baud_rate, cut_roll_off,
|
||||
pump_frequency, pump_baud_rate, pump_roll_off,
|
||||
f_cut_resolution, srs, pump_alpha, cut_beta2, cut_beta3,
|
||||
cut_frequency)
|
||||
|
||||
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_central_frequency / (cut_baud_rate * pump_baud_rate ** 2)
|
||||
eta = cut_baud_rate * eta_cut_central_frequency # Local white noise
|
||||
return eta
|
||||
|
||||
@staticmethod
|
||||
def _fast_generalized_psi(f_eval, cut_carrier, pump_carrier, f_cut_resolution, srs, alpha, beta2, beta3,
|
||||
f_ref_beta):
|
||||
"""Computes the generalized psi function similarly to the one used in the GN model."""
|
||||
z = srs.z
|
||||
rho_norm = srs.rho * exp(outer(alpha/2, z))
|
||||
rho_pump = interp1d(srs.frequency, rho_norm, axis=0)(pump_carrier.frequency)
|
||||
|
||||
f1_array = array([pump_carrier.frequency - (pump_carrier.baud_rate * (1 + pump_carrier.roll_off) / 2),
|
||||
pump_carrier.frequency + (pump_carrier.baud_rate * (1 + pump_carrier.roll_off) / 2)])
|
||||
f2_array = arange(cut_carrier.frequency,
|
||||
cut_carrier.frequency + (cut_carrier.baud_rate * (1 + cut_carrier.roll_off) / 2),
|
||||
f_cut_resolution) # Only positive f2 is used since integrand_f2 is symmetric
|
||||
|
||||
integrand_f1 = zeros(len(f1_array))
|
||||
for f1_index, f1 in enumerate(f1_array):
|
||||
delta_beta = 4 * pi ** 2 * (f1 - f_eval) * (f2_array - f_eval) * \
|
||||
(beta2 + pi * beta3 * (f1 + f2_array - 2 * f_ref_beta))
|
||||
integrand_f2 = NliSolver._generalized_rho_nli(delta_beta, rho_pump, z, alpha)
|
||||
integrand_f1[f1_index] = 2 * trapz(integrand_f2, f2_array) # 2x since integrand_f2 is symmetric in f2
|
||||
generalized_psi = 0.5 * sum(integrand_f1) * pump_carrier.baud_rate
|
||||
return generalized_psi
|
||||
|
||||
@staticmethod
|
||||
def _generalized_psi(f_eval, cut_carrier, pump_carrier, f_cut_resolution, f_pump_resolution, srs, alpha, beta2,
|
||||
beta3, f_ref_beta):
|
||||
def _fast_generalized_psi(f_eval, cut_frequency, cut_baud_rate, cut_roll_off, pump_frequency, pump_baud_rate,
|
||||
pump_roll_off, f_cut_resolution, srs, alpha, beta2, beta3, f_ref_beta):
|
||||
"""Computes the generalized psi function similarly to the one used in the GN model."""
|
||||
z = srs.z
|
||||
rho_norm = srs.rho * exp(outer(alpha / 2, z))
|
||||
rho_pump = interp1d(srs.frequency, rho_norm, axis=0)(pump_carrier.frequency)
|
||||
rho_pump = interp1d(srs.frequency, rho_norm, axis=0)(pump_frequency)
|
||||
|
||||
f1_array = arange(pump_carrier.frequency - (pump_carrier.baud_rate * (1 + pump_carrier.roll_off) / 2),
|
||||
pump_carrier.frequency + (pump_carrier.baud_rate * (1 + pump_carrier.roll_off) / 2),
|
||||
f1_array = array([pump_frequency - (pump_baud_rate * (1 + pump_roll_off) / 2),
|
||||
pump_frequency + (pump_baud_rate * (1 + pump_roll_off) / 2)])
|
||||
f2_array = arange(cut_frequency, cut_frequency + (cut_baud_rate * (1 + cut_roll_off) / 2),
|
||||
f_cut_resolution) # Only positive f2 is used since integrand_f2 is symmetric
|
||||
|
||||
integrand_f1 = zeros(f1_array.size)
|
||||
for f1_index, f1 in enumerate(f1_array):
|
||||
delta_beta = 4 * pi ** 2 * (f1 - f_eval) * (f2_array - f_eval) * (
|
||||
beta2 + pi * beta3 * (f1 + f2_array - 2 * f_ref_beta))
|
||||
integrand_f2 = NliSolver._generalized_rho_nli(delta_beta, rho_pump, z, alpha)
|
||||
integrand_f1[f1_index] = 2 * trapz(integrand_f2, f2_array) # 2x since integrand_f2 is symmetric in f2
|
||||
generalized_psi = 0.5 * sum(integrand_f1) * pump_baud_rate
|
||||
return generalized_psi
|
||||
|
||||
@staticmethod
|
||||
def _generalized_psi(f_eval, cut_frequency, cut_baud_rate, cut_roll_off, pump_frequency, pump_baud_rate,
|
||||
pump_roll_off, f_cut_resolution, f_pump_resolution, srs, alpha, beta2, beta3, f_ref_beta):
|
||||
"""Computes the generalized psi function similarly to the one used in the GN model."""
|
||||
z = srs.z
|
||||
rho_norm = srs.rho * exp(outer(alpha / 2, z))
|
||||
rho_pump = interp1d(srs.frequency, rho_norm, axis=0)(pump_frequency)
|
||||
|
||||
f1_array = arange(pump_frequency - (pump_baud_rate * (1 + pump_roll_off) / 2),
|
||||
pump_frequency + (pump_baud_rate * (1 + pump_roll_off) / 2),
|
||||
f_pump_resolution)
|
||||
f2_array = arange(cut_carrier.frequency - (cut_carrier.baud_rate * (1 + cut_carrier.roll_off) / 2),
|
||||
cut_carrier.frequency + (cut_carrier.baud_rate * (1 + cut_carrier.roll_off) / 2),
|
||||
f2_array = arange(cut_frequency - (cut_baud_rate * (1 + cut_roll_off) / 2),
|
||||
cut_frequency + (cut_baud_rate * (1 + cut_roll_off) / 2),
|
||||
f_cut_resolution)
|
||||
psd1 = raised_cosine_comb(f1_array, pump_carrier) * (pump_carrier.baud_rate / pump_carrier.power.signal)
|
||||
rc1 = raised_cosine(f1_array, pump_frequency, pump_baud_rate, pump_roll_off)
|
||||
|
||||
integrand_f1 = zeros(len(f1_array))
|
||||
for f1_index, (f1, psd1_sample) in enumerate(zip(f1_array, psd1)):
|
||||
f3_array = f1 + f2_array - f_eval
|
||||
psd2 = raised_cosine_comb(f2_array, cut_carrier) * (cut_carrier.baud_rate / cut_carrier.power.signal)
|
||||
psd3 = raised_cosine_comb(f3_array, pump_carrier) * (pump_carrier.baud_rate / pump_carrier.power.signal)
|
||||
ggg = psd1_sample * psd2 * psd3
|
||||
delta_beta = 4 * pi**2 * (f1 - f_eval) * (f2_array - f_eval) * \
|
||||
(beta2 + pi * beta3 * (f1 + f2_array - 2 * f_ref_beta))
|
||||
integrand_f2 = ggg * NliSolver._generalized_rho_nli(delta_beta, rho_pump, z, alpha)
|
||||
integrand_f1[f1_index] = trapz(integrand_f2, f2_array)
|
||||
integrand_f1 = zeros(f1_array.size)
|
||||
for i in range(f1_array.size):
|
||||
f3_array = f1_array[i] + f2_array - f_eval
|
||||
rc2 = raised_cosine(f2_array, cut_frequency, cut_baud_rate, cut_roll_off)
|
||||
rc3 = raised_cosine(f3_array, pump_frequency, pump_baud_rate, pump_roll_off)
|
||||
delta_beta = 4 * pi ** 2 * (f1_array[i] - f_eval) * (f2_array - f_eval) * (
|
||||
beta2 + pi * beta3 * (f1_array[i] + f2_array - 2 * f_ref_beta))
|
||||
integrand_f2 = rc1[i] * rc2 * rc3 * NliSolver._generalized_rho_nli(delta_beta, rho_pump, z, alpha)
|
||||
integrand_f1[i] = trapz(integrand_f2, f2_array)
|
||||
generalized_psi = trapz(integrand_f1, f1_array)
|
||||
return generalized_psi
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ 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 scipy import constants
|
||||
from copy import deepcopy
|
||||
|
||||
from gnpy.core.exceptions import ConfigurationError
|
||||
|
||||
@@ -213,7 +214,7 @@ freq2wavelength = constants.nu2lambda
|
||||
|
||||
|
||||
def freq2wavelength(value):
|
||||
""" Converts frequency units to wavelength units.
|
||||
"""Converts frequency units to wavelength units.
|
||||
|
||||
>>> round(freq2wavelength(191.35e12) * 1e9, 3)
|
||||
1566.723
|
||||
@@ -247,8 +248,7 @@ def per_label_average(values, labels):
|
||||
|
||||
|
||||
def pretty_summary_print(summary):
|
||||
"""Build a prettty string that shows the summary dict values per label with 2 digits
|
||||
"""
|
||||
"""Build a prettty string that shows the summary dict values per label with 2 digits"""
|
||||
if len(summary) == 1:
|
||||
return f'{list(summary.values())[0]:.2f}'
|
||||
text = ', '.join([f'{label}: {value:.2f}' for label, value in summary.items()])
|
||||
@@ -256,7 +256,7 @@ def pretty_summary_print(summary):
|
||||
|
||||
|
||||
def deltawl2deltaf(delta_wl, wavelength):
|
||||
""" deltawl2deltaf(delta_wl, wavelength):
|
||||
"""deltawl2deltaf(delta_wl, wavelength):
|
||||
delta_wl is BW in wavelength units
|
||||
wavelength is the center wl
|
||||
units for delta_wl and wavelength must be same
|
||||
@@ -274,9 +274,9 @@ def deltawl2deltaf(delta_wl, wavelength):
|
||||
|
||||
|
||||
def deltaf2deltawl(delta_f, frequency):
|
||||
""" deltawl2deltaf(delta_f, frequency):
|
||||
converts delta frequency to delta wavelength
|
||||
units for delta_wl and wavelength must be same
|
||||
"""convert delta frequency to delta wavelength
|
||||
|
||||
Units for delta_wl and wavelength must be same.
|
||||
|
||||
:param delta_f: delta frequency in same units as frequency
|
||||
:param frequency: frequency BW is relevant for
|
||||
@@ -291,8 +291,7 @@ def deltaf2deltawl(delta_f, frequency):
|
||||
|
||||
|
||||
def rrc(ffs, baud_rate, alpha):
|
||||
""" rrc(ffs, baud_rate, alpha): computes the root-raised cosine filter
|
||||
function.
|
||||
"""compute the root-raised cosine filter function
|
||||
|
||||
:param ffs: A numpy array of frequencies
|
||||
:param baud_rate: The Baud Rate of the System
|
||||
@@ -318,7 +317,7 @@ def rrc(ffs, baud_rate, alpha):
|
||||
|
||||
|
||||
def merge_amplifier_restrictions(dict1, dict2):
|
||||
"""Updates contents of dicts recursively
|
||||
"""Update contents of dicts recursively
|
||||
|
||||
>>> d1 = {'params': {'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []}}}
|
||||
>>> d2 = {'params': {'target_pch_out_db': -20}}
|
||||
@@ -413,3 +412,43 @@ def convert_length(value, units):
|
||||
return value * 1e3
|
||||
else:
|
||||
raise ConfigurationError(f'Cannot convert length in "{units}" into meters')
|
||||
|
||||
|
||||
def replace_none(dictionary):
|
||||
""" Replaces None with inf values in a frequency slots dict
|
||||
|
||||
>>> replace_none({'N': 3, 'M': None})
|
||||
{'N': 3, 'M': inf}
|
||||
|
||||
"""
|
||||
for key, val in dictionary.items():
|
||||
if val is None:
|
||||
dictionary[key] = float('inf')
|
||||
if val == float('inf'):
|
||||
dictionary[key] = None
|
||||
return dictionary
|
||||
|
||||
|
||||
def order_slots(slots):
|
||||
""" Order frequency slots from larger slots to smaller ones up to None
|
||||
|
||||
>>> l = [{'N': 3, 'M': None}, {'N': 2, 'M': 1}, {'N': None, 'M': None},{'N': 7, 'M': 2},{'N': None, 'M': 1} , {'N': None, 'M': 0}]
|
||||
>>> order_slots(l)
|
||||
([7, 2, None, None, 3, None], [2, 1, 1, 0, None, None], [3, 1, 4, 5, 0, 2])
|
||||
"""
|
||||
slots_list = deepcopy(slots)
|
||||
slots_list = [replace_none(e) for e in slots_list]
|
||||
for i, e in enumerate(slots_list):
|
||||
e['i'] = i
|
||||
slots_list = sorted(slots_list, key=lambda x: (-x['M'], x['N']) if x['M'] != float('inf') else (x['M'], x['N']))
|
||||
slots_list = [replace_none(e) for e in slots_list]
|
||||
return [e['N'] for e in slots_list], [e['M'] for e in slots_list], [e['i'] for e in slots_list]
|
||||
|
||||
|
||||
def restore_order(elements, order):
|
||||
""" Use order to re-order the element of the list, and ignore None values
|
||||
|
||||
>>> restore_order([7, 2, None, None, 3, None], [3, 1, 4, 5, 0, 2])
|
||||
[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]
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"gain_ripple": [
|
||||
0.0
|
||||
],
|
||||
"f_min": 191.35e12,
|
||||
"f_max": 196.1e12,
|
||||
"dgt": [
|
||||
1.0,
|
||||
1.017807767853702,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
'''
|
||||
"""
|
||||
Processing of data via :py:mod:`.json_io`.
|
||||
Utilities for Excel conversion in :py:mod:`.convert` and :py:mod:`.service_sheet`.
|
||||
Example code in :py:mod:`.cli_examples` and :py:mod:`.plots`.
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.tools.cli_examples
|
||||
=======================
|
||||
|
||||
Common code for CLI examples
|
||||
'''
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import logging
|
||||
@@ -19,9 +19,9 @@ import gnpy.core.ansi_escapes as ansi_escapes
|
||||
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
|
||||
from gnpy.core.equipment import trx_mode_params
|
||||
import gnpy.core.exceptions as exceptions
|
||||
from gnpy.core.network import build_network
|
||||
from gnpy.core.network import add_missing_elements_in_network, design_network
|
||||
from gnpy.core.parameters import SimParams
|
||||
from gnpy.core.utils import db2lin, lin2db, automatic_nch
|
||||
from gnpy.core.utils import db2lin, lin2db, automatic_nch, watt2dbm, dbm2watt
|
||||
from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation,
|
||||
BLOCKING_NOPATH, correct_json_route_list,
|
||||
deduplicate_disjunctions, compute_path_with_disjunction,
|
||||
@@ -48,7 +48,7 @@ def show_example_data_dir():
|
||||
|
||||
|
||||
def load_common_data(equipment_filename, topology_filename, simulation_filename, save_raw_network_filename):
|
||||
'''Load common configuration from JSON files'''
|
||||
"""Load common configuration from JSON files"""
|
||||
|
||||
try:
|
||||
equipment = load_equipment(equipment_filename)
|
||||
@@ -85,7 +85,7 @@ def load_common_data(equipment_filename, topology_filename, simulation_filename,
|
||||
|
||||
|
||||
def _setup_logging(args):
|
||||
logging.basicConfig(level={2: logging.DEBUG, 1: logging.INFO, 0: logging.CRITICAL}.get(args.verbose, logging.DEBUG))
|
||||
logging.basicConfig(level={2: logging.DEBUG, 1: logging.INFO, 0: logging.WARNING}.get(args.verbose, logging.DEBUG))
|
||||
|
||||
|
||||
def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
|
||||
@@ -197,37 +197,37 @@ def transmission_main_example(args=None):
|
||||
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'])
|
||||
params['nb_channel'] = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
|
||||
# use ref_req to hold reference channel used for design and req for the propagation
|
||||
# and req to hold channels to be propagated
|
||||
# apply power sweep on the design and on the channels
|
||||
ref_req = PathRequest(**params)
|
||||
pref_ch_db = watt2dbm(ref_req.power)
|
||||
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)
|
||||
params['nb_channel'] = len(initial_spectrum)
|
||||
print('User input for spectrum used for propagation instead of SI')
|
||||
params['nb_channel'] = nb_channels
|
||||
req = PathRequest(**params)
|
||||
p_ch_db = watt2dbm(req.power)
|
||||
req.initial_spectrum = initial_spectrum
|
||||
print(f'There are {nb_channels} channels propagating')
|
||||
print(f'There are {req.nb_channel} 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']))
|
||||
if not args.no_insert_edfas:
|
||||
try:
|
||||
add_missing_elements_in_network(network, equipment)
|
||||
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)
|
||||
|
||||
# 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)
|
||||
try:
|
||||
build_network(network, equipment, pref_ch_db, pref_total_db, args.no_insert_edfas)
|
||||
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)
|
||||
|
||||
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
|
||||
@@ -237,15 +237,32 @@ def transmission_main_example(args=None):
|
||||
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]')
|
||||
# initial network is designed using req.power. that is that any missing information (amp gain or delta_p) is filled
|
||||
# using this req.power, previous to any sweep requested later on.
|
||||
try:
|
||||
design_network(ref_req, network, equipment, set_connector_losses=True, verbose=True)
|
||||
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)
|
||||
|
||||
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}:')
|
||||
for dp_db in power_range:
|
||||
req.power = db2lin(pref_ch_db + dp_db) * 1e-3
|
||||
ref_req.power = dbm2watt(pref_ch_db + dp_db)
|
||||
req.power = dbm2watt(p_ch_db + dp_db)
|
||||
design_network(ref_req, network, equipment, set_connector_losses=False, verbose=False)
|
||||
# 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)
|
||||
if power_mode:
|
||||
print(f'\nPropagating with input power = {ansi_escapes.cyan}{lin2db(req.power*1e3):.2f} dBm{ansi_escapes.reset}:')
|
||||
print(f'\nPropagating with input power = {ansi_escapes.cyan}{watt2dbm(req.power):.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)
|
||||
@@ -323,25 +340,50 @@ def path_requests_run(args=None):
|
||||
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} into JSON format')
|
||||
_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)
|
||||
|
||||
# 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
|
||||
if not args.no_insert_edfas:
|
||||
try:
|
||||
add_missing_elements_in_network(network, equipment)
|
||||
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)
|
||||
|
||||
p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
|
||||
equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
|
||||
params = {
|
||||
'request_id': 'reference',
|
||||
'trx_type': '',
|
||||
'trx_mode': '',
|
||||
'source': None,
|
||||
'destination': None,
|
||||
'bidir': False,
|
||||
'nodes_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)
|
||||
}
|
||||
trx_params = trx_mode_params(equipment)
|
||||
params.update(trx_params)
|
||||
reference_channel = PathRequest(**params)
|
||||
try:
|
||||
build_network(network, equipment, p_db, p_total_db, args.no_insert_edfas)
|
||||
design_network(reference_channel, network, equipment, verbose=True)
|
||||
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}')
|
||||
|
||||
@@ -21,18 +21,22 @@ the "east" information so that it is possible to input undirected data.
|
||||
"""
|
||||
|
||||
from xlrd import open_workbook
|
||||
from logging import getLogger
|
||||
from argparse import ArgumentParser
|
||||
from collections import namedtuple, Counter, defaultdict
|
||||
from itertools import chain
|
||||
from json import dumps
|
||||
from pathlib import Path
|
||||
from copy import copy
|
||||
from gnpy.core import ansi_escapes
|
||||
|
||||
from gnpy.core.utils import silent_remove
|
||||
from gnpy.core.exceptions import NetworkTopologyError
|
||||
from gnpy.core.elements import Edfa, Fused, Fiber
|
||||
|
||||
|
||||
_logger = getLogger(__name__)
|
||||
|
||||
|
||||
def all_rows(sh, start=0):
|
||||
return (sh.row(x) for x in range(start, sh.nrows))
|
||||
|
||||
@@ -183,18 +187,18 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
|
||||
slice_out = read_slice(my_sheet, start_line + iteration, slice_in, h0)
|
||||
iteration += 1
|
||||
if slice_out == (-1, -1):
|
||||
msg = f'missing header {h0}'
|
||||
if h0 in ('east', 'Node A', 'Node Z', 'City'):
|
||||
print(f'{ansi_escapes.red}CRITICAL{ansi_escapes.reset}: missing _{h0}_ header: EXECUTION ENDS')
|
||||
raise NetworkTopologyError(f'Missing _{h0}_ header')
|
||||
raise NetworkTopologyError(msg)
|
||||
else:
|
||||
print(f'missing header {h0}')
|
||||
_logger.warning(msg)
|
||||
elif not isinstance(input_headers_dict[h0], dict):
|
||||
headers[slice_out[0]] = input_headers_dict[h0]
|
||||
else:
|
||||
headers = parse_headers(my_sheet, input_headers_dict[h0], headers, start_line + 1, slice_out)
|
||||
if headers == {}:
|
||||
print(f'{ansi_escapes.red}CRITICAL ERROR{ansi_escapes.reset}: could not find any header to read _ ABORT')
|
||||
raise NetworkTopologyError('Could not find any header to read')
|
||||
msg = 'CRITICAL ERROR: could not find any header to read _ ABORT'
|
||||
raise NetworkTopologyError(msg)
|
||||
return headers
|
||||
|
||||
|
||||
@@ -219,40 +223,76 @@ def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
|
||||
for l1 in links:
|
||||
for l2 in links:
|
||||
if l1 is not l2 and l1 == l2 and l2 not in duplicate_links:
|
||||
print(f'\nWARNING\n \
|
||||
_logger.warning(f'\nWARNING\n \
|
||||
link {l1.from_city}-{l1.to_city} is duplicate \
|
||||
\nthe 1st duplicate link will be removed but you should check Links sheet input')
|
||||
duplicate_links.append(l1)
|
||||
for l in duplicate_links:
|
||||
links.remove(l)
|
||||
links_by_city[l.from_city].remove(l)
|
||||
links_by_city[l.to_city].remove(l)
|
||||
|
||||
if duplicate_links:
|
||||
msg = 'XLS error: ' \
|
||||
+ f'links {_format_items([(d.from_city, d.to_city) for d in duplicate_links])} are duplicate'
|
||||
raise NetworkTopologyError(msg)
|
||||
unreferenced_nodes = [n for n in nodes_by_city if n not in links_by_city]
|
||||
if unreferenced_nodes:
|
||||
raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} The following nodes are not '
|
||||
f'referenced from the {ansi_escapes.cyan}Links{ansi_escapes.reset} sheet. '
|
||||
f'If unused, remove them from the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} '
|
||||
f'sheet:\n'
|
||||
+ _format_items(unreferenced_nodes))
|
||||
msg = 'XLS error: The following nodes are not ' \
|
||||
+ 'referenced from the Links sheet. ' \
|
||||
+ 'If unused, remove them from the Nodes sheet:\n' \
|
||||
+ _format_items(unreferenced_nodes)
|
||||
raise NetworkTopologyError(msg)
|
||||
# no need to check "Links" for invalid nodes because that's already in parse_excel()
|
||||
wrong_eqpt_from = [n for n in eqpts_by_city if n not in nodes_by_city]
|
||||
wrong_eqpt_to = [n.to_city for destinations in eqpts_by_city.values()
|
||||
for n in destinations if n.to_city not in nodes_by_city]
|
||||
wrong_eqpt = wrong_eqpt_from + wrong_eqpt_to
|
||||
if wrong_eqpt:
|
||||
raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} '
|
||||
f'The {ansi_escapes.cyan}Eqpt{ansi_escapes.reset} sheet refers to nodes that '
|
||||
f'are not defined in the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} sheet:\n'
|
||||
+ _format_items(wrong_eqpt))
|
||||
msg = 'XLS error: ' \
|
||||
+ 'The Eqpt sheet refers to nodes that ' \
|
||||
+ 'are not defined in the Nodes sheet:\n'\
|
||||
+ _format_items(wrong_eqpt)
|
||||
raise NetworkTopologyError(msg)
|
||||
# Now check links that are not listed in Links sheet, and duplicates
|
||||
bad_eqpt = []
|
||||
possible_links = [f'{e.from_city}|{e.to_city}' for e in links] + [f'{e.to_city}|{e.from_city}' for e in links]
|
||||
possible_eqpt = []
|
||||
duplicate_eqpt = []
|
||||
duplicate_ila = []
|
||||
for city, eqpts in eqpts_by_city.items():
|
||||
for eqpt in eqpts:
|
||||
# Check that each node_A-node_Z exists in links
|
||||
nodea_nodez = f'{eqpt.from_city}|{eqpt.to_city}'
|
||||
nodez_nodea = f'{eqpt.to_city}|{eqpt.from_city}'
|
||||
if nodea_nodez not in possible_links \
|
||||
or nodez_nodea not in possible_links:
|
||||
bad_eqpt.append([eqpt.from_city, eqpt.to_city])
|
||||
else:
|
||||
# Check that there are no duplicate lines in the Eqpt sheet
|
||||
if nodea_nodez in possible_eqpt:
|
||||
duplicate_eqpt.append([eqpt.from_city, eqpt.to_city])
|
||||
else:
|
||||
possible_eqpt.append(nodea_nodez)
|
||||
# check that there are no two lines defining an ILA with different directions
|
||||
if nodes_by_city[city].node_type == 'ILA' and len(eqpts) > 1:
|
||||
duplicate_ila.append(city)
|
||||
if bad_eqpt:
|
||||
msg = 'XLS error: ' \
|
||||
+ 'The Eqpt sheet references links that ' \
|
||||
+ 'are not defined in the Links sheet:\n' \
|
||||
+ _format_items(f'{item[0]} -> {item[1]}' for item in bad_eqpt)
|
||||
raise NetworkTopologyError(msg)
|
||||
if duplicate_eqpt:
|
||||
msg = 'XLS error: Duplicate lines in Eqpt sheet:' \
|
||||
+ _format_items(f'{item[0]} -> {item[1]}' for item in duplicate_eqpt)
|
||||
raise NetworkTopologyError(msg)
|
||||
if duplicate_ila:
|
||||
msg = 'XLS error: Duplicate ILA eqpt definition in Eqpt sheet:' \
|
||||
+ _format_items(duplicate_ila)
|
||||
raise NetworkTopologyError(msg)
|
||||
|
||||
for city, link in links_by_city.items():
|
||||
if nodes_by_city[city].node_type.lower() == 'ila' and len(link) != 2:
|
||||
# wrong input: ILA sites can only be Degree 2
|
||||
# => correct to make it a ROADM and remove entry in links_by_city
|
||||
# TODO: put in log rather than print
|
||||
print(f'invalid node type ({nodes_by_city[city].node_type})\
|
||||
specified in {city}, replaced by ROADM')
|
||||
_logger.warning(f'invalid node type ({nodes_by_city[city].node_type}) '
|
||||
+ f'specified in {city}, replaced by ROADM')
|
||||
nodes_by_city[city].node_type = 'ROADM'
|
||||
for n in nodes:
|
||||
if n.city == city:
|
||||
@@ -642,17 +682,19 @@ def parse_excel(input_filename):
|
||||
# sanity check
|
||||
all_cities = Counter(n.city for n in nodes)
|
||||
if len(all_cities) != len(nodes):
|
||||
raise ValueError(f'Duplicate city: {all_cities}')
|
||||
msg = f'Duplicate city: {all_cities}'
|
||||
raise NetworkTopologyError(msg)
|
||||
bad_links = []
|
||||
for lnk in links:
|
||||
if lnk.from_city not in all_cities or lnk.to_city not in all_cities:
|
||||
bad_links.append([lnk.from_city, lnk.to_city])
|
||||
|
||||
if bad_links:
|
||||
raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} '
|
||||
f'The {ansi_escapes.cyan}Links{ansi_escapes.reset} sheet references nodes that '
|
||||
f'are not defined in the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} sheet:\n'
|
||||
+ _format_items(f'{item[0]} -> {item[1]}' for item in bad_links))
|
||||
msg = 'XLS error: ' \
|
||||
+ 'The Links sheet references nodes that ' \
|
||||
+ 'are not defined in the Nodes sheet:\n' \
|
||||
+ _format_items(f'{item[0]} -> {item[1]}' for item in bad_links)
|
||||
raise NetworkTopologyError(msg)
|
||||
|
||||
return nodes, links, eqpts, roadms
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.tools.json_io
|
||||
==================
|
||||
|
||||
Loading and saving data from JSON files in GNPy's internal data format
|
||||
'''
|
||||
"""
|
||||
|
||||
from networkx import DiGraph
|
||||
from logging import getLogger
|
||||
@@ -15,13 +15,15 @@ import json
|
||||
from collections import namedtuple
|
||||
from numpy import arange
|
||||
|
||||
from gnpy.core import ansi_escapes, elements
|
||||
from gnpy.core import elements
|
||||
from gnpy.core.equipment import trx_mode_params
|
||||
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.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
|
||||
from gnpy.tools.service_sheet import read_service_sheet
|
||||
|
||||
@@ -50,10 +52,9 @@ class _JsonThing:
|
||||
for k, v in default_values.items():
|
||||
setattr(self, k, clean_kwargs.get(k, v))
|
||||
if k not in clean_kwargs and name != 'Amp':
|
||||
print(ansi_escapes.red +
|
||||
f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' +
|
||||
f'\n default value is {k} = {v}' +
|
||||
ansi_escapes.reset)
|
||||
msg = f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' \
|
||||
+ f'\n default value is {k} = {v}'
|
||||
_logger.warning(msg)
|
||||
|
||||
|
||||
class SI(_JsonThing):
|
||||
@@ -109,11 +110,12 @@ class Roadm(_JsonThing):
|
||||
allowed_equalisations = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth']
|
||||
requested_eq_mask = [eq in kwargs for eq in allowed_equalisations]
|
||||
if sum(requested_eq_mask) > 1:
|
||||
raise EquipmentConfigError('Only one equalization type should be set in ROADM, found: '
|
||||
+ ', '.join(eq for eq in allowed_equalisations if eq in kwargs))
|
||||
msg = 'Only one equalization type should be set in ROADM, found: ' \
|
||||
+ ', '.join(eq for eq in allowed_equalisations if eq in kwargs)
|
||||
raise EquipmentConfigError(msg)
|
||||
if not any(requested_eq_mask):
|
||||
raise EquipmentConfigError('No equalization type set in ROADM')
|
||||
|
||||
msg = 'No equalization type set in ROADM'
|
||||
raise EquipmentConfigError(msg)
|
||||
for key in allowed_equalisations:
|
||||
if key in kwargs:
|
||||
setattr(self, key, kwargs[key])
|
||||
@@ -133,6 +135,7 @@ class Transceiver(_JsonThing):
|
||||
for mode_params in self.mode:
|
||||
penalties = mode_params.get('penalties')
|
||||
mode_params['penalties'] = {}
|
||||
mode_params['equalization_offset_db'] = mode_params.get('equalization_offset_db', 0)
|
||||
if not penalties:
|
||||
continue
|
||||
for impairment in ('chromatic_dispersion', 'pmd', 'pdl'):
|
||||
@@ -162,9 +165,14 @@ class Fiber(_JsonThing):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.update_attr(self.default_values, kwargs, self.__class__.__name__)
|
||||
for optional in ['gamma', 'raman_efficiency']:
|
||||
if optional in kwargs:
|
||||
setattr(self, optional, kwargs[optional])
|
||||
if 'gamma' in kwargs:
|
||||
setattr(self, 'gamma', kwargs['gamma'])
|
||||
if 'raman_efficiency' in kwargs:
|
||||
raman_coefficient = kwargs['raman_efficiency']
|
||||
cr = raman_coefficient.pop('cr')
|
||||
raman_coefficient['g0'] = cr
|
||||
raman_coefficient['reference_frequency'] = DEFAULT_RAMAN_COEFFICIENT['reference_frequency']
|
||||
setattr(self, 'raman_coefficient', raman_coefficient)
|
||||
|
||||
|
||||
class RamanFiber(Fiber):
|
||||
@@ -182,15 +190,24 @@ class Amp(_JsonThing):
|
||||
'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': None,
|
||||
'nf_ripple': 0,
|
||||
'dgt': None,
|
||||
'gain_ripple': 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
|
||||
'pdl': 0,
|
||||
'advance_configurations_from_json': None
|
||||
}
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
@@ -209,7 +226,8 @@ class Amp(_JsonThing):
|
||||
try:
|
||||
nf0 = kwargs.pop('nf0')
|
||||
except KeyError: # nf0 is expected for a fixed gain amp
|
||||
raise EquipmentConfigError(f'missing nf0 value input for amplifier: {type_variety} in equipment config')
|
||||
msg = f'missing nf0 value input for amplifier: {type_variety} in equipment config'
|
||||
raise EquipmentConfigError(msg)
|
||||
for k in ('nf_min', 'nf_max'):
|
||||
try:
|
||||
del kwargs[k]
|
||||
@@ -224,7 +242,8 @@ class Amp(_JsonThing):
|
||||
nf_min = kwargs.pop('nf_min')
|
||||
nf_max = kwargs.pop('nf_max')
|
||||
except KeyError:
|
||||
raise EquipmentConfigError(f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config')
|
||||
msg = f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config'
|
||||
raise EquipmentConfigError(msg)
|
||||
try: # remove all remaining nf inputs
|
||||
del kwargs['nf0']
|
||||
except KeyError:
|
||||
@@ -246,7 +265,8 @@ class Amp(_JsonThing):
|
||||
preamp_variety = kwargs.pop('preamp_variety')
|
||||
booster_variety = kwargs.pop('booster_variety')
|
||||
except KeyError:
|
||||
raise EquipmentConfigError(f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config')
|
||||
msg = f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config'
|
||||
raise EquipmentConfigError(msg)
|
||||
dual_stage_def = Model_dual_stage(preamp_variety, booster_variety)
|
||||
else:
|
||||
raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist')
|
||||
@@ -368,9 +388,7 @@ def _update_dual_stage(equipment):
|
||||
|
||||
|
||||
def _roadm_restrictions_sanity_check(equipment):
|
||||
""" verifies that booster and preamp restrictions specified in roadm equipment are listed
|
||||
in the edfa.
|
||||
"""
|
||||
"""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:
|
||||
@@ -440,11 +458,11 @@ def load_network(filename, equipment):
|
||||
|
||||
|
||||
def save_network(network: DiGraph, filename: str):
|
||||
'''Dump the network into a JSON file
|
||||
"""Dump the network into a JSON file
|
||||
|
||||
:param network: network to work on
|
||||
:param filename: file to write to
|
||||
'''
|
||||
"""
|
||||
save_json(network_to_json(network), filename)
|
||||
|
||||
|
||||
@@ -486,13 +504,20 @@ def network_from_json(json_data, equipment):
|
||||
# if more than one equalization was defined in element config, then raise an error
|
||||
extra_params = merge_equalization(temp, extra_params)
|
||||
if not extra_params:
|
||||
raise ConfigurationError(f'ROADM {el_config["uid"]}: invalid equalization settings')
|
||||
msg = f'ROADM {el_config["uid"]}: invalid equalization settings'
|
||||
raise ConfigurationError(msg)
|
||||
temp = merge_amplifier_restrictions(temp, extra_params)
|
||||
el_config['params'] = temp
|
||||
el_config['type_variety'] = variety
|
||||
elif (typ in ['Fiber', 'RamanFiber']) or (typ == 'Edfa' and variety not in ['default', '']):
|
||||
elif (typ in ['Fiber', 'RamanFiber']):
|
||||
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':
|
||||
if variety in ['default', '']:
|
||||
el_config['params'] = Amp.default_values
|
||||
else:
|
||||
raise ConfigurationError(f'The Edfa of variety type {variety} was not recognized:'
|
||||
'\nplease check it is properly defined in the eqpt_config json file')
|
||||
el = cls(**el_config)
|
||||
g.add_node(el)
|
||||
|
||||
@@ -507,7 +532,8 @@ def network_from_json(json_data, equipment):
|
||||
edge_length = 0.01
|
||||
g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
|
||||
except KeyError:
|
||||
raise NetworkTopologyError(f'can not find {from_node} or {to_node} defined in {cx}')
|
||||
msg = f'can not find {from_node} or {to_node} defined in {cx}'
|
||||
raise NetworkTopologyError(msg)
|
||||
|
||||
return g
|
||||
|
||||
@@ -538,15 +564,13 @@ def save_json(obj, filename):
|
||||
|
||||
|
||||
def load_requests(filename, eqpt, bidir, network, network_filename):
|
||||
""" loads the requests from a json or an excel file into a data string
|
||||
"""
|
||||
"""loads the requests from a json or an excel file into a data string"""
|
||||
if filename.suffix.lower() in ('.xls', '.xlsx'):
|
||||
_logger.info('Automatically converting requests from XLS to JSON')
|
||||
try:
|
||||
return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
|
||||
except ServiceError as this_e:
|
||||
print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {this_e}')
|
||||
exit(1)
|
||||
raise ServiceError(f'Service error: {this_e}')
|
||||
else:
|
||||
return load_json(filename)
|
||||
|
||||
@@ -563,6 +587,9 @@ def requests_from_json(json_data, equipment):
|
||||
params['bidir'] = req['bidirectional']
|
||||
params['destination'] = req['destination']
|
||||
params['trx_type'] = req['path-constraints']['te-bandwidth']['trx_type']
|
||||
if params['trx_type'] is None:
|
||||
msg = f'Request {req["request-id"]} has no transceiver type defined.'
|
||||
raise ServiceError(msg)
|
||||
params['trx_mode'] = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
|
||||
params['format'] = params['trx_mode']
|
||||
params['spacing'] = req['path-constraints']['te-bandwidth']['spacing']
|
||||
@@ -575,9 +602,12 @@ def requests_from_json(json_data, equipment):
|
||||
# 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
|
||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||
try:
|
||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||
except EquipmentConfigError as e:
|
||||
msg = f'Equipment Config error in {req["request-id"]}: {e}'
|
||||
raise EquipmentConfigError(msg) from e
|
||||
params.update(trx_params)
|
||||
# print(trx_params['min_spacing'])
|
||||
# optical power might be set differently in the request. if it is indicated then the
|
||||
# params['power'] is updated
|
||||
try:
|
||||
@@ -598,7 +628,8 @@ def requests_from_json(json_data, equipment):
|
||||
params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
|
||||
except KeyError:
|
||||
params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
|
||||
params['effective_freq_slot'] = req['path-constraints']['te-bandwidth'].get('effective-freq-slot', [None])[0]
|
||||
params['effective_freq_slot'] = \
|
||||
req['path-constraints']['te-bandwidth'].get('effective-freq-slot', [{'N': None, 'M': None}])
|
||||
try:
|
||||
params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
|
||||
except KeyError:
|
||||
@@ -612,44 +643,66 @@ def _check_one_request(params, f_max_from_si):
|
||||
"""Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
|
||||
f_min = params['f_min']
|
||||
f_max = params['f_max']
|
||||
max_recommanded_nb_channels = automatic_nch(f_min, f_max, params['spacing'])
|
||||
max_recommanded_nb_channels = automatic_nch(f_min, f_max_from_si, params['spacing'])
|
||||
if params['baud_rate'] is not None:
|
||||
# implicitly means that a mode is defined with min_spacing
|
||||
if params['min_spacing'] > params['spacing']:
|
||||
msg = f'Request {params["request_id"]} has spacing below transponder ' +\
|
||||
f'{params["trx_type"]} {params["trx_mode"]} min spacing value ' +\
|
||||
f'{params["min_spacing"]*1e-9}GHz.\nComputation stopped'
|
||||
print(msg)
|
||||
_logger.critical(msg)
|
||||
raise ServiceError(msg)
|
||||
if f_max > f_max_from_si:
|
||||
msg = f'''Requested channel number {params["nb_channel"]}, baud rate {params["baud_rate"]} GHz
|
||||
and requested spacing {params["spacing"]*1e-9}GHz is not consistent with frequency range
|
||||
{f_min*1e-12} THz, {f_max*1e-12} THz, min recommanded spacing {params["min_spacing"]*1e-9}GHz.
|
||||
max recommanded nb of channels is {max_recommanded_nb_channels}.'''
|
||||
_logger.critical(msg)
|
||||
msg = f'Requested channel number {params["nb_channel"]}, baud rate {params["baud_rate"] * 1e-9} GHz' \
|
||||
+ f' and requested spacing {params["spacing"]*1e-9}GHz is not consistent with frequency range' \
|
||||
+ f' {f_min*1e-12} THz, {f_max_from_si*1e-12} THz.' \
|
||||
+ f' Max recommanded nb of channels is {max_recommanded_nb_channels}.'
|
||||
raise ServiceError(msg)
|
||||
# Transponder mode already selected; will it fit to the requested bandwidth?
|
||||
if params['trx_mode'] is not None and params['effective_freq_slot'] is not None \
|
||||
and params['effective_freq_slot']['M'] is not None:
|
||||
_, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
|
||||
params['spacing'],
|
||||
params['bit_rate'])
|
||||
# params['effective_freq_slot']['M'] value should be bigger than the computed requested_m (simple estimate)
|
||||
if params['trx_mode'] is not None and params['effective_freq_slot'] is not None:
|
||||
required_nb_of_channels, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
|
||||
params['spacing'],
|
||||
params['bit_rate'])
|
||||
_, per_channel_m = compute_spectrum_slot_vs_bandwidth(params['bit_rate'],
|
||||
params['spacing'],
|
||||
params['bit_rate'])
|
||||
# each M should fit one or more channels if it is not None
|
||||
# spectrum slots should not overlap
|
||||
# resulting nb of channels should be bigger than the nb computed with path_bandwidth
|
||||
# without being splitted
|
||||
# TODO: elaborate a more accurate estimate with nb_wl * tx_osnr + possibly guardbands in case of
|
||||
# superchannel closed packing.
|
||||
|
||||
if requested_m > params['effective_freq_slot']['M']:
|
||||
msg = f'requested M {params["effective_freq_slot"]["M"]} number of slots for request' +\
|
||||
f'{params["request_id"]} should be greater than {requested_m} to support request' +\
|
||||
f'{params["path_bandwidth"] * 1e-9} Gbit/s with {params["trx_type"]} {params["trx_mode"]}'
|
||||
_logger.critical(msg)
|
||||
nb_of_channels = 0
|
||||
# order slots
|
||||
slots = sorted(params['effective_freq_slot'], key=lambda x: float('inf') if x['N'] is None else x['N'])
|
||||
for slot in slots:
|
||||
nb_of_channels = nb_of_channels + slot['M'] // per_channel_m if slot['M'] is not None \
|
||||
and nb_of_channels is not None else None
|
||||
if slot['M'] is not None and slot['M'] < per_channel_m:
|
||||
msg = f'Requested M {slot} number of slots for request' +\
|
||||
f' {params["request_id"]} should be greater than {per_channel_m} to support request' +\
|
||||
f'with {params["trx_type"]} {params["trx_mode"]}'
|
||||
_logger.critical(msg)
|
||||
if nb_of_channels is not None and nb_of_channels < required_nb_of_channels:
|
||||
msg = f'Requested M {slots} number of slots for request {params["request_id"]} support {nb_of_channels}' +\
|
||||
f' nb of channels while {required_nb_of_channels} are required to support request' +\
|
||||
f' {params["path_bandwidth"] * 1e-9} Gbit/s with {params["trx_type"]} {params["trx_mode"]}'
|
||||
raise ServiceError(msg)
|
||||
if nb_of_channels is not None:
|
||||
_, stop0n = mvalue_to_slots(slots[0]['N'], slots[0]['M'])
|
||||
i = 1
|
||||
while i < len(slots):
|
||||
slot = slots[i]
|
||||
startn, stopn = mvalue_to_slots(slot['N'], slot['M'])
|
||||
if startn <= stop0n:
|
||||
msg = f'Requested M {slots} for request {params["request_id"]} overlap'
|
||||
raise ServiceError(msg)
|
||||
_, stop0n = startn, stopn
|
||||
i += 1
|
||||
|
||||
|
||||
def disjunctions_from_json(json_data):
|
||||
""" reads the disjunction requests from the json dict and create the list
|
||||
of requested disjunctions for this set of requests
|
||||
"""reads the disjunction requests from the json dict and create the list
|
||||
of requested disjunctions for this set of requests
|
||||
"""
|
||||
disjunctions_list = []
|
||||
if 'synchronization' in json_data:
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
'''
|
||||
"""
|
||||
gnpy.tools.plots
|
||||
================
|
||||
|
||||
Graphs and plots usable from a CLI application
|
||||
'''
|
||||
"""
|
||||
|
||||
from matplotlib.pyplot import show, axis, figure, title, text
|
||||
from networkx import draw_networkx
|
||||
|
||||
@@ -18,7 +18,6 @@ from copy import deepcopy
|
||||
from gnpy.core.utils import db2lin
|
||||
from gnpy.core.exceptions import ServiceError
|
||||
from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
|
||||
import gnpy.core.ansi_escapes as ansi_escapes
|
||||
from gnpy.tools.convert import corresp_names, corresp_next_node
|
||||
|
||||
SERVICES_COLUMN = 12
|
||||
@@ -68,24 +67,21 @@ class Request_element(Element):
|
||||
if [mode for mode in equipment['Transceiver'][Request.trx_type].mode if mode['format'] == Requestmode]:
|
||||
self.mode = Requestmode
|
||||
else:
|
||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
|
||||
# print(msg)
|
||||
logger.critical(msg)
|
||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
|
||||
+ f'with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
|
||||
raise ServiceError(msg)
|
||||
else:
|
||||
Requestmode = None
|
||||
self.mode = Request.mode
|
||||
except KeyError:
|
||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
|
||||
# print(msg)
|
||||
logger.critical(msg)
|
||||
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
|
||||
+ f'with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
|
||||
raise ServiceError(msg)
|
||||
# excel input are in GHz and dBm
|
||||
if Request.spacing is not None:
|
||||
self.spacing = Request.spacing * 1e9
|
||||
else:
|
||||
msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
|
||||
logger.critical(msg)
|
||||
raise ServiceError(msg)
|
||||
if Request.power is not None:
|
||||
self.power = db2lin(Request.power) * 1e-3
|
||||
@@ -225,7 +221,7 @@ def parse_excel(input_filename):
|
||||
def parse_service_sheet(service_sheet):
|
||||
""" reads each column according to authorized fieldnames. order is not important.
|
||||
"""
|
||||
logger.info(f'Validating headers on {service_sheet.name!r}')
|
||||
logger.debug(f'Validating headers on {service_sheet.name!r}')
|
||||
# add a test on field to enable the '' field case that arises when columns on the
|
||||
# right hand side are used as comments or drawing in the excel sheet
|
||||
header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
|
||||
@@ -245,7 +241,6 @@ def parse_service_sheet(service_sheet):
|
||||
service_fieldnames = [authorized_fieldnames[e] for e in header]
|
||||
except KeyError:
|
||||
msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
|
||||
logger.critical(msg)
|
||||
raise ValueError(msg)
|
||||
for row in all_rows(service_sheet, start=5):
|
||||
yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
|
||||
@@ -273,15 +268,13 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
|
||||
for pathreq in pathreqlist:
|
||||
# first check that source and dest are transceivers
|
||||
if pathreq.source not in transponders:
|
||||
msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find' +\
|
||||
f' transponder source : {pathreq.source}.{ansi_escapes.reset}'
|
||||
logger.critical(msg)
|
||||
msg = f'Request: {pathreq.request_id}: could not find' +\
|
||||
f' transponder source : {pathreq.source}.'
|
||||
raise ServiceError(msg)
|
||||
|
||||
if pathreq.destination not in transponders:
|
||||
msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find' +\
|
||||
f' transponder destination: {pathreq.destination}.{ansi_escapes.reset}'
|
||||
logger.critical(msg)
|
||||
msg = f'Request: {pathreq.request_id}: could not find' +\
|
||||
f' transponder destination: {pathreq.destination}.'
|
||||
raise ServiceError(msg)
|
||||
# silently pop source and dest nodes from the list if they were added by the user as first
|
||||
# and last elem in the constraints respectively. Other positions must lead to an error
|
||||
@@ -333,17 +326,16 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
|
||||
# too much ambiguity, 'b' is an ila, its name can be:
|
||||
# Edfa0_fiber (a → b)-xx if next node is c or
|
||||
# Edfa0_fiber (c → b)-xx if next node is a
|
||||
msg = f'{ansi_escapes.yellow}Invalid route node specified:' +\
|
||||
f'\n\t\'{n_id}\', replaced with \'{new_n}\'{ansi_escapes.reset}'
|
||||
logger.info(msg)
|
||||
msg = f'Request {pathreq.request_id}: Invalid route node specified:' \
|
||||
+ f'\n\t\'{n_id}\', replaced with \'{new_n}\''
|
||||
logger.warning(msg)
|
||||
pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
|
||||
except StopIteration:
|
||||
# shall not come in this case, unless requested direction does not exist
|
||||
msg = f'{ansi_escapes.yellow}Invalid route specified {n_id}: could' +\
|
||||
f' not decide on direction, skipped!.\nPlease add a valid' +\
|
||||
f' direction in constraints (next neighbour node){ansi_escapes.reset}'
|
||||
print(msg)
|
||||
logger.info(msg)
|
||||
msg = f'Request {pathreq.request_id}: Invalid route specified {n_id}: could' \
|
||||
+ ' not decide on direction, skipped!.\nPlease add a valid' \
|
||||
+ ' direction in constraints (next neighbour node)'
|
||||
logger.warning(msg)
|
||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
||||
pathreq.nodes_list.remove(n_id)
|
||||
else:
|
||||
@@ -351,28 +343,24 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
|
||||
# if no matching can be found in the network just ignore this constraint
|
||||
# if it is a loose constraint
|
||||
# warns the user that this node is not part of the topology
|
||||
msg = f'{ansi_escapes.yellow}Invalid node specified:\n\t\'{n_id}\'' +\
|
||||
f', could not use it as constraint, skipped!{ansi_escapes.reset}'
|
||||
print(msg)
|
||||
logger.info(msg)
|
||||
msg = f'Request {pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
|
||||
+ ', could not use it as constraint, skipped!'
|
||||
logger.warning(msg)
|
||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
||||
pathreq.nodes_list.remove(n_id)
|
||||
else:
|
||||
msg = f'{ansi_escapes.red}Could not find node:\n\t\'{n_id}\' in network' +\
|
||||
f' topology. Strict constraint can not be applied.{ansi_escapes.reset}'
|
||||
logger.critical(msg)
|
||||
msg = f'Request {pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
|
||||
+ ' topology. Strict constraint can not be applied.'
|
||||
raise ServiceError(msg)
|
||||
else:
|
||||
if temp.loose_list[i] == 'LOOSE':
|
||||
print(f'{ansi_escapes.yellow}Invalid route node specified:\n\t\'{n_id}\'' +
|
||||
f' type is not supported as constraint with xls network input,' +
|
||||
f' skipped!{ansi_escapes.reset}')
|
||||
logger.warning(f'Request {pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\''
|
||||
+ ' type is not supported as constraint with xls network input, skipped!')
|
||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
||||
pathreq.nodes_list.remove(n_id)
|
||||
else:
|
||||
msg = f'{ansi_escapes.red}Invalid route node specified \n\t\'{n_id}\'' +\
|
||||
f' type is not supported as constraint with xls network input,' +\
|
||||
f', Strict constraint can not be applied.{ansi_escapes.reset}'
|
||||
logger.critical(msg)
|
||||
msg = f'Invalid route node specified \n\t\'{n_id}\'' \
|
||||
+ ' type is not supported as constraint with xls network input,' \
|
||||
+ ', Strict constraint can not be applied.'
|
||||
raise ServiceError(msg)
|
||||
return pathreqlist
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
'''
|
||||
"""
|
||||
Tracking :py:mod:`.request` for spectrum and their :py:mod:`.spectrum_assignment`.
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -23,9 +23,9 @@ 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.info import create_input_spectral_information, carriers_to_spectral_information
|
||||
from gnpy.core import network as network_module
|
||||
from gnpy.core.exceptions import ServiceError, DisjunctionError
|
||||
import gnpy.core.ansi_escapes as ansi_escapes
|
||||
from copy import deepcopy
|
||||
from csv import writer
|
||||
from math import ceil
|
||||
@@ -35,15 +35,14 @@ LOGGER = getLogger(__name__)
|
||||
RequestParams = namedtuple('RequestParams', 'request_id source destination bidir trx_type'
|
||||
' 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')
|
||||
' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
|
||||
' equalization_offset_db')
|
||||
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
|
||||
' node_diverse disjunctions_req')
|
||||
|
||||
|
||||
class PathRequest:
|
||||
""" the class that contains all attributes related to a request
|
||||
"""
|
||||
|
||||
"""the class that contains all attributes related to a request"""
|
||||
def __init__(self, *args, **params):
|
||||
params = RequestParams(**params)
|
||||
self.request_id = params.request_id
|
||||
@@ -70,9 +69,10 @@ class PathRequest:
|
||||
self.cost = params.cost
|
||||
self.path_bandwidth = params.path_bandwidth
|
||||
if params.effective_freq_slot is not None:
|
||||
self.N = params.effective_freq_slot['N']
|
||||
self.M = params.effective_freq_slot['M']
|
||||
self.N = [s['N'] for s in params.effective_freq_slot]
|
||||
self.M = [s['M'] for s in params.effective_freq_slot]
|
||||
self.initial_spectrum = None
|
||||
self.offset_db = params.equalization_offset_db
|
||||
|
||||
def __str__(self):
|
||||
return '\n\t'.join([f'{type(self).__name__} {self.request_id}',
|
||||
@@ -104,8 +104,7 @@ class PathRequest:
|
||||
|
||||
|
||||
class Disjunction:
|
||||
""" the class that contains all attributes related to disjunction constraints
|
||||
"""
|
||||
"""the class that contains all attributes related to disjunction constraints"""
|
||||
|
||||
def __init__(self, *args, **params):
|
||||
params = DisjunctionParams(**params)
|
||||
@@ -150,8 +149,7 @@ class ResultElement:
|
||||
|
||||
@property
|
||||
def detailed_path_json(self):
|
||||
""" a function that builds path object for normal and blocking cases
|
||||
"""
|
||||
"""a function that builds path object for normal and blocking cases"""
|
||||
index = 0
|
||||
pro_list = []
|
||||
for element in self.computed_path:
|
||||
@@ -175,10 +173,10 @@ class ResultElement:
|
||||
temp = {
|
||||
'path-route-object': {
|
||||
'index': index,
|
||||
"label-hop": {
|
||||
"N": self.path_request.N,
|
||||
"M": self.path_request.M
|
||||
},
|
||||
"label-hop": [{
|
||||
"N": n,
|
||||
"M": m
|
||||
} for n, m in zip(self.path_request.N, self.path_request.M)],
|
||||
}
|
||||
}
|
||||
pro_list.append(temp)
|
||||
@@ -207,11 +205,9 @@ class ResultElement:
|
||||
|
||||
@property
|
||||
def path_properties(self):
|
||||
""" a function that returns the path properties (metrics, crossed elements) into a dict
|
||||
"""
|
||||
"""a function that returns the path properties (metrics, crossed elements) into a dict"""
|
||||
def path_metric(pth, req):
|
||||
""" creates the metrics dictionary
|
||||
"""
|
||||
"""creates the metrics dictionary"""
|
||||
return [
|
||||
{
|
||||
'metric-type': 'SNR-bandwidth',
|
||||
@@ -253,8 +249,7 @@ class ResultElement:
|
||||
|
||||
@property
|
||||
def pathresult(self):
|
||||
""" create the result dictionnary (response for a request)
|
||||
"""
|
||||
"""create the result dictionnary (response for a request)"""
|
||||
try:
|
||||
if self.path_request.blocking_reason in BLOCKING_NOPATH:
|
||||
response = {
|
||||
@@ -292,7 +287,6 @@ def compute_constrained_path(network, req):
|
||||
# been corrected and harmonized before
|
||||
msg = (f'Request {req.request_id} malformed list of nodes: last node should '
|
||||
'be destination trx')
|
||||
LOGGER.critical(msg)
|
||||
raise ValueError()
|
||||
|
||||
trx = [n for n in network if isinstance(n, Transceiver)]
|
||||
@@ -307,10 +301,9 @@ def compute_constrained_path(network, req):
|
||||
path_generator = shortest_simple_paths(network, source, destination, weight='weight')
|
||||
total_path = next(path for path in path_generator if ispart(nodes_list, path))
|
||||
except NetworkXNoPath:
|
||||
msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path from'
|
||||
f' {source.uid} to node: {destination.uid} in network topology{ansi_escapes.reset}')
|
||||
msg = (f'Request {req.request_id} could not find a path from'
|
||||
f' {source.uid} to node: {destination.uid} in network topology')
|
||||
LOGGER.critical(msg)
|
||||
print(msg)
|
||||
req.blocking_reason = 'NO_PATH'
|
||||
total_path = []
|
||||
except StopIteration:
|
||||
@@ -319,49 +312,35 @@ def compute_constrained_path(network, req):
|
||||
# last node which is the transceiver)
|
||||
# if all nodes i n node_list are LOOSE constraint, skip the constraints and find
|
||||
# a path w/o constraints, else there is no possible path
|
||||
print(f'{ansi_escapes.yellow}Request {req.request_id} could not find a path crossing '
|
||||
f'{[el.uid for el in nodes_list[:-1]]} in network topology{ansi_escapes.reset}')
|
||||
LOGGER.warning(f'Request {req.request_id} could not find a path crossing '
|
||||
f'{[el.uid for el in nodes_list[:-1]]} in network topology')
|
||||
|
||||
if 'STRICT' not in req.loose_list[:-1]:
|
||||
msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path with user_'
|
||||
f'include node constraints{ansi_escapes.reset}')
|
||||
LOGGER.info(msg)
|
||||
print(f'constraint ignored')
|
||||
msg = (f'Request {req.request_id} could not find a path with user_'
|
||||
f'include node constraints. Constraint ignored')
|
||||
LOGGER.warning(msg)
|
||||
total_path = dijkstra_path(network, source, destination, weight='weight')
|
||||
else:
|
||||
# one STRICT makes the whole list STRICT
|
||||
msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path with user '
|
||||
f'include node constraints.\nNo path computed{ansi_escapes.reset}')
|
||||
msg = (f'Request {req.request_id} could not find a path with user '
|
||||
f'include node constraints.\nNo path computed')
|
||||
LOGGER.critical(msg)
|
||||
print(msg)
|
||||
req.blocking_reason = 'NO_PATH_WITH_CONSTRAINT'
|
||||
total_path = []
|
||||
|
||||
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 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"""
|
||||
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, ref_carrier=ref_carrier(equipment))
|
||||
power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr, delta_pdb=req.offset_db)
|
||||
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)
|
||||
else:
|
||||
si = el(si)
|
||||
path[0].update_snr(si.tx_osnr)
|
||||
@@ -376,20 +355,21 @@ def propagate(path, req, equipment):
|
||||
|
||||
def propagate_and_optimize_mode(path, req, equipment):
|
||||
# if mode is unknown : loops on the modes starting from the highest baudrate fiting in the
|
||||
# step 1: create an ordered list of modes based on baudrate
|
||||
baudrate_to_explore = list(set([this_mode['baud_rate']
|
||||
for this_mode in equipment['Transceiver'][req.tsp].mode
|
||||
if float(this_mode['min_spacing']) <= req.spacing]))
|
||||
# step 1: create an ordered list of modes based on baudrate and power offset
|
||||
# order higher baudrate with higher power offset first
|
||||
baudrate_offset_to_explore = list(set([(this_mode['baud_rate'], this_mode['equalization_offset_db'])
|
||||
for this_mode in equipment['Transceiver'][req.tsp].mode
|
||||
if float(this_mode['min_spacing']) <= req.spacing]))
|
||||
# TODO be carefull on limits cases if spacing very close to req spacing eg 50.001 50.000
|
||||
baudrate_to_explore = sorted(baudrate_to_explore, reverse=True)
|
||||
if baudrate_to_explore:
|
||||
baudrate_offset_to_explore = sorted(baudrate_offset_to_explore, reverse=True)
|
||||
if baudrate_offset_to_explore:
|
||||
# at least 1 baudrate can be tested wrt spacing
|
||||
for this_br in baudrate_to_explore:
|
||||
for (this_br, this_offset) in baudrate_offset_to_explore:
|
||||
modes_to_explore = [this_mode for this_mode in equipment['Transceiver'][req.tsp].mode
|
||||
if this_mode['baud_rate'] == this_br and
|
||||
float(this_mode['min_spacing']) <= req.spacing]
|
||||
if this_mode['baud_rate'] == this_br
|
||||
and float(this_mode['min_spacing']) <= req.spacing]
|
||||
modes_to_explore = sorted(modes_to_explore,
|
||||
key=lambda x: x['bit_rate'], reverse=True)
|
||||
key=lambda x: (x['bit_rate'], x['equalization_offset_db']), reverse=True)
|
||||
# step2: computes propagation for each baudrate: stop and select the first that passes
|
||||
# TODO: the case of roll off is not included: for now use SI one
|
||||
# TODO: if the loop in mode optimization does not have a feasible path, then bugs
|
||||
@@ -401,10 +381,10 @@ def propagate_and_optimize_mode(path, req, equipment):
|
||||
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,
|
||||
tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment))
|
||||
delta_pdb=this_offset, tx_osnr=req.tx_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)
|
||||
else:
|
||||
spc_info = el(spc_info)
|
||||
for this_mode in modes_to_explore:
|
||||
@@ -428,22 +408,19 @@ def propagate_and_optimize_mode(path, req, equipment):
|
||||
|
||||
# returns the last propagated path and mode
|
||||
msg = f'\tWarning! Request {req.request_id}: no mode satisfies path SNR requirement.\n'
|
||||
print(msg)
|
||||
LOGGER.info(msg)
|
||||
LOGGER.warning(msg)
|
||||
req.blocking_reason = 'NO_FEASIBLE_MODE'
|
||||
return path, last_explored_mode
|
||||
else:
|
||||
# no baudrate satisfying spacing
|
||||
msg = f'\tWarning! Request {req.request_id}: no baudrate satisfies spacing requirement.\n'
|
||||
print(msg)
|
||||
LOGGER.info(msg)
|
||||
LOGGER.warning(msg)
|
||||
req.blocking_reason = 'NO_FEASIBLE_BAUDRATE_WITH_SPACING'
|
||||
return [], None
|
||||
|
||||
|
||||
def jsontopath_metric(path_metric):
|
||||
""" a functions that reads resulting metric from json string
|
||||
"""
|
||||
"""a functions that reads resulting metric from json string"""
|
||||
output_snr = next(e['accumulative-value']
|
||||
for e in path_metric if e['metric-type'] == 'SNR-0.1nm')
|
||||
output_snrbandwidth = next(e['accumulative-value']
|
||||
@@ -461,9 +438,7 @@ def jsontopath_metric(path_metric):
|
||||
|
||||
|
||||
def jsontoparams(my_p, tsp, mode, equipment):
|
||||
""" a function that derives optical params from transponder type and mode
|
||||
supports the no mode case
|
||||
"""
|
||||
"""a function that derives optical params from transponder type and mode supports the no mode case"""
|
||||
temp = []
|
||||
for elem in my_p['path-properties']['path-route-objects']:
|
||||
if 'num-unnum-hop' in elem['path-route-object']:
|
||||
@@ -473,8 +448,8 @@ def jsontoparams(my_p, tsp, mode, equipment):
|
||||
temp2 = []
|
||||
for elem in my_p['path-properties']['path-route-objects']:
|
||||
if 'label-hop' in elem['path-route-object'].keys():
|
||||
temp2.append(f'{elem["path-route-object"]["label-hop"]["N"]}, ' +
|
||||
f'{elem["path-route-object"]["label-hop"]["M"]}')
|
||||
temp2.append(f'{[e["N"] for e in elem["path-route-object"]["label-hop"]]}, '
|
||||
+ f'{[e["M"] for e in elem["path-route-object"]["label-hop"]]}')
|
||||
# OrderedDict.fromkeys returns the unique set of strings.
|
||||
# TODO: if spectrum changes along the path, we should be able to give the segments
|
||||
# eg for regeneration case
|
||||
@@ -498,10 +473,10 @@ def jsontoparams(my_p, tsp, mode, equipment):
|
||||
|
||||
|
||||
def jsontocsv(json_data, equipment, fileout):
|
||||
""" reads json path result file in accordance with:
|
||||
Yang model for requesting Path Computation
|
||||
draft-ietf-teas-yang-path-computation-01.txt.
|
||||
and write results in an CSV file
|
||||
"""reads json path result file in accordance with:
|
||||
Yang model for requesting Path Computation
|
||||
draft-ietf-teas-yang-path-computation-01.txt.
|
||||
and write results in an CSV file
|
||||
"""
|
||||
mywriter = writer(fileout)
|
||||
mywriter.writerow(('response-id', 'source', 'destination', 'path_bandwidth', 'Pass?',
|
||||
@@ -836,13 +811,13 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
|
||||
if not ispart(allpaths[id(pth)].req.nodes_list, pth):
|
||||
testispartok = False
|
||||
if 'STRICT' in allpaths[id(pth)].req.loose_list:
|
||||
LOGGER.info(f'removing solution from candidate paths\n{pth}')
|
||||
LOGGER.debug(f'removing solution from candidate paths\n{pth}')
|
||||
testispartnokloose = False
|
||||
break
|
||||
if testispartok:
|
||||
temp.append(sol)
|
||||
elif testispartnokloose:
|
||||
LOGGER.info(f'Adding solution as alternate solution not satisfying constraint\n{pth}')
|
||||
LOGGER.debug(f'Adding solution as alternate solution not satisfying constraint\n{pth}')
|
||||
alternatetemp.append(sol)
|
||||
if temp:
|
||||
candidates[this_d.disjunction_id] = temp
|
||||
@@ -864,9 +839,7 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
|
||||
# remove duplicated candidates
|
||||
candidates = remove_candidate(candidates, allpaths, allpaths[id(pth)].req, pth)
|
||||
else:
|
||||
msg = f'No disjoint path found with added constraint'
|
||||
LOGGER.critical(msg)
|
||||
print(f'{msg}\nComputation stopped.')
|
||||
msg = 'No disjoint path found with added constraint\nComputation stopped.'
|
||||
# TODO in this case: replay step 5 with the candidate without constraints
|
||||
raise DisjunctionError(msg)
|
||||
|
||||
@@ -887,8 +860,7 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
|
||||
|
||||
|
||||
def isdisjoint(pth1, pth2):
|
||||
""" returns 0 if disjoint
|
||||
"""
|
||||
"""returns 0 if disjoint"""
|
||||
edge1 = list(pairwise(pth1))
|
||||
edge2 = list(pairwise(pth2))
|
||||
for edge in edge1:
|
||||
@@ -898,9 +870,9 @@ def isdisjoint(pth1, pth2):
|
||||
|
||||
|
||||
def find_reversed_path(pth):
|
||||
""" select of intermediate roadms and find the path between them
|
||||
note that this function may not give an exact result in case of multiple
|
||||
links between two adjacent nodes.
|
||||
"""select of intermediate roadms and find the path between them
|
||||
note that this function may not give an exact result in case of multiple
|
||||
links between two adjacent nodes.
|
||||
"""
|
||||
# TODO add some indication on elements to indicate from which other they
|
||||
# are the reversed direction. This is partly done with oms indication
|
||||
@@ -923,9 +895,8 @@ def find_reversed_path(pth):
|
||||
# concatenation should be [roadma el1 el2 roadmb el3 el4 roadmc]
|
||||
reversed_path = list(OrderedDict.fromkeys(reversed_path))
|
||||
else:
|
||||
msg = f'Error while handling reversed path {pth[-1].uid} to {pth[0].uid}:' +\
|
||||
' can not handle unidir topology. TO DO.'
|
||||
LOGGER.critical(msg)
|
||||
msg = f'Error while handling reversed path {pth[-1].uid} to {pth[0].uid}:' \
|
||||
+ ' can not handle unidir topology. TO DO.'
|
||||
raise ValueError(msg)
|
||||
reversed_path.append(pth[0])
|
||||
|
||||
@@ -933,9 +904,7 @@ def find_reversed_path(pth):
|
||||
|
||||
|
||||
def ispart(ptha, pthb):
|
||||
""" the functions takes two paths a and b and retrns True
|
||||
if all a elements are part of b and in the same order
|
||||
"""
|
||||
"""the functions takes two paths a and b and retrns True if all a elements are part of b and in the same order"""
|
||||
j = 0
|
||||
for elem in ptha:
|
||||
if elem in pthb:
|
||||
@@ -949,8 +918,7 @@ def ispart(ptha, pthb):
|
||||
|
||||
|
||||
def remove_candidate(candidates, allpaths, rqst, pth):
|
||||
""" filter duplicate candidates
|
||||
"""
|
||||
"""filter duplicate candidates"""
|
||||
# print(f'coucou {rqst.request_id}')
|
||||
for key, candidate in candidates.items():
|
||||
temp = candidate.copy()
|
||||
@@ -965,8 +933,7 @@ def remove_candidate(candidates, allpaths, rqst, pth):
|
||||
|
||||
|
||||
def compare_reqs(req1, req2, disjlist):
|
||||
""" compare two requests: returns True or False
|
||||
"""
|
||||
"""compare two requests: returns True or False"""
|
||||
dis1 = [d for d in disjlist if req1.request_id in d.disjunctions_req]
|
||||
dis2 = [d for d in disjlist if req2.request_id in d.disjunctions_req]
|
||||
same_disj = False
|
||||
@@ -999,28 +966,31 @@ def compare_reqs(req1, req2, disjlist):
|
||||
req1.format == req2.format and \
|
||||
req1.OSNR == req2.OSNR and \
|
||||
req1.roll_off == req2.roll_off and \
|
||||
same_disj and \
|
||||
getattr(req1, 'N', None) is None and getattr(req2, 'N', None) is None and \
|
||||
getattr(req1, 'M', None) is None and getattr(req2, 'M', None) is None:
|
||||
same_disj:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def requests_aggregation(pathreqlist, disjlist):
|
||||
""" this function aggregates requests so that if several requests
|
||||
exist between same source and destination and with same transponder type
|
||||
"""this function aggregates requests so that if several requests
|
||||
exist between same source and destination and with same transponder type
|
||||
If transponder mode is defined and identical, then also agregates demands.
|
||||
"""
|
||||
# todo maybe add conditions on mode ??, spacing ...
|
||||
# currently if undefined takes the default values
|
||||
local_list = pathreqlist.copy()
|
||||
for req in pathreqlist:
|
||||
for this_r in local_list:
|
||||
if req.request_id != this_r.request_id and compare_reqs(req, this_r, disjlist):
|
||||
if req.request_id != this_r.request_id and compare_reqs(req, this_r, disjlist) and\
|
||||
this_r.tsp_mode is not None:
|
||||
# aggregate
|
||||
this_r.path_bandwidth += req.path_bandwidth
|
||||
this_r.N = this_r.N + req.N
|
||||
this_r.M = this_r.M + req.M
|
||||
temp_r_id = this_r.request_id
|
||||
this_r.request_id = ' | '.join((this_r.request_id, req.request_id))
|
||||
|
||||
# remove request from list
|
||||
local_list.remove(req)
|
||||
# todo change also disjunction req with new demand
|
||||
@@ -1037,23 +1007,22 @@ def requests_aggregation(pathreqlist, disjlist):
|
||||
|
||||
|
||||
def correct_json_route_list(network, pathreqlist):
|
||||
""" all names in list should be exact name in the network, and there is no ambiguity
|
||||
This function only checks that list is correct, warns user if the name is incorrect and
|
||||
suppresses the constraint it it is loose or raises an error if it is strict
|
||||
"""all names in list should be exact name in the network, and there is no ambiguity
|
||||
|
||||
This function only checks that list is correct, warns user if the name is incorrect and
|
||||
suppresses the constraint it it is loose or raises an error if it is strict
|
||||
"""
|
||||
all_uid = [n.uid for n in network.nodes()]
|
||||
transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
|
||||
for pathreq in pathreqlist:
|
||||
if pathreq.source not in transponders:
|
||||
msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find transponder' +\
|
||||
f' source : {pathreq.source}.{ansi_escapes.reset}'
|
||||
LOGGER.critical(msg)
|
||||
msg = f'Request: {pathreq.request_id}: could not find transponder' \
|
||||
+ f' source : {pathreq.source}.'
|
||||
raise ServiceError(msg)
|
||||
|
||||
if pathreq.destination not in transponders:
|
||||
msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find transponder' +\
|
||||
f' destination : {pathreq.destination}.{ansi_escapes.reset}'
|
||||
LOGGER.critical(msg)
|
||||
msg = f'Request: {pathreq.request_id}: could not find transponder' \
|
||||
+ f' destination : {pathreq.destination}.'
|
||||
raise ServiceError(msg)
|
||||
|
||||
# silently remove source and dest nodes from the list
|
||||
@@ -1072,24 +1041,21 @@ def correct_json_route_list(network, pathreqlist):
|
||||
# if no matching can be found in the network just ignore this constraint
|
||||
# if it is a loose constraint
|
||||
# warns the user that this node is not part of the topology
|
||||
msg = f'{ansi_escapes.yellow}invalid route node specified:\n\t\'{n_id}\',' +\
|
||||
f' could not use it as constraint, skipped!{ansi_escapes.reset}'
|
||||
print(msg)
|
||||
LOGGER.info(msg)
|
||||
msg = f'invalid route node specified:\n\t\'{n_id}\',' \
|
||||
+ ' could not use it as constraint, skipped!'
|
||||
LOGGER.warning(msg)
|
||||
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
|
||||
pathreq.nodes_list.remove(n_id)
|
||||
else:
|
||||
msg = f'{ansi_escapes.red}could not find node:\n\t \'{n_id}\' in network' +\
|
||||
f' topology. Strict constraint can not be applied.{ansi_escapes.reset}'
|
||||
LOGGER.critical(msg)
|
||||
msg = f'could not find node:\n\t \'{n_id}\' in network' \
|
||||
+ ' topology. Strict constraint can not be applied.'
|
||||
raise ServiceError(msg)
|
||||
|
||||
return pathreqlist
|
||||
|
||||
|
||||
def deduplicate_disjunctions(disjn):
|
||||
""" clean disjunctions to remove possible repetition
|
||||
"""
|
||||
"""clean disjunctions to remove possible repetition"""
|
||||
local_disjn = disjn.copy()
|
||||
for elem in local_disjn:
|
||||
for dis_elem in local_disjn:
|
||||
@@ -1100,8 +1066,9 @@ def deduplicate_disjunctions(disjn):
|
||||
|
||||
|
||||
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
""" 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 !
|
||||
"""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 !
|
||||
"""
|
||||
path_res_list = []
|
||||
reversed_path_res_list = []
|
||||
@@ -1112,10 +1079,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
# use the power specified in requests but might be different from the one
|
||||
# specified for design the power is an optional parameter for requests
|
||||
# definition if optional, use the one defines in eqt_config.json
|
||||
print(f'request {pathreq.request_id}')
|
||||
print(f'Computing path from {pathreq.source} to {pathreq.destination}')
|
||||
# adding first node to be clearer on the output
|
||||
print(f'with path constraint: {[pathreq.source] + pathreq.nodes_list}')
|
||||
msg = f'\n\trequest {pathreq.request_id}\n' \
|
||||
+ f'\tComputing path from {pathreq.source} to {pathreq.destination}\n' \
|
||||
+ f'\twith path constraint: {[pathreq.source] + pathreq.nodes_list}'
|
||||
# # adding first node to be clearer on the output
|
||||
|
||||
# pathlist[i] contains the whole path information for request i
|
||||
# last element is a transciver and where the result of the propagation is
|
||||
@@ -1124,8 +1091,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
# elements to simulate performance, several demands having the same destination
|
||||
# may use the same transponder for the performance simulation. This is why
|
||||
# we use deepcopy: to ensure that each propagation is recorded and not overwritten
|
||||
network_module.design_network(pathreq, network, equipment, set_connector_losses=False, verbose=False)
|
||||
total_path = deepcopy(pathlist[i])
|
||||
print(f'Computed path (roadms):{[e.uid for e in total_path if isinstance(e, Roadm)]}')
|
||||
msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path if isinstance(e, Roadm)]}'
|
||||
LOGGER.info(msg)
|
||||
# for debug
|
||||
# print(f'{pathreq.baud_rate} {pathreq.power} {pathreq.spacing} {pathreq.nb_channel}')
|
||||
if total_path:
|
||||
@@ -1136,14 +1105,12 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
snr01nm_with_penalty = total_path[-1].snr_01nm - total_path[-1].total_penalty
|
||||
min_ind = argmin(snr01nm_with_penalty)
|
||||
if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
|
||||
msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
|
||||
f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' +\
|
||||
f'\n\tcomputed SNR in 0.1nm = {round(total_path[-1].snr_01nm[min_ind], 2)}' +\
|
||||
f'\n\tCD penalty = {round(total_path[-1].penalties["chromatic_dispersion"][min_ind], 2)}' +\
|
||||
f'\n\tPMD penalty = {round(total_path[-1].penalties["pmd"][min_ind], 2)}' +\
|
||||
f'\n\trequired osnr = {pathreq.OSNR}' +\
|
||||
f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
|
||||
print(msg)
|
||||
msg = f'\tWarning! Request {pathreq.request_id} computed path from' \
|
||||
+ f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' \
|
||||
+ f'\n\tcomputed SNR in 0.1nm = {round(total_path[-1].snr_01nm[min_ind], 2)}'
|
||||
msg = _penalty_msg(total_path, msg, min_ind) \
|
||||
+ f'\n\trequired osnr = {pathreq.OSNR}' \
|
||||
+ f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
|
||||
LOGGER.warning(msg)
|
||||
pathreq.blocking_reason = 'MODE_NOT_FEASIBLE'
|
||||
else:
|
||||
@@ -1179,22 +1146,20 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
if pathreq.bidir and pathreq.baud_rate is not None:
|
||||
# Both directions requested, and a feasible mode was found
|
||||
rev_p = deepcopy(reversed_path)
|
||||
|
||||
print(f'\n\tPropagating Z to A direction {pathreq.destination} to {pathreq.source}')
|
||||
print(f'\tPath (roadsm) {[r.uid for r in rev_p if isinstance(r,Roadm)]}\n')
|
||||
msg = f'\n\tPropagating Z to A direction {pathreq.destination} to {pathreq.source}\n' \
|
||||
+ f'\tPath (roadms) {[r.uid for r in rev_p if isinstance(r,Roadm)]}\n'
|
||||
LOGGER.info(msg)
|
||||
propagate(rev_p, pathreq, equipment)
|
||||
propagated_reversed_path = rev_p
|
||||
snr01nm_with_penalty = rev_p[-1].snr_01nm - rev_p[-1].total_penalty
|
||||
min_ind = argmin(snr01nm_with_penalty)
|
||||
if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
|
||||
msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
|
||||
f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' +\
|
||||
f'\n\tcomputed SNR in 0.1nm = {round(rev_p[-1].snr_01nm[min_ind], 2)}' +\
|
||||
f'\n\tCD penalty = {round(rev_p[-1].penalties["chromatic_dispersion"][min_ind], 2)}' +\
|
||||
f'\n\tPMD penalty = {round(rev_p[-1].penalties["pmd"][min_ind], 2)}' +\
|
||||
f'\n\trequired osnr = {pathreq.OSNR}' +\
|
||||
f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
|
||||
print(msg)
|
||||
msg = f'\tWarning! Request {pathreq.request_id} computed path from' \
|
||||
+ f' {pathreq.destination} to {pathreq.source} does not pass with {pathreq.tsp_mode}' \
|
||||
+ f'\n\tcomputed SNR in 0.1nm = {round(rev_p[-1].snr_01nm[min_ind], 2)}'
|
||||
msg = _penalty_msg(rev_p, msg, min_ind) \
|
||||
+ f'\n\trequired osnr = {pathreq.OSNR}' \
|
||||
+ f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
|
||||
LOGGER.warning(msg)
|
||||
# TODO selection of mode should also be on reversed direction !!
|
||||
if not hasattr(pathreq, 'blocking_reason'):
|
||||
@@ -1202,9 +1167,8 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
else:
|
||||
propagated_reversed_path = []
|
||||
else:
|
||||
msg = 'Total path is empty. No propagation'
|
||||
print(msg)
|
||||
LOGGER.info(msg)
|
||||
msg = f'Request {pathreq.request_id}: Total path is empty. No propagation'
|
||||
LOGGER.warning(msg)
|
||||
reversed_path = []
|
||||
propagated_reversed_path = []
|
||||
|
||||
@@ -1212,12 +1176,12 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
|
||||
reversed_path_res_list.append(reversed_path)
|
||||
propagated_reversed_path_res_list.append(propagated_reversed_path)
|
||||
# print to have a nice output
|
||||
print('')
|
||||
return path_res_list, reversed_path_res_list, propagated_reversed_path_res_list
|
||||
|
||||
|
||||
def compute_spectrum_slot_vs_bandwidth(bandwidth, spacing, bit_rate, slot_width=0.0125e12):
|
||||
""" Compute the number of required wavelengths and the M value (number of consumed slots)
|
||||
"""Compute the number of required wavelengths and the M value (number of consumed slots)
|
||||
|
||||
Each wavelength consumes one `spacing`, and the result is rounded up to consume a natural number of slots.
|
||||
|
||||
>>> compute_spectrum_slot_vs_bandwidth(400e9, 50e9, 200e9)
|
||||
@@ -1226,3 +1190,19 @@ def compute_spectrum_slot_vs_bandwidth(bandwidth, spacing, bit_rate, slot_width=
|
||||
number_of_wavelengths = ceil(bandwidth / bit_rate)
|
||||
total_number_of_slots = ceil(spacing / slot_width) * number_of_wavelengths
|
||||
return number_of_wavelengths, total_number_of_slots
|
||||
|
||||
|
||||
def _penalty_msg(total_path, msg, min_ind):
|
||||
"""formatting helper for reporting unfeasible paths
|
||||
|
||||
The penalty info are optional, so this checks that penalty exists before creating a message."""
|
||||
penalty_dict = {
|
||||
'pdl': 'PDL',
|
||||
'chromatic_dispersion': 'CD',
|
||||
'pmd': 'PMD'}
|
||||
for key, pretty in penalty_dict.items():
|
||||
if key in total_path[-1].penalties:
|
||||
msg += f'\n\t{pretty} penalty = {round(total_path[-1].penalties[key][min_ind], 2)}'
|
||||
else:
|
||||
msg += f'\n\t{pretty} penalty not evaluated'
|
||||
return msg
|
||||
|
||||
@@ -17,14 +17,14 @@ from collections import namedtuple
|
||||
from logging import getLogger
|
||||
from gnpy.core.elements import Roadm, Transceiver
|
||||
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
|
||||
|
||||
LOGGER = getLogger(__name__)
|
||||
|
||||
|
||||
class Bitmap:
|
||||
""" records the spectrum occupation
|
||||
"""
|
||||
"""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
|
||||
@@ -45,26 +45,22 @@ class Bitmap:
|
||||
raise SpectrumError(f'bitmap is not consistant with f_min{f_min} - n: {n_min} and f_max{f_max}- n :{n_max}')
|
||||
|
||||
def getn(self, i):
|
||||
""" converts the n (itu grid) into a local index
|
||||
"""
|
||||
"""converts the n (itu grid) into a local index"""
|
||||
return self.freq_index[i]
|
||||
|
||||
def geti(self, nvalue):
|
||||
""" converts the local index into n (itu grid)
|
||||
"""
|
||||
"""converts the local index into n (itu grid)"""
|
||||
return self.freq_index.index(nvalue)
|
||||
|
||||
def insert_left(self, newbitmap):
|
||||
""" insert bitmap on the left to align oms bitmaps if their start frequencies are different
|
||||
"""
|
||||
"""insert bitmap on the left to align oms bitmaps if their start frequencies are different"""
|
||||
self.bitmap = newbitmap + self.bitmap
|
||||
temp = list(range(self.n_min - len(newbitmap), self.n_min))
|
||||
self.freq_index = temp + self.freq_index
|
||||
self.n_min = self.freq_index[0]
|
||||
|
||||
def insert_right(self, newbitmap):
|
||||
""" insert bitmap on the right to align oms bitmaps if their stop frequencies are different
|
||||
"""
|
||||
"""insert bitmap on the right to align oms bitmaps if their stop frequencies are different"""
|
||||
self.bitmap = self.bitmap + newbitmap
|
||||
self.freq_index = self.freq_index + list(range(self.n_max, self.n_max + len(newbitmap)))
|
||||
self.n_max = self.freq_index[-1]
|
||||
@@ -75,8 +71,8 @@ OMSParams = namedtuple('OMSParams', 'oms_id el_id_list el_list')
|
||||
|
||||
|
||||
class OMS:
|
||||
""" OMS class is the logical container that represent a link between two adjacent ROADMs and
|
||||
records the crossed elements and the occupied spectrum
|
||||
"""OMS class is the logical container that represent a link between two adjacent ROADMs and
|
||||
records the crossed elements and the occupied spectrum
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **params):
|
||||
@@ -98,36 +94,28 @@ class OMS:
|
||||
f'{self.el_id_list[0]} - {self.el_id_list[-1]}', '\n'])
|
||||
|
||||
def add_element(self, elem):
|
||||
""" records oms elements
|
||||
"""
|
||||
"""records oms elements"""
|
||||
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):
|
||||
""" frequencies expressed in Hz
|
||||
def update_spectrum(self, f_min, f_max, guardband=0.15e12, 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
|
||||
For the flexible DWDM grid, the allowed frequency slots have a nominal central frequency (in THz) defined by:
|
||||
193.1 + n × 0.00625 where n is a positive or negative integer including 0
|
||||
and 0.00625 is the nominal central frequency granularity in THz
|
||||
and a slot width defined by:
|
||||
12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.
|
||||
Any combination of frequency slots is allowed as long as no two frequency slots overlap.
|
||||
If bitmap is not None, then use it: Bitmap checks its consistency with f_min f_max
|
||||
else a brand new bitmap is created
|
||||
"""
|
||||
if existing_spectrum is None:
|
||||
# add some 150 GHz margin to enable a center channel on f_min
|
||||
# use ITU-T G694.1
|
||||
# Flexible DWDM grid definition
|
||||
# For the flexible DWDM grid, the allowed frequency slots have a nominal
|
||||
# central frequency (in THz) defined by:
|
||||
# 193.1 + n × 0.00625 where n is a positive or negative integer including 0
|
||||
# and 0.00625 is the nominal central frequency granularity in THz
|
||||
# and a slot width defined by:
|
||||
# 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in
|
||||
# GHz.
|
||||
# Any combination of frequency slots is allowed as long as no two frequency
|
||||
# slots overlap.
|
||||
|
||||
# TODO : add explaination on that / parametrize ....
|
||||
self.spectrum_bitmap = Bitmap(f_min, f_max, grid, guardband)
|
||||
# print(len(self.spectrum_bitmap.bitmap))
|
||||
self.spectrum_bitmap = Bitmap(f_min=f_min, f_max=f_max, grid=grid, guardband=guardband,
|
||||
bitmap=existing_spectrum)
|
||||
|
||||
def assign_spectrum(self, nvalue, mvalue):
|
||||
""" change oms spectrum to mark spectrum assigned
|
||||
"""
|
||||
"""change oms spectrum to mark spectrum assigned"""
|
||||
if not isinstance(nvalue, int):
|
||||
raise SpectrumError(f'N must be a signed integer, got {nvalue}')
|
||||
if not isinstance(mvalue, int):
|
||||
@@ -146,16 +134,16 @@ class OMS:
|
||||
self.spectrum_bitmap.bitmap[self.spectrum_bitmap.geti(startn):self.spectrum_bitmap.geti(stopn) + 1] = [0] * (stopn - startn + 1)
|
||||
|
||||
def add_service(self, service_id, nb_wl):
|
||||
""" record service and mark spectrum as occupied
|
||||
"""
|
||||
"""record service and mark spectrum as occupied"""
|
||||
self.service_list.append(service_id)
|
||||
self.nb_channels += nb_wl
|
||||
|
||||
|
||||
def frequency_to_n(freq, grid=0.00625e12):
|
||||
""" converts frequency into the n value (ITU grid)
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
"""converts frequency into the n value (ITU grid)
|
||||
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
|
||||
>>> frequency_to_n(193.1375e12)
|
||||
6
|
||||
@@ -167,9 +155,10 @@ def frequency_to_n(freq, grid=0.00625e12):
|
||||
|
||||
|
||||
def nvalue_to_frequency(nvalue, grid=0.00625e12):
|
||||
""" converts n value into a frequency
|
||||
reference to Recommendation G.694.1 (02/12), Table 1
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
"""converts n value into a frequency
|
||||
|
||||
reference to Recommendation G.694.1 (02/12), Table 1
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
|
||||
>>> nvalue_to_frequency(6)
|
||||
193137500000000.0
|
||||
@@ -181,17 +170,17 @@ def nvalue_to_frequency(nvalue, grid=0.00625e12):
|
||||
|
||||
|
||||
def mvalue_to_slots(nvalue, mvalue):
|
||||
""" convert center n an m into start and stop n
|
||||
"""
|
||||
"""convert center n an m into start and stop n"""
|
||||
startn = nvalue - mvalue
|
||||
stopn = nvalue + mvalue - 1
|
||||
return startn, stopn
|
||||
|
||||
|
||||
def slots_to_m(startn, stopn):
|
||||
""" converts the start and stop n values to the center n and m value
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
"""converts the start and stop n values to the center n and m value
|
||||
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
|
||||
>>> nval, mval = slots_to_m(6, 20)
|
||||
>>> nval
|
||||
@@ -206,10 +195,11 @@ def slots_to_m(startn, stopn):
|
||||
|
||||
|
||||
def m_to_freq(nvalue, mvalue, grid=0.00625e12):
|
||||
""" converts m into frequency range
|
||||
spectrum(13,7) is (193137500000000.0, 193225000000000.0)
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
"""converts m into frequency range
|
||||
|
||||
spectrum(13,7) is (193137500000000.0, 193225000000000.0)
|
||||
reference to Recommendation G.694.1 (02/12), Figure I.3
|
||||
https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
|
||||
|
||||
>>> fstart, fstop = m_to_freq(13, 7)
|
||||
>>> fstart
|
||||
@@ -225,9 +215,7 @@ def m_to_freq(nvalue, mvalue, grid=0.00625e12):
|
||||
|
||||
|
||||
def align_grids(oms_list):
|
||||
""" used to apply same grid to all oms : same starting n, stop n and slot size
|
||||
out of grid slots are set to 0
|
||||
"""
|
||||
"""Used to apply same grid to all oms : same starting n, stop n and slot size. Out of grid slots are set to 0."""
|
||||
n_min = min([o.spectrum_bitmap.n_min for o in oms_list])
|
||||
n_max = max([o.spectrum_bitmap.n_max for o in oms_list])
|
||||
for this_o in oms_list:
|
||||
@@ -239,12 +227,13 @@ def align_grids(oms_list):
|
||||
|
||||
|
||||
def build_oms_list(network, equipment):
|
||||
""" initialization of OMS list in the network
|
||||
an oms is build reading all intermediate nodes between two adjacent ROADMs
|
||||
each element within the list is being added an oms and oms_id to record the
|
||||
oms it belongs to.
|
||||
the function supports different spectrum width and supposes that the whole network
|
||||
works with the min range among OMSs
|
||||
"""initialization of OMS list in the network
|
||||
|
||||
an oms is build reading all intermediate nodes between two adjacent ROADMs
|
||||
each element within the list is being added an oms and oms_id to record the
|
||||
oms it belongs to.
|
||||
the function supports different spectrum width and supposes that the whole network
|
||||
works with the min range among OMSs
|
||||
"""
|
||||
oms_id = 0
|
||||
oms_list = []
|
||||
@@ -296,8 +285,9 @@ def build_oms_list(network, equipment):
|
||||
|
||||
|
||||
def reversed_oms(oms_list):
|
||||
""" identifies reversed OMS
|
||||
only applicable for non parallel OMS
|
||||
"""identifies reversed OMS
|
||||
|
||||
only applicable for non parallel OMS
|
||||
"""
|
||||
for oms in oms_list:
|
||||
has_reversed = False
|
||||
@@ -322,28 +312,41 @@ def bitmap_sum(band1, band2):
|
||||
return res
|
||||
|
||||
|
||||
def spectrum_selection(pth, oms_list, requested_m, requested_n=None):
|
||||
"""Collects spectrum availability and call the select_candidate function"""
|
||||
|
||||
# use indexes instead of ITU-T n values
|
||||
def build_path_oms_id_list(pth):
|
||||
path_oms = []
|
||||
for elem in pth:
|
||||
if not isinstance(elem, Roadm) and not isinstance(elem, Transceiver):
|
||||
# only edfa, fused and fibers have oms_id attribute
|
||||
path_oms.append(elem.oms_id)
|
||||
# remove duplicate oms_id, order is not important
|
||||
path_oms = list(set(path_oms))
|
||||
# assuming all oms have same freq index
|
||||
if not path_oms:
|
||||
candidate = (None, None, None)
|
||||
return candidate, path_oms
|
||||
freq_index = oms_list[path_oms[0]].spectrum_bitmap.freq_index
|
||||
freq_index_min = oms_list[path_oms[0]].spectrum_bitmap.freq_index_min
|
||||
freq_index_max = oms_list[path_oms[0]].spectrum_bitmap.freq_index_max
|
||||
return list(set(path_oms))
|
||||
|
||||
freq_availability = oms_list[path_oms[0]].spectrum_bitmap.bitmap
|
||||
|
||||
def aggregate_oms_bitmap(path_oms, oms_list):
|
||||
spectrum = oms_list[path_oms[0]].spectrum_bitmap
|
||||
bitmap = spectrum.bitmap
|
||||
# assuming all oms have same freq indices
|
||||
for oms in path_oms[1:]:
|
||||
freq_availability = bitmap_sum(oms_list[oms].spectrum_bitmap.bitmap, freq_availability)
|
||||
bitmap = bitmap_sum(oms_list[oms].spectrum_bitmap.bitmap, bitmap)
|
||||
params = {
|
||||
'oms_id': 0,
|
||||
'el_id_list': 0,
|
||||
'el_list': []
|
||||
}
|
||||
freq_min = nvalue_to_frequency(spectrum.freq_index_min)
|
||||
freq_max = nvalue_to_frequency(spectrum.freq_index_max)
|
||||
aggregate_oms = OMS(**params)
|
||||
aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, existing_spectrum=bitmap)
|
||||
return aggregate_oms
|
||||
|
||||
|
||||
def spectrum_selection(test_oms, requested_m, requested_n=None):
|
||||
"""Collects spectrum availability and call the select_candidate function"""
|
||||
freq_index = test_oms.spectrum_bitmap.freq_index
|
||||
freq_index_min = test_oms.spectrum_bitmap.freq_index_min
|
||||
freq_index_max = test_oms.spectrum_bitmap.freq_index_max
|
||||
freq_availability = test_oms.spectrum_bitmap.bitmap
|
||||
|
||||
if requested_n is None:
|
||||
# avoid slots reserved on the edge 0.15e-12 on both sides -> 24
|
||||
candidates = [(freq_index[i] + requested_m, freq_index[i], freq_index[i] + 2 * requested_m - 1)
|
||||
@@ -354,23 +357,36 @@ def spectrum_selection(pth, oms_list, requested_m, requested_n=None):
|
||||
|
||||
candidate = select_candidate(candidates, policy='first_fit')
|
||||
else:
|
||||
i = oms_list[path_oms[0]].spectrum_bitmap.geti(requested_n)
|
||||
# print(f'N {requested_n} i {i}')
|
||||
# print(freq_availability[i-m:i+m] )
|
||||
# print(freq_index[i-m:i+m])
|
||||
if (freq_availability[i - requested_m:i + requested_m] == [1] * (2 * requested_m) and
|
||||
freq_index[i - requested_m] >= freq_index_min
|
||||
i = test_oms.spectrum_bitmap.geti(requested_n)
|
||||
if (freq_availability[i - requested_m:i + requested_m] == [1] * (2 * requested_m)
|
||||
and freq_index[i - requested_m] >= freq_index_min
|
||||
and freq_index[i + requested_m - 1] <= freq_index_max):
|
||||
# candidate is the triplet center_n, startn and stopn
|
||||
candidate = (requested_n, requested_n - requested_m, requested_n + requested_m - 1)
|
||||
else:
|
||||
candidate = (None, None, None)
|
||||
return candidate, path_oms
|
||||
return candidate
|
||||
|
||||
|
||||
def determine_slot_numbers(test_oms, requested_n, required_m, per_channel_m):
|
||||
"""determines max availability around requested_n. requested_n should not be None"""
|
||||
bitmap = test_oms.spectrum_bitmap
|
||||
freq_index = bitmap.freq_index
|
||||
freq_index_min = bitmap.freq_index_min
|
||||
freq_index_max = bitmap.freq_index_max
|
||||
freq_availability = bitmap.bitmap
|
||||
center_i = bitmap.geti(requested_n)
|
||||
i = per_channel_m
|
||||
while (freq_availability[center_i - i:center_i + i] == [1] * (2 * i)
|
||||
and freq_index[center_i - i] >= freq_index_min
|
||||
and freq_index[center_i + i - 1] <= freq_index_max
|
||||
and i <= required_m):
|
||||
i += per_channel_m
|
||||
return i - per_channel_m
|
||||
|
||||
|
||||
def select_candidate(candidates, policy):
|
||||
""" selects a candidate among all available spectrum
|
||||
"""
|
||||
"""selects a candidate among all available spectrum"""
|
||||
if policy == 'first_fit':
|
||||
if candidates:
|
||||
return candidates[0]
|
||||
@@ -380,44 +396,112 @@ def select_candidate(candidates, policy):
|
||||
raise ServiceError('Only first_fit spectrum assignment policy is implemented.')
|
||||
|
||||
|
||||
def compute_n_m(required_m, rq, path_oms, oms_list, per_channel_m, policy='first_fit'):
|
||||
""" based on requested path_bandwidth fill in M=None values with uint values, using per_channel_m
|
||||
and center frequency, with first fit strategy. The function checks the available spectrum but check
|
||||
consistencies among M values of the request, but not with other requests.
|
||||
For example, if request is for 32 slots corresponding to 8 x 4 slots of 32Gbauds channels,
|
||||
the following frequency slots will result in the following assignment
|
||||
|
||||
N = 0, 8, 16, 32 -> 0, 8, 16, 32
|
||||
M = 8, None, 8, None -> 8, 8, 8, 8
|
||||
|
||||
N = 0, 8, 16, 32 -> 0, , 16
|
||||
M = None, None, 8, None -> 24, , 8
|
||||
"""
|
||||
selected_m = []
|
||||
selected_n = []
|
||||
remaining_slots_to_serve = required_m
|
||||
# order slots for the computation: assign biggest m first
|
||||
rq_N, rq_M, order = order_slots([{'N': n, 'M': m} for n, m in zip(rq.N, rq.M)])
|
||||
# Create an oms that represents current assignments of all oms listed in path_oms, and test N and M on it.
|
||||
# If M is defined, checks that proposed N, M is free
|
||||
test_oms = aggregate_oms_bitmap(path_oms, oms_list)
|
||||
for n, m in zip(rq_N, rq_M):
|
||||
if m is not None and n is not None:
|
||||
# check availabilityfor this n, m
|
||||
available_slots = determine_slot_numbers(test_oms, n, m, m)
|
||||
if available_slots == 0:
|
||||
# if n, m are not feasible, break at this point no have non zero remaining_slots_to_serve
|
||||
# in order to blocks the request (even is other N,M where feasible)
|
||||
break
|
||||
elif m is not None and n is None:
|
||||
# find a candidate n
|
||||
n, _, _ = spectrum_selection(test_oms, m, None)
|
||||
if n is None:
|
||||
# if no n is feasible for the m, block the request
|
||||
break
|
||||
elif m is None and n is not None:
|
||||
# find a feasible m for this n. If None is found, then block the request
|
||||
m = determine_slot_numbers(test_oms, n, remaining_slots_to_serve, per_channel_m)
|
||||
if m == 0 or remaining_slots_to_serve == 0:
|
||||
break
|
||||
else:
|
||||
# if n and m are not defined, try to find a single assignment to fits the remaining slots to serve
|
||||
# (first fit strategy)
|
||||
n, _, _ = spectrum_selection(test_oms, remaining_slots_to_serve, None)
|
||||
if n is None or remaining_slots_to_serve == 0:
|
||||
break
|
||||
else:
|
||||
m = remaining_slots_to_serve
|
||||
selected_m.append(m)
|
||||
selected_n.append(n)
|
||||
test_oms.assign_spectrum(n, m)
|
||||
remaining_slots_to_serve = remaining_slots_to_serve - m
|
||||
|
||||
# re-order selected_m and selected_n according to initial request N, M order, ignoring None values
|
||||
not_selected = [None for i in range(len(rq_N) - len(selected_n))]
|
||||
selected_m = restore_order(selected_m + not_selected, order)
|
||||
selected_n = restore_order(selected_n + not_selected, order)
|
||||
return selected_n, selected_m, remaining_slots_to_serve
|
||||
|
||||
|
||||
def pth_assign_spectrum(pths, rqs, oms_list, rpths):
|
||||
""" basic first fit assignment
|
||||
if reversed path are provided, means that occupation is bidir
|
||||
"""basic first fit assignment
|
||||
|
||||
if reversed path are provided, means that occupation is bidir
|
||||
"""
|
||||
for pth, rq, rpth in zip(pths, rqs, rpths):
|
||||
# computes the number of channels required
|
||||
if hasattr(rq, 'blocking_reason'):
|
||||
rq.N = None
|
||||
rq.M = None
|
||||
else:
|
||||
nb_wl, requested_m = compute_spectrum_slot_vs_bandwidth(rq.path_bandwidth,
|
||||
rq.spacing, rq.bit_rate)
|
||||
if getattr(rq, 'M', None) is not None:
|
||||
# Consistency check between the requested M and path_bandwidth
|
||||
# M value should be bigger than the computed requested_m (simple estimate)
|
||||
# TODO: elaborate a more accurate estimate with nb_wl * tx_osnr + possibly guardbands in case of
|
||||
# computes the number of channels required for path_bandwidth and the min required nb of slots
|
||||
# for one channel (corresponds to the spacing)
|
||||
nb_wl, required_m = compute_spectrum_slot_vs_bandwidth(rq.path_bandwidth,
|
||||
rq.spacing, rq.bit_rate)
|
||||
_, per_channel_m = compute_spectrum_slot_vs_bandwidth(rq.bit_rate,
|
||||
rq.spacing, rq.bit_rate)
|
||||
# find oms ids that are concerned both by pth and rpth
|
||||
path_oms = build_path_oms_id_list(pth + rpth)
|
||||
if getattr(rq, 'M', None) is not None and all(rq.M):
|
||||
# if all M are well defined: Consistency check that the requested M are enough to carry the nb_wl:
|
||||
# check that the integer number of per_channel_m carried in each M value is enough to carry nb_wl.
|
||||
# if not, blocks the demand
|
||||
nb_channels_of_request = sum([m // per_channel_m for m in rq.M])
|
||||
# TODO: elaborate a more accurate estimate with nb_wl * min_spacing + possibly guardbands in case of
|
||||
# superchannel closed packing.
|
||||
if requested_m > rq.M:
|
||||
if nb_wl > nb_channels_of_request:
|
||||
rq.N = None
|
||||
rq.M = None
|
||||
rq.blocking_reason = 'NOT_ENOUGH_RESERVED_SPECTRUM'
|
||||
# need to stop here for this request and not go though spectrum selection process with requested_m
|
||||
# need to stop here for this request and not go though spectrum selection process
|
||||
continue
|
||||
# use the req.M even if requested_m is smaller
|
||||
requested_m = rq.M
|
||||
requested_n = getattr(rq, 'N', None)
|
||||
(center_n, startn, stopn), path_oms = spectrum_selection(pth + rpth, oms_list, requested_m,
|
||||
requested_n)
|
||||
# if requested n and m concern already occupied spectrum the previous function returns a None candidate
|
||||
# if not None, center_n and start, stop frequencies are applicable to all oms of pth
|
||||
# checks that spectrum is not None else indicate blocking reason
|
||||
if center_n is not None:
|
||||
for oms_elem in path_oms:
|
||||
oms_list[oms_elem].assign_spectrum(center_n, requested_m)
|
||||
oms_list[oms_elem].add_service(rq.request_id, nb_wl)
|
||||
rq.N = center_n
|
||||
rq.M = requested_m
|
||||
else:
|
||||
# Use the req.M even if nb_wl and required_m are smaller.
|
||||
# first fit strategy: assign as many lambda as possible in the None remaining N, M values
|
||||
selected_n, selected_m, remaining_slots_to_serve = \
|
||||
compute_n_m(required_m, rq, path_oms, oms_list, per_channel_m)
|
||||
# if there are some remaining_slots_to_serve, this means that provided rq.M and rq.N values were
|
||||
# not possible. Then do not go though spectrum assignment process and blocks the demand
|
||||
if remaining_slots_to_serve > 0:
|
||||
rq.N = None
|
||||
rq.M = None
|
||||
rq.blocking_reason = 'NO_SPECTRUM'
|
||||
continue
|
||||
for oms_elem in path_oms:
|
||||
for this_n, this_m in zip(selected_n, selected_m):
|
||||
if this_m is not None:
|
||||
oms_list[oms_elem].assign_spectrum(this_n, this_m)
|
||||
oms_list[oms_elem].add_service(rq.request_id, nb_wl)
|
||||
rq.N = selected_n
|
||||
rq.M = selected_m
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
matplotlib>=3.5.1,<4
|
||||
networkx>=2.6,<3
|
||||
numpy>=1.22.0,<2
|
||||
pbr>=5.7.0,<6
|
||||
scipy>=1.7.3,<2
|
||||
xlrd>=1.2.0,<2
|
||||
33
setup.cfg
33
setup.cfg
@@ -23,6 +23,7 @@ classifier =
|
||||
Programming Language :: Python :: 3.9
|
||||
Programming Language :: Python :: 3.10
|
||||
Programming Language :: Python :: 3.11
|
||||
Programming Language :: Python :: 3.12
|
||||
Programming Language :: Python :: Implementation :: CPython
|
||||
Topic :: Scientific/Engineering
|
||||
Topic :: Scientific/Engineering :: Physics
|
||||
@@ -48,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
|
||||
|
||||
@@ -83375,7 +83375,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 +88752,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 +89037,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 +89721,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 +89797,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 +89911,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
|
||||
@@ -193159,4 +193159,4 @@
|
||||
"to_node": "fiber (Warsaw → Vienna)-_(7/7)"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
21
tests/data/CORONET_services.json
Normal file
21
tests/data/CORONET_services.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"path-request": [
|
||||
{
|
||||
"request-id": "0",
|
||||
"source": "trx Abilene",
|
||||
"destination": "trx Albany",
|
||||
"src-tp-id": "trx Abilene",
|
||||
"dst-tp-id": "trx Albany",
|
||||
"bidirectional": false,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "Voyager",
|
||||
"trx_mode": "mode 3",
|
||||
"spacing": 62500000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
{
|
||||
"f_min": 191.35e12,
|
||||
"f_max": 196.1e12,
|
||||
"nf_ripple": [
|
||||
0.0,
|
||||
0.0,
|
||||
|
||||
@@ -217,7 +217,7 @@
|
||||
"tx_osnr": 45,
|
||||
"min_spacing": 75e9,
|
||||
"cost":1
|
||||
},
|
||||
},
|
||||
{
|
||||
"format": "mode 4",
|
||||
"baud_rate": 66e9,
|
||||
|
||||
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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
@@ -240,7 +240,6 @@
|
||||
"east edfa in Rennes_STA to Stbrieuc": -20,
|
||||
"east edfa in Rennes_STA to Ploermel": -20
|
||||
}
|
||||
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
@@ -310,7 +309,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
|
||||
}
|
||||
@@ -333,7 +332,7 @@
|
||||
"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
|
||||
@@ -430,7 +429,7 @@
|
||||
"per_degree_pch_out_db": {
|
||||
"east edfa in g to e": -20,
|
||||
"east edfa in g to h": -20
|
||||
}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
@@ -1593,7 +1592,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 +2234,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 +2291,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 +2310,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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
response-id,source,destination,path_bandwidth,Pass?,nb of tsp pairs,total cost,transponder-type,transponder-mode,OSNR-0.1nm,SNR-0.1nm,SNR-bandwidth,baud rate (Gbaud),input power (dBm),path,"spectrum (N,M)",reversed path OSNR-0.1nm,reversed path SNR-0.1nm,reversed path SNR-bandwidth
|
||||
0,trx Lorient_KMA,trx Vannes_KBE,100.0,True,1,1,Voyager,mode 1,30.84,30.84,26.75,32.0,0.0,trx Lorient_KMA | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"-284, 4",,,
|
||||
1,trx Brest_KLA,trx Vannes_KBE,10.0,True,1,1,Voyager,mode 1,22.65,22.11,18.03,32.0,1.0,trx Brest_KLA | roadm Brest_KLA | east edfa in Brest_KLA to Morlaix | fiber (Brest_KLA → Morlaix)-F060 | east fused spans in Morlaix | fiber (Morlaix → Lannion_CAS)-F059 | west edfa in Lannion_CAS to Morlaix | roadm Lannion_CAS | east edfa in Lannion_CAS to Corlay | fiber (Lannion_CAS → Corlay)-F061 | west fused spans in Corlay | fiber (Corlay → Loudeac)-F010 | west fused spans in Loudeac | fiber (Loudeac → Lorient_KMA)-F054 | west edfa in Lorient_KMA to Loudeac | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"-276, 4",,,
|
||||
3,trx Lannion_CAS,trx Rennes_STA,60.0,True,1,1,vendorA_trx-type1,mode 1,28.29,25.85,21.77,32.0,1.0,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,"-284, 4",,,
|
||||
4,trx Rennes_STA,trx Lannion_CAS,150.0,True,1,1,vendorA_trx-type1,mode 2,22.27,22.15,15.05,64.0,0.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Ploermel | fiber (Rennes_STA → Ploermel)- | east edfa in Ploermel to Vannes_KBE | fiber (Ploermel → Vannes_KBE)- | west edfa in Vannes_KBE to Ploermel | roadm Vannes_KBE | east edfa in Vannes_KBE to Lorient_KMA | fiber (Vannes_KBE → Lorient_KMA)-F055 | west edfa in Lorient_KMA to Vannes_KBE | roadm Lorient_KMA | east edfa in Lorient_KMA to Loudeac | fiber (Lorient_KMA → Loudeac)-F054 | east fused spans in Loudeac | fiber (Loudeac → Corlay)-F010 | east fused spans in Corlay | fiber (Corlay → Lannion_CAS)-F061 | west edfa in Lannion_CAS to Corlay | roadm Lannion_CAS | trx Lannion_CAS,"-266, 6",,,
|
||||
5,trx Rennes_STA,trx Lannion_CAS,20.0,True,1,1,vendorA_trx-type1,mode 2,30.79,28.78,21.68,64.0,3.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS,"-274, 6",,,
|
||||
0,trx Lorient_KMA,trx Vannes_KBE,100.0,True,1,1,Voyager,mode 1,30.84,30.84,26.75,32.0,0.0,trx Lorient_KMA | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"[-284], [4]",,,
|
||||
1,trx Brest_KLA,trx Vannes_KBE,10.0,True,1,1,Voyager,mode 1,22.65,22.11,18.03,32.0,1.0,trx Brest_KLA | roadm Brest_KLA | east edfa in Brest_KLA to Morlaix | fiber (Brest_KLA → Morlaix)-F060 | east fused spans in Morlaix | fiber (Morlaix → Lannion_CAS)-F059 | west edfa in Lannion_CAS to Morlaix | roadm Lannion_CAS | east edfa in Lannion_CAS to Corlay | fiber (Lannion_CAS → Corlay)-F061 | west fused spans in Corlay | fiber (Corlay → Loudeac)-F010 | west fused spans in Loudeac | fiber (Loudeac → Lorient_KMA)-F054 | west edfa in Lorient_KMA to Loudeac | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"[-276], [4]",,,
|
||||
3,trx Lannion_CAS,trx Rennes_STA,60.0,True,1,1,vendorA_trx-type1,mode 1,28.29,25.85,21.77,32.0,1.0,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,"[-284], [4]",,,
|
||||
4,trx Rennes_STA,trx Lannion_CAS,150.0,True,1,1,vendorA_trx-type1,mode 2,22.27,22.14,15.05,64.0,0.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Ploermel | fiber (Rennes_STA → Ploermel)- | east edfa in Ploermel to Vannes_KBE | fiber (Ploermel → Vannes_KBE)- | west edfa in Vannes_KBE to Ploermel | roadm Vannes_KBE | east edfa in Vannes_KBE to Lorient_KMA | fiber (Vannes_KBE → Lorient_KMA)-F055 | west edfa in Lorient_KMA to Vannes_KBE | roadm Lorient_KMA | east edfa in Lorient_KMA to Loudeac | fiber (Lorient_KMA → Loudeac)-F054 | east fused spans in Loudeac | fiber (Loudeac → Corlay)-F010 | east fused spans in Corlay | fiber (Corlay → Lannion_CAS)-F061 | west edfa in Lannion_CAS to Corlay | roadm Lannion_CAS | trx Lannion_CAS,"[-266], [6]",,,
|
||||
5,trx Rennes_STA,trx Lannion_CAS,20.0,True,1,1,vendorA_trx-type1,mode 2,30.79,28.76,21.67,64.0,3.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS,"[-274], [6]",,,
|
||||
6,,,,NO_PATH,,,,,,,,,,,,,,
|
||||
|
||||
|
@@ -1,97 +1,97 @@
|
||||
signal,nli
|
||||
1.9952623149688793e-05,1.1158426495504604e-08
|
||||
1.9952623149688793e-05,1.263949624403159e-08
|
||||
1.9952623149688793e-05,1.3358478621325285e-08
|
||||
1.9952623149688793e-05,1.3830775406251184e-08
|
||||
1.9952623149688793e-05,1.4180462471172083e-08
|
||||
1.9952623149688793e-05,1.4456701012984246e-08
|
||||
1.9952623149688793e-05,1.4683973899785875e-08
|
||||
1.9952623149688793e-05,1.487624147046227e-08
|
||||
1.9952623149688793e-05,1.5042217041806274e-08
|
||||
1.9952623149688793e-05,1.5187703614492153e-08
|
||||
1.9952623149688793e-05,1.5316759790785317e-08
|
||||
1.9952623149688793e-05,1.543233485150211e-08
|
||||
1.9952623149688793e-05,1.553663885878994e-08
|
||||
1.9952623149688793e-05,1.5631370249579246e-08
|
||||
1.9952623149688793e-05,1.5717862065800704e-08
|
||||
1.9952623149688793e-05,1.57971793985894e-08
|
||||
1.9952623149688793e-05,1.5870186356579704e-08
|
||||
1.9952623149688793e-05,1.593759332223716e-08
|
||||
1.9952623149688793e-05,1.5999991070923486e-08
|
||||
1.9952623149688793e-05,1.6057875903450682e-08
|
||||
1.9952623149688793e-05,1.6111668489205982e-08
|
||||
1.9952623149688793e-05,1.6161728217386366e-08
|
||||
1.9952623149688793e-05,1.6208364281630228e-08
|
||||
1.9952623149688793e-05,1.6251844350226973e-08
|
||||
1.9952623149688793e-05,1.629240142540359e-08
|
||||
1.9952623149688793e-05,1.6330239326114482e-08
|
||||
1.9952623149688793e-05,1.6365537111728e-08
|
||||
1.9952623149688793e-05,1.6398452681655655e-08
|
||||
1.9952623149688793e-05,1.642912572715412e-08
|
||||
1.9952623149688793e-05,1.6457680168940455e-08
|
||||
1.9952623149688793e-05,1.6484226183026747e-08
|
||||
1.9952623149688793e-05,1.6508861894003893e-08
|
||||
1.9952623149688793e-05,1.6531674797617433e-08
|
||||
1.9952623149688793e-05,1.655274296130114e-08
|
||||
1.9952623149688793e-05,1.657213604125123e-08
|
||||
1.9952623149688793e-05,1.6589916146838222e-08
|
||||
1.9952623149688793e-05,1.660613857708963e-08
|
||||
1.9952623149688793e-05,1.6620852449214096e-08
|
||||
1.9952623149688793e-05,1.6634101235366932e-08
|
||||
1.9952623149688793e-05,1.664592322084737e-08
|
||||
1.9952623149688793e-05,1.6656351894496074e-08
|
||||
1.9952623149688793e-05,1.666541628009631e-08
|
||||
1.9952623149688793e-05,1.6673141215973025e-08
|
||||
1.9952623149688793e-05,1.6679547588653583e-08
|
||||
1.9952623149688793e-05,1.6684652525341145e-08
|
||||
1.9952623149688793e-05,1.668846954900963e-08
|
||||
1.9952623149688793e-05,1.66910086991187e-08
|
||||
1.9952623149688793e-05,1.6692276620238304e-08
|
||||
1.9952623149688793e-05,1.6692276620238304e-08
|
||||
1.9952623149688793e-05,1.6691008699118703e-08
|
||||
1.9952623149688793e-05,1.6688469549009633e-08
|
||||
1.9952623149688793e-05,1.6684652525341148e-08
|
||||
1.9952623149688793e-05,1.6679547588653586e-08
|
||||
1.9952623149688793e-05,1.6673141215973028e-08
|
||||
1.9952623149688793e-05,1.666541628009631e-08
|
||||
1.9952623149688793e-05,1.6656351894496084e-08
|
||||
1.9952623149688793e-05,1.6645923220847374e-08
|
||||
1.9952623149688793e-05,1.6634101235366935e-08
|
||||
1.9952623149688793e-05,1.66208524492141e-08
|
||||
1.9952623149688793e-05,1.6606138577089633e-08
|
||||
1.9952623149688793e-05,1.6589916146838225e-08
|
||||
1.9952623149688793e-05,1.6572136041251237e-08
|
||||
1.9952623149688793e-05,1.6552742961301146e-08
|
||||
1.9952623149688793e-05,1.653167479761744e-08
|
||||
1.9952623149688793e-05,1.6508861894003893e-08
|
||||
1.9952623149688793e-05,1.648422618302675e-08
|
||||
1.9952623149688793e-05,1.645768016894046e-08
|
||||
1.9952623149688793e-05,1.6429125727154126e-08
|
||||
1.9952623149688793e-05,1.6398452681655658e-08
|
||||
1.9952623149688793e-05,1.6365537111728004e-08
|
||||
1.9952623149688793e-05,1.6330239326114482e-08
|
||||
1.9952623149688793e-05,1.6292401425403594e-08
|
||||
1.9952623149688793e-05,1.6251844350226973e-08
|
||||
1.9952623149688793e-05,1.6208364281630228e-08
|
||||
1.9952623149688793e-05,1.616172821738637e-08
|
||||
1.9952623149688793e-05,1.6111668489205982e-08
|
||||
1.9952623149688793e-05,1.605787590345069e-08
|
||||
1.9952623149688793e-05,1.5999991070923493e-08
|
||||
1.9952623149688793e-05,1.5937593322237167e-08
|
||||
1.9952623149688793e-05,1.5870186356579704e-08
|
||||
1.9952623149688793e-05,1.5797179398589402e-08
|
||||
1.9952623149688793e-05,1.571786206580071e-08
|
||||
1.9952623149688793e-05,1.5631370249579252e-08
|
||||
1.9952623149688793e-05,1.5536638858789946e-08
|
||||
1.9952623149688793e-05,1.5432334851502114e-08
|
||||
1.9952623149688793e-05,1.531675979078532e-08
|
||||
1.9952623149688793e-05,1.5187703614492156e-08
|
||||
1.9952623149688793e-05,1.5042217041806274e-08
|
||||
1.9952623149688793e-05,1.4876241470462273e-08
|
||||
1.9952623149688793e-05,1.4683973899785879e-08
|
||||
1.9952623149688793e-05,1.4456701012984246e-08
|
||||
1.9952623149688793e-05,1.4180462471172086e-08
|
||||
1.9952623149688793e-05,1.3830775406251184e-08
|
||||
1.9952623149688793e-05,1.3358478621325285e-08
|
||||
1.9952623149688793e-05,1.2639496244031593e-08
|
||||
1.9952623149688793e-05,1.1158426495504613e-08
|
||||
1.9952623149688796e-05,1.0570305869494063e-08
|
||||
1.9952623149688796e-05,1.1989102199581664e-08
|
||||
1.9952623149688796e-05,1.2687787891259665e-08
|
||||
1.9952623149688796e-05,1.3153676763101585e-08
|
||||
1.9952623149688796e-05,1.3504001312414315e-08
|
||||
1.9952623149688796e-05,1.378517965356758e-08
|
||||
1.9952623149688796e-05,1.4020312829929705e-08
|
||||
1.9952623149688796e-05,1.4222564206194578e-08
|
||||
1.9952623149688796e-05,1.440014394542033e-08
|
||||
1.9952623149688796e-05,1.4558516068269932e-08
|
||||
1.9952623149688796e-05,1.4701499315172012e-08
|
||||
1.9952623149688796e-05,1.4831866587815758e-08
|
||||
1.9952623149688796e-05,1.4951694168451522e-08
|
||||
1.9952623149688796e-05,1.506257639956634e-08
|
||||
1.9952623149688796e-05,1.5165763570833366e-08
|
||||
1.9952623149688796e-05,1.5262253772723937e-08
|
||||
1.9952623149688796e-05,1.535285600134073e-08
|
||||
1.9952623149688796e-05,1.543823467328411e-08
|
||||
1.9952623149688796e-05,1.551894175425445e-08
|
||||
1.9952623149688796e-05,1.5595440417063968e-08
|
||||
1.9952623149688796e-05,1.5668122772822936e-08
|
||||
1.9952623149688796e-05,1.5737323370281063e-08
|
||||
1.9952623149688796e-05,1.5803329618444796e-08
|
||||
1.9952623149688796e-05,1.5866389935670908e-08
|
||||
1.9952623149688796e-05,1.592672019391794e-08
|
||||
1.9952623149688796e-05,1.598450886742589e-08
|
||||
1.9952623149688796e-05,1.6039921184766554e-08
|
||||
1.9952623149688796e-05,1.609310250559421e-08
|
||||
1.9952623149688796e-05,1.61441810880001e-08
|
||||
1.9952623149688796e-05,1.6193270372246937e-08
|
||||
1.9952623149688796e-05,1.6240470877236143e-08
|
||||
1.9952623149688796e-05,1.6285871784230113e-08
|
||||
1.9952623149688796e-05,1.6329552265978812e-08
|
||||
1.9952623149688796e-05,1.6371582606990462e-08
|
||||
1.9952623149688796e-05,1.641202515119326e-08
|
||||
1.9952623149688796e-05,1.6450935105904177e-08
|
||||
1.9952623149688796e-05,1.6488361225310858e-08
|
||||
1.9952623149688796e-05,1.6524346392188574e-08
|
||||
1.9952623149688796e-05,1.6558928113022246e-08
|
||||
1.9952623149688796e-05,1.6592138938867027e-08
|
||||
1.9952623149688796e-05,1.6624006821997905e-08
|
||||
1.9952623149688796e-05,1.665455541654349e-08
|
||||
1.9952623149688796e-05,1.668380432977811e-08
|
||||
1.9952623149688796e-05,1.6711769329485368e-08
|
||||
1.9952623149688796e-05,1.6738462511750264e-08
|
||||
1.9952623149688796e-05,1.6763892432637406e-08
|
||||
1.9952623149688796e-05,1.6788064206436675e-08
|
||||
1.9952623149688796e-05,1.681097957247311e-08
|
||||
1.9952623149688796e-05,1.6832636931862217e-08
|
||||
1.9952623149688796e-05,1.6853031355021186e-08
|
||||
1.9952623149688796e-05,1.687215456020574e-08
|
||||
1.9952623149688796e-05,1.688999486281053e-08
|
||||
1.9952623149688796e-05,1.690653709463382e-08
|
||||
1.9952623149688796e-05,1.6921762491746848e-08
|
||||
1.9952623149688796e-05,1.6935648549006222e-08
|
||||
1.9952623149688796e-05,1.6948168838584662e-08
|
||||
1.9952623149688796e-05,1.695929278914847e-08
|
||||
1.9952623149688796e-05,1.696898542145055e-08
|
||||
1.9952623149688796e-05,1.6977207035104874e-08
|
||||
1.9952623149688796e-05,1.6983912840119302e-08
|
||||
1.9952623149688796e-05,1.6989052525338295e-08
|
||||
1.9952623149688796e-05,1.699256975421989e-08
|
||||
1.9952623149688796e-05,1.6994401576260005e-08
|
||||
1.9952623149688796e-05,1.6994477739772384e-08
|
||||
1.9952623149688796e-05,1.699271988849318e-08
|
||||
1.9952623149688796e-05,1.6989040620420942e-08
|
||||
1.9952623149688796e-05,1.6983342382173362e-08
|
||||
1.9952623149688796e-05,1.6975516165613388e-08
|
||||
1.9952623149688796e-05,1.6965439965112504e-08
|
||||
1.9952623149688796e-05,1.6952976942961452e-08
|
||||
1.9952623149688796e-05,1.693797323625088e-08
|
||||
1.9952623149688796e-05,1.6920255319826076e-08
|
||||
1.9952623149688796e-05,1.6899626814970685e-08
|
||||
1.9952623149688796e-05,1.6875864599859146e-08
|
||||
1.9952623149688796e-05,1.6848714031984708e-08
|
||||
1.9952623149688796e-05,1.6817883029489423e-08
|
||||
1.9952623149688796e-05,1.6783034669737056e-08
|
||||
1.9952623149688796e-05,1.674377783759437e-08
|
||||
1.9952623149688796e-05,1.669965527407164e-08
|
||||
1.9952623149688796e-05,1.6650128108596616e-08
|
||||
1.9952623149688796e-05,1.6594555557112625e-08
|
||||
1.9952623149688796e-05,1.6532167853144137e-08
|
||||
1.9952623149688796e-05,1.6462029512327026e-08
|
||||
1.9952623149688796e-05,1.6382988469074245e-08
|
||||
1.9952623149688796e-05,1.6293604020234886e-08
|
||||
1.9952623149688796e-05,1.619204201130206e-08
|
||||
1.9952623149688796e-05,1.607591759753518e-08
|
||||
1.9952623149688796e-05,1.5942050594874486e-08
|
||||
1.9952623149688796e-05,1.578606776895102e-08
|
||||
1.9952623149688796e-05,1.5601720601345105e-08
|
||||
1.9952623149688796e-05,1.5379633197361104e-08
|
||||
1.9952623149688796e-05,1.5104793671989548e-08
|
||||
1.9952623149688796e-05,1.4750892345803154e-08
|
||||
1.9952623149688796e-05,1.4265134295425351e-08
|
||||
1.9952623149688796e-05,1.3514359541675816e-08
|
||||
1.9952623149688796e-05,1.194579997186553e-08
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
signal,nli
|
||||
1.9952623149688793e-05,5.522326183599433e-09
|
||||
1.7957360834719913e-05,4.5606601423111315e-09
|
||||
2.593841009459543e-05,6.633717697038881e-09
|
||||
1.5962098519751036e-05,4.3237017878447286e-09
|
||||
2.3943147779626553e-05,8.311382502260195e-09
|
||||
1.9952623149688796e-05,5.183134799604202e-09
|
||||
1.7957360834719913e-05,4.286200408629989e-09
|
||||
2.593841009459543e-05,6.2510001955285065e-09
|
||||
1.5962098519751036e-05,4.082332034495425e-09
|
||||
2.3943147779626556e-05,7.857762167195498e-09
|
||||
|
||||
|
@@ -1,96 +1,96 @@
|
||||
1.000000000000000021e-03,5.915557166626927424e-04,3.840877221245049653e-04,2.466727384040633977e-04,1.573474629975438242e-04,9.994300566924636483e-05,6.331217828438720550e-05,4.004003600460594289e-05,2.529553013238426405e-05
|
||||
1.000000000000000021e-03,5.910087140881509866e-04,3.835259923737136521e-04,2.462279833344210639e-04,1.570298910751132091e-04,9.972770370845923681e-05,6.317035443958771254e-05,3.994817502675088248e-05,2.523663218966317481e-05
|
||||
1.000000000000000021e-03,5.904624672772724710e-04,3.829653846278134621e-04,2.457842903404500092e-04,1.567131560243821098e-04,9.951300275831494635e-05,6.302894048828063141e-05,3.985658526347281646e-05,2.517791045472703461e-05
|
||||
1.000000000000000021e-03,5.899169734839467818e-04,3.824058950962419133e-04,2.453416557234028707e-04,1.563972548287988369e-04,9.929890059644241613e-05,6.288793488850426760e-05,3.976526568300959219e-05,2.511936425240675192e-05
|
||||
1.000000000000000021e-03,5.893722299298780965e-04,3.818475199355363483e-04,2.449000757332959262e-04,1.560821844312877747e-04,9.908539497140619857e-05,6.274733607851797545e-05,3.967421524053715842e-05,2.506099289905929403e-05
|
||||
1.000000000000000021e-03,5.888282338048204554e-04,3.812902552499899305e-04,2.444595465697163919e-04,1.557679417349789946e-04,9.887248360327203632e-05,6.260714247720703990e-05,3.958343287844485109e-05,2.500279570274922987e-05
|
||||
1.000000000000000021e-03,5.882849822668304897e-04,3.807340970923119234e-04,2.440200643826254091e-04,1.554545236039297650e-04,9.866016418416755746e-05,6.246735248448248958e-05,3.949291752660743311e-05,2.494477196342878550e-05
|
||||
1.000000000000000021e-03,5.877403241312353140e-04,3.801768826891299322e-04,2.435799392795756472e-04,1.551407333476893054e-04,9.844762961169771281e-05,6.232743618144160702e-05,3.940232665622856909e-05,2.488670234861411131e-05
|
||||
1.000000000000000021e-03,5.871942634186000593e-04,3.796186190022559433e-04,2.431391779090945110e-04,1.548265761463755335e-04,9.823488356157069126e-05,6.218739605181586088e-05,3.931166190013138108e-05,2.482858791458364441e-05
|
||||
1.000000000000000021e-03,5.866468041173980141e-04,3.790593129257516128e-04,2.426977868451053722e-04,1.545120571165502460e-04,9.802192966180839372e-05,6.204723454596646772e-05,3.922092486871354988e-05,2.477042970290643410e-05
|
||||
1.000000000000000021e-03,5.860979501842715923e-04,3.784989712866057847e-04,2.422557725877665796e-04,1.541971813119806349e-04,9.780877149334107738e-05,6.190695408131255699e-05,3.913011715023943305e-05,2.471222874063606835e-05
|
||||
1.000000000000000021e-03,5.855428054911818777e-04,3.779325362214322600e-04,2.418091152720060536e-04,1.538790714407033914e-04,9.759345536126727376e-05,6.176526646718061210e-05,3.903840385562048950e-05,2.465344951928800295e-05
|
||||
1.000000000000000021e-03,5.849813875456967485e-04,3.773600382625630725e-04,2.413578451141304101e-04,1.535577517356502032e-04,9.737599881379701964e-05,6.162218372343696363e-05,3.894579295722817337e-05,2.459409722576532997e-05
|
||||
1.000000000000000021e-03,5.844137140093277807e-04,3.767815081401627831e-04,2.409019924922280132e-04,1.532332465435331354e-04,9.715641947446165209e-05,6.147771791853056712e-05,3.885229245840823961e-05,2.453417706661341544e-05
|
||||
1.000000000000000021e-03,5.838398026969793654e-04,3.761969767804803125e-04,2.404415879440078890e-04,1.529055803229076760e-04,9.693473504062415536e-05,6.133188116843621776e-05,3.875791039276530608e-05,2.447369426754818325e-05
|
||||
1.000000000000000021e-03,5.832596715764015120e-04,3.756064753041117783e-04,2.399766621646476654e-04,1.525747776422469490e-04,9.671096328199675835e-05,6.118468563560254894e-05,3.866265482344967213e-05,2.441265407298631344e-05
|
||||
1.000000000000000021e-03,5.826733387676383139e-04,3.750100350242446291e-04,2.395072460046293692e-04,1.522408631780071723e-04,9.648512203915507620e-05,6.103614352789890607e-05,3.856653384244465896e-05,2.435106174557538284e-05
|
||||
1.000000000000000021e-03,5.820810441807425326e-04,3.744079089136845458e-04,2.390335428197917333e-04,1.519039834472631588e-04,9.625731118926498641e-05,6.088632085792882825e-05,3.846959029618343478e-05,2.428894479270876788e-05
|
||||
1.000000000000000021e-03,5.814828054675655030e-04,3.738001274474016776e-04,2.385555825972570808e-04,1.515641624143126585e-04,9.602754804766522702e-05,6.073522946956701240e-05,3.837183203343020677e-05,2.422630831805138899e-05
|
||||
1.000000000000000021e-03,5.808786404289665358e-04,3.731867212872194738e-04,2.380733954737781241e-04,1.512214241469207320e-04,9.579584999731260704e-05,6.058288124990010364e-05,3.827326693032387752e-05,2.416315744255338838e-05
|
||||
1.000000000000000021e-03,5.802685670142343878e-04,3.725677212800349654e-04,2.375870117335689917e-04,1.508757928143868079e-04,9.556223448729982074e-05,6.042928812817623899e-05,3.817390288966712009e-05,2.409949730398197492e-05
|
||||
1.000000000000000021e-03,5.796526968519212725e-04,3.719432545624587992e-04,2.370965379259533010e-04,1.505273470495264228e-04,9.532675589286383365e-05,6.027448635812982831e-05,3.807376356963088358e-05,2.403534314190221437e-05
|
||||
1.000000000000000021e-03,5.790310479093865609e-04,3.713133518665244839e-04,2.366020041460938778e-04,1.501761108339581341e-04,9.508943151110322721e-05,6.011848775803337427e-05,3.797285679655886708e-05,2.397070004317041725e-05
|
||||
1.000000000000000021e-03,5.784036383121742876e-04,3.706780441238009577e-04,2.361034406501071276e-04,1.498221082613785163e-04,9.485027871279472060e-05,5.996130419345521918e-05,3.787119042685209972e-05,2.390557311366359151e-05
|
||||
1.000000000000000021e-03,5.777704863433433301e-04,3.700373624633735868e-04,2.356008778526011383e-04,1.494653635353745394e-04,9.460931494071504256e-05,5.980294757607067669e-05,3.776877234616485572e-05,2.383996747774973522e-05
|
||||
1.000000000000000021e-03,5.771316104427772061e-04,3.693913382097967039e-04,2.350943463241932639e-04,1.491059009672212558e-04,9.436655770795449559e-05,5.964342986246977532e-05,3.766561046859827219e-05,2.377388827775711285e-05
|
||||
1.000000000000000021e-03,5.764870292064976651e-04,3.687400028810397501e-04,2.345838767890191692e-04,1.487437449736715462e-04,9.412202459622686095e-05,5.948276305296108525e-05,3.756171273589169023e-05,2.370734067344167480e-05
|
||||
1.000000000000000021e-03,5.758375946234993610e-04,3.680842155919215072e-04,2.340701414876563216e-04,1.483793719498717782e-04,9.387603703510192111e-05,5.932115823520561543e-05,3.745721560837426419e-05,2.364041205155829344e-05
|
||||
1.000000000000000021e-03,5.751833223951592329e-04,3.674240032104748388e-04,2.335531666416808738e-04,1.480128027327277474e-04,9.362861002461524574e-05,5.915862564500113025e-05,3.735212585887714390e-05,2.357310681190604310e-05
|
||||
1.000000000000000021e-03,5.745242283439769499e-04,3.667593927483133397e-04,2.330329785818580578e-04,1.476440582313571256e-04,9.337975861033522300e-05,5.899517554647101613e-05,3.724645027783519551e-05,2.350542936525477225e-05
|
||||
1.000000000000000021e-03,5.738603284130473379e-04,3.660904113590355527e-04,2.325096037462197861e-04,1.472731594253864234e-04,9.312949788206356194e-05,5.883081823114703288e-05,3.714019567266727830e-05,2.343738413293735195e-05
|
||||
1.000000000000000021e-03,5.731917314000997948e-04,3.654171810067180655e-04,2.319831433530600859e-04,1.469001805571756218e-04,9.287787898176902846e-05,5.866558771451522606e-05,3.703338420706373603e-05,2.336898537810763873e-05
|
||||
1.000000000000000021e-03,5.725184531760584700e-04,3.647397285916569422e-04,2.314536235223777264e-04,1.465251423190001693e-04,9.262491677678542706e-05,5.849949412959568328e-05,3.692602258076439168e-05,2.330023745100291859e-05
|
||||
1.000000000000000021e-03,5.718405097346714646e-04,3.640580811583470273e-04,2.309210704829702432e-04,1.461480654746279682e-04,9.237062617930094123e-05,5.833254763720848617e-05,3.681811751074023914e-05,2.323114471257928647e-05
|
||||
1.000000000000000021e-03,5.711579171919053044e-04,3.633722658937428313e-04,2.303855105703487465e-04,1.457689708574830614e-04,9.211502214495855044e-05,5.816475842498649012e-05,3.670967573052717390e-05,2.316171153407365905e-05
|
||||
1.000000000000000021e-03,5.704706917853448337e-04,3.626823101255147543e-04,2.298469702246577707e-04,1.453878793688169360e-04,9.185811967146480901e-05,5.799613670639434487e-05,3.660070398956385041e-05,2.309194229656875218e-05
|
||||
1.000000000000000021e-03,5.697788498735841109e-04,3.619882413202942504e-04,2.293054759885765847e-04,1.450048119758659754e-04,9.159993379718755254e-05,5.782669271974067121e-05,3.649120905252569737e-05,2.302184139055488024e-05
|
||||
1.000000000000000021e-03,5.690839249361781711e-04,3.612915831986411477e-04,2.287622092282637863e-04,1.446206010588695675e-04,9.134102410651873409e-05,5.765679311500335815e-05,3.638142760462866287e-05,2.295156024783083523e-05
|
||||
1.000000000000000021e-03,5.683859273133331363e-04,3.605923537461036641e-04,2.282171874164802170e-04,1.442352604283837097e-04,9.108140050118301682e-05,5.748644463023418617e-05,3.627136409615889481e-05,2.288110175599186700e-05
|
||||
1.000000000000000021e-03,5.676848674169825831e-04,3.598905710243090802e-04,2.276704280772651710e-04,1.438488039249314222e-04,9.082107289971861372e-05,5.731565401294060850e-05,3.616102298282374168e-05,2.281046880581413228e-05
|
||||
1.000000000000000021e-03,5.669807557304629327e-04,3.591862531699841626e-04,2.271219487847658911e-04,1.434612454179789358e-04,9.056005123670258442e-05,5.714442801953895405e-05,3.605040872538299508e-05,2.273966429101268041e-05
|
||||
1.000000000000000021e-03,5.662756696284717943e-04,3.584815135619230891e-04,2.265734124911083147e-04,1.430737675597642188e-04,9.029913524493678829e-05,5.697329258726415482e-05,3.593986162522089478e-05,2.266890625682277028e-05
|
||||
1.000000000000000021e-03,5.655696121370722921e-04,3.577763576655677066e-04,2.260248242651153531e-04,1.426863741861267136e-04,9.003832758694041048e-05,5.680224948786493348e-05,3.582938283523433764e-05,2.259819544408493697e-05
|
||||
1.000000000000000021e-03,5.648625863181645518e-04,3.570707909872514684e-04,2.254761892066869196e-04,1.422990691538204475e-04,8.977763093872482745e-05,5.663130050166089515e-05,3.571897351373497692e-05,2.252753259705453904e-05
|
||||
1.000000000000000021e-03,5.641545952693012783e-04,3.563648190736888295e-04,2.249275124461922067e-04,1.419118563399853763e-04,8.951704798938974166e-05,5.646044741725799208e-05,3.560863482425828067e-05,2.245691846327665519e-05
|
||||
1.000000000000000021e-03,5.634456421235028989e-04,3.556584475114634488e-04,2.243787991438712611e-04,1.415247396416227112e-04,8.925658144072659398e-05,5.628969203126926030e-05,3.549836793537420297e-05,2.238635379346144160e-05
|
||||
1.000000000000000021e-03,5.627357300490819225e-04,3.549516819265270164e-04,2.238300544892383743e-04,1.411377229750731741e-04,8.899623400682166435e-05,5.611903614803531905e-05,3.538817402049950172e-05,2.231583934136070575e-05
|
||||
1.000000000000000021e-03,5.620265745740795878e-04,3.542462045793823072e-04,2.232825718355581747e-04,1.407517127660701999e-04,8.873661298955798349e-05,5.594887683102661642e-05,3.527830905094599801e-05,2.224553873809700179e-05
|
||||
1.000000000000000021e-03,5.613181716914067464e-04,3.535420099674467737e-04,2.227363458317740963e-04,1.403667046661989041e-04,8.847771519474716161e-05,5.577921186868756777e-05,3.516877154903826080e-05,2.217545101761858074e-05
|
||||
1.000000000000000021e-03,5.606105174362018646e-04,3.528390926567629869e-04,2.221913711948466166e-04,1.399826943822104249e-04,8.821953746856249804e-05,5.561003907731979445e-05,3.505956005567386572e-05,2.210557522599888898e-05
|
||||
1.000000000000000021e-03,5.599036078855734169e-04,3.521374472813410678e-04,2.216476427089692435e-04,1.395996776753266513e-04,8.796207669700402236e-05,5.544135630070159596e-05,3.495067313006486022e-05,2.203591042126611129e-05
|
||||
1.000000000000000021e-03,5.591992581819900257e-04,3.514388991464684675e-04,2.211065862108586844e-04,1.392186639199167455e-04,8.770601346645835294e-05,5.527361030479937100e-05,3.484239951455165907e-05,2.196664147854661471e-05
|
||||
1.000000000000000021e-03,5.584974577369657654e-04,3.507434317312190116e-04,2.205681855748304113e-04,1.388396401724235928e-04,8.745133837595373525e-05,5.510679463338290224e-05,3.473473491875524963e-05,2.189776560286087024e-05
|
||||
1.000000000000000021e-03,5.577981960279812567e-04,3.500510286412654524e-04,2.200324248112712805e-04,1.384625936044855835e-04,8.719804211084999142e-05,5.494090289064881491e-05,3.462767509292537455e-05,2.182928002589032757e-05
|
||||
1.000000000000000021e-03,5.571014625980537805e-04,3.493616736077873519e-04,2.194992880653100025e-04,1.380875115017372141e-04,8.694611544190507637e-05,5.477592874055209164e-05,3.452121582748434684e-05,2.176118200567564087e-05
|
||||
1.000000000000000021e-03,5.564072470552914543e-04,3.486753504863699662e-04,2.189687596154907018e-04,1.377143812626113696e-04,8.669554922434540153e-05,5.461186590614181566e-05,3.441535295257522900e-05,2.169346882631773742e-05
|
||||
1.000000000000000021e-03,5.557155390724777657e-04,3.479920432559456848e-04,2.184408238724854000e-04,1.373431903971786034e-04,8.644633439696230146e-05,5.444870816891464747e-05,3.431008233762035268e-05,2.162613779768559453e-05
|
||||
1.000000000000000021e-03,5.550282308874212147e-04,3.473135853761227104e-04,2.179168797741835634e-04,1.369749146289257855e-04,8.619912270820690987e-05,5.428688083545962664e-05,3.420567782931384528e-05,2.155936384410790980e-05
|
||||
1.000000000000000021e-03,5.543453044039096641e-04,3.466399489498413807e-04,2.173969005859271932e-04,1.366095327799803094e-04,8.595389890905566596e-05,5.412637349122350694e-05,3.410213253115887156e-05,2.149314248283782383e-05
|
||||
1.000000000000000021e-03,5.536667416543260278e-04,3.459711063207645686e-04,2.168808598269340415e-04,1.362470238846985658e-04,8.571064790824490891e-05,5.396717583150281386e-05,3.399943962027434491e-05,2.142746927933548718e-05
|
||||
1.000000000000000021e-03,5.529925247987736454e-04,3.453070300711248903e-04,2.163687312677279435e-04,1.358873671873677324e-04,8.546935477049620155e-05,5.380927766017944798e-05,3.389759234653519571e-05,2.136233984669994517e-05
|
||||
1.000000000000000021e-03,5.523242123557685823e-04,3.446492679875326503e-04,2.158617145497228296e-04,1.355314077800207832e-04,8.523058755788532964e-05,5.365305115434923267e-05,3.379683095199963850e-05,2.129790788796336886e-05
|
||||
1.000000000000000021e-03,5.516617811459008413e-04,3.439977838203789025e-04,2.153597748770509342e-04,1.351791181086447731e-04,8.499432644189092710e-05,5.349848277838686991e-05,3.369714647650299112e-05,2.123416758034315385e-05
|
||||
1.000000000000000021e-03,5.510052081904127453e-04,3.433525416882428740e-04,2.148628778379304833e-04,1.348304709382760146e-04,8.476055183025699440e-05,5.334555916079864168e-05,3.359853006971443923e-05,2.117111317291617240e-05
|
||||
1.000000000000000021e-03,5.503544707098636342e-04,3.427135060745518090e-04,2.143709894006651793e-04,1.344854393494213974e-04,8.452924436422564868e-05,5.319426709225049006e-05,3.350097298979682009e-05,2.110873898573355285e-05
|
||||
1.000000000000000021e-03,5.497095461228062706e-04,3.420806418242862412e-04,2.138840759097000895e-04,1.341439967345312348e-04,8.430038491581448882e-05,5.304459352362807473e-05,3.340446660208796169e-05,2.104703940894962140e-05
|
||||
1.000000000000000021e-03,5.490704120444732210e-04,3.414539141407250565e-04,2.134021040817290626e-04,1.338061167945246396e-04,8.407395458513211085e-05,5.289652556412503305e-05,3.330900237780223545e-05,2.098600890196449472e-05
|
||||
1.000000000000000021e-03,5.484371298422446297e-04,3.408333692467681113e-04,2.129251024270059081e-04,1.334718163299163942e-04,8.384996326436759272e-05,5.275006911363530105e-05,3.321458388816914869e-05,2.092564965374723430e-05
|
||||
1.000000000000000021e-03,5.478096771889333057e-04,3.402189725469309967e-04,2.124530379214265854e-04,1.331410692793207290e-04,8.362839223924152716e-05,5.260521141428185532e-05,3.312120269498457291e-05,2.086595618361951373e-05
|
||||
1.000000000000000021e-03,5.471880319478338028e-04,3.396106897916775086e-04,2.119858778995733334e-04,1.328138498781884043e-04,8.340922301478033581e-05,5.246193986031627375e-05,3.302885046175365648e-05,2.080692307740899109e-05
|
||||
1.000000000000000021e-03,5.465721721714859958e-04,3.390084870743713592e-04,2.115235900510876890e-04,1.324901326555763298e-04,8.319243731282516567e-05,5.232024199634728476e-05,3.293751895248773966e-05,2.074854498665493433e-05
|
||||
1.000000000000000021e-03,5.459629241404544706e-04,3.384131725428774743e-04,2.110667946787101129e-04,1.321703518944146796e-04,8.297832591380873519e-05,5.218030786215170435e-05,3.284733064718059383e-05,2.069090019482566404e-05
|
||||
1.000000000000000021e-03,5.453602635114507746e-04,3.378247083723790616e-04,2.106154557101209946e-04,1.318544791589579420e-04,8.276686841524559784e-05,5.204212355675735553e-05,3.275827635494999894e-05,2.063398273378693265e-05
|
||||
1.000000000000000021e-03,5.447641661727002649e-04,3.372430571518834691e-04,2.101695374983407439e-04,1.315424863636820575e-04,8.255804467261116894e-05,5.190567535780167048e-05,3.267034700418964161e-05,2.057778671334094953e-05
|
||||
1.000000000000000021e-03,5.441746082424759419e-04,3.366681818805845774e-04,2.097290048174083239e-04,1.312343457694375884e-04,8.235183479637930588e-05,5.177094971942625129e-05,3.258353364113958107e-05,2.052230632028256941e-05
|
||||
1.000000000000000021e-03,5.435915660676414983e-04,3.361000459642789163e-04,2.092938228581225045e-04,1.309300299796617602e-04,8.214821914910500468e-05,5.163793327020207291e-05,3.249782742847867687e-05,2.046753581747058517e-05
|
||||
1.000000000000000021e-03,5.430150162222109568e-04,3.355386132118161487e-04,2.088639572238308215e-04,1.306295119366350911e-04,8.194717834254394587e-05,5.150661281108238069e-05,3.241321964393507540e-05,2.041346954291065543e-05
|
||||
1.000000000000000021e-03,5.424450181544462771e-04,3.349839271155603902e-04,2.084394340599780252e-04,1.303328067075743425e-04,8.174872108664715700e-05,5.137699346328779477e-05,3.232971335519106785e-05,2.036010936323692981e-05
|
||||
1.000000000000000021e-03,5.418815485793469040e-04,3.344359518126675877e-04,2.080202193468776877e-04,1.300398875631312602e-04,8.155282824274543232e-05,5.124906220377890154e-05,3.224729995882103797e-05,2.030744969463951815e-05
|
||||
1.000000000000000021e-03,5.413245844265015877e-04,3.338946518213946552e-04,2.076062794549138172e-04,1.297507280942760690e-04,8.135948090770286575e-05,5.112280617242197348e-05,3.216597096011364272e-05,2.025548502431296445e-05
|
||||
1.000000000000000021e-03,5.407741028387587183e-04,3.333599920378552692e-04,2.071975811406991498e-04,1.294653022088876294e-04,8.116866041129419294e-05,5.099821267012491396e-05,3.208571797180734118e-05,2.020420990962221080e-05
|
||||
1.000000000000000021e-03,5.402303025747014556e-04,3.328321561526745862e-04,2.067942601549091974e-04,1.291837026153304184e-04,8.098042783792958120e-05,5.087532120941394917e-05,3.200656629292941073e-05,2.015364045325785942e-05
|
||||
1.000000000000000021e-03,5.396931605409548225e-04,3.323111087173311550e-04,2.063962829591101838e-04,1.289059030082810651e-04,8.079476437365657295e-05,5.075411899733799342e-05,3.192850747587867838e-05,2.010377117411100997e-05
|
||||
1.000000000000000021e-03,5.391626538584482192e-04,3.317968146613820609e-04,2.060036164003212873e-04,1.286318773981824648e-04,8.061165143636152362e-05,5.063459340114707095e-05,3.185153317990099749e-05,2.005459666083220688e-05
|
||||
1.000000000000000021e-03,5.386387598611086340e-04,3.312892392892789490e-04,2.056162277072543561e-04,1.283616001079104806e-04,8.043107067321031531e-05,5.051673194647494236e-05,3.177563516985718072e-05,2.000611157101859271e-05
|
||||
1.000000000000000021e-03,5.381214560945620949e-04,3.307883482772016118e-04,2.052340844865845515e-04,1.280950457694747437e-04,8.025300395811590449e-05,5.040052231554306949e-05,3.170080531500530551e-05,1.995831063041139523e-05
|
||||
1.000000000000000021e-03,5.376107203148404326e-04,3.302941076699326679e-04,2.048571547192701043e-04,1.278321893207613302e-04,8.007743338923888358e-05,5.028595234538581714e-05,3.162703558779804923e-05,1.991118863210237610e-05
|
||||
1.000000000000000021e-03,5.371022748594453389e-04,3.298024246812891291e-04,2.044823390252625600e-04,1.275708788891961756e-04,7.990292563076895462e-05,5.017208832604374468e-05,3.155372544493714152e-05,1.986436223028797206e-05
|
||||
1.000000000000000021e-03,5.365961117498912114e-04,3.293132869081722108e-04,2.041096254707852251e-04,1.273111050031557620e-04,7.972947385597059739e-05,5.005892559260894715e-05,3.148087179640124731e-05,1.981782941609088261e-05
|
||||
1.000000000000000021e-03,5.360922230056120808e-04,3.288266819633119922e-04,2.037390021489647173e-04,1.270528582181514683e-04,7.955707126027152540e-05,4.994645949643470906e-05,3.140847156340457124e-05,1.977158818812822943e-05
|
||||
1.000000000000000021e-03,5.355906006439992324e-04,3.283425974753378354e-04,2.033704571798752555e-04,1.267961291168465381e-04,7.938571106126265876e-05,4.983468540512894492e-05,3.133652167839010846e-05,1.972563655250571181e-05
|
||||
1.000000000000000021e-03,5.350891259362026411e-04,3.278589502113704612e-04,2.030023855884717748e-04,1.265397912200834861e-04,7.921463777328526478e-05,4.972310904903239575e-05,3.126470337114675132e-05,1.967977067875568528e-05
|
||||
1.000000000000000021e-03,5.345877966909636306e-04,3.273757374134148111e-04,2.026347848040474173e-04,1.262838424862170036e-04,7.904384991646645146e-05,4.961172941171763403e-05,3.119301596587686584e-05,1.963399012641590455e-05
|
||||
1.000000000000000021e-03,5.340866106918126799e-04,3.268929562877650259e-04,2.022676522245876859e-04,1.260282808504260116e-04,7.887334599501782170e-05,4.950054546622813158e-05,3.112145877995456692e-05,1.958829445064508602e-05
|
||||
1.000000000000000021e-03,5.335855656972701092e-04,3.264106040054970534e-04,2.019009852173301103e-04,1.257731042251948573e-04,7.870312449759831505e-05,4.938955617533215942e-05,3.105003112409614148e-05,1.954268320233478379e-05
|
||||
1.000000000000000021e-03,5.330846594410641130e-04,3.259286777029715004e-04,2.015347811193284109e-04,1.255183105007985753e-04,7.853318389767883849e-05,4.927876049177821896e-05,3.097873230253197569e-05,1.949715592822227211e-05
|
||||
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
|
||||
|
||||
|
@@ -1,98 +1,98 @@
|
||||
1.000000000000000021e-03,6.059596816131984903e-04,4.124540545641951000e-04,2.874328952539468305e-04,2.103398919772851445e-04,1.677242405549142946e-04,1.544863001982801454e-04,1.810521006745035243e-04,3.200643516934312716e-04
|
||||
1.000000000000000021e-03,6.053276391419512917e-04,4.117105797931639192e-04,2.867132476380170980e-04,2.096494018677202108e-04,1.670078900317705016e-04,1.536235748319029191e-04,1.797412011853683042e-04,3.172302656811062894e-04
|
||||
1.000000000000000021e-03,6.046965215788322606e-04,4.109687952835336887e-04,2.859957486816950244e-04,2.089614974033423851e-04,1.662949011112697126e-04,1.527659914515381017e-04,1.784402430016445015e-04,3.144223032044235564e-04
|
||||
1.000000000000000021e-03,6.040663257237133005e-04,4.102286952029449651e-04,2.852803900268787471e-04,2.082761669373014350e-04,1.655852558250782110e-04,1.519135165004971508e-04,1.771491455864908956e-04,3.116402083285431824e-04
|
||||
1.000000000000000021e-03,6.034134049131552151e-04,4.094420572177277762e-04,2.844940684888993296e-04,2.074903534701979157e-04,1.647299311261353841e-04,1.508247978694524506e-04,1.753757648572244786e-04,3.073546770239318966e-04
|
||||
1.000000000000000021e-03,6.027614491955140619e-04,4.086572704905903084e-04,2.837102537033676193e-04,2.067078158689920062e-04,1.638793172508614261e-04,1.497441922066543145e-04,1.736205593148946460e-04,3.031290170068882115e-04
|
||||
1.000000000000000021e-03,6.021104551256277167e-04,4.078743283205443272e-04,2.829289352705667755e-04,2.059285379676389937e-04,1.630333854029286287e-04,1.486716352337672398e-04,1.718833358612950819e-04,2.989623714008152688e-04
|
||||
1.000000000000000021e-03,6.014582116574243619e-04,4.070908897338878368e-04,2.821481168500803620e-04,2.051508852341138217e-04,1.621907338278938133e-04,1.476057520309239507e-04,1.701623353591907634e-04,2.948510854465446421e-04
|
||||
1.000000000000000021e-03,6.008047235362061304e-04,4.063069632907822604e-04,2.813678065291968134e-04,2.043748619094956848e-04,1.613513572535205565e-04,1.465465096091600223e-04,1.684574188261711764e-04,2.907944492354505236e-04
|
||||
1.000000000000000021e-03,6.001451360530016092e-04,4.055123728737173791e-04,2.805722092000019225e-04,2.035777116783122080e-04,1.604816172174310248e-04,1.454380432794140279e-04,1.666509749540511247e-04,2.864106919229302104e-04
|
||||
1.000000000000000021e-03,5.994843238884264500e-04,4.047173509812383436e-04,2.797772242168449484e-04,2.027823739011739494e-04,1.596154967418240479e-04,1.443369747762361644e-04,1.648627759919576703e-04,2.820911717580149220e-04
|
||||
1.000000000000000021e-03,5.988172342183890103e-04,4.039163714190686103e-04,2.789780293498389497e-04,2.019848363041463460e-04,1.587495225986212185e-04,1.432398991427229250e-04,1.630885426393815433e-04,2.778273023594395367e-04
|
||||
1.000000000000000021e-03,5.981438884479926745e-04,4.031094770638417378e-04,2.781746763026650849e-04,2.011851525894453846e-04,1.578837467363927922e-04,1.421468562989037501e-04,1.613282432889087106e-04,2.736185440612619660e-04
|
||||
1.000000000000000021e-03,5.974643081279905951e-04,4.022967109333065402e-04,2.773672167904255525e-04,2.003833762773818070e-04,1.570182206524130687e-04,1.410578853054891162e-04,1.595818450324428667e-04,2.694643589605560702e-04
|
||||
1.000000000000000021e-03,5.967776135628261383e-04,4.014760835454474729e-04,2.765523639715266420e-04,1.995745107850170087e-04,1.561451751437292214e-04,1.399593838969533089e-04,1.578189695554256631e-04,2.652593622585595239e-04
|
||||
1.000000000000000021e-03,5.960847301704033955e-04,4.006496794462583626e-04,2.757335282633677394e-04,1.987637005805311633e-04,1.552725686595443394e-04,1.388652425906941482e-04,1.560705931497471889e-04,2.611111091988240428e-04
|
||||
1.000000000000000021e-03,5.953856800664869900e-04,3.998175424230218200e-04,2.749107619574642008e-04,1.979509993037016505e-04,1.544004519462355480e-04,1.377754975907092790e-04,1.543366727366940775e-04,2.570190084729973012e-04
|
||||
1.000000000000000021e-03,5.946807128856675898e-04,3.989799547069150759e-04,2.740843182982303974e-04,1.971366223883773178e-04,1.535290106655841792e-04,1.366903106980890768e-04,1.526173104925201149e-04,2.529827224768709296e-04
|
||||
1.000000000000000021e-03,5.939698501124463306e-04,3.981369586533569987e-04,2.732542475356756692e-04,1.963206208562686219e-04,1.526582921179318820e-04,1.356097131673934353e-04,1.509124557001679569e-04,2.490016526370400561e-04
|
||||
1.000000000000000021e-03,5.932465626846949178e-04,3.972749900655482406e-04,2.723996767755988246e-04,1.954732420440092287e-04,1.517449722599865122e-04,1.344633353162260421e-04,1.490787207039270096e-04,2.446311790608478916e-04
|
||||
1.000000000000000021e-03,5.925174390191371033e-04,3.964077570693368959e-04,2.715417094444828503e-04,1.946245940839898595e-04,1.508329769024341859e-04,1.333227635443309334e-04,1.472627410071646460e-04,2.403295419535726046e-04
|
||||
1.000000000000000021e-03,5.917825975966207411e-04,3.955354074700222146e-04,2.706804869652218665e-04,1.937748023716854423e-04,1.499224142400159925e-04,1.321880784683747445e-04,1.454644877205459041e-04,2.360959501695517580e-04
|
||||
1.000000000000000021e-03,5.910420603206251872e-04,3.946579839875351422e-04,2.698160594859791645e-04,1.929239167799043884e-04,1.490133276731937860e-04,1.310592984163628486e-04,1.436838579350653566e-04,2.319294885748935905e-04
|
||||
1.000000000000000021e-03,5.902958492424382119e-04,3.937755294749108723e-04,2.689484771457827648e-04,1.920719869699086713e-04,1.481057601269397369e-04,1.299364409184113305e-04,1.419207481479104003e-04,2.278292508796841368e-04
|
||||
1.000000000000000021e-03,5.895598685634120817e-04,3.929178479527316910e-04,2.681193531438139815e-04,1.912726116179633686e-04,1.472689584526509451e-04,1.289152165190126341e-04,1.403276367723939690e-04,2.241040180807166735e-04
|
||||
1.000000000000000021e-03,5.888182184446727908e-04,3.920550888852155800e-04,2.672869104586279658e-04,1.904718280301954622e-04,1.464329431074320987e-04,1.278983689606465277e-04,1.387482416027983217e-04,2.204326648641897243e-04
|
||||
1.000000000000000021e-03,5.880709209312291698e-04,3.911872944022057189e-04,2.664511977530461032e-04,1.896696843025943828e-04,1.455977573633372962e-04,1.268859249854523304e-04,1.371825077963339959e-04,2.168145532732365665e-04
|
||||
1.000000000000000021e-03,5.873188516038330012e-04,3.903153927531259398e-04,2.656130037940035156e-04,1.888668181821939697e-04,1.447639292589146184e-04,1.258783532658409540e-04,1.356308744741794301e-04,2.132498546822566535e-04
|
||||
1.000000000000000021e-03,5.865620290918570692e-04,3.894394196579139384e-04,2.647723694527710347e-04,1.880632691586897262e-04,1.439314922056974795e-04,1.248756678383702303e-04,1.340932673985179111e-04,2.097378989636096219e-04
|
||||
1.000000000000000021e-03,5.858004721379563712e-04,3.885594109297237520e-04,2.639293355828808605e-04,1.872590765580118600e-04,1.431004792703304354e-04,1.238778821782577646e-04,1.325696118981003829e-04,2.062780220293337398e-04
|
||||
1.000000000000000021e-03,5.850341996176138979e-04,3.876754025264287241e-04,2.630839431003643525e-04,1.864542796470906004e-04,1.422709233084495310e-04,1.228850093894619591e-04,1.310598332174379369e-04,2.028695668674851068e-04
|
||||
1.000000000000000021e-03,5.842633259194077947e-04,3.867875329548579075e-04,2.622363206668650243e-04,1.856489888735660490e-04,1.414429165168560936e-04,1.218971173595769875e-04,1.295639192660443006e-04,1.995119889022209966e-04
|
||||
1.000000000000000021e-03,5.834878697730810785e-04,3.858958376209294626e-04,2.613865082576556967e-04,1.848432421885319707e-04,1.406164899573639974e-04,1.209142166826000190e-04,1.280817922197122173e-04,1.962046375108947760e-04
|
||||
1.000000000000000021e-03,5.827078500230523962e-04,3.850003520236475163e-04,2.605345458299026889e-04,1.840370773822073991e-04,1.397916743597008157e-04,1.199363174304283899e-04,1.266133739282210172e-04,1.929468682039042694e-04
|
||||
1.000000000000000021e-03,5.819334261621241173e-04,3.841195496874485939e-04,2.597054450234843122e-04,1.832615752361228063e-04,1.390067359137023490e-04,1.190124837885568685e-04,1.252266477671892364e-04,1.898342669542842250e-04
|
||||
1.000000000000000021e-03,5.811544494713084385e-04,3.832349425929183610e-04,2.588741118031709712e-04,1.824854619290212638e-04,1.382230274271905722e-04,1.180928923649849320e-04,1.238519429087230690e-04,1.867668194223294086e-04
|
||||
1.000000000000000021e-03,5.803709388350691226e-04,3.823465658113372784e-04,2.580405852181276633e-04,1.817087742555892370e-04,1.374405795299253087e-04,1.171775570200931022e-04,1.224892004036316632e-04,1.837439681062861012e-04
|
||||
1.000000000000000021e-03,5.795844646861092117e-04,3.814560496353979662e-04,2.572062245701910057e-04,1.809325897993571621e-04,1.366602663048694689e-04,1.162672443199922736e-04,1.211391750652958171e-04,1.807664171209839225e-04
|
||||
1.000000000000000021e-03,5.787950390386191295e-04,3.805634168176052199e-04,2.563710546191050039e-04,1.801569303693986560e-04,1.358821021611104744e-04,1.153619483579342790e-04,1.198017787120210541e-04,1.778335550584487373e-04
|
||||
1.000000000000000021e-03,5.780026739739645147e-04,3.796686901561970007e-04,2.555351001009416268e-04,1.793818176715784992e-04,1.351061013224604760e-04,1.144616629966290335e-04,1.184769233829579004e-04,1.749447775426769835e-04
|
||||
1.000000000000000021e-03,5.772073816396077655e-04,3.787718924921195112e-04,2.546983857238086673e-04,1.786072733038042632e-04,1.343322778228697451e-04,1.135663818643436025e-04,1.171645213323757931e-04,1.720994871389106646e-04
|
||||
1.000000000000000021e-03,5.764112975619451167e-04,3.778753049229251356e-04,2.538628529985562728e-04,1.778348606584519826e-04,1.335619170774594953e-04,1.126772524533375236e-04,1.158657577413503814e-04,1.692991320527776819e-04
|
||||
1.000000000000000021e-03,5.756144252522814222e-04,3.769789335549947914e-04,2.530285065275222683e-04,1.770645798114452998e-04,1.327950095246515803e-04,1.117942393436846088e-04,1.145805009748875411e-04,1.665430248001372392e-04
|
||||
1.000000000000000021e-03,5.748167682568085593e-04,3.760827845283660131e-04,2.521953509290719687e-04,1.762964308427695766e-04,1.320315456257037542e-04,1.109173072961205789e-04,1.133086205901110452e-04,1.638304880953399246e-04
|
||||
1.000000000000000021e-03,5.740166237139158025e-04,3.751830736799844387e-04,2.513572749088919958e-04,1.755213872380331861e-04,1.312580494760662926e-04,1.100242733780145235e-04,1.120050977276823334e-04,1.610268323297459373e-04
|
||||
1.000000000000000021e-03,5.732157063485666254e-04,3.742836154796483610e-04,2.505204393147844274e-04,1.747485543201545441e-04,1.304881340598568315e-04,1.091376023135285023e-04,1.107157077892566201e-04,1.582698947895536752e-04
|
||||
1.000000000000000021e-03,5.724140197507473007e-04,3.733844159930685934e-04,2.496848484812796650e-04,1.739779315547772373e-04,1.297217884948703216e-04,1.082572552711356679e-04,1.094403070125688193e-04,1.555589173140119988e-04
|
||||
1.000000000000000021e-03,5.716133163514535006e-04,3.724872615728835922e-04,2.488519667094108378e-04,1.732106573421359136e-04,1.289599119326889729e-04,1.073839886960488172e-04,1.081795839980315968e-04,1.528943685588057789e-04
|
||||
1.000000000000000021e-03,5.708135916089464952e-04,3.715921440481619780e-04,2.480217821880964816e-04,1.724467146387093834e-04,1.282024761936270685e-04,1.065177436423506841e-04,1.069333674890963240e-04,1.502754491507743331e-04
|
||||
1.000000000000000021e-03,5.700148410279018158e-04,3.706990553358867476e-04,2.471942832207120249e-04,1.716860865497342535e-04,1.274494533371790404e-04,1.056584617232978574e-04,1.057014883248694426e-04,1.477013737020834935e-04
|
||||
1.000000000000000021e-03,5.692170601522963469e-04,3.698079874222007994e-04,2.463694581964103098e-04,1.709287562926333241e-04,1.267008156164750913e-04,1.048060850476081559e-04,1.044837793145218324e-04,1.451713702741069042e-04
|
||||
1.000000000000000021e-03,5.684221107462931718e-04,3.689208973051672467e-04,2.455489480245545849e-04,1.701760222502850749e-04,1.259576042689529907e-04,1.039615052862917467e-04,1.032810864032787402e-04,1.426862118551680341e-04
|
||||
1.000000000000000021e-03,5.676299806599446841e-04,3.680377623533836952e-04,2.447327238198633678e-04,1.694278494753442496e-04,1.252197721019686588e-04,1.031246414956518974e-04,1.020932099638295122e-04,1.402450714512258731e-04
|
||||
1.000000000000000021e-03,5.668406578186927338e-04,3.671585601102087264e-04,2.439207569480618843e-04,1.686842033525584789e-04,1.244872724153648453e-04,1.022954136930148580e-04,1.009199532576916553e-04,1.378471380449364540e-04
|
||||
1.000000000000000021e-03,5.660528798623399357e-04,3.662807588285737852e-04,2.431092838206291959e-04,1.679399278621275505e-04,1.237529841606189703e-04,1.014631173867882653e-04,9.974194130068655907e-05,1.354424501489320950e-04
|
||||
1.000000000000000021e-03,5.652678887062091489e-04,3.654068578608936813e-04,2.423020363044335113e-04,1.672001557892942780e-04,1.230240193993821724e-04,1.006384714692423982e-04,9.857860748076281341e-05,1.330810886504238974e-04
|
||||
1.000000000000000021e-03,5.644856725120149217e-04,3.645368352560149003e-04,2.414989864020476457e-04,1.664648531857207327e-04,1.223003320760450115e-04,9.982139651422967225e-05,9.742975533494338731e-05,1.307622432316707048e-04
|
||||
1.000000000000000021e-03,5.637081598516872297e-04,3.636726247466106157e-04,2.407016951041400575e-04,1.657352124900924413e-04,1.215828418563276393e-04,9.901263879559620603e-05,9.629602344691408898e-05,1.284862679388324466e-04
|
||||
1.000000000000000021e-03,5.629353300793490293e-04,3.628141892281135789e-04,2.399101174854294510e-04,1.650111827309744587e-04,1.208714852573268089e-04,9.821209936496322563e-05,9.517719041742417905e-05,1.262523213089875105e-04
|
||||
1.000000000000000021e-03,5.621671626935266465e-04,3.619614919160761232e-04,2.391242090587739641e-04,1.642927134849468424e-04,1.201661995513669139e-04,9.741968060975319133e-05,9.407303841474721877e-05,1.240595794224424390e-04
|
||||
1.000000000000000021e-03,5.614036373218869204e-04,3.611144963064036881e-04,2.383439257149278542e-04,1.635797548004748762e-04,1.194669226721670609e-04,9.663528612429730903e-05,9.298335293466474341e-05,1.219072350364201328e-04
|
||||
1.000000000000000021e-03,5.606463485664969944e-04,3.602748496609082000e-04,2.375706263435288989e-04,1.628733614326239394e-04,1.187744774441648902e-04,9.585958850070355037e-05,9.190871230268097864e-05,1.197956257524449784e-04
|
||||
1.000000000000000021e-03,5.598952698555576370e-04,3.594425038433207622e-04,2.368042532426757629e-04,1.621734693226255697e-04,1.180887870128607769e-04,9.509247448928166366e-05,9.084888029067286991e-05,1.177239166851852087e-04
|
||||
1.000000000000000021e-03,5.591503748394264367e-04,3.586174111937711294e-04,2.360447493430869353e-04,1.614800151758654528e-04,1.174097755299612002e-04,9.433383251239638840e-05,8.980362478385646723e-05,1.156912913627774928e-04
|
||||
1.000000000000000021e-03,5.584225591487143505e-04,3.578196518919505740e-04,2.353197697834314708e-04,1.608280111225492105e-04,1.167814916834832538e-04,9.364209834454310303e-05,8.886089862139266997e-05,1.138670987493162862e-04
|
||||
1.000000000000000021e-03,5.577008468242452242e-04,3.570289620106132170e-04,2.346013750077580542e-04,1.601820316992516276e-04,1.161592518078891664e-04,9.295772679954118940e-05,8.793036528463705852e-05,1.120748093307471799e-04
|
||||
1.000000000000000021e-03,5.569852125454166723e-04,3.562452965139748743e-04,2.338895121728417183e-04,1.595420198714332595e-04,1.155429900504064843e-04,9.228062559771084612e-05,8.701184300011380421e-05,1.103138112316197746e-04
|
||||
1.000000000000000021e-03,5.562757163116399499e-04,3.554686957703368042e-04,2.331841974232642283e-04,1.589079715282182140e-04,1.149326819589807311e-04,9.161073769793274093e-05,8.610518609906000706e-05,1.085835484715731990e-04
|
||||
1.000000000000000021e-03,5.555723328562507538e-04,3.546991150005096983e-04,2.324853783642831767e-04,1.582798302759657303e-04,1.143282626503791007e-04,9.094797264045832242e-05,8.521021771090780625e-05,1.068834322603653324e-04
|
||||
1.000000000000000021e-03,5.548750371213563657e-04,3.539365098621276230e-04,2.317930031654593444e-04,1.576575403787569985e-04,1.137296680667903865e-04,9.029224125378113518e-05,8.432676390648500317e-05,1.052128860599020399e-04
|
||||
1.000000000000000021e-03,5.541838042439771635e-04,3.531808364136874187e-04,2.311070205067102163e-04,1.570410466910287454e-04,1.131368348940622735e-04,8.964345554504144940e-05,8.345465350366406993e-05,1.035713449503019397e-04
|
||||
1.000000000000000021e-03,5.534994772986728557e-04,3.524329474767404734e-04,2.304281200650363333e-04,1.564308719194829761e-04,1.125501566344392631e-04,8.900191672771989599e-05,8.259410426967044201e-05,1.019587783174918249e-04
|
||||
1.000000000000000021e-03,5.528220286453137825e-04,3.516927939956549431e-04,2.297562446752235638e-04,1.558269550144645319e-04,1.119695640249353838e-04,8.836753049012398612e-05,8.174493812638424233e-05,1.003746189891791522e-04
|
||||
1.000000000000000021e-03,5.521514308959529988e-04,3.509603274307335013e-04,2.290913378267074509e-04,1.552292356754889449e-04,1.113949887224841186e-04,8.774020391605217217e-05,8.090698006040516024e-05,9.881831191717569708e-05
|
||||
1.000000000000000021e-03,5.514925705077818562e-04,3.502439423799475968e-04,2.284441610897542578e-04,1.546502536108915020e-04,1.108405451476827762e-04,8.713560862370903280e-05,8.009669495978734939e-05,9.729798207441842409e-05
|
||||
1.000000000000000021e-03,5.508404954145605355e-04,3.495351144497065954e-04,2.278037808073336661e-04,1.540772565128698055e-04,1.102918428934658313e-04,8.653767235071846409e-05,7.929694151393572473e-05,9.580416231533655223e-05
|
||||
1.000000000000000021e-03,5.501951791779016417e-04,3.488337972114359704e-04,2.271701434112839691e-04,1.535101877933933972e-04,1.097488185619751536e-04,8.594630990981442489e-05,7.850756016455258672e-05,9.433633928045583440e-05
|
||||
1.000000000000000021e-03,5.495566796872157793e-04,3.481400279377950191e-04,2.265432624126748171e-04,1.529490418493457818e-04,1.092114481281042810e-04,8.536146896299809861e-05,7.772842391839215501e-05,9.289404738934854406e-05
|
||||
1.000000000000000021e-03,5.489249706454161527e-04,3.474537605956091817e-04,2.259230848255512310e-04,1.523937628358645337e-04,1.086796692149487770e-04,8.478306608188779627e-05,7.695937762456762194e-05,9.147679298288125297e-05
|
||||
1.000000000000000021e-03,5.483000259883204826e-04,3.467749496226811058e-04,2.253095582547179863e-04,1.518442955755717951e-04,1.081534202533376696e-04,8.421101904463252675e-05,7.620026875215024978e-05,9.008409282780761526e-05
|
||||
1.000000000000000021e-03,5.476818198739591458e-04,3.461035499001802445e-04,2.247026308546789793e-04,1.513005855077949086e-04,1.076326404207925846e-04,8.364524675486820964e-05,7.545094724756280888e-05,8.871547365198851438e-05
|
||||
1.000000000000000021e-03,5.470705529810189179e-04,3.454397485743721506e-04,2.241024413587690614e-04,1.507627254998857578e-04,1.071173841908876651e-04,8.308576484396013343e-05,7.471135773791005180e-05,8.737059031219478156e-05
|
||||
1.000000000000000021e-03,5.464661991670638182e-04,3.447835000304132159e-04,2.235089374295866490e-04,1.502306605954647535e-04,1.066075905365267742e-04,8.253249249775968508e-05,7.398135232542971769e-05,8.604898363826276057e-05
|
||||
1.000000000000000021e-03,5.458687325221291348e-04,3.441347591201103138e-04,2.229220673120790245e-04,1.497043364932862668e-04,1.061031992194506256e-04,8.198535007121052676e-05,7.326078561528488937e-05,8.475020417489323324e-05
|
||||
1.000000000000000021e-03,5.452901895090844558e-04,3.435150570304173014e-04,2.223706511768525117e-04,1.492190839480494894e-04,1.056468106030715887e-04,8.149737756206330190e-05,7.262157722718122260e-05,8.358877577600780481e-05
|
||||
1.000000000000000021e-03,5.447184570616723891e-04,3.429026954804162766e-04,2.218256219048080177e-04,1.487392297472955698e-04,1.051953246672348403e-04,8.101471604563164947e-05,7.199020130947719233e-05,8.244600742971828849e-05
|
||||
1.000000000000000021e-03,5.441535103689846154e-04,3.422976319891982578e-04,2.212869318272295087e-04,1.482647252612499030e-04,1.047486894350850925e-04,8.053730000430466094e-05,7.136654438032706549e-05,8.132155926679031160e-05
|
||||
1.000000000000000021e-03,5.435909997143165834e-04,3.416955774702987799e-04,2.207511658034611989e-04,1.477929951923679644e-04,1.043049394866297369e-04,8.006352324306285982e-05,7.074908147590525608e-05,8.021344078389119761e-05
|
||||
1.000000000000000021e-03,5.430309161342643806e-04,3.410965159927432586e-04,2.202183050641030458e-04,1.473240192034464783e-04,1.038640511149413747e-04,7.959335168171117276e-05,7.013774197495506457e-05,7.912139691327875046e-05
|
||||
1.000000000000000021e-03,5.424732506674768149e-04,3.405004316631486216e-04,2.196883309178195964e-04,1.468577770769967101e-04,1.034260007962051111e-04,7.912675157408064104e-05,6.953245613429904408e-05,7.804517686317993341e-05
|
||||
1.000000000000000021e-03,5.419179943504857889e-04,3.399073086151600896e-04,2.191612247355960430e-04,1.463942486957527610e-04,1.029907651665082401e-04,7.866368947795671801e-05,6.893315503775990498e-05,7.698453395110452940e-05
|
||||
1.000000000000000021e-03,5.413629828746738867e-04,3.393149394667066966e-04,2.186351838182767991e-04,1.459320465988429058e-04,1.025572658029062702e-04,7.820326658601671303e-05,6.833895931108436813e-05,7.593823716905742757e-05
|
||||
1.000000000000000021e-03,5.408082138671730385e-04,3.387233205925343745e-04,2.181102035828516778e-04,1.454711649598321068e-04,1.021254940975202248e-04,7.774546638666711494e-05,6.774982397495531476e-05,7.490609035628451105e-05
|
||||
1.000000000000000021e-03,5.402536849306272763e-04,3.381324483351249330e-04,2.175862794239174624e-04,1.450115979478540569e-04,1.016954414669310805e-04,7.729027246482876178e-05,6.716570445567967391e-05,7.388790009412213962e-05
|
||||
1.000000000000000021e-03,5.396844473492076093e-04,3.375153269484326116e-04,2.170269255797531330e-04,1.445081577421817903e-04,1.012119806681102793e-04,7.676796353167371053e-05,6.648955946153636300e-05,7.272015355307609235e-05
|
||||
1.000000000000000021e-03,5.391154759339646064e-04,3.368990409960971838e-04,2.164687998325534753e-04,1.440063199340409466e-04,1.007307157169936256e-04,7.624910690660518565e-05,6.582015362379603355e-05,7.157078178685281889e-05
|
||||
1.174325560395078800e-03,2.755298774803674553e-03,5.194387759090383395e-03,9.354521953613973567e-03,1.651171618252517473e-02,2.916966879690554432e-02,5.262163370571950466e-02,9.910396847768351836e-02,2.000000000000000111e-01
|
||||
4.160571131359890040e-03,8.527170824088577475e-03,1.466969461393815427e-02,2.443642414582058997e-02,3.975038656808106002e-02,6.331729118004528201e-02,9.842489957479945428e-02,1.474045868235714374e-01,2.059999999999999887e-01
|
||||
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
|
||||
|
||||
|
224
tests/data/test_old_parameters_fiber_config.json
Normal file
224
tests/data/test_old_parameters_fiber_config.json
Normal file
@@ -0,0 +1,224 @@
|
||||
{
|
||||
"uid": "Span1",
|
||||
"params": {
|
||||
"length": 80,
|
||||
"loss_coef": 0.2,
|
||||
"length_units": "km",
|
||||
"att_in": 0,
|
||||
"con_in": 0.5,
|
||||
"con_out": 0.5,
|
||||
"type_variety": "SSMF",
|
||||
"dispersion": 0.0000167,
|
||||
"effective_area": 83e-12,
|
||||
"pmd_coef": 1.265e-15,
|
||||
"raman_efficiency": {
|
||||
"cr": [
|
||||
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,
|
||||
1.88408911e-04,
|
||||
2.05914127e-04,
|
||||
2.24074028e-04,
|
||||
2.47508283e-04,
|
||||
2.77729174e-04,
|
||||
3.08044243e-04,
|
||||
3.34764439e-04,
|
||||
3.56481704e-04,
|
||||
3.77127256e-04,
|
||||
3.96269124e-04,
|
||||
4.10955175e-04,
|
||||
4.18718761e-04,
|
||||
4.19511263e-04,
|
||||
4.17025384e-04,
|
||||
4.13565369e-04,
|
||||
4.07726048e-04,
|
||||
3.83671291e-04,
|
||||
4.08564283e-04,
|
||||
3.69571936e-04,
|
||||
3.14442090e-04,
|
||||
2.16074535e-04,
|
||||
1.23097823e-04,
|
||||
8.95457457e-05,
|
||||
7.52470400e-05,
|
||||
7.19806145e-05,
|
||||
8.87961158e-05,
|
||||
9.30812065e-05,
|
||||
9.37058268e-05,
|
||||
8.45719619e-05,
|
||||
6.90585286e-05,
|
||||
4.50407159e-05,
|
||||
3.36521245e-05,
|
||||
3.02292475e-05,
|
||||
2.69376939e-05,
|
||||
2.60020897e-05,
|
||||
2.82958958e-05,
|
||||
3.08667558e-05,
|
||||
3.66024657e-05,
|
||||
5.80610307e-05,
|
||||
6.54797937e-05,
|
||||
6.25022715e-05,
|
||||
5.37806442e-05,
|
||||
3.94996621e-05,
|
||||
2.68120644e-05,
|
||||
2.33038554e-05,
|
||||
1.79140757e-05,
|
||||
1.52472424e-05,
|
||||
1.32707565e-05,
|
||||
1.06541760e-05,
|
||||
9.84649374e-06,
|
||||
9.13999627e-06,
|
||||
9.08971012e-06,
|
||||
1.04227525e-05,
|
||||
1.50419271e-05,
|
||||
1.77838232e-05,
|
||||
2.15810815e-05,
|
||||
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
|
||||
],
|
||||
"frequency_offset": [
|
||||
0.0e12,
|
||||
0.5e12,
|
||||
1.0e12,
|
||||
1.5e12,
|
||||
2.0e12,
|
||||
2.5e12,
|
||||
3.0e12,
|
||||
3.5e12,
|
||||
4.0e12,
|
||||
4.5e12,
|
||||
5.0e12,
|
||||
5.5e12,
|
||||
6.0e12,
|
||||
6.5e12,
|
||||
7.0e12,
|
||||
7.5e12,
|
||||
8.0e12,
|
||||
8.5e12,
|
||||
9.0e12,
|
||||
9.5e12,
|
||||
10.0e12,
|
||||
10.5e12,
|
||||
11.0e12,
|
||||
11.5e12,
|
||||
12.0e12,
|
||||
12.5e12,
|
||||
12.75e12,
|
||||
13.0e12,
|
||||
13.25e12,
|
||||
13.5e12,
|
||||
14.0e12,
|
||||
14.5e12,
|
||||
14.75e12,
|
||||
15.0e12,
|
||||
15.5e12,
|
||||
16.0e12,
|
||||
16.5e12,
|
||||
17.0e12,
|
||||
17.5e12,
|
||||
18.0e12,
|
||||
18.25e12,
|
||||
18.5e12,
|
||||
18.75e12,
|
||||
19.0e12,
|
||||
19.5e12,
|
||||
20.0e12,
|
||||
20.5e12,
|
||||
21.0e12,
|
||||
21.5e12,
|
||||
22.0e12,
|
||||
22.5e12,
|
||||
23.0e12,
|
||||
23.5e12,
|
||||
24.0e12,
|
||||
24.5e12,
|
||||
25.0e12,
|
||||
25.5e12,
|
||||
26.0e12,
|
||||
26.5e12,
|
||||
27.0e12,
|
||||
27.5e12,
|
||||
28.0e12,
|
||||
28.5e12,
|
||||
29.0e12,
|
||||
29.5e12,
|
||||
30.0e12,
|
||||
30.5e12,
|
||||
31.0e12,
|
||||
31.5e12,
|
||||
32.0e12,
|
||||
32.5e12,
|
||||
33.0e12,
|
||||
33.5e12,
|
||||
34.0e12,
|
||||
34.5e12,
|
||||
35.0e12,
|
||||
35.5e12,
|
||||
36.0e12,
|
||||
36.5e12,
|
||||
37.0e12,
|
||||
37.5e12,
|
||||
38.0e12,
|
||||
38.5e12,
|
||||
39.0e12,
|
||||
39.5e12,
|
||||
40.0e12,
|
||||
40.5e12,
|
||||
41.0e12,
|
||||
41.5e12,
|
||||
42.0e12
|
||||
]
|
||||
}
|
||||
},
|
||||
"operational": {
|
||||
"temperature": 283,
|
||||
"raman_pumps": [
|
||||
{
|
||||
"power": 224.403e-3,
|
||||
"frequency": 205e12,
|
||||
"propagation_direction": "counterprop"
|
||||
},
|
||||
{
|
||||
"power": 231.135e-3,
|
||||
"frequency": 201e12,
|
||||
"propagation_direction": "counterprop"
|
||||
}
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
"latitude": 1,
|
||||
"longitude": 0,
|
||||
"city": null,
|
||||
"region": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
225
tests/data/test_parameters_fiber_config.json
Normal file
225
tests/data/test_parameters_fiber_config.json
Normal file
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"uid": "Span1",
|
||||
"params": {
|
||||
"length": 80,
|
||||
"loss_coef": 0.2,
|
||||
"length_units": "km",
|
||||
"att_in": 0,
|
||||
"con_in": 0.5,
|
||||
"con_out": 0.5,
|
||||
"type_variety": "SSMF",
|
||||
"dispersion": 0.0000167,
|
||||
"effective_area": 83e-12,
|
||||
"pmd_coef": 1.265e-15,
|
||||
"raman_coefficient": {
|
||||
"g0": [
|
||||
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,
|
||||
1.88408911e-04,
|
||||
2.05914127e-04,
|
||||
2.24074028e-04,
|
||||
2.47508283e-04,
|
||||
2.77729174e-04,
|
||||
3.08044243e-04,
|
||||
3.34764439e-04,
|
||||
3.56481704e-04,
|
||||
3.77127256e-04,
|
||||
3.96269124e-04,
|
||||
4.10955175e-04,
|
||||
4.18718761e-04,
|
||||
4.19511263e-04,
|
||||
4.17025384e-04,
|
||||
4.13565369e-04,
|
||||
4.07726048e-04,
|
||||
3.83671291e-04,
|
||||
4.08564283e-04,
|
||||
3.69571936e-04,
|
||||
3.14442090e-04,
|
||||
2.16074535e-04,
|
||||
1.23097823e-04,
|
||||
8.95457457e-05,
|
||||
7.52470400e-05,
|
||||
7.19806145e-05,
|
||||
8.87961158e-05,
|
||||
9.30812065e-05,
|
||||
9.37058268e-05,
|
||||
8.45719619e-05,
|
||||
6.90585286e-05,
|
||||
4.50407159e-05,
|
||||
3.36521245e-05,
|
||||
3.02292475e-05,
|
||||
2.69376939e-05,
|
||||
2.60020897e-05,
|
||||
2.82958958e-05,
|
||||
3.08667558e-05,
|
||||
3.66024657e-05,
|
||||
5.80610307e-05,
|
||||
6.54797937e-05,
|
||||
6.25022715e-05,
|
||||
5.37806442e-05,
|
||||
3.94996621e-05,
|
||||
2.68120644e-05,
|
||||
2.33038554e-05,
|
||||
1.79140757e-05,
|
||||
1.52472424e-05,
|
||||
1.32707565e-05,
|
||||
1.06541760e-05,
|
||||
9.84649374e-06,
|
||||
9.13999627e-06,
|
||||
9.08971012e-06,
|
||||
1.04227525e-05,
|
||||
1.50419271e-05,
|
||||
1.77838232e-05,
|
||||
2.15810815e-05,
|
||||
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
|
||||
],
|
||||
"frequency_offset": [
|
||||
0.0e12,
|
||||
0.5e12,
|
||||
1.0e12,
|
||||
1.5e12,
|
||||
2.0e12,
|
||||
2.5e12,
|
||||
3.0e12,
|
||||
3.5e12,
|
||||
4.0e12,
|
||||
4.5e12,
|
||||
5.0e12,
|
||||
5.5e12,
|
||||
6.0e12,
|
||||
6.5e12,
|
||||
7.0e12,
|
||||
7.5e12,
|
||||
8.0e12,
|
||||
8.5e12,
|
||||
9.0e12,
|
||||
9.5e12,
|
||||
10.0e12,
|
||||
10.5e12,
|
||||
11.0e12,
|
||||
11.5e12,
|
||||
12.0e12,
|
||||
12.5e12,
|
||||
12.75e12,
|
||||
13.0e12,
|
||||
13.25e12,
|
||||
13.5e12,
|
||||
14.0e12,
|
||||
14.5e12,
|
||||
14.75e12,
|
||||
15.0e12,
|
||||
15.5e12,
|
||||
16.0e12,
|
||||
16.5e12,
|
||||
17.0e12,
|
||||
17.5e12,
|
||||
18.0e12,
|
||||
18.25e12,
|
||||
18.5e12,
|
||||
18.75e12,
|
||||
19.0e12,
|
||||
19.5e12,
|
||||
20.0e12,
|
||||
20.5e12,
|
||||
21.0e12,
|
||||
21.5e12,
|
||||
22.0e12,
|
||||
22.5e12,
|
||||
23.0e12,
|
||||
23.5e12,
|
||||
24.0e12,
|
||||
24.5e12,
|
||||
25.0e12,
|
||||
25.5e12,
|
||||
26.0e12,
|
||||
26.5e12,
|
||||
27.0e12,
|
||||
27.5e12,
|
||||
28.0e12,
|
||||
28.5e12,
|
||||
29.0e12,
|
||||
29.5e12,
|
||||
30.0e12,
|
||||
30.5e12,
|
||||
31.0e12,
|
||||
31.5e12,
|
||||
32.0e12,
|
||||
32.5e12,
|
||||
33.0e12,
|
||||
33.5e12,
|
||||
34.0e12,
|
||||
34.5e12,
|
||||
35.0e12,
|
||||
35.5e12,
|
||||
36.0e12,
|
||||
36.5e12,
|
||||
37.0e12,
|
||||
37.5e12,
|
||||
38.0e12,
|
||||
38.5e12,
|
||||
39.0e12,
|
||||
39.5e12,
|
||||
40.0e12,
|
||||
40.5e12,
|
||||
41.0e12,
|
||||
41.5e12,
|
||||
42.0e12
|
||||
],
|
||||
"reference_frequency": 206184634112792
|
||||
}
|
||||
},
|
||||
"operational": {
|
||||
"temperature": 283,
|
||||
"raman_pumps": [
|
||||
{
|
||||
"power": 224.403e-3,
|
||||
"frequency": 205e12,
|
||||
"propagation_direction": "counterprop"
|
||||
},
|
||||
{
|
||||
"power": 231.135e-3,
|
||||
"frequency": 201e12,
|
||||
"propagation_direction": "counterprop"
|
||||
}
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
"latitude": 1,
|
||||
"longitude": 0,
|
||||
"city": null,
|
||||
"region": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,97 +1,97 @@
|
||||
,Unnamed: 0,signal,ase,nli
|
||||
0,0,0.00028461768874888705,3.436639817118301e-08,2.1584395398371026e-07
|
||||
1,1,0.00028211666293476406,3.423996759499589e-08,2.1809245861954257e-07
|
||||
2,2,0.0002796385058453953,3.411427963331182e-08,2.2028548201656645e-07
|
||||
3,3,0.0002771829951915728,3.398932824433299e-08,2.224238538437057e-07
|
||||
4,4,0.00027338904730863836,3.371109366484941e-08,2.2339638015421542e-07
|
||||
5,5,0.0002696478418176822,3.3435235312069656e-08,2.2430128879557504e-07
|
||||
6,6,0.00026595862771951147,3.316172589770091e-08,2.2514026889123164e-07
|
||||
7,7,0.0002623182345801782,3.289051654795761e-08,2.2591288176837496e-07
|
||||
8,8,0.00025872603823298804,3.262158136113203e-08,2.2662073272007013e-07
|
||||
9,9,0.0002548422077504841,3.231480491053109e-08,2.269632917207947e-07
|
||||
10,10,0.0002510150800727548,3.201089350512762e-08,2.2724305184561305e-07
|
||||
11,11,0.0002472372108596339,3.1709697987730424e-08,2.274556638142854e-07
|
||||
12,12,0.0002435081184388883,3.1411188710954923e-08,2.2760284870806473e-07
|
||||
13,13,0.0002398273228957255,3.1115336193393125e-08,2.2768630096746835e-07
|
||||
14,14,0.00023610099948769217,3.081056270085416e-08,2.27617695956038e-07
|
||||
15,15,0.00023242489102440902,3.050859262250336e-08,2.274887362838919e-07
|
||||
16,16,0.00022879847092097078,3.020939430576677e-08,2.273011122655665e-07
|
||||
17,17,0.00022522143236587835,2.991293825364657e-08,2.27056704831033e-07
|
||||
18,18,0.00022169324298613107,2.9619193056612953e-08,2.2315585168570266e-07
|
||||
19,19,0.0002178178461312317,2.9278097616561043e-08,2.189169855906453e-07
|
||||
20,20,0.0002140033759047069,2.8940600865395135e-08,2.1475128288390263e-07
|
||||
21,21,0.00021024912752446947,2.8606658136588645e-08,2.1065775386659407e-07
|
||||
22,22,0.000206554289175574,2.827622313698371e-08,2.0663530613832196e-07
|
||||
23,23,0.00020291805701626135,2.7949249962519028e-08,2.0268286030011824e-07
|
||||
24,24,0.00019961589106178864,2.765975998385304e-08,1.9907485701921993e-07
|
||||
25,25,0.00019636137150032674,2.7373095433009936e-08,1.9552454239910457e-07
|
||||
26,26,0.0001931539326017224,2.7089223372231097e-08,1.9203113225618846e-07
|
||||
27,27,0.00018999370973089413,2.68081175642488e-08,1.885945418493717e-07
|
||||
28,28,0.00018688010986276862,2.6529745205109403e-08,1.8521396370161997e-07
|
||||
29,29,0.00018381254538966195,2.6254073731438793e-08,1.818885993764317e-07
|
||||
30,30,0.00018079043504395085,2.5981070886269e-08,1.78617660347401e-07
|
||||
31,31,0.00017781329518445636,2.5710706310905614e-08,1.7540045799671345e-07
|
||||
32,32,0.00017488055045064023,2.544294811944895e-08,1.7223621637516225e-07
|
||||
33,33,0.00017199163096488036,2.5177764647772334e-08,1.691241684952796e-07
|
||||
34,34,0.00016923198600435235,2.4926164244345613e-08,1.6614800249846462e-07
|
||||
35,35,0.00016651223518287261,2.4676978561810828e-08,1.632195038378843e-07
|
||||
36,36,0.00016383188581753214,2.443018036493577e-08,1.6033800467387247e-07
|
||||
37,37,0.0001611915388800597,2.418575294396746e-08,1.5725354810318075e-07
|
||||
38,38,0.0001585906555197023,2.394366896238391e-08,1.5422386234766858e-07
|
||||
39,39,0.00015602870309712287,2.3703901303924173e-08,1.5124806354481474e-07
|
||||
40,40,0.0001535051551031788,2.3466423066629146e-08,1.4832528036973196e-07
|
||||
41,41,0.0001510212597387019,2.3231240549132765e-08,1.4545635735033158e-07
|
||||
42,42,0.00014857641307701306,2.2998325757462813e-08,1.4264034538487909e-07
|
||||
43,43,0.00014617002011358969,2.276765094680208e-08,1.3987631140917146e-07
|
||||
44,44,0.00014368188097051016,2.252080862505795e-08,1.3704924606778587e-07
|
||||
45,45,0.00014123500136325632,2.227648394665253e-08,1.342768563640109e-07
|
||||
46,46,0.00013882871459443323,2.2034644371118186e-08,1.31558126246417e-07
|
||||
47,47,0.00013646341840215168,2.1795267893415555e-08,1.2889305332810146e-07
|
||||
48,48,0.00013413841082142,2.155832207437193e-08,1.2628059500046815e-07
|
||||
49,49,0.00013185300210097483,2.132377480769977e-08,1.2371972883222934e-07
|
||||
50,50,0.00012960651423053282,2.1091594291962705e-08,1.2120945193769904e-07
|
||||
51,51,0.00012739961074346843,2.0861774576065466e-08,1.1875002031242091e-07
|
||||
52,52,0.00012523156633255863,2.0634283235397628e-08,1.1634039147633555e-07
|
||||
53,53,0.00012310166960708747,2.0409088189365173e-08,1.1397954484148417e-07
|
||||
54,54,0.00012096529298347188,2.0178855168888422e-08,1.1162594309222065e-07
|
||||
55,55,0.00011886718830718708,1.9950983760858723e-08,1.093208043434055e-07
|
||||
56,56,0.00011680664424128133,1.9725440474060072e-08,1.0695583879566178e-07
|
||||
57,57,0.00011478396058700633,1.950220202088885e-08,1.0464196732373097e-07
|
||||
58,58,0.00011279839933843229,1.9281235055452333e-08,1.0237806316789167e-07
|
||||
59,59,0.00011084923776207272,1.906250658388995e-08,1.0016302524437989e-07
|
||||
60,60,0.00010893576763351642,1.884598391874928e-08,9.79957771514819e-08
|
||||
61,61,0.00010705827573621923,1.8631654017664683e-08,9.587614496435341e-08
|
||||
62,62,0.00010521603014069265,1.8419483867548078e-08,9.380304193213288e-08
|
||||
63,63,0.00010340831493293095,1.8209440802910146e-08,9.1775407295826e-08
|
||||
64,64,0.00010178667717264663,1.8029552937387797e-08,8.992671343771878e-08
|
||||
65,65,0.00010019319833745167,1.7851381317094802e-08,8.811583172055121e-08
|
||||
66,66,9.86273426809622e-05,1.767490377589294e-08,8.634195328719705e-08
|
||||
67,67,9.70886230248071e-05,1.7500098774413897e-08,8.460432022445385e-08
|
||||
68,68,9.557652367577673e-05,1.7326944621204857e-08,8.290215772518696e-08
|
||||
69,69,9.409053958216297e-05,1.7155419863785074e-08,8.123470846820667e-08
|
||||
70,70,9.263017577528553e-05,1.698550325493719e-08,7.960123192429599e-08
|
||||
71,71,9.119540203213482e-05,1.681718296074974e-08,7.800139303615196e-08
|
||||
72,72,8.978572151582878e-05,1.6650437769918198e-08,7.643446000507212e-08
|
||||
73,73,8.840064792008674e-05,1.648524670194174e-08,7.489971794966337e-08
|
||||
74,74,8.704752218385389e-05,1.6323921332107853e-08,7.340306015991841e-08
|
||||
75,75,8.571782151670807e-05,1.616417166590195e-08,7.228178645083984e-08
|
||||
76,76,8.441109599127084e-05,1.6005979385519616e-08,7.117988659258102e-08
|
||||
77,77,8.312693723019766e-05,1.584932678267078e-08,7.009701621983393e-08
|
||||
78,78,8.186491243372442e-05,1.569419608150936e-08,6.90328103730187e-08
|
||||
79,79,8.062459786565112e-05,1.554056978222129e-08,6.798691173543069e-08
|
||||
80,80,7.94055784447779e-05,1.538843064058219e-08,6.695897028871753e-08
|
||||
81,81,7.820755061857071e-05,1.523776381588298e-08,6.594873006137818e-08
|
||||
82,82,7.703011159024537e-05,1.5088552513719166e-08,6.495585139392737e-08
|
||||
83,83,7.587286701386211e-05,1.494078021244127e-08,6.398000175307732e-08
|
||||
84,84,7.483848702669918e-05,1.481852757489104e-08,6.310775801171533e-08
|
||||
85,85,7.382059659354297e-05,1.4697575551136038e-08,6.224941913167962e-08
|
||||
86,86,7.281889798107282e-05,1.4577917663325962e-08,6.140473404853674e-08
|
||||
87,87,7.183165666349203e-05,1.4459532716368791e-08,6.057224011868445e-08
|
||||
88,88,7.08586484091438e-05,1.4342415672865158e-08,5.975174825816752e-08
|
||||
89,89,6.989965271824705e-05,1.422656189652791e-08,5.8943072529944956e-08
|
||||
90,90,6.895445267562359e-05,1.411196715686287e-08,5.814603001970201e-08
|
||||
91,91,6.802197391413278e-05,1.3998609279853771e-08,5.735971476442124e-08
|
||||
92,92,6.710204336793658e-05,1.3886485591019257e-08,5.6583980825863337e-08
|
||||
93,93,6.619449037899918e-05,1.3775593851234834e-08,5.581868429617485e-08
|
||||
94,94,6.515268324911003e-05,1.3628882565600955e-08,5.494017759648076e-08
|
||||
95,95,6.412720169535454e-05,1.3483606920728348e-08,5.407543748332493e-08
|
||||
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
|
||||
|
||||
|
BIN
tests/data/wrong_duplicate_eqpt_ila_reverse.xlsx
Executable file
BIN
tests/data/wrong_duplicate_eqpt_ila_reverse.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_duplicate_link_reverse.xlsx
Executable file
BIN
tests/data/wrong_duplicate_link_reverse.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_node_type.xlsx
Normal file
BIN
tests/data/wrong_node_type.xlsx
Normal file
Binary file not shown.
BIN
tests/data/wrong_service.xlsx
Executable file
BIN
tests/data/wrong_service.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_service_type.xlsx
Normal file
BIN
tests/data/wrong_service_type.xlsx
Normal file
Binary file not shown.
BIN
tests/data/wrong_topo_bad_eqpt.xlsx
Executable file
BIN
tests/data/wrong_topo_bad_eqpt.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_duplicate_eqpt.xlsx
Executable file
BIN
tests/data/wrong_topo_duplicate_eqpt.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_duplicate_node.xlsx
Executable file
BIN
tests/data/wrong_topo_duplicate_node.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_eqpt.xlsx
Executable file
BIN
tests/data/wrong_topo_eqpt.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_link.xlsx
Executable file
BIN
tests/data/wrong_topo_link.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_link_header.xlsx
Executable file
BIN
tests/data/wrong_topo_link_header.xlsx
Executable file
Binary file not shown.
BIN
tests/data/wrong_topo_node.xlsx
Executable file
BIN
tests/data/wrong_topo_node.xlsx
Executable file
Binary file not shown.
37
tests/invocation/logs_path_request
Normal file
37
tests/invocation/logs_path_request
Normal file
@@ -0,0 +1,37 @@
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
|
||||
INFO gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 0
|
||||
Computing path from trx Lorient_KMA to trx Vannes_KBE
|
||||
with path constraint: ['trx Lorient_KMA', 'trx Vannes_KBE']
|
||||
Computed path (roadms):['roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 1
|
||||
Computing path from trx Brest_KLA to trx Vannes_KBE
|
||||
with path constraint: ['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE']
|
||||
Computed path (roadms):['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 3
|
||||
Computing path from trx Lannion_CAS to trx Rennes_STA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Rennes_STA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Rennes_STA']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 4
|
||||
Computing path from trx Rennes_STA to trx Lannion_CAS
|
||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
|
||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Vannes_KBE', 'roadm Lorient_KMA', 'roadm Lannion_CAS']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 5
|
||||
Computing path from trx Rennes_STA to trx Lannion_CAS
|
||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
|
||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Lannion_CAS']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 7 | 6
|
||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 7b
|
||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
|
||||
13
tests/invocation/logs_path_requests_run_CD_PMD_PDL_missing
Normal file
13
tests/invocation/logs_path_requests_run_CD_PMD_PDL_missing
Normal file
@@ -0,0 +1,13 @@
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
|
||||
INFO gnpy.topology.request:request.py
|
||||
request 0
|
||||
Computing path from trx Abilene to trx Albany
|
||||
with path constraint: ['trx Abilene', 'trx Albany']
|
||||
Computed path (roadms):['roadm Abilene', 'roadm Dallas', 'roadm Little_Rock', 'roadm Memphis', 'roadm Nashville', 'roadm Louisville', 'roadm Cincinnati', 'roadm Columbus', 'roadm Cleveland', 'roadm Buffalo', 'roadm Rochester', 'roadm Syracuse', 'roadm Albany']
|
||||
WARNING gnpy.topology.request:request.py Warning! Request 0 computed path from trx Abilene to trx Albany does not pass with mode 3
|
||||
computed SNR in 0.1nm = 14.44
|
||||
PDL penalty not evaluated
|
||||
CD penalty not evaluated
|
||||
PMD penalty not evaluated
|
||||
required osnr = 18
|
||||
system margin = 2
|
||||
307
tests/invocation/logs_power_sweep_example
Normal file
307
tests/invocation/logs_power_sweep_example
Normal file
@@ -0,0 +1,307 @@
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py source = 'brest'
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'rennes'
|
||||
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
|
||||
|
||||
307
tests/invocation/logs_transmission_saturated
Normal file
307
tests/invocation/logs_transmission_saturated
Normal file
@@ -0,0 +1,307 @@
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py source = 'lannion'
|
||||
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'lorient'
|
||||
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.82 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.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
|
||||
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
||||
a power reduction of -1.82 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.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
|
||||
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
||||
a power reduction of -1.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.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
|
||||
is beyond all available amplifiers capabilities and/or extended_gain_range:
|
||||
a power reduction of -1.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 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.82 is applied
|
||||
|
||||
@@ -15,6 +15,7 @@ Transceiver trx_Stockholm
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm_Stockholm
|
||||
effective loss (dB): 22.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -30,7 +31,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)
|
||||
@@ -53,8 +53,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
|
||||
@@ -72,12 +71,11 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
|
||||
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
|
||||
@@ -94,7 +92,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)
|
||||
@@ -117,7 +114,6 @@ 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
|
||||
@@ -135,7 +131,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)
|
||||
@@ -155,11 +150,10 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
|
||||
(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
|
||||
@@ -176,7 +170,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)
|
||||
@@ -199,7 +192,6 @@ 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
|
||||
@@ -217,7 +209,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)
|
||||
@@ -240,7 +231,6 @@ 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
|
||||
@@ -248,16 +238,17 @@ Roadm roadm_Gothenburg
|
||||
reference pch out (dBm): -20.00
|
||||
actual pch out (dBm): -20.00
|
||||
Transceiver trx_Gothenburg
|
||||
GSNR (0.1nm, dB): 18.90
|
||||
GSNR (signal bw, dB): 14.88
|
||||
GSNR (0.1nm, dB): 18.89
|
||||
GSNR (signal bw, dB): 14.86
|
||||
OSNR ASE (0.1nm, dB): 21.20
|
||||
OSNR ASE (signal bw, dB): 17.18
|
||||
CD (ps/nm): 8350.42
|
||||
PMD (ps): 7.99
|
||||
PDL (dB): 3.74
|
||||
Latency (ms): 2.45
|
||||
|
||||
Transmission result for input power = 2.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m18.90 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m18.89 dB[0m
|
||||
|
||||
(No source node specified: picked trx_Stockholm)
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ Transceiver trx_Stockholm
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm_Stockholm
|
||||
effective loss (dB): 22.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -30,7 +31,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)
|
||||
@@ -53,8 +53,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
|
||||
@@ -69,15 +68,14 @@ 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
|
||||
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
|
||||
@@ -94,7 +92,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)
|
||||
@@ -117,7 +114,6 @@ 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
|
||||
@@ -135,7 +131,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)
|
||||
@@ -155,10 +150,9 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
|
||||
(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
|
||||
@@ -176,7 +170,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)
|
||||
@@ -199,8 +192,7 @@ 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
|
||||
@@ -217,7 +209,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)
|
||||
@@ -240,7 +231,6 @@ 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
|
||||
@@ -248,16 +238,17 @@ Roadm roadm_Gothenburg
|
||||
reference pch out (dBm): -20.00
|
||||
actual pch out (dBm): -20.00
|
||||
Transceiver trx_Gothenburg
|
||||
GSNR (0.1nm, dB): 19.27
|
||||
GSNR (signal bw, dB): 15.24
|
||||
GSNR (0.1nm, dB): 19.25
|
||||
GSNR (signal bw, dB): 15.23
|
||||
OSNR ASE (0.1nm, dB): 21.84
|
||||
OSNR ASE (signal bw, dB): 17.82
|
||||
CD (ps/nm): 8350.42
|
||||
PMD (ps): 7.99
|
||||
PDL (dB): 3.74
|
||||
Latency (ms): 2.45
|
||||
|
||||
Transmission result for input power = 2.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m19.27 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m19.25 dB[0m
|
||||
|
||||
(No source node specified: picked trx_Stockholm)
|
||||
|
||||
|
||||
@@ -106,48 +106,13 @@
|
||||
]
|
||||
[1;34;40mComputing all paths with constraints[0m
|
||||
[1;34;40mPropagating on selected path[0m
|
||||
request 0
|
||||
Computing path from trx Lorient_KMA to trx Vannes_KBE
|
||||
with path constraint: ['trx Lorient_KMA', 'trx Vannes_KBE']
|
||||
Computed path (roadms):['roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||
|
||||
request 1
|
||||
Computing path from trx Brest_KLA to trx Vannes_KBE
|
||||
with path constraint: ['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE']
|
||||
Computed path (roadms):['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
|
||||
|
||||
request 3
|
||||
Computing path from trx Lannion_CAS to trx Rennes_STA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Rennes_STA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Rennes_STA']
|
||||
|
||||
request 4
|
||||
Computing path from trx Rennes_STA to trx Lannion_CAS
|
||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
|
||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Vannes_KBE', 'roadm Lorient_KMA', 'roadm Lannion_CAS']
|
||||
|
||||
request 5
|
||||
Computing path from trx Rennes_STA to trx Lannion_CAS
|
||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
|
||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Lannion_CAS']
|
||||
|
||||
request 7 | 6
|
||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
|
||||
|
||||
request 7b
|
||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
|
||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
|
||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
|
||||
|
||||
[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 trx Brest_KLA to trx Vannes_KBE : 17.75 21.83 14 mode 1 200.0 2 (-272,8)
|
||||
3 trx Lannion_CAS to trx Rennes_STA : 22.21 26.29 13 mode 1 60.0 1 (-284,4)
|
||||
4 trx Rennes_STA to trx Lannion_CAS : 16.06 23.29 17 mode 2 150.0 1 (-258,6)
|
||||
5 trx Rennes_STA to trx Lannion_CAS : 20.31 27.54 17 mode 2 20.0 1 (-274,6)
|
||||
7 | 6 trx Lannion_CAS to trx Lorient_KMA : 19.52 23.61 14 mode 1 700.0 7 (-224,28)
|
||||
7b trx Lannion_CAS to trx Lorient_KMA : 19.61 23.69 14 mode 1 400.0 4 (-172,24)
|
||||
0 trx Lorient_KMA to trx Vannes_KBE : 24.83 28.92 14 mode 1 100.0 1 ([-284],[4])
|
||||
1 trx Brest_KLA to trx Vannes_KBE : 17.74 21.82 14 mode 1 200.0 2 ([-272],[8])
|
||||
3 trx Lannion_CAS to trx Rennes_STA : 22.19 26.28 13 mode 1 60.0 1 ([-284],[4])
|
||||
4 trx Rennes_STA to trx Lannion_CAS : 16.06 23.29 17 mode 2 150.0 1 ([-258],[6])
|
||||
5 trx Rennes_STA to trx Lannion_CAS : 20.3 27.53 17 mode 2 20.0 1 ([-274],[6])
|
||||
7 | 6 trx Lannion_CAS to trx Lorient_KMA : 19.52 23.61 14 mode 1 700.0 7 ([-224],[28])
|
||||
7b trx Lannion_CAS to trx Lorient_KMA : 19.61 23.69 14 mode 1 400.0 4 ([-172],[24])
|
||||
[1;33;40mResult summary shows mean GSNR and OSNR (average over all channels)[0m
|
||||
|
||||
24
tests/invocation/path_requests_run_CD_PMD_PDL_missing
Normal file
24
tests/invocation/path_requests_run_CD_PMD_PDL_missing
Normal file
@@ -0,0 +1,24 @@
|
||||
[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
|
||||
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
|
||||
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
|
||||
[1;33;40mResult summary shows mean GSNR and OSNR (average over all channels)[0m
|
||||
154
tests/invocation/power_sweep_example
Normal file
154
tests/invocation/power_sweep_example
Normal file
@@ -0,0 +1,154 @@
|
||||
There are 95 channels propagating
|
||||
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:
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
Propagating with input power = [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
|
||||
|
||||
(Invalid source node 'brest' replaced with trx Brest_KLA)
|
||||
|
||||
(Invalid destination node 'rennes' replaced with trx Rennes_STA)
|
||||
@@ -16,6 +16,7 @@ Transceiver trx Lannion_CAS
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm Lannion_CAS
|
||||
effective loss (dB): 20.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -31,7 +32,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
|
||||
@@ -76,7 +76,6 @@ 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
|
||||
@@ -85,12 +84,13 @@ Roadm roadm Lorient_KMA
|
||||
actual pch out (dBm): -20.00
|
||||
Transceiver trx Lorient_KMA
|
||||
GSNR (0.1nm, dB): 23.61
|
||||
GSNR (signal bw, dB): 19.52
|
||||
GSNR (signal bw, dB): 19.53
|
||||
OSNR ASE (0.1nm, dB): 23.89
|
||||
OSNR ASE (signal bw, dB): 19.81
|
||||
CD (ps/nm): 2171.00
|
||||
PMD (ps): 0.46
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.64
|
||||
|
||||
Transmission result for input power = 0.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m
|
||||
|
||||
@@ -16,6 +16,7 @@ Transceiver trx Lannion_CAS
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm Lannion_CAS
|
||||
effective loss (dB): 20.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -31,7 +32,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
|
||||
@@ -76,7 +76,6 @@ 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
|
||||
@@ -84,79 +83,80 @@ Roadm roadm Lorient_KMA
|
||||
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.65, mode_2: 23.81
|
||||
GSNR (signal bw, dB): mode_1: 19.57, mode_2: 16.72
|
||||
GSNR (0.1nm, dB): mode_1: 23.66, mode_2: 23.81
|
||||
GSNR (signal bw, dB): mode_1: 19.58, mode_2: 16.72
|
||||
OSNR ASE (0.1nm, dB): mode_1: 23.91, mode_2: 23.87
|
||||
OSNR ASE (signal bw, dB): mode_1: 19.83, mode_2: 16.78
|
||||
CD (ps/nm): 2171.00
|
||||
PMD (ps): 0.46
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.64
|
||||
|
||||
Transmission result for input power = 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:
|
||||
Ch. # Channel frequency (THz) Channel power (dBm) OSNR ASE (signal bw, dB) SNR NLI (signal bw, dB) GSNR (signal bw, dB)
|
||||
1 191.40000 -20.04 19.85 33.30 19.65
|
||||
2 191.45000 -20.04 19.85 32.70 19.63
|
||||
3 191.50000 -20.04 19.84 32.45 19.61
|
||||
4 191.55000 -20.04 19.84 32.29 19.60
|
||||
5 191.60000 -20.04 19.84 32.18 19.60
|
||||
6 191.65000 -20.04 19.84 32.10 19.59
|
||||
7 191.70000 -20.04 19.84 32.03 19.59
|
||||
8 191.75000 -20.04 19.84 31.98 19.58
|
||||
9 191.80000 -20.04 19.84 31.93 19.58
|
||||
10 191.85000 -20.04 19.84 31.90 19.57
|
||||
11 191.90000 -20.04 19.84 31.86 19.57
|
||||
12 191.95000 -20.04 19.84 31.84 19.57
|
||||
13 192.00000 -20.04 19.83 31.82 19.57
|
||||
14 192.05000 -20.04 19.83 31.80 19.57
|
||||
15 192.10000 -20.04 19.83 31.78 19.56
|
||||
16 192.15000 -20.04 19.83 31.77 19.56
|
||||
17 192.20000 -20.04 19.83 31.76 19.56
|
||||
18 192.25000 -20.04 19.83 31.75 19.56
|
||||
19 192.30000 -20.04 19.83 31.75 19.56
|
||||
20 192.35000 -20.04 19.83 31.75 19.56
|
||||
21 192.40000 -20.05 19.83 31.75 19.56
|
||||
22 192.45000 -20.05 19.82 31.75 19.55
|
||||
23 192.50000 -20.05 19.82 31.76 19.55
|
||||
24 192.55000 -20.05 19.82 31.76 19.55
|
||||
25 192.60000 -20.05 19.82 31.78 19.55
|
||||
26 192.65000 -20.05 19.82 31.79 19.55
|
||||
27 192.70000 -20.05 19.82 31.81 19.55
|
||||
28 192.75000 -20.05 19.82 31.83 19.55
|
||||
29 192.80000 -20.05 19.82 31.86 19.55
|
||||
30 192.85000 -20.05 19.82 31.90 19.56
|
||||
31 192.90000 -20.04 19.82 31.95 19.56
|
||||
32 192.95000 -20.04 19.81 32.02 19.56
|
||||
33 193.00000 -20.04 19.81 32.11 19.56
|
||||
34 193.05000 -20.04 19.81 32.27 19.57
|
||||
35 193.10000 -20.04 19.81 32.61 19.59
|
||||
36 193.16250 -20.09 16.80 33.70 16.71
|
||||
37 193.23750 -20.09 16.80 34.20 16.72
|
||||
38 193.31250 -20.09 16.80 34.45 16.72
|
||||
39 193.38750 -20.09 16.79 34.62 16.72
|
||||
1 191.40000 -20.04 19.85 33.52 19.66
|
||||
2 191.45000 -20.04 19.85 32.93 19.64
|
||||
3 191.50000 -20.04 19.84 32.67 19.62
|
||||
4 191.55000 -20.04 19.84 32.50 19.61
|
||||
5 191.60000 -20.04 19.84 32.39 19.61
|
||||
6 191.65000 -20.04 19.84 32.30 19.60
|
||||
7 191.70000 -20.04 19.84 32.22 19.60
|
||||
8 191.75000 -20.04 19.84 32.16 19.59
|
||||
9 191.80000 -20.04 19.84 32.11 19.59
|
||||
10 191.85000 -20.04 19.84 32.07 19.59
|
||||
11 191.90000 -20.04 19.84 32.04 19.58
|
||||
12 191.95000 -20.04 19.84 32.00 19.58
|
||||
13 192.00000 -20.04 19.83 31.98 19.58
|
||||
14 192.05000 -20.04 19.83 31.95 19.57
|
||||
15 192.10000 -20.04 19.83 31.93 19.57
|
||||
16 192.15000 -20.04 19.83 31.91 19.57
|
||||
17 192.20000 -20.04 19.83 31.90 19.57
|
||||
18 192.25000 -20.04 19.83 31.88 19.57
|
||||
19 192.30000 -20.04 19.83 31.87 19.56
|
||||
20 192.35000 -20.04 19.83 31.87 19.56
|
||||
21 192.40000 -20.04 19.83 31.86 19.56
|
||||
22 192.45000 -20.04 19.82 31.86 19.56
|
||||
23 192.50000 -20.04 19.82 31.86 19.56
|
||||
24 192.55000 -20.04 19.82 31.86 19.56
|
||||
25 192.60000 -20.04 19.82 31.87 19.56
|
||||
26 192.65000 -20.04 19.82 31.88 19.56
|
||||
27 192.70000 -20.04 19.82 31.89 19.56
|
||||
28 192.75000 -20.04 19.82 31.91 19.56
|
||||
29 192.80000 -20.04 19.82 31.93 19.56
|
||||
30 192.85000 -20.04 19.82 31.97 19.56
|
||||
31 192.90000 -20.04 19.82 32.01 19.56
|
||||
32 192.95000 -20.04 19.81 32.07 19.56
|
||||
33 193.00000 -20.04 19.81 32.16 19.57
|
||||
34 193.05000 -20.04 19.81 32.31 19.57
|
||||
35 193.10000 -20.04 19.81 32.65 19.59
|
||||
36 193.16250 -20.09 16.80 33.73 16.71
|
||||
37 193.23750 -20.09 16.80 34.22 16.72
|
||||
38 193.31250 -20.09 16.80 34.47 16.72
|
||||
39 193.38750 -20.09 16.79 34.63 16.72
|
||||
40 193.46250 -20.09 16.79 34.75 16.72
|
||||
41 193.53750 -20.09 16.79 34.85 16.72
|
||||
42 193.61250 -20.09 16.79 34.94 16.72
|
||||
43 193.68750 -20.09 16.79 35.02 16.72
|
||||
44 193.76250 -20.09 16.79 35.08 16.72
|
||||
45 193.83750 -20.09 16.78 35.15 16.72
|
||||
46 193.91250 -20.09 16.78 35.20 16.72
|
||||
47 193.98750 -20.09 16.78 35.26 16.72
|
||||
48 194.06250 -20.09 16.78 35.31 16.72
|
||||
49 194.13750 -20.09 16.78 35.36 16.72
|
||||
50 194.21250 -20.09 16.78 35.41 16.72
|
||||
51 194.28750 -20.09 16.78 35.47 16.72
|
||||
52 194.36250 -20.09 16.77 35.52 16.72
|
||||
53 194.43750 -20.09 16.77 35.58 16.72
|
||||
54 194.51250 -20.09 16.77 35.65 16.71
|
||||
55 194.58750 -20.09 16.77 35.72 16.71
|
||||
56 194.66250 -20.09 16.77 35.81 16.71
|
||||
57 194.73750 -20.09 16.77 35.92 16.71
|
||||
58 194.81250 -20.09 16.76 36.06 16.71
|
||||
59 194.88750 -20.09 16.76 36.27 16.71
|
||||
60 194.96250 -20.09 16.76 36.75 16.72
|
||||
41 193.53750 -20.09 16.79 34.84 16.72
|
||||
42 193.61250 -20.09 16.79 34.92 16.72
|
||||
43 193.68750 -20.09 16.79 34.99 16.72
|
||||
44 193.76250 -20.09 16.79 35.04 16.72
|
||||
45 193.83750 -20.09 16.78 35.10 16.72
|
||||
46 193.91250 -20.09 16.78 35.15 16.72
|
||||
47 193.98750 -20.09 16.78 35.19 16.72
|
||||
48 194.06250 -20.09 16.78 35.24 16.72
|
||||
49 194.13750 -20.09 16.78 35.28 16.72
|
||||
50 194.21250 -20.09 16.78 35.33 16.72
|
||||
51 194.28750 -20.09 16.78 35.37 16.72
|
||||
52 194.36250 -20.09 16.77 35.42 16.72
|
||||
53 194.43750 -20.09 16.77 35.47 16.71
|
||||
54 194.51250 -20.09 16.77 35.53 16.71
|
||||
55 194.58750 -20.09 16.77 35.59 16.71
|
||||
56 194.66250 -20.09 16.77 35.67 16.71
|
||||
57 194.73750 -20.09 16.77 35.77 16.71
|
||||
58 194.81250 -20.09 16.76 35.90 16.71
|
||||
59 194.88750 -20.09 16.76 36.11 16.71
|
||||
60 194.96250 -20.09 16.76 36.58 16.72
|
||||
|
||||
(No source node specified: picked trx Lannion_CAS)
|
||||
|
||||
|
||||
437
tests/invocation/transmission_long_pow
Normal file
437
tests/invocation/transmission_long_pow
Normal file
@@ -0,0 +1,437 @@
|
||||
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 15 fiber spans over 1200 km between Site_A and Site_B
|
||||
|
||||
Now propagating between Site_A and Site_B:
|
||||
|
||||
Propagating with input power = [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
|
||||
Roadm roadm Site A
|
||||
effective loss (dB): 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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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
|
||||
|
||||
Transmission result for input power = 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)
|
||||
437
tests/invocation/transmission_long_psd
Normal file
437
tests/invocation/transmission_long_psd
Normal file
@@ -0,0 +1,437 @@
|
||||
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 15 fiber spans over 1200 km between Site_A and Site_B
|
||||
|
||||
Now propagating between Site_A and Site_B:
|
||||
|
||||
Propagating with input power = [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
|
||||
Roadm roadm Site A
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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
|
||||
|
||||
Transmission result for input power = 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)
|
||||
437
tests/invocation/transmission_long_psw
Normal file
437
tests/invocation/transmission_long_psw
Normal file
@@ -0,0 +1,437 @@
|
||||
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 15 fiber spans over 1200 km between Site_A and Site_B
|
||||
|
||||
Now propagating between Site_A and Site_B:
|
||||
|
||||
Propagating with input power = [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
|
||||
Roadm roadm Site A
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
effective loss (dB): 20.00
|
||||
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
|
||||
|
||||
Transmission result for input power = 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)
|
||||
@@ -15,6 +15,7 @@ Transceiver Site_A
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Fiber Span1
|
||||
type_variety: SSMF
|
||||
length (km): 80.00
|
||||
@@ -35,20 +36,20 @@ 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
|
||||
GSNR (0.1nm, dB): 31.17
|
||||
GSNR (signal bw, dB): 27.09
|
||||
GSNR (0.1nm, dB): 31.18
|
||||
GSNR (signal bw, dB): 27.10
|
||||
OSNR ASE (0.1nm, dB): 33.30
|
||||
OSNR ASE (signal bw, dB): 29.21
|
||||
CD (ps/nm): 1336.00
|
||||
PMD (ps): 0.36
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.39
|
||||
|
||||
Transmission result for input power = 0.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m31.17 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m31.18 dB[0m
|
||||
|
||||
(No source node specified: picked Site_A)
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ Transceiver Site_A
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
RamanFiber Span1
|
||||
type_variety: SSMF
|
||||
length (km): 80.00
|
||||
@@ -22,114 +23,114 @@ RamanFiber Span1
|
||||
total loss (dB): 17.00
|
||||
(includes conn loss (dB) in: 0.50 out: 0.50)
|
||||
(conn loss out includes EOL margin defined in eqpt_config.json)
|
||||
reference pch out (dBm): -7.77
|
||||
actual pch out (dBm): -8.03
|
||||
reference pch out (dBm): -7.20
|
||||
actual pch out (dBm): -7.47
|
||||
Fused Fused1
|
||||
loss (dB): 0.00
|
||||
Edfa Edfa1
|
||||
type_variety: std_low_gain
|
||||
effective gain(dB): 5.77
|
||||
effective gain(dB): 5.20
|
||||
(before att_in and before output VOA)
|
||||
noise figure (dB): 13.23
|
||||
noise figure (dB): 13.80
|
||||
(including att_in)
|
||||
pad att_in (dB): 2.23
|
||||
Power In (dBm): 11.04
|
||||
pad att_in (dB): 2.80
|
||||
Power In (dBm): 11.61
|
||||
Power Out (dBm): 16.81
|
||||
Delta_P (dB): -2.00
|
||||
target pch (dBm): -2.00
|
||||
effective pch (dBm): -2.00
|
||||
actual pch out (dBm): -2.26
|
||||
output VOA (dB): 0.00
|
||||
Transceiver Site_B
|
||||
GSNR (0.1nm, dB): 31.44
|
||||
GSNR (signal bw, dB): 27.36
|
||||
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
|
||||
CD (ps/nm): 1336.00
|
||||
PMD (ps): 0.36
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.39
|
||||
|
||||
Transmission result for input power = 0.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m31.44 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m31.42 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.21 31.62 31.43 28.52
|
||||
2 191.40000 0.17 31.60 31.35 28.46
|
||||
3 191.45000 0.13 31.58 31.26 28.41
|
||||
4 191.50000 0.09 31.56 31.18 28.36
|
||||
5 191.55000 0.03 31.53 31.10 28.30
|
||||
6 191.60000 -0.02 31.50 31.02 28.24
|
||||
7 191.65000 -0.08 31.46 30.94 28.19
|
||||
8 191.70000 -0.14 31.43 30.87 28.13
|
||||
9 191.75000 -0.20 31.40 30.79 28.08
|
||||
10 191.80000 -0.27 31.37 30.72 28.02
|
||||
11 191.85000 -0.33 31.33 30.65 27.97
|
||||
12 191.90000 -0.40 31.29 30.58 27.91
|
||||
13 191.95000 -0.46 31.26 30.51 27.86
|
||||
14 192.00000 -0.53 31.22 30.44 27.80
|
||||
15 192.05000 -0.59 31.18 30.37 27.75
|
||||
16 192.10000 -0.66 31.15 30.30 27.69
|
||||
17 192.15000 -0.73 31.11 30.24 27.64
|
||||
18 192.20000 -0.80 31.07 30.17 27.59
|
||||
19 192.25000 -0.86 31.03 30.18 27.57
|
||||
20 192.30000 -0.94 30.99 30.19 27.56
|
||||
21 192.35000 -1.02 30.94 30.20 27.54
|
||||
22 192.40000 -1.09 30.90 30.20 27.53
|
||||
23 192.45000 -1.17 30.86 30.21 27.51
|
||||
24 192.50000 -1.24 30.81 30.22 27.50
|
||||
25 192.55000 -1.31 30.77 30.23 27.48
|
||||
26 192.60000 -1.38 30.73 30.23 27.46
|
||||
27 192.65000 -1.45 30.69 30.24 27.45
|
||||
28 192.70000 -1.52 30.65 30.25 27.43
|
||||
29 192.75000 -1.59 30.60 30.26 27.42
|
||||
30 192.80000 -1.67 30.56 30.27 27.40
|
||||
31 192.85000 -1.74 30.52 30.27 27.38
|
||||
32 192.90000 -1.81 30.47 30.28 27.37
|
||||
33 192.95000 -1.88 30.43 30.29 27.35
|
||||
34 193.00000 -1.95 30.39 30.30 27.33
|
||||
35 193.05000 -2.02 30.34 30.30 27.31
|
||||
36 193.10000 -2.08 30.30 30.31 27.30
|
||||
37 193.15000 -2.15 30.26 30.32 27.28
|
||||
38 193.20000 -2.22 30.21 30.34 27.26
|
||||
39 193.25000 -2.29 30.17 30.36 27.25
|
||||
40 193.30000 -2.36 30.13 30.37 27.24
|
||||
41 193.35000 -2.43 30.08 30.39 27.22
|
||||
42 193.40000 -2.50 30.04 30.41 27.21
|
||||
43 193.45000 -2.56 29.99 30.43 27.19
|
||||
44 193.50000 -2.63 29.95 30.44 27.18
|
||||
45 193.55000 -2.70 29.90 30.46 27.16
|
||||
46 193.60000 -2.78 29.85 30.48 27.15
|
||||
47 193.65000 -2.85 29.80 30.50 27.13
|
||||
48 193.70000 -2.92 29.76 30.52 27.11
|
||||
49 193.75000 -2.99 29.71 30.54 27.09
|
||||
50 193.80000 -3.06 29.66 30.55 27.07
|
||||
51 193.85000 -3.14 29.61 30.57 27.06
|
||||
52 193.90000 -3.21 29.56 30.59 27.04
|
||||
53 193.95000 -3.28 29.52 30.61 27.02
|
||||
54 194.00000 -3.35 29.47 30.63 27.00
|
||||
55 194.05000 -3.42 29.42 30.65 26.98
|
||||
56 194.10000 -3.50 29.37 30.67 26.96
|
||||
57 194.15000 -3.57 29.32 30.72 26.95
|
||||
58 194.20000 -3.64 29.26 30.78 26.95
|
||||
59 194.25000 -3.72 29.21 30.84 26.94
|
||||
60 194.30000 -3.79 29.16 30.90 26.94
|
||||
61 194.35000 -3.86 29.11 30.96 26.93
|
||||
62 194.40000 -3.93 29.06 31.02 26.92
|
||||
63 194.45000 -4.01 29.01 31.09 26.91
|
||||
64 194.50000 -4.08 28.96 31.15 26.91
|
||||
65 194.55000 -4.14 28.91 31.21 26.90
|
||||
66 194.60000 -4.21 28.86 31.28 26.90
|
||||
67 194.65000 -4.27 28.82 31.34 26.89
|
||||
68 194.70000 -4.34 28.77 31.41 26.88
|
||||
69 194.75000 -4.41 28.72 31.48 26.88
|
||||
70 194.80000 -4.47 28.67 31.55 26.87
|
||||
71 194.85000 -4.54 28.63 31.62 26.86
|
||||
72 194.90000 -4.60 28.58 31.69 26.85
|
||||
73 194.95000 -4.67 28.53 31.76 26.84
|
||||
74 195.00000 -4.73 28.48 31.84 26.83
|
||||
75 195.05000 -4.80 28.43 31.91 26.82
|
||||
76 195.10000 -4.86 28.38 31.91 26.79
|
||||
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
|
||||
|
||||
(No source node specified: picked Site_A)
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ Transceiver Site_A
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm Site A
|
||||
effective loss (dB): 20.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -30,7 +31,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
|
||||
@@ -53,7 +53,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
|
||||
@@ -76,7 +75,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
|
||||
@@ -99,7 +97,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
|
||||
@@ -122,7 +119,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
|
||||
@@ -145,7 +141,6 @@ 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
|
||||
@@ -163,7 +158,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
|
||||
@@ -182,11 +176,10 @@ Edfa Edfa6
|
||||
noise figure (dB): 9.00
|
||||
(including att_in)
|
||||
pad att_in (dB): 4.00
|
||||
Power In (dBm): 3.83
|
||||
Power In (dBm): 3.84
|
||||
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
|
||||
@@ -209,7 +202,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
|
||||
@@ -232,7 +224,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
|
||||
@@ -255,7 +246,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
|
||||
@@ -278,7 +268,6 @@ 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
|
||||
@@ -296,7 +285,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
|
||||
@@ -319,7 +307,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
|
||||
@@ -342,7 +329,6 @@ 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
|
||||
@@ -360,7 +346,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
|
||||
@@ -383,7 +368,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
|
||||
@@ -406,7 +390,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
|
||||
@@ -429,7 +412,6 @@ 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
|
||||
@@ -437,16 +419,17 @@ Roadm roadm Site B
|
||||
reference pch out (dBm): -20.00
|
||||
actual pch out (dBm): -20.00
|
||||
Transceiver Site_B
|
||||
GSNR (0.1nm, dB): 17.85
|
||||
GSNR (signal bw, dB): 13.77
|
||||
GSNR (0.1nm, dB): 17.84
|
||||
GSNR (signal bw, dB): 13.76
|
||||
OSNR ASE (0.1nm, dB): 19.70
|
||||
OSNR ASE (signal bw, dB): 15.62
|
||||
CD (ps/nm): 20040.00
|
||||
PMD (ps): 1.39
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 5.88
|
||||
|
||||
Transmission result for input power = 0.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m17.85 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m17.84 dB[0m
|
||||
|
||||
(No source node specified: picked Site_A)
|
||||
|
||||
|
||||
@@ -1,242 +1,6 @@
|
||||
There are 96 channels propagating
|
||||
Power mode is set to True
|
||||
=> it can be modified in eqpt_config.json - Span
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING[0m: 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.
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING[0m: 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.
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING[0m: 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.
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING[0m: 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.
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
[1;31;40mWARNING:[0m 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.82 is applied
|
||||
|
||||
|
||||
There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA
|
||||
|
||||
@@ -251,6 +15,7 @@ Transceiver trx Lannion_CAS
|
||||
CD (ps/nm): 0.00
|
||||
PMD (ps): 0.00
|
||||
PDL (dB): 0.00
|
||||
Latency (ms): 0.00
|
||||
Roadm roadm Lannion_CAS
|
||||
effective loss (dB): 23.00
|
||||
reference pch out (dBm): -20.00
|
||||
@@ -264,9 +29,8 @@ Edfa east edfa in Lannion_CAS to Corlay
|
||||
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
|
||||
@@ -301,34 +65,34 @@ 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
|
||||
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
|
||||
effective loss (dB): 21.18
|
||||
reference pch out (dBm): -20.00
|
||||
actual pch out (dBm): -20.00
|
||||
Transceiver trx Lorient_KMA
|
||||
GSNR (0.1nm, dB): 23.94
|
||||
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
|
||||
|
||||
Transmission result for input power = 3.00 dBm:
|
||||
Final GSNR (0.1 nm): [1;36;40m23.94 dB[0m
|
||||
Final GSNR (0.1 nm): [1;36;40m23.77 dB[0m
|
||||
|
||||
(Invalid source node 'lannion' replaced with trx Lannion_CAS)
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
build>=0.10.0,<1
|
||||
pytest>=6.2.5,<7
|
||||
pandas>=1.3.5,<2
|
||||
|
||||
# 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, network_from_json
|
||||
from pathlib import Path
|
||||
import pytest
|
||||
|
||||
@@ -74,8 +75,7 @@ def si(nch_and_spacing, bw):
|
||||
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))
|
||||
spacing=spacing, tx_osnr=40.0)
|
||||
|
||||
|
||||
@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]
|
||||
|
||||
@@ -115,7 +115,7 @@ def test_si(si, nch_and_spacing):
|
||||
|
||||
@pytest.mark.parametrize("gain", [17, 19, 21, 23])
|
||||
def test_compare_nf_models(gain, setup_edfa_variable_gain, si):
|
||||
""" compare the 2 amplifier models (polynomial and estimated from nf_min and max)
|
||||
"""compare the 2 amplifier models (polynomial and estimated from nf_min and max)
|
||||
=> nf_model vs nf_poly_fit for intermediate gain values:
|
||||
between gain_min and gain_flatmax some discrepancy is expected but target < 0.5dB
|
||||
=> unitary test for Edfa._calc_nf (and Edfa.interpol_params)"""
|
||||
@@ -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,173 @@ 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, power=0.001,
|
||||
spacing=75e9, tx_osnr=None)
|
||||
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 = [
|
||||
-32.00529182, -31.93540907, -31.86554231, -31.79417979, -31.71903263,
|
||||
-31.6424009, -31.56531159, -31.48775435, -31.41468382, -31.35973323,
|
||||
-31.32286555, -31.28602346, -31.2472908, -31.20086569, -31.14671746,
|
||||
-31.08702653, -31.01341963, -30.93430243, -30.87791656, -30.84413339,
|
||||
-30.81605918, -30.78824936, -30.76071036, -30.73319161, -30.70494101,
|
||||
-30.67368479, -30.63941012, -30.60178381, -30.55585766, -30.5066561,
|
||||
-30.43426575, -30.33848379, -30.24471112, -30.18220815, -30.15076699,
|
||||
-30.11934744, -30.08776718, -30.05548097, -30.02250068, -29.98954302,
|
||||
-29.95661362, -29.92370274, -29.8854762, -29.84193785, -29.79238328,
|
||||
-29.72452662, -29.6385071, -29.54788144, -29.44581202, -29.33924103,
|
||||
-29.23276107, -29.10289365, -28.91425473, -28.70204648, -28.50670713,
|
||||
-28.3282514, -28.15895225, -28.009065, -27.87864672, -27.76315964,
|
||||
-27.68523133, -27.62260405, -27.58076622]
|
||||
|
||||
else:
|
||||
expected_sig_out = [
|
||||
-30.00529182, -29.93540907, -29.86554231, -29.79417979, -29.71903263,
|
||||
-29.6424009, -29.56531159, -29.48775435, -29.41468382, -29.35973323,
|
||||
-29.32286555, -29.28602346, -29.2472908, -29.20086569, -29.14671746,
|
||||
-29.08702653, -29.01341963, -28.93430243, -28.87791656, -28.84413339,
|
||||
-28.81605918, -28.78824936, -28.76071036, -28.73319161, -28.70494101,
|
||||
-28.67368479, -28.63941012, -28.60178381, -28.55585766, -28.5066561,
|
||||
-28.43426575, -28.33848379, -28.24471112, -28.18220815, -28.15076699,
|
||||
-28.11934744, -28.08776718, -28.05548097, -28.02250068, -27.98954302,
|
||||
-27.95661362, -27.92370274, -27.8854762, -27.84193785, -27.79238328,
|
||||
-27.72452662, -27.6385071, -27.54788144, -27.44581202, -27.33924103,
|
||||
-27.23276107, -27.10289365, -26.91425473, -26.70204648, -26.50670713,
|
||||
-26.3282514, -26.15895225, -26.009065, -25.87864672, -25.76315964,
|
||||
-25.68523133, -25.62260405, -25.58076622]
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
# License: BSD 3-Clause Licence
|
||||
# Copyright (c) 2018, Telecom Infra Project
|
||||
|
||||
'''
|
||||
"""
|
||||
@author: esther.lerouzic
|
||||
checks that computed paths are disjoint as specified in the json service file
|
||||
that computed paths do not loop
|
||||
that include node constraints are correctly taken into account
|
||||
'''
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
import pytest
|
||||
@@ -19,7 +19,7 @@ from gnpy.core.exceptions import ServiceError, DisjunctionError
|
||||
from gnpy.core.utils import automatic_nch, lin2db
|
||||
from gnpy.core.elements import Roadm
|
||||
from gnpy.topology.request import (compute_path_dsjctn, isdisjoint, find_reversed_path, PathRequest,
|
||||
correct_json_route_list)
|
||||
correct_json_route_list, requests_aggregation, Disjunction)
|
||||
from gnpy.topology.spectrum_assignment import build_oms_list
|
||||
from gnpy.tools.json_io import requests_from_json, load_requests, load_network, load_equipment, disjunctions_from_json
|
||||
|
||||
@@ -31,8 +31,7 @@ EQPT_LIBRARY_NAME = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
|
||||
|
||||
@pytest.fixture()
|
||||
def serv(test_setup):
|
||||
''' common setup for service list
|
||||
'''
|
||||
"""common setup for service list"""
|
||||
network, equipment = test_setup
|
||||
data = load_requests(SERVICE_FILE_NAME, equipment, bidir=False, network=network, network_filename=NETWORK_FILE_NAME)
|
||||
rqs = requests_from_json(data, equipment)
|
||||
@@ -43,8 +42,7 @@ def serv(test_setup):
|
||||
|
||||
@pytest.fixture()
|
||||
def test_setup():
|
||||
''' common setup for tests: builds network, equipment and oms only once
|
||||
'''
|
||||
"""common setup for tests: builds network, equipment and oms only once"""
|
||||
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||
network = load_network(NETWORK_FILE_NAME, equipment)
|
||||
# Build the network once using the default power defined in SI in eqpt config
|
||||
@@ -61,9 +59,10 @@ def test_setup():
|
||||
|
||||
|
||||
def test_disjunction(serv):
|
||||
''' service_file contains sevaral combination of disjunction constraint. The test checks
|
||||
that computed paths with disjunction constraint are effectively disjoint
|
||||
'''
|
||||
"""service_file contains sevaral combination of disjunction constraint
|
||||
|
||||
The test checks that computed paths with disjunction constraint are effectively disjoint.
|
||||
"""
|
||||
network, equipment, rqs, dsjn = serv
|
||||
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
|
||||
print(dsjn)
|
||||
@@ -86,8 +85,7 @@ def test_disjunction(serv):
|
||||
|
||||
|
||||
def test_does_not_loop_back(serv):
|
||||
''' check that computed paths do not loop back ie each element appears only once
|
||||
'''
|
||||
"""check that computed paths do not loop back ie each element appears only once"""
|
||||
network, equipment, rqs, dsjn = serv
|
||||
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
|
||||
test = True
|
||||
@@ -108,8 +106,7 @@ def test_does_not_loop_back(serv):
|
||||
|
||||
|
||||
def create_rq(equipment, srce, dest, bdir, node_list, loose_list, rqid='test_request'):
|
||||
''' create the usual request list according to parameters
|
||||
'''
|
||||
"""create the usual request list according to parameters"""
|
||||
requests_list = []
|
||||
params = {
|
||||
'request_id': rqid,
|
||||
@@ -151,19 +148,20 @@ def create_rq(equipment, srce, dest, bdir, node_list, loose_list, rqid='test_req
|
||||
['trx a', 'trx h', 'pass', 'found_path', ['trx h'], ['STRICT']],
|
||||
['trx a', 'trx h', 'pass', 'found_path', ['roadm a'], ['STRICT']]])
|
||||
def test_include_constraints(test_setup, srce, dest, result, pth, node_list, loose_list):
|
||||
''' check that all combinations of constraints are correctly handled:
|
||||
- STRICT/LOOSE
|
||||
- correct names/incorrect names -> pass/fail
|
||||
- possible include/impossible include
|
||||
if incorrect name -> fail
|
||||
else:
|
||||
constraint |one or more STRICT | all LOOSE
|
||||
----------------------------------------------------------------------------------
|
||||
>1 path from s to d | can be applied | found_path | found_path
|
||||
| cannot be applied | no_path | found_path
|
||||
----------------------------------------------------------------------------------
|
||||
0 | | computation stops
|
||||
'''
|
||||
"""check that all combinations of constraints are correctly handled:
|
||||
|
||||
- STRICT/LOOSE
|
||||
- correct names/incorrect names -> pass/fail
|
||||
- possible include/impossible include
|
||||
if incorrect name -> fail
|
||||
else:
|
||||
constraint |one or more STRICT | all LOOSE
|
||||
----------------------------------------------------------------------------------
|
||||
>1 path from s to d | can be applied | found_path | found_path
|
||||
| cannot be applied | no_path | found_path
|
||||
----------------------------------------------------------------------------------
|
||||
0 | | computation stops
|
||||
"""
|
||||
network, equipment = test_setup
|
||||
dsjn = []
|
||||
bdir = False
|
||||
@@ -201,7 +199,7 @@ def test_include_constraints(test_setup, srce, dest, result, pth, node_list, loo
|
||||
['roadm c', 'roadm f'],
|
||||
['roadm a', 'roadm b', 'roadm f', 'roadm h']]]])
|
||||
def test_create_disjunction(test_setup, dis1, dis2, node_list1, loose_list1, result, expected_paths):
|
||||
""" verifies that the expected result is obtained for a set of particular constraints:
|
||||
"""verifies that the expected result is obtained for a set of particular constraints:
|
||||
in particular, verifies that:
|
||||
- multiple disjunction constraints are correcly handled
|
||||
- in case a loose constraint can not be met, the first alternate candidate is selected
|
||||
@@ -242,3 +240,91 @@ def test_create_disjunction(test_setup, dis1, dis2, node_list1, loose_list1, res
|
||||
path_names.append(roadm_names)
|
||||
assert path_names == expected_paths
|
||||
# if loose, one path can be returned
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def request_set():
|
||||
""" creates default request dict
|
||||
"""
|
||||
return {
|
||||
# 'request_id': '0',
|
||||
'source': 'trx a',
|
||||
'bidir': False,
|
||||
'destination': 'trx g',
|
||||
'trx_type': 'Voyager',
|
||||
'spacing': 50e9,
|
||||
'nodes_list': [],
|
||||
'loose_list': [],
|
||||
'f_min': 191.1e12,
|
||||
'f_max': 196.3e12,
|
||||
'nb_channel': None,
|
||||
'power': 0,
|
||||
'path_bandwidth': 200e9}
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'ids, modes, req_n, req_m, disjunction, final_ids, final_ns, final_ms, final_path_bandwidths',
|
||||
# requests that should be correctly aggregated:
|
||||
[(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0], [16], [32], [48]], [[8], [8], [8], [8]], [[]],
|
||||
['d | c | b | a'], [[48, 32, 16, 0]], [[8, 8, 8, 8]], [800e9]),
|
||||
(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0, 8], [16, 24], [32, 40], [48]], [[4, 4], [4, 4], [4, 4], [8]], [[]],
|
||||
['d | c | b | a'], [[48, 32, 40, 16, 24, 0, 8]], [[8, 4, 4, 4, 4, 4, 4]], [800e9]),
|
||||
(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0, 8], [None, 24], [32, 40], [None]], [[4, 4], [4, 4], [4, 4], [None]], [[]],
|
||||
['d | c | b | a'], [[None, 32, 40, None, 24, 0, 8]], [[None, 4, 4, 4, 4, 4, 4]], [800e9]),
|
||||
# 'a' and 'b' have same constraint and can be aggregated
|
||||
(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0], [16], [32], [48]], [[8], [8], [8], [8]], [['c', 'd']],
|
||||
['b | a', 'c', 'd'], [[16, 0], [32], [48]], [[8, 8], [8], [8]], [400e9, 200e9, 200e9]),
|
||||
(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0], [16], [32], [48]], [[8], [8], [8], [8]], [['a', 'd'], ['b', 'd']],
|
||||
['b | a', 'c', 'd'], [[16, 0], [32], [48]], [[8, 8], [8], [8]], [400e9, 200e9, 200e9]),
|
||||
# requests that should not be aggregated:
|
||||
(['a', 'b', 'c', 'd'], [None, None, None, 'mode 1'],
|
||||
[[0, 8], [None, 24], [32, 40], [None]], [[4, 4], [4, 4], [4, 4], [None]], [[]],
|
||||
['a', 'b', 'c', 'd'], [[0, 8], [None, 24], [32, 40], [None]], [[4, 4], [4, 4], [4, 4], [None]],
|
||||
[200e9, 200e9, 200e9, 200e9]),
|
||||
(['a', 'b', 'c', 'd'], ['mode 1', 'mode 1', 'mode 1', 'mode 1'],
|
||||
[[0], [16], [32], [48]], [[8], [8], [8], [8]], [['c', 'd', 'a']],
|
||||
['a', 'b', 'c', 'd'], [[0], [16], [32], [48]], [[8], [8], [8], [8]], [200e9, 200e9, 200e9, 200e9]), ])
|
||||
def test_aggregation(ids, modes, req_n, req_m, disjunction, final_ids, final_ns, final_ms, final_path_bandwidths,
|
||||
request_set):
|
||||
""" tests that identical requests are correctly aggregated (included frequency slots merging)
|
||||
if mode is not defined, requests must not be merged,
|
||||
if requests are in a synchronization vector, they should not be merged
|
||||
"""
|
||||
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||
requests = []
|
||||
for request_id, mode, req_n, req_m in zip(ids, modes, req_n, req_m):
|
||||
params = request_set
|
||||
params['request_id'] = request_id
|
||||
params['trx_mode'] = mode
|
||||
params['effective_freq_slot'] = [{'N': n, 'M': m} for n, m in zip(req_n, req_m)]
|
||||
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
|
||||
params.update(trx_params)
|
||||
requests.append(PathRequest(**params))
|
||||
params = {
|
||||
'relaxable': False,
|
||||
'link_diverse': True,
|
||||
'node_diverse': True
|
||||
}
|
||||
|
||||
disjunctions = []
|
||||
i = 0
|
||||
for vector in disjunction:
|
||||
params['disjunctions_req'] = vector
|
||||
params['disjunction_id'] = i
|
||||
disjunctions.append(Disjunction(**params))
|
||||
i += 1
|
||||
requests, disjunctions = requests_aggregation(requests, disjunctions)
|
||||
print(disjunctions)
|
||||
print(requests)
|
||||
i = 0
|
||||
for final_id, final_n, final_m, final_path_bandwidth in zip(final_ids, final_ns, final_ms, final_path_bandwidths):
|
||||
assert requests[i].request_id == final_id
|
||||
assert requests[i].N == final_n
|
||||
assert requests[i].M == final_m
|
||||
assert requests[i].path_bandwidth == final_path_bandwidth
|
||||
i += 1
|
||||
|
||||
@@ -12,16 +12,17 @@ from pathlib import Path
|
||||
import pytest
|
||||
from numpy.testing import assert_allclose, assert_array_equal, assert_raises
|
||||
from numpy import array
|
||||
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
|
||||
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
|
||||
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
|
||||
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
|
||||
|
||||
|
||||
TEST_DIR = Path(__file__).parent
|
||||
@@ -71,16 +72,16 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
|
||||
}
|
||||
}
|
||||
roadm = Roadm(**roadm_config)
|
||||
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',
|
||||
@@ -96,7 +97,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)
|
||||
|
||||
@@ -213,12 +214,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": {
|
||||
@@ -242,7 +241,9 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
|
||||
}
|
||||
}
|
||||
roadm = Roadm(**roadm_config)
|
||||
si = roadm(si, 'toto')
|
||||
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),
|
||||
@@ -265,12 +266,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": {
|
||||
@@ -294,24 +293,24 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
|
||||
}
|
||||
}
|
||||
roadm = Roadm(**roadm_config)
|
||||
si = roadm(si, 'toto')
|
||||
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):
|
||||
""" common setup for tests: builds network, equipment and oms only once
|
||||
"""
|
||||
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
|
||||
|
||||
|
||||
def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, mode, spacing, power_dbm):
|
||||
""" create the usual request list according to parameters
|
||||
"""
|
||||
"""create the usual request list according to parameters"""
|
||||
params = {'request_id': 'test_request',
|
||||
'source': source,
|
||||
'bidir': bidir,
|
||||
@@ -336,8 +335,7 @@ def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, m
|
||||
@pytest.mark.parametrize('power_dbm', [0, 1, -2, None])
|
||||
@pytest.mark.parametrize('mode, slot_width', (['mode 1', 50e9], ['mode 2', 75e9]))
|
||||
def test_initial_spectrum(mode, slot_width, power_dbm):
|
||||
""" checks that propagation using the user defined spectrum identical to SI, gives same result as SI
|
||||
"""
|
||||
"""checks that propagation using the user defined spectrum identical to SI, gives same result as SI"""
|
||||
# first propagate without any req.initial_spectrum attribute
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
|
||||
@@ -373,7 +371,7 @@ def test_initial_spectrum(mode, slot_width, power_dbm):
|
||||
|
||||
|
||||
def test_initial_spectrum_not_identical():
|
||||
""" checks that user defined spectrum overrides spectrum defined in SI
|
||||
"""checks that user defined spectrum overrides spectrum defined in SI
|
||||
"""
|
||||
# first propagate without any req.initial_spectrum attribute
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
@@ -408,7 +406,7 @@ def test_initial_spectrum_not_identical():
|
||||
('target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9))])
|
||||
@pytest.mark.parametrize('power_dbm', [0, 2, -0.5])
|
||||
def test_target_psd_or_psw(power_dbm, equalization, target_value):
|
||||
""" checks that if target_out_mWperSlotWidth or target_psd_out_mWperGHz is defined, it is used as equalization
|
||||
"""checks that if target_out_mWperSlotWidth or target_psd_out_mWperGHz is defined, it is used as equalization
|
||||
and it gives same result if computed target is the same
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
@@ -438,8 +436,7 @@ def test_target_psd_or_psw(power_dbm, equalization, target_value):
|
||||
|
||||
|
||||
def ref_network():
|
||||
""" Create a network instance with a instance of propagated path
|
||||
"""
|
||||
"""Create a network instance with a instance of propagated path"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
network = net_setup(equipment)
|
||||
req0 = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
|
||||
@@ -449,13 +446,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
|
||||
"""checks that if target_psd_out_mWperGHz is defined, delta_p of amps is correctly updated
|
||||
|
||||
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 = [{
|
||||
@@ -509,7 +507,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)
|
||||
@@ -535,10 +532,10 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
|
||||
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)
|
||||
spacing=req.spacing, tx_osnr=req.tx_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)
|
||||
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),
|
||||
@@ -586,3 +583,253 @@ def test_power_option(req_power):
|
||||
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)
|
||||
|
||||
|
||||
def transceiver(slot_width, value):
|
||||
return {
|
||||
"type_variety": "test_offset",
|
||||
"frequency": {
|
||||
"min": 191.3e12,
|
||||
"max": 196.1e12
|
||||
},
|
||||
"mode": [
|
||||
{
|
||||
"format": "mode 1",
|
||||
"baud_rate": 64e9,
|
||||
"OSNR": 18,
|
||||
"bit_rate": 100e9,
|
||||
"roll_off": 0.15,
|
||||
"tx_osnr": 40,
|
||||
"min_spacing": 75e9,
|
||||
"cost": 1
|
||||
},
|
||||
{
|
||||
"format": "mode 3",
|
||||
"baud_rate": 64e9,
|
||||
"OSNR": 18,
|
||||
"bit_rate": 100e9,
|
||||
"roll_off": 0.15,
|
||||
"tx_osnr": 40,
|
||||
"min_spacing": slot_width,
|
||||
"equalization_offset_db": value,
|
||||
"cost": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
def some_requests():
|
||||
route = {
|
||||
"route-object-include-exclude": [
|
||||
{
|
||||
"explicit-route-usage": "route-include-ero",
|
||||
"index": 0,
|
||||
"num-unnum-hop": {
|
||||
"node-id": "trx Brest_KLA",
|
||||
"link-tp-id": "link-tp-id is not used",
|
||||
"hop-type": "STRICT"
|
||||
}
|
||||
},
|
||||
{
|
||||
"explicit-route-usage": "route-include-ero",
|
||||
"index": 1,
|
||||
"num-unnum-hop": {
|
||||
"node-id": "trx Vannes_KBE",
|
||||
"link-tp-id": "link-tp-id is not used",
|
||||
"hop-type": "STRICT"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
return {
|
||||
"path-request": [{
|
||||
"request-id": "2",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"trx_mode": "mode 1",
|
||||
"spacing": 75000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
},
|
||||
"explicit-route-objects": route
|
||||
}, {
|
||||
"request-id": "3",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"trx_mode": "mode 3",
|
||||
"spacing": 87500000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
},
|
||||
"explicit-route-objects": route
|
||||
}, {
|
||||
"request-id": "4",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"trx_mode": "mode 1",
|
||||
"spacing": 87500000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
},
|
||||
"explicit-route-objects": route
|
||||
}]
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize('slot_width, value', [(75e9, lin2db(75 / 87.5)),
|
||||
(87.5e9, lin2db(75 / 87.5))])
|
||||
def test_power_offset_trx_equalization_psw(slot_width, value):
|
||||
"""Check that the equalization with the offset is giving the same result as with reference slot_width
|
||||
Check that larger slot width but no offset takes larger slot width for equalization
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
trx = transceiver(slot_width, value)
|
||||
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
|
||||
setattr(equipment['Roadm']['default'], 'target_pch_out_db', None)
|
||||
setattr(equipment['Roadm']['default'], 'target_out_mWperSlotWidth', power_dbm_to_psd_mw_ghz(-20, 50e9))
|
||||
network = net_setup(equipment)
|
||||
json_data = some_requests()
|
||||
ref_request, request, other = requests_from_json(json_data, equipment)
|
||||
# ref_request (_expected) has no offset, equalization on 75GH basis
|
||||
path_expected = compute_constrained_path(network, ref_request)
|
||||
_ = propagate(path_expected, ref_request, equipment)
|
||||
roadm1_expected = deepcopy(path_expected[1])
|
||||
# request has an offset either defined in power and a larger slot width.
|
||||
# The defined offset is "equalize as if it was a 75 GHz channel" although slot_width is 87.5GHz
|
||||
path = compute_constrained_path(network, request)
|
||||
_ = propagate(path, request, equipment)
|
||||
roadm1 = deepcopy(path[1])
|
||||
# the other request has a larger slot width (spacing) but no offset. so equalization uses this slot width
|
||||
path_other = compute_constrained_path(network, other)
|
||||
_ = propagate(path, other, equipment)
|
||||
roadm1_other = path_other[1]
|
||||
# check the first frequency since all cariers have the same equalization
|
||||
# Check that the power is equalized as if it was for a 75GHz channel (mode 1) instead of a 87.5GHz
|
||||
assert roadm1.pch_out_dbm[0] == roadm1_expected.pch_out_dbm[0]
|
||||
# Check that equalization instead uses 87.5GHz basis
|
||||
assert roadm1_other.pch_out_dbm[0] == roadm1_expected.pch_out_dbm[0] + lin2db(87.5 / 75)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('slot_width, value', [(75e9, lin2db(75 / 50)),
|
||||
(87.5e9, lin2db(75 / 50))])
|
||||
def test_power_offset_trx_equalization_p(slot_width, value):
|
||||
"""Check that the constant power equalization with the offset is applied
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
trx = transceiver(slot_width, value)
|
||||
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
|
||||
setattr(equipment['Roadm']['default'], 'target_pch_out_db', -20)
|
||||
network = net_setup(equipment)
|
||||
json_data = some_requests()
|
||||
ref_request, request, _ = requests_from_json(json_data, equipment)
|
||||
path_expected = compute_constrained_path(network, ref_request)
|
||||
_ = propagate(path_expected, ref_request, equipment)
|
||||
roadm1_expected = deepcopy(path_expected[1])
|
||||
path = compute_constrained_path(network, request)
|
||||
_ = propagate(path, request, equipment)
|
||||
roadm1 = deepcopy(path[1])
|
||||
assert roadm1.pch_out_dbm[0] == roadm1_expected.pch_out_dbm[0] + lin2db(75 / 50)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('equalization, target_value',
|
||||
[('target_pch_out_db', -20),
|
||||
('target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 64e9)),
|
||||
('target_out_mWperSlotWidth', power_dbm_to_psd_mw_ghz(-20, 50e9))])
|
||||
@pytest.mark.parametrize('slot_width, value, expected_mode', [(75e9, 3.0, 'mode 3')])
|
||||
def test_power_offset_automatic_mode_selection(slot_width, value, equalization,
|
||||
target_value, expected_mode):
|
||||
"""Check that the same result is obtained if the mode is user defined or if it is
|
||||
automatically selected
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
trx = transceiver(slot_width, value)
|
||||
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
|
||||
setattr(equipment['Roadm']['default'], 'target_pch_out_db', None)
|
||||
setattr(equipment['Roadm']['default'], equalization, target_value)
|
||||
network = net_setup(equipment)
|
||||
route = {
|
||||
"route-object-include-exclude": [
|
||||
{
|
||||
"explicit-route-usage": "route-include-ero",
|
||||
"index": 0,
|
||||
"num-unnum-hop": {
|
||||
"node-id": "trx Brest_KLA",
|
||||
"link-tp-id": "link-tp-id is not used",
|
||||
"hop-type": "STRICT"
|
||||
}
|
||||
},
|
||||
{
|
||||
"explicit-route-usage": "route-include-ero",
|
||||
"index": 1,
|
||||
"num-unnum-hop": {
|
||||
"node-id": "trx Vannes_KBE",
|
||||
"link-tp-id": "link-tp-id is not used",
|
||||
"hop-type": "STRICT"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
json_data = {
|
||||
"path-request": [{
|
||||
"request-id": "imposed_mode",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"trx_mode": "mode 3",
|
||||
"spacing": 75000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
},
|
||||
"explicit-route-objects": route
|
||||
}, {
|
||||
"request-id": "free_mode",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"spacing": 75000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
},
|
||||
"explicit-route-objects": route
|
||||
}]}
|
||||
imposed_req, free_req, = requests_from_json(json_data, equipment)
|
||||
assert free_req.tsp_mode is None
|
||||
path_expected = compute_constrained_path(network, imposed_req)
|
||||
_ = propagate(path_expected, imposed_req, equipment)
|
||||
path = compute_constrained_path(network, free_req)
|
||||
_, 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)
|
||||
|
||||
97
tests/test_gain_mode.py
Normal file
97
tests/test_gain_mode.py
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/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)
|
||||
}
|
||||
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)
|
||||
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)
|
||||
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from pathlib import Path
|
||||
import os
|
||||
from logging import INFO, Formatter
|
||||
import pytest
|
||||
import subprocess
|
||||
from gnpy.tools.cli_examples import transmission_main_example, path_requests_run
|
||||
@@ -9,39 +10,54 @@ from gnpy.tools.cli_examples import transmission_main_example, path_requests_run
|
||||
SRC_ROOT = Path(__file__).parent.parent
|
||||
|
||||
|
||||
@pytest.mark.parametrize("output, handler, args", (
|
||||
('transmission_main_example', transmission_main_example, []),
|
||||
('transmission_saturated', transmission_main_example,
|
||||
@pytest.mark.parametrize("output, log, handler, args", (
|
||||
('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', path_requests_run, []),
|
||||
('transmission_main_example__raman', transmission_main_example,
|
||||
('path_requests_run', 'logs_path_request', path_requests_run, ['-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', transmission_main_example,
|
||||
('openroadm-v4-Stockholm-Gothenburg', None, transmission_main_example,
|
||||
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver4.json', 'gnpy/example-data/Sweden_OpenROADMv4_example_network.json', ]),
|
||||
('openroadm-v5-Stockholm-Gothenburg', transmission_main_example,
|
||||
('openroadm-v5-Stockholm-Gothenburg', None, transmission_main_example,
|
||||
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', 'gnpy/example-data/Sweden_OpenROADMv5_example_network.json', ]),
|
||||
('transmission_main_example_long', transmission_main_example,
|
||||
('transmission_main_example_long', None, transmission_main_example,
|
||||
['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json']),
|
||||
('spectrum1_transmission_main_example', transmission_main_example,
|
||||
('spectrum1_transmission_main_example', None, transmission_main_example,
|
||||
['--spectrum', 'gnpy/example-data/initial_spectrum1.json', 'gnpy/example-data/meshTopologyExampleV2.xls', ]),
|
||||
('spectrum2_transmission_main_example', transmission_main_example,
|
||||
('spectrum2_transmission_main_example', None, transmission_main_example,
|
||||
['--spectrum', 'gnpy/example-data/initial_spectrum2.json', 'gnpy/example-data/meshTopologyExampleV2.xls', '--show-channels', ]),
|
||||
))
|
||||
|
||||
|
||||
def test_example_invocation(capfd, output, handler, args):
|
||||
'''Make sure that our examples produce useful output'''
|
||||
('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', ]),
|
||||
))
|
||||
def test_example_invocation(capfd, caplog, output, log, handler, args):
|
||||
"""Make sure that our examples produce useful output"""
|
||||
os.chdir(SRC_ROOT)
|
||||
expected = open(SRC_ROOT / 'tests' / 'invocation' / output, mode='r', encoding='utf-8').read()
|
||||
formatter = Formatter('%(levelname)-9s%(name)s:%(filename)s %(message)s')
|
||||
caplog.handler.setFormatter(formatter)
|
||||
# keep INFO level to at least test those logs once
|
||||
caplog.set_level(INFO)
|
||||
handler(args)
|
||||
captured = capfd.readouterr()
|
||||
assert captured.out == expected
|
||||
assert captured.err == ''
|
||||
if log:
|
||||
expected_log = open(SRC_ROOT / 'tests' / 'invocation' / log, mode='r', encoding='utf-8').read()
|
||||
assert expected_log == caplog.text
|
||||
|
||||
|
||||
@pytest.mark.parametrize('program', ('gnpy-transmission-example', 'gnpy-path-request'))
|
||||
def test_run_wrapper(program):
|
||||
'''Ensure that our wrappers really, really work'''
|
||||
"""Ensure that our wrappers really, really work"""
|
||||
proc = subprocess.run((program, '--help'), stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||
check=True, universal_newlines=True)
|
||||
assert proc.stderr == ''
|
||||
@@ -53,5 +69,5 @@ def test_conversion_xls():
|
||||
proc = subprocess.run(
|
||||
('gnpy-convert-xls', SRC_ROOT / 'tests' / 'data' / 'testTopology.xls', '--output', os.path.devnull),
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, universal_newlines=True)
|
||||
assert proc.stderr == ''
|
||||
assert proc.stderr == 'missing header delta p\nmissing header delta p\n'
|
||||
assert os.path.devnull in proc.stdout
|
||||
|
||||
422
tests/test_logger.py
Normal file
422
tests/test_logger.py
Normal file
@@ -0,0 +1,422 @@
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
# Copyright (C) 2020 Telecom Infra Project and GNPy contributors
|
||||
# see LICENSE.md for a list of contributors
|
||||
#
|
||||
|
||||
from pathlib import Path
|
||||
import re
|
||||
import pytest
|
||||
|
||||
from gnpy.core.exceptions import ConfigurationError, ServiceError, EquipmentConfigError, ParametersError, \
|
||||
NetworkTopologyError
|
||||
from gnpy.tools.json_io import SI, Roadm, Amp, load_equipment, requests_from_json, network_from_json, \
|
||||
load_network, load_requests
|
||||
from gnpy.tools.convert import xls_to_json_data
|
||||
|
||||
TEST_DIR = Path(__file__).parent
|
||||
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
|
||||
DATA_DIR = TEST_DIR / 'data'
|
||||
|
||||
|
||||
def test_jsonthing(caplog):
|
||||
"""Check that a missing key correctly raises an info
|
||||
"""
|
||||
json_data = {
|
||||
|
||||
"baud_rate": 32e9,
|
||||
"f_max": 196.1e12,
|
||||
"spacing": 50e9,
|
||||
"power_dbm": 0,
|
||||
"power_range_db": [0, 0, 1],
|
||||
"roll_off": 0.15,
|
||||
"tx_osnr": 40,
|
||||
"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'
|
||||
assert expected_msg in caplog.text
|
||||
|
||||
|
||||
def wrong_equipment():
|
||||
"""Creates list of malformed equipments
|
||||
"""
|
||||
data = []
|
||||
data.append({
|
||||
"error": EquipmentConfigError,
|
||||
"equipment": Roadm,
|
||||
"json_data": {
|
||||
"target_pch_out_db": -20,
|
||||
"target_out_mWperSlotWidth": 3.125e-4,
|
||||
"add_drop_osnr": 38,
|
||||
"pmd": 0,
|
||||
"pdl": 0,
|
||||
"restrictions": {
|
||||
"preamp_variety_list": [],
|
||||
"booster_variety_list": []
|
||||
}
|
||||
},
|
||||
"expected_msg": "Only one equalization type should be set in ROADM, found: target_pch_out_db,"
|
||||
+ " target_out_mWperSlotWidth"
|
||||
})
|
||||
data.append({
|
||||
"error": EquipmentConfigError,
|
||||
"equipment": Roadm,
|
||||
"json_data": {
|
||||
"add_drop_osnr": 38,
|
||||
"pmd": 0,
|
||||
"pdl": 0,
|
||||
"restrictions": {
|
||||
"preamp_variety_list": [],
|
||||
"booster_variety_list": []
|
||||
}
|
||||
},
|
||||
"expected_msg": "No equalization type set in ROADM"
|
||||
})
|
||||
return data
|
||||
|
||||
|
||||
@pytest.mark.parametrize('error, equipment, json_data, expected_msg',
|
||||
[(e['error'], e['equipment'], e['json_data'], e['expected_msg']) for e in wrong_equipment()])
|
||||
def test_wrong_equipment(caplog, error, equipment, json_data, expected_msg):
|
||||
"""
|
||||
"""
|
||||
with pytest.raises(EquipmentConfigError, match=expected_msg):
|
||||
_ = equipment(**json_data)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('xls_service_filename, xls_topo_filename, expected_msg',
|
||||
[('wrong_service.xlsx', 'testTopology.xls',
|
||||
"Service error: Request Id: 0 - could not find tsp : 'Voyager' with mode: 'Mode 10' "
|
||||
+ "in eqpt library \nComputation stopped."),
|
||||
('wrong_service_type.xlsx', 'testTopology.xls',
|
||||
"Service error: Request Id: 0 - could not find tsp : 'Galileo' with mode: 'mode 1' "
|
||||
+ "in eqpt library \nComputation stopped.")])
|
||||
def test_wrong_xls_service(xls_service_filename, xls_topo_filename, expected_msg):
|
||||
"""
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
network = load_network(DATA_DIR / xls_topo_filename, equipment)
|
||||
with pytest.raises(ServiceError, match=expected_msg):
|
||||
_ = load_requests(DATA_DIR / xls_service_filename, equipment, False, network, DATA_DIR / xls_topo_filename)
|
||||
|
||||
|
||||
def wrong_amp():
|
||||
"""Creates list of malformed equipments
|
||||
"""
|
||||
data = []
|
||||
data.append({
|
||||
"error": EquipmentConfigError,
|
||||
"json_data": {
|
||||
"type_variety": "test_fixed_gain",
|
||||
"type_def": "fixed_gain",
|
||||
"gain_flatmax": 21,
|
||||
"gain_min": 20,
|
||||
"p_max": 21,
|
||||
"allowed_for_design": True
|
||||
},
|
||||
"expected_msg": "missing nf0 value input for amplifier: test_fixed_gain in equipment config"
|
||||
})
|
||||
data.append({
|
||||
"error": EquipmentConfigError,
|
||||
"json_data": {
|
||||
"type_variety": "test",
|
||||
"type_def": "variable_gain",
|
||||
"gain_flatmax": 25,
|
||||
"gain_min": 15,
|
||||
"p_max": 21,
|
||||
"nf_min": 5.8,
|
||||
"out_voa_auto": False,
|
||||
"allowed_for_design": True
|
||||
},
|
||||
"expected_msg": "missing nf_min or nf_max value input for amplifier: test in equipment config"
|
||||
})
|
||||
data.append({
|
||||
"error": EquipmentConfigError,
|
||||
"json_data": {
|
||||
"type_variety": "medium+high_power",
|
||||
"type_def": "dual_stage",
|
||||
"gain_min": 25,
|
||||
"preamp_variety": "std_medium_gain",
|
||||
"allowed_for_design": False
|
||||
},
|
||||
"expected_msg": "missing preamp/booster variety input for amplifier: medium+high_power in equipment config"
|
||||
})
|
||||
return data
|
||||
|
||||
|
||||
@pytest.mark.parametrize('error, json_data, expected_msg',
|
||||
[(e['error'], e['json_data'], e['expected_msg']) for e in wrong_amp()])
|
||||
def test_wrong_amp(error, json_data, expected_msg):
|
||||
"""
|
||||
"""
|
||||
with pytest.raises(error, match=re.escape(expected_msg)):
|
||||
_ = Amp.from_json(EQPT_FILENAME, **json_data)
|
||||
|
||||
|
||||
def wrong_requests():
|
||||
"""Creates list of malformed requests
|
||||
"""
|
||||
data = []
|
||||
data.append({
|
||||
'error': ConfigurationError,
|
||||
'json_data': {
|
||||
"path-request": [{
|
||||
"request-id": "imposed_mode",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "test_offset",
|
||||
"trx_mode": "mode 3",
|
||||
"spacing": 75000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}]
|
||||
},
|
||||
'expected_msg': 'Equipment Config error in imposed_mode: '
|
||||
+ 'Could not find transponder "test_offset" with mode "mode 3" in equipment library'
|
||||
})
|
||||
data.append({
|
||||
'error': ServiceError,
|
||||
'json_data': {
|
||||
"path-request": [{
|
||||
"request-id": "Missing_type",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": None,
|
||||
"spacing": 75000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}]},
|
||||
'expected_msg': 'Request Missing_type has no transceiver type defined'
|
||||
})
|
||||
data.append({
|
||||
'error': ServiceError,
|
||||
'json_data': {
|
||||
"path-request": [{
|
||||
"request-id": "wrong_spacing",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "Voyager",
|
||||
"trx_mode": "mode 2",
|
||||
"spacing": 50000000000.0,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}]},
|
||||
'expected_msg': 'Request wrong_spacing has spacing below transponder Voyager mode 2 min spacing'
|
||||
+ ' value 75.0GHz.\nComputation stopped'
|
||||
})
|
||||
data.append({
|
||||
'error': ServiceError,
|
||||
'json_data': {
|
||||
"path-request": [{
|
||||
"request-id": "Wrong_nb_channel",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "Voyager",
|
||||
"trx_mode": "mode 2",
|
||||
"spacing": 75000000000.0,
|
||||
"max-nb-of-channel": 150,
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}]},
|
||||
'expected_msg': 'Requested channel number 150, baud rate 66.0 GHz'
|
||||
+ ' and requested spacing 75.0GHz is not consistent with frequency range'
|
||||
+ ' 191.35 THz, 196.1 THz.'
|
||||
+ ' Max recommanded nb of channels is 63.'
|
||||
})
|
||||
data.append({
|
||||
'error': ServiceError,
|
||||
'json_data': {
|
||||
"path-request": [{
|
||||
"request-id": "Wrong_M",
|
||||
"source": "trx Brest_KLA",
|
||||
"destination": "trx Vannes_KBE",
|
||||
"src-tp-id": "trx Brest_KLA",
|
||||
"dst-tp-id": "trx Vannes_KBE",
|
||||
"bidirectional": False,
|
||||
"path-constraints": {
|
||||
"te-bandwidth": {
|
||||
"technology": "flexi-grid",
|
||||
"trx_type": "Voyager",
|
||||
"trx_mode": "mode 2",
|
||||
"spacing": 75000000000.0,
|
||||
"effective-freq-slot": [
|
||||
{
|
||||
"N": -208,
|
||||
"M": 4
|
||||
}
|
||||
],
|
||||
"path_bandwidth": 100000000000.0
|
||||
}
|
||||
}
|
||||
}]},
|
||||
'expected_msg': 'Requested M [{\'N\': -208, \'M\': 4}] number of slots for request Wrong_M '
|
||||
+ 'support 0 nb of channels while 1 are required to support request 100.0 Gbit/s'
|
||||
+ ' with Voyager mode 2'
|
||||
})
|
||||
return data
|
||||
|
||||
|
||||
@pytest.mark.parametrize('error, json_data, expected_msg',
|
||||
[(e['error'], e['json_data'], e['expected_msg']) for e in wrong_requests()])
|
||||
def test_json_request(error, json_data, expected_msg):
|
||||
"""
|
||||
Check that a missing key is correctly raisong the logger
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
|
||||
with pytest.raises(error, match=re.escape(expected_msg)):
|
||||
_ = requests_from_json(json_data, equipment)
|
||||
|
||||
|
||||
def wrong_element():
|
||||
"""
|
||||
"""
|
||||
data = []
|
||||
data.append({
|
||||
"error": ConfigurationError,
|
||||
"json_data": {
|
||||
"elements": [{
|
||||
"uid": "roadm SITE2",
|
||||
"type": "Roadm",
|
||||
"params": {
|
||||
"target_pch_out_db": -20,
|
||||
"target_out_mWperSlotWidth": 3.125e-4,
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
"latitude": 2.0,
|
||||
"longitude": 3.0,
|
||||
"city": "SITE2",
|
||||
"region": "RLD"
|
||||
}
|
||||
}
|
||||
}],
|
||||
"connections": []
|
||||
},
|
||||
"expected_msg": "ROADM roadm SITE2: invalid equalization settings"
|
||||
})
|
||||
data.append({
|
||||
"error": ConfigurationError,
|
||||
"json_data": {
|
||||
"elements": [{
|
||||
"uid": "east edfa in ILA2 to SITE2",
|
||||
"type": "Edfa",
|
||||
"type_variety": "not_valid_variety",
|
||||
"metadata": {
|
||||
"location": {
|
||||
"latitude": 2.0,
|
||||
"longitude": 0.0,
|
||||
"city": "ILA2",
|
||||
"region": "RLD"
|
||||
}
|
||||
}
|
||||
}],
|
||||
"connections": []
|
||||
},
|
||||
"expected_msg": "The Edfa of variety type not_valid_variety was not recognized:"
|
||||
+ "\nplease check it is properly defined in the eqpt_config json file"
|
||||
})
|
||||
data.append({
|
||||
"error": ParametersError,
|
||||
"json_data": {
|
||||
"elements": [{
|
||||
"uid": "fiber (ILA2 → ILA1)",
|
||||
"type": "Fiber",
|
||||
"type_variety": "SSMF",
|
||||
"params": {
|
||||
"length": 100.0,
|
||||
"loss_coef": 0.2,
|
||||
"att_in": 0,
|
||||
"con_in": 0,
|
||||
"con_out": 0
|
||||
},
|
||||
"metadata": {
|
||||
"location": {
|
||||
"latitude": 2.0,
|
||||
"longitude": 1.5,
|
||||
"city": None,
|
||||
"region": None
|
||||
}
|
||||
}
|
||||
}],
|
||||
"connections": []
|
||||
},
|
||||
"expected_msg": "Config error in fiber (ILA2 → ILA1): "
|
||||
+ "Fiber configurations json must include \'length_units\'. Configuration: "
|
||||
+ "{\'length\': 100.0, \'loss_coef\': 0.2, \'att_in\': 0, \'con_in\': 0, \'con_out\': 0, "
|
||||
+ "\'type_variety\': \'SSMF\', \'dispersion\': 1.67e-05, \'effective_area\': 8.3e-11, "
|
||||
+ "\'pmd_coef\': 1.265e-15}"
|
||||
})
|
||||
return data
|
||||
|
||||
|
||||
@pytest.mark.parametrize('error, json_data, expected_msg',
|
||||
[(e['error'], e['json_data'], e['expected_msg']) for e in wrong_element()])
|
||||
def test_json_network(error, json_data, expected_msg):
|
||||
"""
|
||||
Check that a missing key is correctly raisong the logger
|
||||
"""
|
||||
equipment = load_equipment(EQPT_FILENAME)
|
||||
with pytest.raises(error, match=re.escape(expected_msg)):
|
||||
_ = network_from_json(json_data, equipment)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('input_filename, expected_msg',
|
||||
[(DATA_DIR / 'wrong_topo_node.xlsx', 'XLS error: The following nodes are not referenced from the Links sheet.'
|
||||
+ ' If unused, remove them from the Nodes sheet:\n - toto'),
|
||||
(DATA_DIR / 'wrong_topo_link.xlsx', 'XLS error: The Links sheet references nodes that are not defined in the '
|
||||
+ 'Nodes sheet:\n - ALB -> toto'),
|
||||
(DATA_DIR / 'wrong_topo_link_header.xlsx', 'missing header Node Z'),
|
||||
(DATA_DIR / 'wrong_topo_eqpt.xlsx', 'XLS error: The Eqpt sheet refers to nodes that are not defined in the '
|
||||
+ 'Nodes sheet:\n - toto'),
|
||||
(DATA_DIR / 'wrong_topo_duplicate_node.xlsx', 'Duplicate city: Counter({\'ALB\': 2, \'CHA_3\': 1})'),
|
||||
(DATA_DIR / 'wrong_topo_duplicate_eqpt.xlsx', 'XLS error: Duplicate lines in Eqpt sheet: - ALB -> CHA_3'),
|
||||
(DATA_DIR / 'wrong_topo_bad_eqpt.xlsx', 'XLS error: The Eqpt sheet references links that are not defined '
|
||||
+ 'in the Links sheet:\n - toto -> CHA_3'),
|
||||
(DATA_DIR / 'wrong_duplicate_link_reverse.xlsx', 'XLS error: links - (\'ila\', \'siteb\') are duplicate'),
|
||||
(DATA_DIR / 'wrong_duplicate_eqpt_ila_reverse.xlsx', 'XLS error: Duplicate ILA eqpt definition in Eqpt sheet:'
|
||||
+ ' - ila')])
|
||||
def test_wrong_xlsx(input_filename, expected_msg):
|
||||
"""Check that error and logs are correctly working
|
||||
"""
|
||||
with pytest.raises(NetworkTopologyError, match=re.escape(expected_msg)):
|
||||
_ = xls_to_json_data(input_filename)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('input_filename, expected_msg',
|
||||
[(DATA_DIR / 'wrong_node_type.xlsx', 'invalid node type (ILA) specified in Lannion_CAS, replaced by ROADM\n')])
|
||||
def test_log_wrong_xlsx(caplog, input_filename, expected_msg):
|
||||
"""Check that logs are correctly working
|
||||
"""
|
||||
_ = xls_to_json_data(input_filename)
|
||||
assert expected_msg in caplog.text
|
||||
@@ -7,8 +7,10 @@
|
||||
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 gnpy.core.network import span_loss, build_network
|
||||
from gnpy.tools.json_io import load_equipment, load_network, network_from_json
|
||||
from gnpy.core.utils import lin2db, automatic_nch
|
||||
from gnpy.core.elements import Fiber, Edfa
|
||||
|
||||
|
||||
TEST_DIR = Path(__file__).parent
|
||||
@@ -49,7 +51,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 +63,180 @@ 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
|
||||
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
|
||||
|
||||
@@ -6,18 +6,51 @@ Checks that the class SimParams behaves as a mutable Singleton.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from gnpy.core.parameters import SimParams
|
||||
from pathlib import Path
|
||||
from numpy.testing import assert_allclose
|
||||
|
||||
from gnpy.core.parameters import SimParams, FiberParams
|
||||
from gnpy.tools.json_io import load_json, Fiber
|
||||
|
||||
TEST_DIR = Path(__file__).parent
|
||||
|
||||
|
||||
@pytest.mark.usefixtures('set_sim_params')
|
||||
def test_sim_parameters():
|
||||
sim_params = {'nli_params': {}, 'raman_params': {}}
|
||||
SimParams.set_params(sim_params)
|
||||
s1 = SimParams.get()
|
||||
s1 = SimParams()
|
||||
assert s1.nli_params.method == 'gn_model_analytic'
|
||||
s2 = SimParams.get()
|
||||
s2 = SimParams()
|
||||
assert not s1.raman_params.flag
|
||||
sim_params['raman_params']['flag'] = True
|
||||
SimParams.set_params(sim_params)
|
||||
assert s2.raman_params.flag
|
||||
assert s1.raman_params.flag
|
||||
|
||||
|
||||
def test_fiber_parameters():
|
||||
fiber_dict_explicit_g0 = load_json(TEST_DIR/'data'/'test_parameters_fiber_config.json')['params']
|
||||
fiber_params_explicit_g0 = FiberParams(**fiber_dict_explicit_g0)
|
||||
|
||||
fiber_dict_default_g0 = load_json(TEST_DIR/'data'/'test_science_utils_fiber_config.json')['params']
|
||||
fiber_params_default_g0 = FiberParams(**fiber_dict_default_g0)
|
||||
|
||||
fiber_dict_cr = load_json(TEST_DIR/'data'/'test_old_parameters_fiber_config.json')['params']
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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(raman_coefficient_explicit_g0, raman_coefficient_default_g0, rtol=1e-10)
|
||||
assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_cr, rtol=1e-10)
|
||||
|
||||
@@ -3,16 +3,17 @@
|
||||
# @Author: Esther Le Rouzic
|
||||
# @Date: 2018-06-15
|
||||
|
||||
""" Adding tests to check the parser non regression
|
||||
convention of naming of test files:
|
||||
- ..._expected.json for the reference output
|
||||
tests:
|
||||
- generation of topology json
|
||||
- reading of Eqpt sheet w and W/ power mode
|
||||
- consistency of autodesign
|
||||
- generation of service list based on service sheet
|
||||
- writing of results in csv
|
||||
- writing of results in json (same keys)
|
||||
"""Adding tests to check the parser non regression
|
||||
|
||||
convention of naming of test files:
|
||||
- ..._expected.json for the reference output
|
||||
tests:
|
||||
- generation of topology json
|
||||
- reading of Eqpt sheet w and W/ power mode
|
||||
- consistency of autodesign
|
||||
- generation of service list based on service sheet
|
||||
- writing of results in csv
|
||||
- writing of results in json (same keys)
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
@@ -23,7 +24,7 @@ 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.network import build_network, add_missing_elements_in_network
|
||||
from gnpy.core.exceptions import ServiceError
|
||||
from gnpy.topology.request import (jsontocsv, requests_aggregation, compute_path_dsjctn, deduplicate_disjunctions,
|
||||
compute_path_with_disjunction, ResultElement, PathRequest)
|
||||
@@ -46,8 +47,7 @@ equipment = load_equipment(eqpt_filename)
|
||||
|
||||
}.items())
|
||||
def test_excel_json_generation(tmpdir, xls_input, expected_json_output):
|
||||
""" tests generation of topology json
|
||||
"""
|
||||
"""tests generation of topology json"""
|
||||
xls_copy = Path(tmpdir) / xls_input.name
|
||||
shutil.copyfile(xls_input, xls_copy)
|
||||
convert_file(xls_copy)
|
||||
@@ -68,11 +68,10 @@ def test_excel_json_generation(tmpdir, xls_input, expected_json_output):
|
||||
DATA_DIR / 'testTopology_auto_design_expected.json',
|
||||
}.items())
|
||||
def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json_output):
|
||||
""" tests generation of topology json
|
||||
test that the build network gives correct results in gain mode
|
||||
"""
|
||||
"""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
|
||||
@@ -100,8 +99,7 @@ def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json
|
||||
True
|
||||
}.items())
|
||||
def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
|
||||
"""test that autodesign creates same file as an input file already autodesigned
|
||||
"""
|
||||
"""test that autodesign creates same file as an input file already autodesigned"""
|
||||
equipment = load_equipment(eqpt_filename)
|
||||
network = load_network(json_input, equipment)
|
||||
# in order to test the Eqpt sheet and load gain target,
|
||||
@@ -112,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)
|
||||
@@ -127,8 +126,7 @@ def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
|
||||
DATA_DIR / 'testService.xls': DATA_DIR / 'testService_services_expected.json'
|
||||
}.items())
|
||||
def test_excel_service_json_generation(xls_input, expected_json_output):
|
||||
""" test services creation
|
||||
"""
|
||||
"""test services creation"""
|
||||
equipment = load_equipment(eqpt_filename)
|
||||
network = load_network(DATA_DIR / 'testTopology.xls', equipment)
|
||||
# Build the network once using the default power defined in SI in eqpt config
|
||||
@@ -148,9 +146,7 @@ def test_excel_service_json_generation(xls_input, expected_json_output):
|
||||
(DATA_DIR / 'testTopology_response.json', )
|
||||
)
|
||||
def test_csv_response_generation(tmpdir, json_input):
|
||||
""" tests if generated csv is consistant with expected generation
|
||||
same columns (order not important)
|
||||
"""
|
||||
"""tests if generated csv is consistant with expected generation same columns (order not important)"""
|
||||
json_data = load_json(json_input)
|
||||
equipment = load_equipment(eqpt_filename)
|
||||
csv_filename = Path(tmpdir / json_input.name).with_suffix('.csv')
|
||||
@@ -215,8 +211,7 @@ def test_csv_response_generation(tmpdir, json_input):
|
||||
DATA_DIR / 'testTopology.xls': DATA_DIR / 'testTopology_response.json',
|
||||
}.items())
|
||||
def test_json_response_generation(xls_input, expected_response_file):
|
||||
""" tests if json response is correctly generated for all combinations of requests
|
||||
"""
|
||||
"""tests if json response is correctly generated for all combinations of requests"""
|
||||
|
||||
equipment = load_equipment(eqpt_filename)
|
||||
network = load_network(xls_input, equipment)
|
||||
@@ -323,8 +318,7 @@ def test_json_response_generation(xls_input, expected_response_file):
|
||||
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'STRICT', 'Fail')
|
||||
])
|
||||
def test_excel_ila_constraints(source, destination, route_list, hoptype, expected_correction):
|
||||
""" add different kind of constraints to test all correct_route cases
|
||||
"""
|
||||
"""add different kind of constraints to test all correct_route cases"""
|
||||
service_xls_input = DATA_DIR / 'testTopology.xls'
|
||||
network_json_input = DATA_DIR / 'testTopology_auto_design_expected.json'
|
||||
equipment = load_equipment(eqpt_filename)
|
||||
@@ -363,7 +357,8 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
|
||||
'nb_channel': 0,
|
||||
'power': 0,
|
||||
'path_bandwidth': 0,
|
||||
'effective_freq_slot': None
|
||||
'effective_freq_slot': None,
|
||||
'equalization_offset_db': 0
|
||||
}
|
||||
request = PathRequest(**params)
|
||||
|
||||
@@ -376,8 +371,7 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
|
||||
|
||||
|
||||
def setup_per_degree(case):
|
||||
""" common setup for degree: returns the dict network for different cases
|
||||
"""
|
||||
"""common setup for degree: returns the dict network for different cases"""
|
||||
json_network = load_json(DATA_DIR / 'testTopology_expected.json')
|
||||
json_network_auto = load_json(DATA_DIR / 'testTopology_auto_design_expected.json')
|
||||
if case == 'no':
|
||||
@@ -401,8 +395,7 @@ def setup_per_degree(case):
|
||||
|
||||
@pytest.mark.parametrize('case', ['no', 'all', 'Lannion_CAS and all', 'Lannion_CAS and one'])
|
||||
def test_target_pch_out_db_global(case):
|
||||
""" check that per degree attributes are correctly created with global values if none are given
|
||||
"""
|
||||
"""check that per degree attributes are correctly created with global values if none are given"""
|
||||
json_network = setup_per_degree(case)
|
||||
per_degree = {}
|
||||
for elem in json_network['elements']:
|
||||
@@ -442,14 +435,12 @@ def test_target_pch_out_db_global(case):
|
||||
|
||||
|
||||
def all_rows(sh, start=0):
|
||||
""" reads excel sheet row per row
|
||||
"""
|
||||
"""reads excel sheet row per row"""
|
||||
return (sh.row(x) for x in range(start, sh.nrows))
|
||||
|
||||
|
||||
class Amp:
|
||||
""" Node element contains uid, list of connected nodes and eqpt type
|
||||
"""
|
||||
"""Node element contains uid, list of connected nodes and eqpt type"""
|
||||
|
||||
def __init__(self, uid, to_node, eqpt=None, west=None):
|
||||
self.uid = uid
|
||||
@@ -459,7 +450,7 @@ class Amp:
|
||||
|
||||
|
||||
def test_eqpt_creation(tmpdir):
|
||||
""" tests that convert correctly creates equipment according to equipment sheet
|
||||
"""tests that convert correctly creates equipment according to equipment sheet
|
||||
including all cominations in testTopologyconvert.xls: if a line exists the amplifier
|
||||
should be created even if no values are provided.
|
||||
"""
|
||||
|
||||
@@ -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,15 @@ 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, power=p, spacing=spacing, tx_osnr=None)
|
||||
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 +130,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, 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,18 @@ 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.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
|
||||
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
|
||||
|
||||
|
||||
TEST_DIR = Path(__file__).parent
|
||||
EQPT_LIBRARY_NAME = TEST_DIR / 'data/eqpt_config.json'
|
||||
@@ -31,10 +34,10 @@ NETWORK_FILE_NAME = TEST_DIR / 'data/testTopology_expected.json'
|
||||
# mark node_uid amps as fused for testing purpose
|
||||
@pytest.mark.parametrize("node_uid", ['east edfa in Lannion_CAS to Stbrieuc'])
|
||||
def test_no_amp_feature(node_uid):
|
||||
''' Check that booster is not placed on a roadm if fused is specified
|
||||
test_parser covers partly this behaviour. This test should guaranty that the
|
||||
feature is preserved even if convert is changed
|
||||
'''
|
||||
"""Check that booster is not placed on a roadm if fused is specified
|
||||
test_parser covers partly this behaviour. This test should guaranty that the
|
||||
feature is preserved even if convert is changed
|
||||
"""
|
||||
equipment = load_equipment(EQPT_LIBRARY_NAME)
|
||||
json_network = load_json(NETWORK_FILE_NAME)
|
||||
|
||||
@@ -145,9 +148,9 @@ def equipment():
|
||||
'booster_variety_list':[]
|
||||
}])
|
||||
def test_restrictions(restrictions, equipment):
|
||||
''' test that restriction is correctly applied if provided in eqpt_config and if no Edfa type
|
||||
"""test that restriction is correctly applied if provided in eqpt_config and if no Edfa type
|
||||
were provided in the network json
|
||||
'''
|
||||
"""
|
||||
# add restrictions
|
||||
equipment['Roadm']['default'].restrictions = restrictions
|
||||
# build network
|
||||
@@ -212,12 +215,13 @@ def test_restrictions(restrictions, equipment):
|
||||
@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):
|
||||
''' Check that egress power of roadm is equal to target power if input power is greater
|
||||
"""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)
|
||||
@@ -254,11 +258,11 @@ 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))
|
||||
power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr)
|
||||
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
|
||||
@@ -274,12 +278,252 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
|
||||
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.
|
||||
# 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 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
|
||||
}
|
||||
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
|
||||
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
|
||||
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)
|
||||
|
||||
@@ -9,10 +9,10 @@ are tested.
|
||||
from pathlib import Path
|
||||
from pandas import read_csv
|
||||
from numpy.testing import assert_allclose
|
||||
from numpy import array, genfromtxt
|
||||
from numpy import array
|
||||
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,13 +23,12 @@ TEST_DIR = Path(__file__).parent
|
||||
|
||||
|
||||
def test_fiber():
|
||||
""" Test the accuracy of propagating the 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, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
||||
# propagation
|
||||
spectral_info_out = fiber(spectral_info_input)
|
||||
|
||||
@@ -46,11 +45,10 @@ 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)
|
||||
tx_osnr=40.0)
|
||||
|
||||
# propagation
|
||||
spectral_info_out = fiber(spectral_info_input)
|
||||
@@ -65,14 +63,13 @@ def test_fiber():
|
||||
|
||||
@pytest.mark.usefixtures('set_sim_params')
|
||||
def test_raman_fiber():
|
||||
""" Test the accuracy of propagating the RamanFiber."""
|
||||
"""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, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
||||
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
|
||||
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)
|
||||
|
||||
@@ -92,7 +89,7 @@ def test_raman_fiber():
|
||||
(0.5, 81, "Lumped loss positions must be between 0 and the fiber length (80.0 km), boundaries excluded.")))
|
||||
@pytest.mark.usefixtures('set_sim_params')
|
||||
def test_fiber_lumped_losses(loss, position, errmsg, set_sim_params):
|
||||
""" Lumped losses length sanity checking."""
|
||||
"""Lumped losses length sanity checking."""
|
||||
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
|
||||
fiber_dict = load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')
|
||||
fiber_dict['params']['lumped_losses'] = [{'position': position, 'loss': loss}]
|
||||
@@ -103,11 +100,10 @@ def test_fiber_lumped_losses(loss, position, errmsg, set_sim_params):
|
||||
|
||||
@pytest.mark.usefixtures('set_sim_params')
|
||||
def test_fiber_lumped_losses_srs(set_sim_params):
|
||||
""" Test the accuracy of Fiber with lumped losses propagation."""
|
||||
"""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, power=1e-3, spacing=50e9, tx_osnr=40.0)
|
||||
|
||||
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'))
|
||||
@@ -118,18 +114,18 @@ def test_fiber_lumped_losses_srs(set_sim_params):
|
||||
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
|
||||
spectral_info_input, fiber)
|
||||
power_profile = stimulated_raman_scattering.power_profile
|
||||
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', delimiter=',')
|
||||
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', header=None)
|
||||
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
|
||||
|
||||
# with Raman pumps
|
||||
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv', delimiter=',')
|
||||
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)
|
||||
power_profile = stimulated_raman_scattering.power_profile
|
||||
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
|
||||
|
||||
# without Stimulated Raman Scattering
|
||||
expected_power_profile = genfromtxt(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_raman.csv', delimiter=',')
|
||||
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_raman.csv', header=None)
|
||||
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)
|
||||
|
||||
@@ -20,7 +20,8 @@ from gnpy.core.elements import Roadm, Transceiver
|
||||
from gnpy.core.exceptions import ServiceError, SpectrumError
|
||||
from gnpy.topology.request import compute_path_dsjctn, find_reversed_path, deduplicate_disjunctions, PathRequest
|
||||
from gnpy.topology.spectrum_assignment import (build_oms_list, align_grids, nvalue_to_frequency,
|
||||
bitmap_sum, Bitmap, spectrum_selection, pth_assign_spectrum)
|
||||
bitmap_sum, Bitmap, spectrum_selection, pth_assign_spectrum,
|
||||
build_path_oms_id_list, aggregate_oms_bitmap)
|
||||
from gnpy.tools.json_io import (load_equipment, load_network, requests_from_json, disjunctions_from_json,
|
||||
_check_one_request)
|
||||
|
||||
@@ -45,8 +46,7 @@ def equipment():
|
||||
|
||||
@pytest.fixture()
|
||||
def setup(equipment):
|
||||
""" common setup for tests: builds network, equipment and oms only once
|
||||
"""
|
||||
"""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
|
||||
@@ -57,9 +57,9 @@ def setup(equipment):
|
||||
|
||||
|
||||
def test_oms(setup):
|
||||
""" tests that the OMS is between two ROADMs, that there is no ROADM or transceivers in the OMS
|
||||
except end points, checks that the id of OMS is present in the element and that the element
|
||||
OMS id is consistant
|
||||
"""tests that the OMS is between two ROADMs, that there is no ROADM or transceivers in the OMS
|
||||
except end points, checks that the id of OMS is present in the element and that the element
|
||||
OMS id is consistant
|
||||
"""
|
||||
network, oms_list = setup
|
||||
for oms in oms_list:
|
||||
@@ -150,8 +150,7 @@ def test_aligned(nmin, nmax, setup):
|
||||
@pytest.mark.parametrize('nval1', [0, 15, 24])
|
||||
@pytest.mark.parametrize('nval2', [8, 12])
|
||||
def test_assign_and_sum(nval1, nval2, setup):
|
||||
""" checks that bitmap sum gives correct result
|
||||
"""
|
||||
"""checks that bitmap sum gives correct result"""
|
||||
network, oms_list = setup
|
||||
guardband = grid
|
||||
mval = 4 # slot in 12.5GHz
|
||||
@@ -198,8 +197,7 @@ def test_assign_and_sum(nval1, nval2, setup):
|
||||
|
||||
|
||||
def test_bitmap_assignment(setup):
|
||||
""" test that a bitmap can be assigned
|
||||
"""
|
||||
"""test that a bitmap can be assigned"""
|
||||
network, oms_list = setup
|
||||
random_oms = oms_list[2]
|
||||
random_oms.assign_spectrum(13, 7)
|
||||
@@ -216,8 +214,7 @@ def test_bitmap_assignment(setup):
|
||||
|
||||
@pytest.fixture()
|
||||
def services(equipment):
|
||||
""" common setup for service list: builds service only once
|
||||
"""
|
||||
"""common setup for service list: builds service only once"""
|
||||
with open(SERVICE_FILENAME, encoding='utf-8') as my_f:
|
||||
services = json.loads(my_f.read())
|
||||
return services
|
||||
@@ -225,25 +222,24 @@ def services(equipment):
|
||||
|
||||
@pytest.fixture()
|
||||
def requests(equipment, services):
|
||||
""" common setup for requests, builds requests list only once
|
||||
"""
|
||||
"""common setup for requests, builds requests list only once"""
|
||||
requests = requests_from_json(services, equipment)
|
||||
return requests
|
||||
|
||||
|
||||
def test_spectrum_assignment_on_path(equipment, setup, requests):
|
||||
""" test assignment functions on path and network
|
||||
"""
|
||||
"""test assignment functions on path and network"""
|
||||
network, oms_list = setup
|
||||
req = [deepcopy(requests[1])]
|
||||
paths = compute_path_dsjctn(network, equipment, req, [])
|
||||
|
||||
first_path_oms = build_path_oms_id_list(paths[0])
|
||||
print(req)
|
||||
for nval in range(100):
|
||||
req = [deepcopy(requests[1])]
|
||||
(center_n, startn, stopn), path_oms = spectrum_selection(paths[0], oms_list, 4)
|
||||
test_oms = aggregate_oms_bitmap(first_path_oms, oms_list)
|
||||
center_n, startn, stopn = spectrum_selection(test_oms, 4)
|
||||
pth_assign_spectrum(paths, req, oms_list, [find_reversed_path(paths[0])])
|
||||
print(f'testing on following oms {path_oms}')
|
||||
print(f'testing on following oms {first_path_oms}')
|
||||
# check that only 96 channels are feasible
|
||||
if nval >= 96:
|
||||
print(center_n, startn, stopn)
|
||||
@@ -256,13 +252,15 @@ def test_spectrum_assignment_on_path(equipment, setup, requests):
|
||||
|
||||
req = [requests[2]]
|
||||
paths = compute_path_dsjctn(network, equipment, req, [])
|
||||
(center_n, startn, stopn), path_oms = spectrum_selection(paths[0], oms_list, 4, 478)
|
||||
second_path_oms = build_path_oms_id_list(paths[0])
|
||||
test_oms = aggregate_oms_bitmap(second_path_oms, oms_list)
|
||||
center_n, startn, stopn = spectrum_selection(test_oms, 4, 478)
|
||||
print(oms_list[0].spectrum_bitmap.freq_index_max)
|
||||
print(oms_list[0])
|
||||
print(center_n, startn, stopn)
|
||||
print('spectrum selection error: should be None')
|
||||
assert center_n is None and startn is None and stopn is None
|
||||
(center_n, startn, stopn), path_oms = spectrum_selection(paths[0], oms_list, 4, 477)
|
||||
center_n, startn, stopn = spectrum_selection(test_oms, 4, 477)
|
||||
print(center_n, startn, stopn)
|
||||
print('spectrum selection error should not be None')
|
||||
assert center_n is not None and startn is not None and stopn is not None
|
||||
@@ -270,8 +268,7 @@ def test_spectrum_assignment_on_path(equipment, setup, requests):
|
||||
|
||||
@pytest.fixture()
|
||||
def request_set():
|
||||
""" creates default request dict
|
||||
"""
|
||||
"""creates default request dict"""
|
||||
return {
|
||||
'request_id': '0',
|
||||
'source': 'trx a',
|
||||
@@ -295,29 +292,28 @@ def request_set():
|
||||
'min_spacing': 37.5e9,
|
||||
'nb_channel': None,
|
||||
'power': 0,
|
||||
'path_bandwidth': 800e9}
|
||||
'path_bandwidth': 800e9,
|
||||
'equalization_offset_db': 0}
|
||||
|
||||
|
||||
def test_freq_slot_exist(setup, equipment, request_set):
|
||||
""" test that assignment works even if effective_freq_slot is not populated
|
||||
"""
|
||||
"""test that assignment works even if effective_freq_slot is not populated"""
|
||||
network, oms_list = setup
|
||||
params = request_set
|
||||
params['effective_freq_slot'] = None
|
||||
params['effective_freq_slot'] = [{'N': None, 'M': None}]
|
||||
rqs = [PathRequest(**params)]
|
||||
paths = compute_path_dsjctn(network, equipment, rqs, [])
|
||||
pth_assign_spectrum(paths, rqs, oms_list, [find_reversed_path(paths[0])])
|
||||
assert rqs[0].N == -256
|
||||
assert rqs[0].M == 32
|
||||
assert rqs[0].N == [-256]
|
||||
assert rqs[0].M == [32]
|
||||
|
||||
|
||||
def test_inconsistant_freq_slot(setup, equipment, request_set):
|
||||
""" test that an inconsistant M correctly raises an error
|
||||
"""
|
||||
"""test that an inconsistant M correctly raises an error"""
|
||||
network, oms_list = setup
|
||||
params = request_set
|
||||
# minimum required nb of slots is 32 (800Gbit/100Gbit/s channels each occupying 50GHz ie 4 slots)
|
||||
params['effective_freq_slot'] = {'N': 0, 'M': 4}
|
||||
params['effective_freq_slot'] = [{'N': 0, 'M': 4}]
|
||||
with pytest.raises(ServiceError):
|
||||
_check_one_request(params, 196.05e12)
|
||||
params['trx_mode'] = None
|
||||
@@ -327,27 +323,59 @@ def test_inconsistant_freq_slot(setup, equipment, request_set):
|
||||
assert rqs[0].blocking_reason == 'NOT_ENOUGH_RESERVED_SPECTRUM'
|
||||
|
||||
|
||||
@pytest.mark.parametrize('n, m, final_n, final_m, blocking_reason', [
|
||||
@pytest.mark.parametrize('req_n, req_m, final_n, final_m, blocking_reason, raises_error', [
|
||||
# regular requests that should be correctly assigned:
|
||||
(-100, 32, -100, 32, None),
|
||||
(150, 50, 150, 50, None),
|
||||
([-100], [32], [-100], [32], None, False),
|
||||
([150], [50], [150], [50], None, False),
|
||||
# if n is None, there should be an assignment (enough spectrum cases)
|
||||
# and the center frequency should be set on the lower part of the spectrum based on m value if it exists
|
||||
# or based on 32
|
||||
(None, 32, -256, 32, None),
|
||||
(None, 40, -248, 40, None),
|
||||
(-100, None, -100, 32, None),
|
||||
(None, None, -256, 32, None),
|
||||
([None], [32], [-256], [32], None, False),
|
||||
([None], [40], [-248], [40], None, False),
|
||||
([-100], [None], [-100], [32], None, False),
|
||||
([None], [None], [-256], [32], None, False),
|
||||
# -280 and 60 center indexes should result in unfeasible spectrum, either out of band or
|
||||
# overlapping with occupied spectrum. The requested spectrum is not available
|
||||
(-280, None, None, None, 'NO_SPECTRUM'),
|
||||
(-60, 40, None, None, 'NO_SPECTRUM'),
|
||||
([None], [300], None, None, 'NO_SPECTRUM', False),
|
||||
([-280], [None], None, None, 'NO_SPECTRUM', False),
|
||||
([-60], [40], None, None, 'NO_SPECTRUM', False),
|
||||
# raises service error: M value too small
|
||||
([-60], [3], None, None, 'NOT_ENOUGH_RESERVED_SPECTRUM', True),
|
||||
# 20 is smaller than min 32 required nb of slots so should also be blocked
|
||||
(-60, 20, None, None, 'NOT_ENOUGH_RESERVED_SPECTRUM')
|
||||
])
|
||||
def test_n_m_requests(setup, equipment, n, m, final_n, final_m, blocking_reason, request_set):
|
||||
""" test that various N and M values for a request end up with the correct path assgnment
|
||||
"""
|
||||
([-60], [20], None, None, 'NOT_ENOUGH_RESERVED_SPECTRUM', False),
|
||||
# multiple assignments
|
||||
([-100, -164], [16, 16], [-100, -164], [16, 16], None, False),
|
||||
([-100, -164], [32, 32], [-100, -164], [32, 32], None, False),
|
||||
([-100, -164], [None, None], [-164], [32], None, False),
|
||||
([None, None], [16, 16], [-272, -240], [16, 16], None, False),
|
||||
([None, None, None], [16, 16, None], [-272, -240], [16, 16], None, False),
|
||||
([None, None], [None, None], [-256], [32], None, False),
|
||||
([-272, None], [16, 16], [-272, -240], [16, 16], None, False),
|
||||
([-272, 100], [None, 16], [-272, 100], [16, 16], None, False),
|
||||
# first assign defined Ms whatever the N (but order them), and then uses imposed N. Fill in with the max
|
||||
# available nb of slots (centered on N).
|
||||
([-88, -100, -116, None], [8, None, 12, None], [-88, -100, -116, -280], [8, 4, 12, 8], None, False),
|
||||
# If no M is defined, uses th Ns to fill in with the max possible nb of slots (with respecte to request,
|
||||
# here it is 32 slots)
|
||||
([-88, -106, -116, None], [None, None, None, None], [-116], [32], None, False),
|
||||
# if one defined N, M is not applicable then blocks the spectrum (even f other slots are OK)
|
||||
# only 2 slots remains between -104 (-100 - 4) and -108 (-112 + 4). So (-106, None) is not feasible, because min
|
||||
# required M is 4 for Voyager, Mode 1
|
||||
([-100, -106, -112], [4, None, 4], None, None, 'NO_SPECTRUM', False),
|
||||
# required nb of channels is 8 with 4 slots each. Next two spectrum are not providing enough spectrum
|
||||
# raises service error: not enough nb of channels
|
||||
([-88, -100, -116], [4, 4, 4], None, None, 'NOT_ENOUGH_RESERVED_SPECTRUM', True),
|
||||
([-88, -100, -116], [4, None, 4], None, None, 'NO_SPECTRUM', False),
|
||||
# only 4 slots remains between -96 (-88 -8) and -104 (-116 + 12), and centered on -100, so N = -101 is not
|
||||
# feasible whatever the M.
|
||||
([-88, -101, -116, None], [8, 4, 12, None], None, None, 'NO_SPECTRUM', False),
|
||||
([-88, -101, -116, -250], [4, 4, 12, 12], None, None, 'NO_SPECTRUM', False),
|
||||
([-88, -101, -116, None], [8, None, 12, None], None, None, 'NO_SPECTRUM', False),
|
||||
# raises service error: slots overlap
|
||||
([-88, -81, -116, -136], [8, 8, 12, 8], None, None, 'NO_SPECTRUM', True),
|
||||
])
|
||||
def test_n_m_requests(setup, equipment, req_n, req_m, final_n, final_m, blocking_reason, raises_error, request_set):
|
||||
"""test that various N and M values for a request end up with the correct path assignment"""
|
||||
network, oms_list = setup
|
||||
# add an occupation on one of the span of the expected path OMS list on both directions
|
||||
# as defined by its offsets within the OMS list: [17, 20, 13, 22] and reversed path [19, 16, 21, 26]
|
||||
@@ -356,7 +384,10 @@ def test_n_m_requests(setup, equipment, n, m, final_n, final_m, blocking_reason,
|
||||
some_oms = oms_list[expected_oms[3]]
|
||||
some_oms.assign_spectrum(-30, 32) # means that spectrum is occupied from indexes -62 to 1 on reversed path
|
||||
params = request_set
|
||||
params['effective_freq_slot'] = {'N': n, 'M': m}
|
||||
params['effective_freq_slot'] = [{'N': n, 'M': m} for n, m in zip(req_n, req_m)]
|
||||
if raises_error:
|
||||
with pytest.raises(ServiceError):
|
||||
_check_one_request(params, 196.3e12)
|
||||
rqs = [PathRequest(**params)]
|
||||
|
||||
paths = compute_path_dsjctn(network, equipment, rqs, [])
|
||||
@@ -372,9 +403,7 @@ def test_n_m_requests(setup, equipment, n, m, final_n, final_m, blocking_reason,
|
||||
|
||||
|
||||
def test_reversed_direction(equipment, setup, requests, services):
|
||||
""" checks that if spectrum is selected on one direction it is also selected on reversed
|
||||
direction
|
||||
"""
|
||||
"""checks that if spectrum is selected on one direction it is also selected on reversed direction"""
|
||||
network, oms_list = setup
|
||||
dsjn = disjunctions_from_json(services)
|
||||
dsjn = deduplicate_disjunctions(dsjn)
|
||||
@@ -392,8 +421,9 @@ def test_reversed_direction(equipment, setup, requests, services):
|
||||
if pth:
|
||||
number_wl = ceil(requests[i].path_bandwidth / requests[i].bit_rate)
|
||||
requested_m = ceil(requests[i].spacing / slot) * number_wl
|
||||
(center_n, startn, stopn), path_oms = spectrum_selection(pth, oms_list, requested_m,
|
||||
requested_n=None)
|
||||
path_oms = build_path_oms_id_list(pth)
|
||||
test_oms = aggregate_oms_bitmap(path_oms, oms_list)
|
||||
center_n, startn, stopn = spectrum_selection(test_oms, requested_m, requested_n=None)
|
||||
spectrum_list.append([center_n, startn, stopn])
|
||||
else:
|
||||
spectrum_list.append([])
|
||||
|
||||
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