mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-10-31 18:18:00 +00:00 
			
		
		
		
	Compare commits
	
		
			63 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 8f9cf8ccc7 | ||
|   | 0c797a254c | ||
|   | 2cdeeabfa6 | ||
|   | 5e874798cb | ||
|   | ff8f044064 | ||
|   | d84ee4e76c | ||
|   | 521d27ffac | ||
|   | 35e759212e | ||
|   | f6dede2b5f | ||
|   | 0d0019f627 | ||
|   | 06fe1c2f63 | ||
|   | 092316a9d7 | ||
|   | 48e3f96967 | ||
|   | e9e8956caf | ||
|   | 0ae341c2a5 | ||
|   | 0c2f6372f8 | ||
|   | 97e80b4445 | ||
|   | 5e4c9b7d73 | ||
|   | e96f821cce | ||
|   | 5f7e61e255 | ||
|   | 682b5c5691 | ||
|   | 11e5117505 | ||
|   | 50603420fc | ||
|   | 125264f265 | ||
|   | b1067a6266 | ||
|   | 50d4ecd700 | ||
|   | 9f37e0371e | ||
|   | 9bd303db05 | ||
|   | 1bcb3ce25c | ||
|   | e381138320 | ||
|   | b450677709 | ||
|   | 54a3725e17 | ||
|   | 8889c2437a | ||
|   | 8bf8b2947b | ||
|   | cb85b8fe2b | ||
|   | 18610fb7a9 | ||
|   | bd6b278dd1 | ||
|   | e143d25339 | ||
|   | ffc7dbc241 | ||
|   | b842898baf | ||
|   | 7ea9e3b341 | ||
|   | fcf168b361 | ||
|   | a7ec7e2ed6 | ||
|   | 00ee102b3a | ||
|   | ce11524ad9 | ||
|   | 74be14562a | ||
|   | 16694d0a09 | ||
|   | 33c6038921 | ||
|   | 119c9eda90 | ||
|   | b63e146bf4 | ||
|   | 09dba8a166 | ||
|   | 7f5043622b | ||
|   | 6ad4593f41 | ||
|   | 706661d801 | ||
|   | a408d28911 | ||
|   | b86fe96032 | ||
|   | 43926518ad | ||
|   | 128a6e816b | ||
|   | 44db951261 | ||
|   | 3c3d919b77 | ||
|   | 2079d2bc5b | ||
|   | 062e2076ed | ||
|   | 1dd1bad273 | 
| @@ -1,47 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -e |  | ||||||
|  |  | ||||||
| IMAGE_NAME=telecominfraproject/oopt-gnpy |  | ||||||
| IMAGE_TAG=$(git describe --tags) |  | ||||||
|  |  | ||||||
| ALREADY_FOUND=0 |  | ||||||
| docker pull ${IMAGE_NAME}:${IMAGE_TAG} && ALREADY_FOUND=1 |  | ||||||
|  |  | ||||||
| if [[ $ALREADY_FOUND == 0 ]]; then |  | ||||||
|   docker build . -t ${IMAGE_NAME} |  | ||||||
|   docker tag ${IMAGE_NAME} ${IMAGE_NAME}:${IMAGE_TAG} |  | ||||||
|  |  | ||||||
|   # shared directory setup: do not clobber the real data |  | ||||||
|   mkdir trash |  | ||||||
|   cd trash |  | ||||||
|   docker run -it --rm --volume $(pwd):/shared ${IMAGE_NAME} gnpy-transmission-example |  | ||||||
| else |  | ||||||
|   echo "Image ${IMAGE_NAME}:${IMAGE_TAG} already available, will just update the other tags" |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| docker images |  | ||||||
|  |  | ||||||
| do_docker_login() { |  | ||||||
|   echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if [[ "${TRAVIS_PULL_REQUEST}" == "false" ]]; then |  | ||||||
|   if [[ "${TRAVIS_BRANCH}" == "develop" || "${TRAVIS_BRANCH}" == "docker" ]]; then |  | ||||||
|     echo "Publishing latest" |  | ||||||
|     docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest |  | ||||||
|     do_docker_login |  | ||||||
|     if [[ $ALREADY_FOUND == 0 ]]; then |  | ||||||
|       docker push ${IMAGE_NAME}:${IMAGE_TAG} |  | ||||||
|     fi |  | ||||||
|     docker push ${IMAGE_NAME}:latest |  | ||||||
|   elif [[ "${TRAVIS_BRANCH}" == "master" ]]; then |  | ||||||
|     echo "Publishing stable" |  | ||||||
|     docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:stable |  | ||||||
|     do_docker_login |  | ||||||
|     if [[ $ALREADY_FOUND == 0 ]]; then |  | ||||||
|       docker push ${IMAGE_NAME}:${IMAGE_TAG} |  | ||||||
|     fi |  | ||||||
|     docker push ${IMAGE_NAME}:stable |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
							
								
								
									
										38
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,23 +11,25 @@ jobs: | |||||||
|     name: Tox test |     name: Tox test | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v3 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|       - uses: fedora-python/tox-github-action@v0.4 |       - uses: fedora-python/tox-github-action@v0.4 | ||||||
|         with: |         with: | ||||||
|           tox_env: ${{ matrix.tox_env }} |           tox_env: ${{ matrix.tox_env }} | ||||||
|           dnf_install: ${{ matrix.dnf_install }} |           dnf_install: ${{ matrix.dnf_install }} | ||||||
|       - uses: codecov/codecov-action@29386c70ef20e286228c72b668a06fd0e8399192 |       - uses: codecov/codecov-action@v3.1.1 | ||||||
|         if: ${{ endswith(matrix.tox_env, '-cover') }} |         if: ${{ endswith(matrix.tox_env, '-cover') }} | ||||||
|         with: |         with: | ||||||
|           files: ${{ github.workspace }}/cover/coverage.xml |           files: ${{ github.workspace }}/cover/coverage.xml | ||||||
|     strategy: |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         tox_env: |         tox_env: | ||||||
|           - py38 |           - py38 | ||||||
|           - py39 |           - py39 | ||||||
|           - py310-cover |           - py310 | ||||||
|  |           - py311-cover | ||||||
|         include: |         include: | ||||||
|           - tox_env: docs |           - tox_env: docs | ||||||
|             dnf_install: graphviz |             dnf_install: graphviz | ||||||
| @@ -38,13 +40,13 @@ jobs: | |||||||
|     name: PyPI packaging |     name: PyPI packaging | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v3 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|       - uses: actions/setup-python@v2 |       - uses: actions/setup-python@v4 | ||||||
|         name: Install Python |         name: Install Python | ||||||
|         with: |         with: | ||||||
|           python-version: '3.10' |           python-version: '3.11' | ||||||
|       - uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95 |       - uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95 | ||||||
|         with: |         with: | ||||||
|           password: ${{ secrets.PYPI_API_TOKEN }} |           password: ${{ secrets.PYPI_API_TOKEN }} | ||||||
| @@ -62,7 +64,7 @@ jobs: | |||||||
|         with: |         with: | ||||||
|           username: jktjkt |           username: jktjkt | ||||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} |           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v3 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|       - name: Extract tag name |       - name: Extract tag name | ||||||
| @@ -92,21 +94,27 @@ jobs: | |||||||
|             telecominfraproject/oopt-gnpy:${{ steps.extract_tag_name.outputs.GIT_DESC }} |             telecominfraproject/oopt-gnpy:${{ steps.extract_tag_name.outputs.GIT_DESC }} | ||||||
|             telecominfraproject/oopt-gnpy:latest |             telecominfraproject/oopt-gnpy:latest | ||||||
|  |  | ||||||
|   windows: |   other-platforms: | ||||||
|     name: Tests on Windows |     name: Tests on other platforms | ||||||
|     runs-on: windows-2019 |     runs-on: ${{ matrix.os }} | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v2 |       - uses: actions/checkout@v3 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|       - uses: actions/setup-python@v2 |       - uses: actions/setup-python@v4 | ||||||
|         with: |         with: | ||||||
|           python-version: ${{ matrix.python_version }} |           python-version: ${{ matrix.python_version }} | ||||||
|       - run: | |       - run: | | ||||||
|  |           pip install -r tests/requirements.txt | ||||||
|           pip install --editable . |           pip install --editable . | ||||||
|           pip install 'pytest>=6.2.5,<7' |  | ||||||
|           pytest -vv |           pytest -vv | ||||||
|     strategy: |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         python_version: |         include: | ||||||
|           - "3.10" |           - os: windows-2019 | ||||||
|  |             python_version: "3.10" | ||||||
|  |           - os: windows-2022 | ||||||
|  |             python_version: "3.11" | ||||||
|  |           - os: macos-12 | ||||||
|  |             python_version: "3.11" | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -1,27 +0,0 @@ | |||||||
| dist: focal |  | ||||||
| os: linux |  | ||||||
| language: python |  | ||||||
| services: docker |  | ||||||
| python: |  | ||||||
|   - "3.8" |  | ||||||
|   - "3.9" |  | ||||||
| before_install: |  | ||||||
|   - sudo apt-get -y install graphviz |  | ||||||
| install: skip |  | ||||||
| script: |  | ||||||
|   - pip install --editable . |  | ||||||
|   - pip install pytest-cov rstcheck |  | ||||||
|   - pytest --cov-report=xml --cov=gnpy -v |  | ||||||
|   - pip install -r docs/requirements.txt |  | ||||||
|   - rstcheck --ignore-roles cite *.rst |  | ||||||
|   - sphinx-build -W --keep-going docs/ x-throwaway-location |  | ||||||
| after_success: |  | ||||||
|   - bash <(curl -s https://codecov.io/bash) |  | ||||||
| jobs: |  | ||||||
|   include: |  | ||||||
|     - stage: test |  | ||||||
|       name: Docker image |  | ||||||
|       script: |  | ||||||
|         - git fetch --unshallow |  | ||||||
|         - ./.docker-travis.sh |  | ||||||
|         - docker images |  | ||||||
							
								
								
									
										22
									
								
								.zuul.yaml
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								.zuul.yaml
									
									
									
									
									
								
							| @@ -2,10 +2,18 @@ | |||||||
| - project: | - project: | ||||||
|     check: |     check: | ||||||
|       jobs: |       jobs: | ||||||
|         - tox-py38 |         - tox-py38: | ||||||
|         - tox-py39 |             vars: | ||||||
|         - tox-py310-cover |               ensure_tox_version: '<4' | ||||||
|         - tox-docs-f35 |         - tox-py39: | ||||||
|  |             vars: | ||||||
|  |               ensure_tox_version: '<4' | ||||||
|  |         - tox-py310-cover: | ||||||
|  |             vars: | ||||||
|  |               ensure_tox_version: '<4' | ||||||
|  |         - tox-docs-f36: | ||||||
|  |             vars: | ||||||
|  |               ensure_tox_version: '<4' | ||||||
|         - coverage-diff: |         - coverage-diff: | ||||||
|             voting: false |             voting: false | ||||||
|             dependencies: |             dependencies: | ||||||
| @@ -16,7 +24,11 @@ | |||||||
|               coverage_job_name_current: tox-py310-cover |               coverage_job_name_current: tox-py310-cover | ||||||
|         - tox-linters-diff-n-report: |         - tox-linters-diff-n-report: | ||||||
|             voting: false |             voting: false | ||||||
|         - tox-py310-cover-previous |             vars: | ||||||
|  |               ensure_tox_version: '<4' | ||||||
|  |         - tox-py310-cover-previous: | ||||||
|  |             vars: | ||||||
|  |               ensure_tox_version: '<4' | ||||||
|     tag: |     tag: | ||||||
|       jobs: |       jobs: | ||||||
|         - oopt-release-python: |         - oopt-release-python: | ||||||
|   | |||||||
| @@ -11,18 +11,21 @@ To learn how to contribute, please see CONTRIBUTING.md | |||||||
| - Brian Taylor (Facebook) <briantaylor@fb.com> | - Brian Taylor (Facebook) <briantaylor@fb.com> | ||||||
| - David Boertjes (Ciena) <dboertje@ciena.com> | - David Boertjes (Ciena) <dboertje@ciena.com> | ||||||
| - Diego Landa (Facebook) <dlanda@fb.com> | - Diego Landa (Facebook) <dlanda@fb.com> | ||||||
|  | - Emmanuelle Delfour (Orange) <WEDE7391@orange.com> | ||||||
| - Esther Le Rouzic (Orange) <esther.lerouzic@orange.com> | - Esther Le Rouzic (Orange) <esther.lerouzic@orange.com> | ||||||
| - Gabriele Galimberti (Cisco) <ggalimbe@cisco.com> | - Gabriele Galimberti (Cisco) <ggalimbe@cisco.com> | ||||||
| - Gert Grammel (Juniper Networks) <ggrammel@juniper.net> | - Gert Grammel (Juniper Networks) <ggrammel@juniper.net> | ||||||
|  | - Giacomo Borraccini (Politecnico di Torino) <giacomo.borraccini@polito.it> | ||||||
| - Gilad Goldfarb (Facebook) <giladg@fb.com> | - Gilad Goldfarb (Facebook) <giladg@fb.com> | ||||||
| - James Powell (Telecom Infra Project) <james.powell@telecominfraproject.com> | - James Powell (Telecom Infra Project) <james.powell@telecominfraproject.com> | ||||||
| - Jan Kundrát (Telecom Infra Project) <jan.kundrat@telecominfraproject.com> | - Jan Kundrát (Telecom Infra Project) <jkt@jankundrat.com> | ||||||
| - Jeanluc Augé (Orange) <jeanluc.auge@orange.com> | - Jeanluc Augé (Orange) <jeanluc.auge@orange.com> | ||||||
| - Jonas Mårtensson (RISE) <jonas.martensson@ri.se> | - Jonas Mårtensson (RISE) <jonas.martensson@ri.se> | ||||||
| - Mattia Cantono (Politecnico di Torino) <mattia.cantono@polito.it> | - Mattia Cantono (Politecnico di Torino) <mattia.cantono@polito.it> | ||||||
| - Miguel Garrich (University Catalunya) <miquel.garrich@upct.es> | - Miguel Garrich (University Catalunya) <miquel.garrich@upct.es> | ||||||
| - Raj Nagarajan (Lumentum) <raj.nagarajan@lumentum.com> | - Raj Nagarajan (Lumentum) <raj.nagarajan@lumentum.com> | ||||||
| - Roberts Miculens (Lattelecom) <roberts.miculens@lattelecom.lv> | - Roberts Miculens (Lattelecom) <roberts.miculens@lattelecom.lv> | ||||||
|  | - Sami Alavi (NUST) <sami.mansooralavi1999@gmail.com> | ||||||
| - Shengxiang Zhu (University of Arizona) <szhu@email.arizona.edu> | - Shengxiang Zhu (University of Arizona) <szhu@email.arizona.edu> | ||||||
| - Stefan Melin (Telia Company) <Stefan.Melin@teliacompany.com> | - Stefan Melin (Telia Company) <Stefan.Melin@teliacompany.com> | ||||||
| - Vittorio Curri (Politecnico di Torino) <vittorio.curri@polito.it> | - Vittorio Curri (Politecnico di Torino) <vittorio.curri@polito.it> | ||||||
|   | |||||||
| @@ -3,12 +3,12 @@ | |||||||
| [](https://pypi.org/project/gnpy/) | [](https://pypi.org/project/gnpy/) | ||||||
| [](https://pypi.org/project/gnpy/) | [](https://pypi.org/project/gnpy/) | ||||||
| [](http://gnpy.readthedocs.io/en/master/?badge=master) | [](http://gnpy.readthedocs.io/en/master/?badge=master) | ||||||
| [](https://github.com/Telecominfraproject/oopt-gnpy/actions/workflows/main.yml) | [](https://github.com/Telecominfraproject/oopt-gnpy/actions/workflows/main.yml) | ||||||
| [](https://review.gerrithub.io/q/project:Telecominfraproject/oopt-gnpy+is:open) | [](https://review.gerrithub.io/q/project:Telecominfraproject/oopt-gnpy+is:open) | ||||||
| [](https://github.com/Telecominfraproject/oopt-gnpy/graphs/contributors) | [](https://github.com/Telecominfraproject/oopt-gnpy/graphs/contributors) | ||||||
| [](https://lgtm.com/projects/g/Telecominfraproject/oopt-gnpy/) |  | ||||||
| [](https://codecov.io/gh/Telecominfraproject/oopt-gnpy) | [](https://codecov.io/gh/Telecominfraproject/oopt-gnpy) | ||||||
| [](https://doi.org/10.5281/zenodo.3458319) | [](https://doi.org/10.5281/zenodo.3458319) | ||||||
|  | [](https://matrix.to/#/%23oopt-gnpy%3Afoss.wtf?via=matrix.org&via=foss.wtf) | ||||||
|  |  | ||||||
| GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks. | 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. | 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. | ||||||
| @@ -26,4 +26,6 @@ This example demonstrates how GNPy can be used to check the expected SNR at the | |||||||
|  |  | ||||||
|  |  | ||||||
| GNPy can do much more, including acting as a Path Computation Engine, tracking bandwidth requests, or advising the SDN controller about a best possible path through a large DWDM network. | GNPy can do much more, including acting as a Path Computation Engine, tracking bandwidth requests, or advising the SDN controller about a best possible path through a large DWDM network. | ||||||
| Learn more about this [in the documentation](https://gnpy.readthedocs.io/). | Learn more about this [in the documentation](https://gnpy.readthedocs.io/), or give it a [try online at `gnpy.app`](https://gnpy.app/): | ||||||
|  |  | ||||||
|  | [](https://gnpy.app/) | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ We encourage all interested people outside the TIP to [join the project](https:/ | |||||||
|  |  | ||||||
| `gnpy` is looking for additional contributors, especially those with experience planning and maintaining large-scale, real-world mesh optical networks. | `gnpy` is looking for additional contributors, especially those with experience planning and maintaining large-scale, real-world mesh optical networks. | ||||||
|  |  | ||||||
| To get involved, please contact [Jan Kundrát](mailto:jan.kundrat@telecominfraproject.com) or [Gert Grammel](mailto:ggrammel@juniper.net). | To get involved, please contact [Jan Kundrát](mailto:jkt@jankundrat.com) or [Gert Grammel](mailto:ggrammel@juniper.net). | ||||||
|  |  | ||||||
| `gnpy` contributions are currently limited to members of [TIP](http://telecominfraproject.com). | `gnpy` contributions are currently limited to members of [TIP](http://telecominfraproject.com). | ||||||
| Membership is free and open to all. | Membership is free and open to all. | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ This path is directional, and all "GNPy elements" along the path match the unidi | |||||||
|  |  | ||||||
| The network topology contains not just the physical topology of the network, but also references to the :ref:`equipment library<concepts-equipment>` and a set of *operating parameters* for each entity. | The network topology contains not just the physical topology of the network, but also references to the :ref:`equipment library<concepts-equipment>` and a set of *operating parameters* for each entity. | ||||||
| These parameters include the **fiber length** of each fiber, the connector **attenutation losses**, or an amplifier's specific **gain setting**. | These parameters include the **fiber length** of each fiber, the connector **attenutation losses**, or an amplifier's specific **gain setting**. | ||||||
| The topology is specified via :ref:`XLS files<excel>` or via :ref:`JSON<json>`. | The topology is specified via :ref:`XLS files<excel>` or via :ref:`JSON<legacy-json>`. | ||||||
|  |  | ||||||
| .. _complete-vs-incomplete: | .. _complete-vs-incomplete: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -100,10 +100,10 @@ Raman Amplifiers | |||||||
|  |  | ||||||
| An accurate simulation of Raman amplification requires knowledge of: | An accurate simulation of Raman amplification requires knowledge of: | ||||||
|  |  | ||||||
| - the *power* and *wavelength* of all Raman pumping lasers, | * the *power* and *wavelength* of all Raman pumping lasers, | ||||||
| - the *direction*, whether it is co-propagating or counter-propagating, | * the *direction*, whether it is co-propagating or counter-propagating, | ||||||
| - the Raman efficiency of the fiber, | * the Raman efficiency of the fiber, | ||||||
| - the fiber temperature. | * the fiber temperature. | ||||||
|  |  | ||||||
| Under certain scenarios it is useful to be able to run a simulation without an accurate Raman description. | Under certain scenarios it is useful to be able to run a simulation without an accurate Raman description. | ||||||
| For these purposes, it is possible to approximate a Raman amplifier via a fixed-gain EDFA with the :ref:`polynomial NF<ext-nf-model-polynomial-NF>` model using :math:`\text{a} = \text{b} = \text{c} = 0`, and a desired effective :math:`\text{d} = NF`. | For these purposes, it is possible to approximate a Raman amplifier via a fixed-gain EDFA with the :ref:`polynomial NF<ext-nf-model-polynomial-NF>` model using :math:`\text{a} = \text{b} = \text{c} = 0`, and a desired effective :math:`\text{d} = NF`. | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								docs/images/2022-04-12-gnpy-app.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/images/2022-04-12-gnpy-app.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 288 KiB | 
| @@ -10,7 +10,7 @@ fully-functional programs. | |||||||
|  |  | ||||||
|     **Note**: *If you are a network operator or involved in route planning and |     **Note**: *If you are a network operator or involved in route planning and | ||||||
|     optimization for your organization, please contact project maintainer Jan |     optimization for your organization, please contact project maintainer Jan | ||||||
|     Kundrát <jan.kundrat@telecominfraproject.com>. gnpy is looking for users with |     Kundrát <jkt@jankundrat.com>. gnpy is looking for users with | ||||||
|     specific, delineated use cases to drive requirements for future |     specific, delineated use cases to drive requirements for future | ||||||
|     development.* |     development.* | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										290
									
								
								docs/json.rst
									
									
									
									
									
								
							
							
						
						
									
										290
									
								
								docs/json.rst
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| .. _json: | .. _legacy-json: | ||||||
|  |  | ||||||
| JSON Input Files | JSON Input Files | ||||||
| ================ | ================ | ||||||
| @@ -44,7 +44,7 @@ For all amplifier models: | |||||||
| | ``type_variety``       | (string)  | a unique name to ID the amplifier in the| | | ``type_variety``       | (string)  | a unique name to ID the amplifier in the| | ||||||
| |                        |           | JSON/Excel template topology input file | | |                        |           | JSON/Excel template topology input file | | ||||||
| +------------------------+-----------+-----------------------------------------+ | +------------------------+-----------+-----------------------------------------+ | ||||||
| | ``out_voa_auto``       | (boolean) | auto_design feature to optimize the     | | | ``out_voa_auto``       | (boolean) | auto-design feature to optimize the     | | ||||||
| |                        |           | amplifier output VOA. If true, output   | | |                        |           | amplifier output VOA. If true, output   | | ||||||
| |                        |           | VOA is present and will be used to push | | |                        |           | VOA is present and will be used to push | | ||||||
| |                        |           | amplifier gain to its maximum, within   | | |                        |           | amplifier gain to its maximum, within   | | ||||||
| @@ -176,36 +176,36 @@ ROADM | |||||||
|  |  | ||||||
| The user can only modify the value of existing parameters: | The user can only modify the value of existing parameters: | ||||||
|  |  | ||||||
| +--------------------------+-----------+---------------------------------------------+ | +-------------------------------+-----------+----------------------------------------------------+ | ||||||
| | field                    |   type    | description                                 | | | field                         |   type    | description                                        | | ||||||
| +==========================+===========+=============================================+ | +===============================+===========+====================================================+ | ||||||
| | ``target_pch_out_db``    | (number)  | Auto-design sets the ROADM egress channel   | | | ``target_pch_out_db``         | (number)  | Default :ref:`equalization strategy<equalization>` | | ||||||
| |                          |           | power. This reflects typical control loop   | | | or                            |           | for this ROADM type.                               | | ||||||
| |                          |           | algorithms that adjust ROADM losses to      | | | ``target_psd_out_mWperGHz``   |           |                                                    | | ||||||
| |                          |           | equalize channels (eg coming from different | | | or                            |           | Auto-design sets the ROADM egress channel          | | ||||||
| |                          |           | ingress direction or add ports)             | | | ``target_out_mWperSlotWidth`` |           | power. This reflects typical control loop          | | ||||||
| |                          |           | This is the default value                   | | | (mutually exclusive)          |           | algorithms that adjust ROADM losses to             | | ||||||
| |                          |           | Roadm/params/target_pch_out_db if no value  | | |                               |           | equalize channels (e.g., coming from               | | ||||||
| |                          |           | is given in the ``Roadm`` element in the    | | |                               |           | different ingress direction or add ports).         | | ||||||
| |                          |           | topology input description.                 | | |                               |           |                                                    | | ||||||
| |                          |           | This default value is ignored if a          | | |                               |           | These values are used as defaults when no          | | ||||||
| |                          |           | params/target_pch_out_db value is input in  | | |                               |           | overrides are set per each ``Roadm``               | | ||||||
| |                          |           | the topology for a given ROADM.             | | |                               |           | element in the network topology.                   | | ||||||
| +--------------------------+-----------+---------------------------------------------+ | +-------------------------------+-----------+----------------------------------------------------+ | ||||||
| | ``add_drop_osnr``        | (number)  | OSNR contribution from the add/drop ports   | | | ``add_drop_osnr``             | (number)  | OSNR contribution from the add/drop ports          | | ||||||
| +--------------------------+-----------+---------------------------------------------+ | +-------------------------------+-----------+----------------------------------------------------+ | ||||||
| | ``pmd``                  | (number)  | Polarization mode dispersion (PMD). (s)     | | | ``pmd``                       | (number)  | Polarization mode dispersion (PMD). (s)            | | ||||||
| +--------------------------+-----------+---------------------------------------------+ | +-------------------------------+-----------+----------------------------------------------------+ | ||||||
| | ``restrictions``         | (dict of  | If non-empty, keys ``preamp_variety_list``  | | | ``restrictions``              | (dict of  | If non-empty, keys ``preamp_variety_list``         | | ||||||
| |                          |  strings) | and ``booster_variety_list`` represent      | | |                               |  strings) | and ``booster_variety_list`` represent             | | ||||||
| |                          |           | list of ``type_variety`` amplifiers which   | | |                               |           | list of ``type_variety`` amplifiers which          | | ||||||
| |                          |           | are allowed for auto-design within ROADM's  | | |                               |           | are allowed for auto-design within ROADM's         | | ||||||
| |                          |           | line degrees.                               | | |                               |           | line degrees.                                      | | ||||||
| |                          |           |                                             | | |                               |           |                                                    | | ||||||
| |                          |           | If no booster should be placed on a degree, | | |                               |           | If no booster should be placed on a degree,        | | ||||||
| |                          |           | insert a ``Fused`` node on the degree       | | |                               |           | insert a ``Fused`` node on the degree              | | ||||||
| |                          |           | output.                                     | | |                               |           | output.                                            | | ||||||
| +--------------------------+-----------+---------------------------------------------+ | +-------------------------------+-----------+----------------------------------------------------+ | ||||||
|  |  | ||||||
| Global parameters | Global parameters | ||||||
| ----------------- | ----------------- | ||||||
| @@ -223,6 +223,9 @@ For amplifiers defined in the topology JSON input but whose ``gain = 0`` (placeh | |||||||
| The file ``sim_params.json`` contains the tuning parameters used within both the ``gnpy.science_utils.RamanSolver`` and | The file ``sim_params.json`` contains the tuning parameters used within both the ``gnpy.science_utils.RamanSolver`` and | ||||||
| the ``gnpy.science_utils.NliSolver`` for the evaluation of the Raman profile and the NLI generation, respectively. | the ``gnpy.science_utils.NliSolver`` for the evaluation of the Raman profile and the NLI generation, respectively. | ||||||
|  |  | ||||||
|  | If amplifiers don't have settings, auto-design also sets amplifiers gain, output VOA and target powers according to [J. -L. Auge, V. Curri and E. Le Rouzic, Open Design for Multi-Vendor Optical Networks, OFC 2019](https://ieeexplore.ieee.org/document/8696699), equation 4. | ||||||
|  | See ``delta_power_range_db`` for more explaination. | ||||||
|  |  | ||||||
| +---------------------------------------------+-----------+---------------------------------------------+ | +---------------------------------------------+-----------+---------------------------------------------+ | ||||||
| | field                                       |   type    | description                                 | | | field                                       |   type    | description                                 | | ||||||
| +=============================================+===========+=============================================+ | +=============================================+===========+=============================================+ | ||||||
| @@ -283,23 +286,27 @@ Span configuration is not a list (which may change in later releases) and the us | |||||||
| +-------------------------------------+-----------+---------------------------------------------+ | +-------------------------------------+-----------+---------------------------------------------+ | ||||||
| | field                               | type      | description                                 | | | field                               | type      | description                                 | | ||||||
| +=====================================+===========+=============================================+ | +=====================================+===========+=============================================+ | ||||||
| | ``power_mode``                      | (boolean) | If false, gain mode. Auto-design sets       | | | ``power_mode``                      | (boolean) | If false, **gain mode**. In the gain mode,  | | ||||||
| |                                     |           | amplifier gain = preceding span loss,       | | |                                     |           | only gain settings are used for             | | ||||||
| |                                     |           | unless the amplifier exists and its         | | |                                     |           | propagation, and ``delta_p`` is ignored.    | | ||||||
| |                                     |           | gain > 0 in the topology input JSON.        | | |                                     |           | If no ``gain_target`` is set in an          | | ||||||
| |                                     |           | If true, power mode (recommended for        | | |                                     |           | amplifier, auto-design computes one         | | ||||||
| |                                     |           | auto-design and power sweep.)               | | |                                     |           | according to the ``delta_power_range``      | | ||||||
| |                                     |           | Auto-design sets amplifier power            | | |                                     |           | optimisation range.                         | | ||||||
| |                                     |           | according to delta_power_range. If the      | | |                                     |           | The gain mode                               | | ||||||
| |                                     |           | amplifier exists with gain > 0 in the       | | |                                     |           | is recommended if all the amplifiers        | | ||||||
| |                                     |           | topology JSON input, then its gain is       | | |                                     |           | have already consistent gain settings in    | | ||||||
| |                                     |           | translated into a power target/channel.     | | |                                     |           | the topology input file.                    | | ||||||
| |                                     |           | Moreover, when performing a power sweep     | | |                                     |           |                                             | | ||||||
| |                                     |           | (see ``power_range_db`` in the SI           | | |                                     |           | If true, **power mode**. In the power mode, | | ||||||
| |                                     |           | configuration library) the power sweep      | | |                                     |           | only the ``delta_p`` is used for            | | ||||||
| |                                     |           | is performed w/r/t this power target,       | | |                                     |           | propagation, and ``gain_target`` is         | | ||||||
| |                                     |           | regardless of preceding amplifiers          | | |                                     |           | ignored.                                    | | ||||||
| |                                     |           | power saturation/limitations.               | | |                                     |           | The power mode is recommended for           | | ||||||
|  | |                                     |           | auto-design and power sweep.                | | ||||||
|  | |                                     |           | If no ``delta_p``  is set,                  | | ||||||
|  | |                                     |           | auto-design sets an amplifier power target  | | ||||||
|  | |                                     |           | according to delta_power_range_db.          | | ||||||
| +-------------------------------------+-----------+---------------------------------------------+ | +-------------------------------------+-----------+---------------------------------------------+ | ||||||
| | ``delta_power_range_db``            | (number)  | Auto-design only, power-mode                | | | ``delta_power_range_db``            | (number)  | Auto-design only, power-mode                | | ||||||
| |                                     |           | only. Specifies the [min, max, step]        | | |                                     |           | only. Specifies the [min, max, step]        | | ||||||
| @@ -404,9 +411,9 @@ Span configuration is not a list (which may change in later releases) and the us | |||||||
| SpectralInformation | SpectralInformation | ||||||
| ~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
| The user can only modify the value of existing parameters. | GNPy requires a description of all channels that are propagated through the network. | ||||||
| It defines a spectrum of N identical carriers. | Flexgrid channel partitioning is available since the 2.7 release via the extra ``--spectrum`` option. | ||||||
| While the code libraries allow for different carriers and power levels, the current user parametrization only allows one carrier type and one power/channel definition. | In the simplest case, homogeneous channel allocation can be defined via the ``SpectralInformation`` construct which defines a spectrum of N identical carriers: | ||||||
|  |  | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | field                |   type    | description                               | | | field                |   type    | description                               | | ||||||
| @@ -427,11 +434,20 @@ While the code libraries allow for different carriers and power levels, the curr | |||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | ``tx_osnr``          | (number)  | In dB. OSNR out from transponder.         | | | ``tx_osnr``          | (number)  | In dB. OSNR out from transponder.         | | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | ``power_dbm``        | (number)  | Reference channel power. In gain mode     | | | ``power_dbm``        | (number)  | Reference channel power, in dBm.          | | ||||||
| |                      |           | (see spans/power_mode = false), all gain  | | |                      |           | In gain mode                              | | ||||||
| |                      |           | settings are offset w/r/t this reference  | | |                      |           | (see spans/power_mode = false), if no     | | ||||||
| |                      |           | power. In power mode, it is the           | | |                      |           | gain is set in an amplifier, auto-design  | | ||||||
| |                      |           | reference power for                       | | |                      |           | sets gain to meet this reference          | | ||||||
|  | |                      |           | power. If amplifiers gain is set,         | | ||||||
|  | |                      |           | ``power_dbm`` is                          | | ||||||
|  | |                      |           | ignored.                                  | | ||||||
|  | |                      |           |                                           | | ||||||
|  | |                      |           | In power mode, the ``power_dbm``          | | ||||||
|  | |                      |           | is the reference power for                | | ||||||
|  | |                      |           | the ``delta_p`` settings in amplifiers.   | | ||||||
|  | |                      |           | It is also the reference power for        | | ||||||
|  | |                      |           | auto-design power optimisation range      | | ||||||
| |                      |           | Spans/delta_power_range_db. For example,  | | |                      |           | Spans/delta_power_range_db. For example,  | | ||||||
| |                      |           | if delta_power_range_db = `[0,0,0]`, the  | | |                      |           | if delta_power_range_db = `[0,0,0]`, the  | | ||||||
| |                      |           | same power=power_dbm is launched in every | | |                      |           | same power=power_dbm is launched in every | | ||||||
| @@ -439,12 +455,166 @@ While the code libraries allow for different carriers and power levels, the curr | |||||||
| |                      |           | with the power_dbm value: even if a       | | |                      |           | with the power_dbm value: even if a       | | ||||||
| |                      |           | power sweep is defined (see after) the    | | |                      |           | power sweep is defined (see after) the    | | ||||||
| |                      |           | design is not repeated.                   | | |                      |           | design is not repeated.                   | | ||||||
|  | |                      |           |                                           | | ||||||
|  | |                      |           | If the ``--power`` CLI option is used,    | | ||||||
|  | |                      |           | its value replaces this parameter.        | | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | ``power_range_db``   | (number)  | Power sweep excursion around power_dbm.   | | | ``power_range_db``   | (number)  | Power sweep excursion around              | | ||||||
| |                      |           | It is not the min and max channel power   | | |                      |           | ``power_dbm``.                            | | ||||||
| |                      |           | values! The reference power becomes:      | | |                      |           | This defines a list of reference powers   | | ||||||
|  | |                      |           | to run the propagation, in the range      | | ||||||
| |                      |           | power_range_db + power_dbm.               | | |                      |           | power_range_db + power_dbm.               | | ||||||
|  | |                      |           | Power sweep uses the ``delta_p`` targets  | | ||||||
|  | |                      |           | or, if they have not been set, the ones   | | ||||||
|  | |                      |           | computed by auto-design, regardless of    | | ||||||
|  | |                      |           | of preceding amplifiers' power            | | ||||||
|  | |                      |           | saturation.                               | | ||||||
|  | |                      |           |                                           | | ||||||
|  | |                      |           | Power sweep is an easy way to find the    | | ||||||
|  | |                      |           | optimal reference power.                  | | ||||||
|  | |                      |           |                                           | | ||||||
|  | |                      |           | Power sweep excursion is ignored in case  | | ||||||
|  | |                      |           | of gain mode.                             | | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
| | ``sys_margins``      | (number)  | In dB. Added margin on min required       | | | ``sys_margins``      | (number)  | In dB. Added margin on min required       | | ||||||
| |                      |           | transceiver OSNR.                         | | |                      |           | transceiver OSNR.                         | | ||||||
| +----------------------+-----------+-------------------------------------------+ | +----------------------+-----------+-------------------------------------------+ | ||||||
|  |  | ||||||
|  | .. _mixed-rate: | ||||||
|  |  | ||||||
|  | Arbitrary channel definition | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
|  | Non-uniform channels are defined via a list of spectrum "partitions" which are defined in an extra JSON file via the ``--spectrum`` option. | ||||||
|  | In this approach, each partition is internally homogeneous, but different partitions might use different channel widths, power targets, modulation rates, etc. | ||||||
|  |  | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | field                |   type    | description                               | | ||||||
|  | +======================+===========+===========================================+ | ||||||
|  | | ``f_min``,           | (number)  | In Hz. Mandatory.                         | | ||||||
|  | | ``f_max``            |           | Define partition :math:`f_{min}` is       | | ||||||
|  | |                      |           | the first carrier central frequency       | | ||||||
|  | |                      |           | :math:`f_{max}` is the last one.          | | ||||||
|  | |                      |           | :math:`f_{min}` -:math:`f_{max}`          | | ||||||
|  | |                      |           | partitions must not overlap.              | | ||||||
|  | |                      |           |                                           | | ||||||
|  | |                      |           | Note that the meaning of ``f_min`` and    | | ||||||
|  | |                      |           | ``f_max`` is different than the one in    | | ||||||
|  | |                      |           | ``SpectralInformation``.                  | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | ``baud_rate``        | (number)  | In Hz. Mandatory. Simulated baud rate.    | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | ``slot_width``       | (number)  | In Hz. Carrier spectrum occupation.       | | ||||||
|  | |                      |           | Carriers of this partition are spaced at  | | ||||||
|  | |                      |           | ``slot_width`` offsets.                   | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | ``roll_off``         | (number)  | Pure number between 0 and 1. Mandatory    | | ||||||
|  | |                      |           | TX signal roll-off shape. Used by         | | ||||||
|  | |                      |           | Raman-aware simulation code.              | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | ``tx_osnr``          | (number)  | In dB. Optional. OSNR out from            | | ||||||
|  | |                      |           | transponder. Default value is 40 dB.      | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  | | ``delta_pdb``        | (number)  | In dB. Optional. Power offset compared to | | ||||||
|  | |                      |           | the reference power used for design       | | ||||||
|  | |                      |           | (SI block in equipment library) to be     | | ||||||
|  | |                      |           | applied by ROADM to equalize the carriers | | ||||||
|  | |                      |           | in this partition. Default value is 0 dB. | | ||||||
|  | +----------------------+-----------+-------------------------------------------+ | ||||||
|  |  | ||||||
|  | For example this example: | ||||||
|  |  | ||||||
|  | .. code-block:: json | ||||||
|  |  | ||||||
|  |  { | ||||||
|  |    "SI":[ | ||||||
|  |      { | ||||||
|  |        "f_min": 191.4e12, | ||||||
|  |        "f_max":193.1e12, | ||||||
|  |        "baud_rate": 32e9, | ||||||
|  |        "slot_width": 50e9, | ||||||
|  |        "roll_off": 0.15, | ||||||
|  |        "tx_osnr": 40 | ||||||
|  |      }, | ||||||
|  |      { | ||||||
|  |        "f_min": 193.1625e12, | ||||||
|  |        "f_max":195e12, | ||||||
|  |        "baud_rate": 64e9, | ||||||
|  |        "delta_pdb": 3, | ||||||
|  |        "slot_width": 75e9, | ||||||
|  |        "roll_off": 0.15, | ||||||
|  |        "tx_osnr": 40 | ||||||
|  |      } | ||||||
|  |    ] | ||||||
|  |  } | ||||||
|  |  | ||||||
|  | ...defines a spectrum split into two parts. | ||||||
|  | Carriers with central frequencies ranging from 191.4 THz to 193.1 THz will have 32 GBaud rate and will be spaced by 50 Ghz. | ||||||
|  | Carriers with central frequencies ranging from 193.1625 THz to 195 THz will have 64 GBaud rate and will be spaced by 75 GHz with 3 dB power offset. | ||||||
|  |  | ||||||
|  | If the SI reference carrier is set to ``power_dbm`` = 0dBm, and the ROADM has ``target_pch_out_db`` set to -20 dBm, then all channels ranging from 191.4 THz to 193.1 THz will have their power equalized to -20 + 0 dBm (due to the 0 dB power offset). | ||||||
|  | All channels ranging from 193.1625 THz to 195 THz will have their power equalized to -20 + 3 = -17 dBm (total power signal + noise). | ||||||
|  |  | ||||||
|  | Note that first carrier of the second partition has center frequency 193.1625 THz (its spectrum occupation ranges from 193.125 THz to 193.2 THz). | ||||||
|  | The last carrier of the second partition has center frequency 193.1 THz and spectrum occupation ranges from 193.075 THz to 193.125 THz. | ||||||
|  | There is no overlap of the occupation and both share the same boundary. | ||||||
|  |  | ||||||
|  | .. _equalization: | ||||||
|  |  | ||||||
|  | Equalization choices | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
|  | ROADMs typically equalize the optical power across multiple channels using one of the available equalization strategies — either targeting a specific output power, or a specific power spectral density (PSD), or a spectfic power spectral density using slot_width as spectrum width reference (PSW). | ||||||
|  | All of these strategies can be adjusted by a per-channel power offset. | ||||||
|  | The equalization strategy can be defined globally per a ROADM model, or per each ROADM instance in the topology, and within a ROADM also on a per-degree basis. | ||||||
|  |  | ||||||
|  | Let's consider some example for the equalization. Suppose that the types of signal to be propagated are the following: | ||||||
|  |  | ||||||
|  | .. code-block:: json | ||||||
|  |  | ||||||
|  |    { | ||||||
|  |         "baud_rate": 32e9, | ||||||
|  |         "f_min":191.3e12, | ||||||
|  |         "f_max":192.3e12, | ||||||
|  |         "spacing": 50e9, | ||||||
|  |         "label": 1 | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |         "baud_rate": 64e9, | ||||||
|  |         "f_min":193.3e12, | ||||||
|  |         "f_max":194.3e12, | ||||||
|  |         "spacing": 75e9, | ||||||
|  |         "label": 2 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | with the PSD equalization in a ROADM: | ||||||
|  |  | ||||||
|  | .. code-block:: json | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |       "uid": "roadm A", | ||||||
|  |       "type": "Roadm", | ||||||
|  |       "params": { | ||||||
|  |         "target_psd_out_mWperGHz": 3.125e-4, | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |  | ||||||
|  | This means that power out of the ROADM will be computed as 3.125e-4 * 32 = 0.01 mW ie -20 dBm for label 1 types of carriers | ||||||
|  | and 3.125e4 * 64 = 0.02 mW ie -16.99 dBm for label2 channels. So a ratio of ~ 3 dB between target powers for these carriers. | ||||||
|  |  | ||||||
|  | With the PSW equalization: | ||||||
|  |  | ||||||
|  | .. code-block:: json | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |       "uid": "roadm A", | ||||||
|  |       "type": "Roadm", | ||||||
|  |       "params": { | ||||||
|  |         "target_out_mWperSlotWidth": 2.0e-4, | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  | the power out of the ROADM will be computed as 2.0e-4 * 50 = 0.01 mW ie -20 dBm for label 1 types of carriers | ||||||
|  | and 2.0e4 * 75 = 0.015 mW ie -18.24 dBm for label2 channels. So a ratio of ~ 1.76 dB between target powers for these carriers. | ||||||
|   | |||||||
| @@ -21,16 +21,19 @@ instance as a result. | |||||||
| """ | """ | ||||||
|  |  | ||||||
| from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\ | from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\ | ||||||
|     squeeze, zeros, append, flip, outer |     squeeze, zeros, append, flip, outer, ndarray | ||||||
| from scipy.constants import h, c | from scipy.constants import h, c | ||||||
| from scipy.interpolate import interp1d | from scipy.interpolate import interp1d | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  | from typing import Union | ||||||
|  |  | ||||||
| from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum |  | ||||||
|  | from gnpy.core.utils import lin2db, db2lin, arrange_frequencies, snr_sum, per_label_average, pretty_summary_print, \ | ||||||
|  |     watt2dbm, psd2powerdbm | ||||||
| from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational | from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational | ||||||
| from gnpy.core.science_utils import NliSolver, RamanSolver | from gnpy.core.science_utils import NliSolver, RamanSolver | ||||||
| from gnpy.core.info import SpectralInformation | from gnpy.core.info import SpectralInformation, ReferenceCarrier | ||||||
| from gnpy.core.exceptions import NetworkTopologyError, SpectrumError | from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError | ||||||
|  |  | ||||||
|  |  | ||||||
| class Location(namedtuple('Location', 'latitude longitude city region')): | class Location(namedtuple('Location', 'latitude longitude city region')): | ||||||
| @@ -86,6 +89,7 @@ class Transceiver(_Node): | |||||||
|         self.pdl = None |         self.pdl = None | ||||||
|         self.penalties = {} |         self.penalties = {} | ||||||
|         self.total_penalty = 0 |         self.total_penalty = 0 | ||||||
|  |         self.propagated_labels = [""] | ||||||
|  |  | ||||||
|     def _calc_cd(self, spectral_info): |     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. | ||||||
| @@ -116,6 +120,7 @@ class Transceiver(_Node): | |||||||
|  |  | ||||||
|     def _calc_snr(self, spectral_info): |     def _calc_snr(self, spectral_info): | ||||||
|         with errstate(divide='ignore'): |         with errstate(divide='ignore'): | ||||||
|  |             self.propagated_labels = spectral_info.label | ||||||
|             self.baud_rate = spectral_info.baud_rate |             self.baud_rate = spectral_info.baud_rate | ||||||
|             ratio_01nm = lin2db(12.5e9 / self.baud_rate) |             ratio_01nm = lin2db(12.5e9 / self.baud_rate) | ||||||
|             # set raw values to record original calculation, before update_snr() |             # set raw values to record original calculation, before update_snr() | ||||||
| @@ -173,23 +178,22 @@ class Transceiver(_Node): | |||||||
|         if self.snr is None or self.osnr_ase is None: |         if self.snr is None or self.osnr_ase is None: | ||||||
|             return f'{type(self).__name__} {self.uid}' |             return f'{type(self).__name__} {self.uid}' | ||||||
|  |  | ||||||
|         snr = round(mean(self.snr), 2) |         snr = per_label_average(self.snr, self.propagated_labels) | ||||||
|         osnr_ase = round(mean(self.osnr_ase), 2) |         osnr_ase = per_label_average(self.osnr_ase, self.propagated_labels) | ||||||
|         osnr_ase_01nm = round(mean(self.osnr_ase_01nm), 2) |         osnr_ase_01nm = per_label_average(self.osnr_ase_01nm, self.propagated_labels) | ||||||
|         snr_01nm = round(mean(self.snr_01nm), 2) |         snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels) | ||||||
|         cd = mean(self.chromatic_dispersion) |         cd = mean(self.chromatic_dispersion) | ||||||
|         pmd = mean(self.pmd) |         pmd = mean(self.pmd) | ||||||
|         pdl = mean(self.pdl) |         pdl = mean(self.pdl) | ||||||
|  |  | ||||||
|         result = '\n'.join([f'{type(self).__name__} {self.uid}', |         result = '\n'.join([f'{type(self).__name__} {self.uid}', | ||||||
|  |                             f'  GSNR (0.1nm, dB):          {pretty_summary_print(snr_01nm)}', | ||||||
|                           f'  GSNR (0.1nm, dB):          {snr_01nm:.2f}', |                             f'  GSNR (signal bw, dB):      {pretty_summary_print(snr)}', | ||||||
|                           f'  GSNR (signal bw, dB):      {snr:.2f}', |                             f'  OSNR ASE (0.1nm, dB):      {pretty_summary_print(osnr_ase_01nm)}', | ||||||
|                           f'  OSNR ASE (0.1nm, dB):      {osnr_ase_01nm:.2f}', |                             f'  OSNR ASE (signal bw, dB):  {pretty_summary_print(osnr_ase)}', | ||||||
|                           f'  OSNR ASE (signal bw, dB):  {osnr_ase:.2f}', |                             f'  CD (ps/nm):                {cd:.2f}', | ||||||
|                           f'  CD (ps/nm):                {cd:.2f}', |                             f'  PMD (ps):                  {pmd:.2f}', | ||||||
|                           f'  PMD (ps):                  {pmd:.2f}', |                             f'  PDL (dB):                  {pdl:.2f}']) | ||||||
|                           f'  PDL (dB):                  {pdl:.2f}']) |  | ||||||
|  |  | ||||||
|         cd_penalty = self.penalties.get('chromatic_dispersion') |         cd_penalty = self.penalties.get('chromatic_dispersion') | ||||||
|         if cd_penalty is not None: |         if cd_penalty is not None: | ||||||
| @@ -215,63 +219,185 @@ class Roadm(_Node): | |||||||
|     def __init__(self, *args, params=None, **kwargs): |     def __init__(self, *args, params=None, **kwargs): | ||||||
|         if not params: |         if not params: | ||||||
|             params = {} |             params = {} | ||||||
|         super().__init__(*args, params=RoadmParams(**params), **kwargs) |         try: | ||||||
|         self.pch_out_db = self.params.target_pch_out_db |             super().__init__(*args, params=RoadmParams(**params), **kwargs) | ||||||
|  |         except ParametersError as e: | ||||||
|  |             raise ParametersError(f'Config error in {kwargs["uid"]}: {e}') 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. | ||||||
|  |         self.ref_pch_out_dbm = None | ||||||
|         self.loss = 0  # auto-design interest |         self.loss = 0  # auto-design interest | ||||||
|         self.effective_loss = None |  | ||||||
|  |         # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for | ||||||
|  |         # different carriers. The ref_effective_loss records the loss for a reference carrier. | ||||||
|  |         self.ref_effective_loss = None | ||||||
|  |  | ||||||
|         self.passive = True |         self.passive = True | ||||||
|         self.restrictions = self.params.restrictions |         self.restrictions = self.params.restrictions | ||||||
|         self.per_degree_pch_out_db = self.params.per_degree_pch_out_db |         self.propagated_labels = [""] | ||||||
|  |         # element contains the two types of equalisation parameters, but only one is not None or empty | ||||||
|  |         # target for equalization for the ROADM only one must be not None | ||||||
|  |         self.target_pch_out_dbm = self.params.target_pch_out_db | ||||||
|  |         self.target_psd_out_mWperGHz = self.params.target_psd_out_mWperGHz | ||||||
|  |         self.target_out_mWperSlotWidth = self.params.target_out_mWperSlotWidth | ||||||
|  |         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 | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def to_json(self): |     def to_json(self): | ||||||
|         return {'uid': self.uid, |         if self.target_pch_out_dbm is not None: | ||||||
|                 'type': type(self).__name__, |             equalisation, value = 'target_pch_out_db', self.target_pch_out_dbm | ||||||
|                 'params': { |         elif self.target_psd_out_mWperGHz is not None: | ||||||
|                     'target_pch_out_db': self.pch_out_db, |             equalisation, value = 'target_psd_out_mWperGHz', self.target_psd_out_mWperGHz | ||||||
|                     'restrictions': self.restrictions, |         elif self.target_out_mWperSlotWidth is not None: | ||||||
|                     'per_degree_pch_out_db': self.per_degree_pch_out_db |             equalisation, value = 'target_out_mWperSlotWidth', self.target_out_mWperSlotWidth | ||||||
|                     }, |         else: | ||||||
|                 'metadata': { |             assert False, 'There must be one default equalization defined in ROADM' | ||||||
|                     'location': self.metadata['location']._asdict() |         to_json = { | ||||||
|                 } |             'uid': self.uid, | ||||||
|                 } |             'type': type(self).__name__, | ||||||
|  |             'params': { | ||||||
|  |                 equalisation: value, | ||||||
|  |                 'restrictions': self.restrictions, | ||||||
|  |             }, | ||||||
|  |             'metadata': { | ||||||
|  |                 'location': self.metadata['location']._asdict() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         # several per_degree equalization may coexist on different degrees | ||||||
|  |         if self.per_degree_pch_out_dbm: | ||||||
|  |             to_json['params']['per_degree_pch_out_db'] = self.per_degree_pch_out_dbm | ||||||
|  |         if self.per_degree_pch_psd: | ||||||
|  |             to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd | ||||||
|  |         if self.per_degree_pch_psw: | ||||||
|  |             to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw | ||||||
|  |         return to_json | ||||||
|  |  | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return f'{type(self).__name__}(uid={self.uid!r}, loss={self.loss!r})' |         return f'{type(self).__name__}(uid={self.uid!r}, loss={self.loss!r})' | ||||||
|  |  | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         if self.effective_loss is None: |         if self.ref_effective_loss is None: | ||||||
|             return f'{type(self).__name__} {self.uid}' |             return f'{type(self).__name__} {self.uid}' | ||||||
|  |  | ||||||
|  |         total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels)) | ||||||
|         return '\n'.join([f'{type(self).__name__} {self.uid}', |         return '\n'.join([f'{type(self).__name__} {self.uid}', | ||||||
|                           f'  effective loss (dB):  {self.effective_loss:.2f}', |                           f'  effective loss (dB):     {self.ref_effective_loss:.2f}', | ||||||
|                           f'  pch out (dBm):        {self.pch_out_db:.2f}']) |                           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]: | ||||||
|  |         """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 | ||||||
|  |         target_pch_out_dbm is defined to -20 dbm, then the function returns an array of powers | ||||||
|  |         [-20, -20, -20, -20, -20] | ||||||
|  |         if target_psd_out_mWperGHz is defined instead with 3.125e-4mW/GHz then it returns | ||||||
|  |         [-20, -18.819, -16.9897, -18.819, -20] | ||||||
|  |         if instead a reference_baud_rate is defined, the functions computes the result for a | ||||||
|  |         single reference carrier whose baud_rate is reference_baudrate | ||||||
|  |         """ | ||||||
|  |         if spectral_info: | ||||||
|  |             if self.target_pch_out_dbm is not None: | ||||||
|  |                 return full(len(spectral_info.channel_number), self.target_pch_out_dbm) | ||||||
|  |             if self.target_psd_out_mWperGHz is not None: | ||||||
|  |                 return psd2powerdbm(self.target_psd_out_mWperGHz, spectral_info.baud_rate) | ||||||
|  |             if self.target_out_mWperSlotWidth is not None: | ||||||
|  |                 return psd2powerdbm(self.target_out_mWperSlotWidth, spectral_info.slot_width) | ||||||
|  |         else: | ||||||
|  |             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) | ||||||
|  |             if self.target_out_mWperSlotWidth is not None: | ||||||
|  |                 return psd2powerdbm(self.target_out_mWperSlotWidth, ref_carrier.slot_width) | ||||||
|  |         return None | ||||||
|  |  | ||||||
|  |     def get_per_degree_ref_power(self, degree, ref_carrier): | ||||||
|  |         """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) | ||||||
|  |         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) | ||||||
|  |  | ||||||
|  |     def get_per_degree_power(self, degree, spectral_info): | ||||||
|  |         """Get the target power in dBm out of ROADM degree for the spectral information | ||||||
|  |         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], spectral_info.baud_rate) | ||||||
|  |         return self.get_roadm_target_power(spectral_info=spectral_info) | ||||||
|  |  | ||||||
|     def propagate(self, spectral_info, degree): |     def propagate(self, spectral_info, degree): | ||||||
|         # pin_target and loss are read from eqpt_config.json['Roadm'] |         """Equalization targets are read from topology file if defined and completed with default | ||||||
|         # all ingress channels in xpress are set to this power level |         definition of the library. | ||||||
|         # but add channels are not, so we define an effective loss |         If the input power is lower than the target one, use the input power instead because | ||||||
|         # in the case of add channels |         a ROADM doesn't amplify, it can only attenuate. | ||||||
|         # find the target power on this degree: |         There is no difference for add or express : the same target is applied. For the moment | ||||||
|         # if a target power has been defined for this degree use it else use the global one. |         propagates operates with spectral info carriers all having the same source or destination. | ||||||
|         # if the input power is lower than the target one, use the input power instead because |         """ | ||||||
|         # a ROADM doesn't amplify, it can only attenuate |  | ||||||
|         # TODO maybe add a minimum loss for the ROADM |         # TODO maybe add a minimum loss for the ROADM | ||||||
|         per_degree_pch = self.per_degree_pch_out_db[degree] \ |  | ||||||
|             if degree in self.per_degree_pch_out_db else self.pch_out_db |         # find the target power for the reference carrier | ||||||
|         self.pch_out_db = min(spectral_info.pref.p_spani, per_degree_pch) |         ref_per_degree_pch = self.get_per_degree_ref_power(degree, spectral_info.pref.ref_carrier) | ||||||
|         self.effective_loss = spectral_info.pref.p_spani - self.pch_out_db |         # 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 | ||||||
|  |         # 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) | ||||||
|  |         # Definition of effective_loss: | ||||||
|  |         # Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for | ||||||
|  |         # different carriers. effective_loss records the loss for the reference carrier. | ||||||
|  |         self.ref_effective_loss = spectral_info.pref.p_spani - self.ref_pch_out_dbm | ||||||
|         input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase |         input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase | ||||||
|         min_power = min(lin2db(input_power * 1e3)) |         target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel | ||||||
|         per_degree_pch = per_degree_pch if per_degree_pch < min_power else min_power |         # Computation of the per channel target power according to equalization policy | ||||||
|         delta_power = lin2db(input_power * 1e3) - per_degree_pch |         # If target_power_per_channel has some channels power above input power, then the whole target is reduced. | ||||||
|  |         # For example, if user specifies delta_pdb_per_channel: | ||||||
|  |         # freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM, | ||||||
|  |         # then the target power for each channel uses the specified delta_pdb_per_channel. | ||||||
|  |         # target_power_per_channel[f1, f2, f3] = -19, -17, -23 | ||||||
|  |         # However if input_signal = -23, -16, -26, then the target can not be applied, because | ||||||
|  |         # -23 < -19dBm and -26 < -23dBm. Then the target is only applied to signals whose power is above the | ||||||
|  |         # threshold. others are left unchanged and unequalized. | ||||||
|  |         # the new target is [-23, -17, -26] | ||||||
|  |         # and the attenuation to apply is [-23, -16, -26] - [-23, -17, -26] = [0, 1, 0] | ||||||
|  |         # note that this changes the previous behaviour that equalized all identical channels based on the one | ||||||
|  |         # that had the min power. | ||||||
|  |         # This change corresponds to a discussion held during coders call. Please look at this document for | ||||||
|  |         # a reference: https://telecominfraproject.atlassian.net/wiki/spaces/OOPT/pages/669679645/PSE+Meeting+Minutes | ||||||
|  |         correction = (abs(watt2dbm(input_power) - target_power_per_channel) | ||||||
|  |                       - (watt2dbm(input_power) - target_power_per_channel)) / 2 | ||||||
|  |         new_target = target_power_per_channel - correction | ||||||
|  |         delta_power = watt2dbm(input_power) - new_target | ||||||
|  |  | ||||||
|         spectral_info.apply_attenuation_db(delta_power) |         spectral_info.apply_attenuation_db(delta_power) | ||||||
|         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2) |         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2) | ||||||
|         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2) |         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2) | ||||||
|  |         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): |     def update_pref(self, spectral_info): | ||||||
|         spectral_info.pref = spectral_info.pref._replace(p_span0=spectral_info.pref.p_span0, p_spani=self.pch_out_db) |         """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): |     def __call__(self, spectral_info, degree): | ||||||
|         self.propagate(spectral_info, degree=degree) |         self.propagate(spectral_info, degree=degree) | ||||||
| @@ -326,7 +452,7 @@ class Fiber(_Node): | |||||||
|         super().__init__(*args, params=FiberParams(**params), **kwargs) |         super().__init__(*args, params=FiberParams(**params), **kwargs) | ||||||
|         self.pch_out_db = None |         self.pch_out_db = None | ||||||
|         self.passive = True |         self.passive = True | ||||||
|  |         self.propagated_labels = [""] | ||||||
|         # Raman efficiency matrix function of the delta frequency constructed such that each row is related to a |         # 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 |         # fixed frequency: positive elements represent a gain (from higher frequency) and negative elements represent | ||||||
|         # a loss (to lower frequency) |         # a loss (to lower frequency) | ||||||
| @@ -376,6 +502,7 @@ class Fiber(_Node): | |||||||
|         if self.pch_out_db is None: |         if self.pch_out_db is None: | ||||||
|             return f'{type(self).__name__} {self.uid}' |             return f'{type(self).__name__} {self.uid}' | ||||||
|  |  | ||||||
|  |         total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels)) | ||||||
|         return '\n'.join([f'{type(self).__name__}          {self.uid}', |         return '\n'.join([f'{type(self).__name__}          {self.uid}', | ||||||
|                           f'  type_variety:                {self.type_variety}', |                           f'  type_variety:                {self.type_variety}', | ||||||
|                           f'  length (km):                 {self.params.length * 1e-3:.2f}', |                           f'  length (km):                 {self.params.length * 1e-3:.2f}', | ||||||
| @@ -383,7 +510,8 @@ class Fiber(_Node): | |||||||
|                           f'  total loss (dB):             {self.loss:.2f}', |                           f'  total loss (dB):             {self.loss:.2f}', | ||||||
|                           f'  (includes conn loss (dB) in: {self.params.con_in:.2f} out: {self.params.con_out:.2f})', |                           f'  (includes conn loss (dB) in: {self.params.con_in:.2f} out: {self.params.con_out:.2f})', | ||||||
|                           f'  (conn loss out includes EOL margin defined in eqpt_config.json)', |                           f'  (conn loss out includes EOL margin defined in eqpt_config.json)', | ||||||
|                           f'  pch out (dBm): {self.pch_out_db:.2f}']) |                           f'  reference pch out (dBm):     {self.pch_out_db:.2f}', | ||||||
|  |                           f'  actual pch out (dBm):        {total_pch}']) | ||||||
|  |  | ||||||
|     def loss_coef_func(self, frequency): |     def loss_coef_func(self, frequency): | ||||||
|         frequency = asarray(frequency) |         frequency = asarray(frequency) | ||||||
| @@ -473,6 +601,8 @@ class Fiber(_Node): | |||||||
|         # apply the attenuation due to the output connector loss |         # apply the attenuation due to the output connector loss | ||||||
|         attenuation_out_db = self.params.con_out |         attenuation_out_db = self.params.con_out | ||||||
|         spectral_info.apply_attenuation_db(attenuation_out_db) |         spectral_info.apply_attenuation_db(attenuation_out_db) | ||||||
|  |         self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) | ||||||
|  |         self.propagated_labels = spectral_info.label | ||||||
|  |  | ||||||
|     def update_pref(self, spectral_info): |     def update_pref(self, spectral_info): | ||||||
|         # in case of Raman, the resulting loss of the fiber is not equivalent to self.loss |         # in case of Raman, the resulting loss of the fiber is not equivalent to self.loss | ||||||
| @@ -545,6 +675,8 @@ class RamanFiber(Fiber): | |||||||
|         # apply the attenuation due to the output connector loss |         # apply the attenuation due to the output connector loss | ||||||
|         attenuation_out_db = self.params.con_out |         attenuation_out_db = self.params.con_out | ||||||
|         spectral_info.apply_attenuation_db(attenuation_out_db) |         spectral_info.apply_attenuation_db(attenuation_out_db) | ||||||
|  |         self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase) | ||||||
|  |         self.propagated_labels = spectral_info.label | ||||||
|  |  | ||||||
|  |  | ||||||
| class Edfa(_Node): | class Edfa(_Node): | ||||||
| @@ -573,6 +705,7 @@ class Edfa(_Node): | |||||||
|         self.delta_p = self.operational.delta_p  # delta P with Pref (power swwep) in power mode |         self.delta_p = self.operational.delta_p  # delta P with Pref (power swwep) in power mode | ||||||
|         self.tilt_target = self.operational.tilt_target |         self.tilt_target = self.operational.tilt_target | ||||||
|         self.out_voa = self.operational.out_voa |         self.out_voa = self.operational.out_voa | ||||||
|  |         self.propagated_labels = [""] | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def to_json(self): |     def to_json(self): | ||||||
| @@ -580,7 +713,7 @@ class Edfa(_Node): | |||||||
|                 'type': type(self).__name__, |                 'type': type(self).__name__, | ||||||
|                 'type_variety': self.params.type_variety, |                 'type_variety': self.params.type_variety, | ||||||
|                 'operational': { |                 'operational': { | ||||||
|                     'gain_target': round(self.effective_gain, 6), |                     'gain_target': round(self.effective_gain, 6) if self.effective_gain else None, | ||||||
|                     'delta_p': self.delta_p, |                     'delta_p': self.delta_p, | ||||||
|                     'tilt_target': self.tilt_target, |                     'tilt_target': self.tilt_target, | ||||||
|                     'out_voa': self.out_voa |                     'out_voa': self.out_voa | ||||||
| @@ -606,6 +739,7 @@ class Edfa(_Node): | |||||||
|         if self.pin_db is None or self.pout_db is None: |         if self.pin_db is None or self.pout_db is None: | ||||||
|             return f'{type(self).__name__} {self.uid}' |             return f'{type(self).__name__} {self.uid}' | ||||||
|         nf = mean(self.nf) |         nf = mean(self.nf) | ||||||
|  |         total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels)) | ||||||
|         return '\n'.join([f'{type(self).__name__} {self.uid}', |         return '\n'.join([f'{type(self).__name__} {self.uid}', | ||||||
|                           f'  type_variety:           {self.params.type_variety}', |                           f'  type_variety:           {self.params.type_variety}', | ||||||
|                           f'  effective gain(dB):     {self.effective_gain:.2f}', |                           f'  effective gain(dB):     {self.effective_gain:.2f}', | ||||||
| @@ -618,6 +752,7 @@ class Edfa(_Node): | |||||||
|                           f'  Delta_P (dB):           ' + (f'{self.delta_p:.2f}' if self.delta_p is not None else 'None'), |                           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'  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}', |                           f'  effective pch (dBm):    {self.effective_pch_out_db:.2f}', | ||||||
|  |                           f'  actual pch out (dBm):   {total_pch}', | ||||||
|                           f'  output VOA (dB):        {self.out_voa:.2f}']) |                           f'  output VOA (dB):        {self.out_voa:.2f}']) | ||||||
|  |  | ||||||
|     def interpol_params(self, spectral_info): |     def interpol_params(self, spectral_info): | ||||||
| @@ -639,7 +774,7 @@ class Edfa(_Node): | |||||||
|  |  | ||||||
|         self.nch = spectral_info.number_of_channels |         self.nch = spectral_info.number_of_channels | ||||||
|         pin = spectral_info.signal + spectral_info.ase + spectral_info.nli |         pin = spectral_info.signal + spectral_info.ase + spectral_info.nli | ||||||
|         self.pin_db = lin2db(sum(pin * 1e3)) |         self.pin_db = watt2dbm(sum(pin)) | ||||||
|         # The following should be changed when we have the new spectral information including slot widths. |         # The following should be changed when we have the new spectral information including slot widths. | ||||||
|         # For now, with homogeneous spectrum, we can calculate it as the difference between neighbouring channels. |         # 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] |         self.slot_width = self.channel_freq[1] - self.channel_freq[0] | ||||||
| @@ -652,15 +787,14 @@ class Edfa(_Node): | |||||||
|             self.effective_gain = self.target_pch_out_db - pref.p_spani |             self.effective_gain = self.target_pch_out_db - pref.p_spani | ||||||
|  |  | ||||||
|         """check power saturation and correct effective gain & power accordingly:""" |         """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 = min( | ||||||
|             self.effective_gain, |             self.effective_gain, | ||||||
|             self.params.p_max - (pref.p_spani + pref.neq_ch) |             self.params.p_max - self.pin_db | ||||||
|         ) |         ) | ||||||
|         #print(self.uid, self.effective_gain, self.operational.gain_target) |  | ||||||
|         self.effective_pch_out_db = round(pref.p_spani + self.effective_gain, 2) |         self.effective_pch_out_db = round(pref.p_spani + self.effective_gain, 2) | ||||||
|  |  | ||||||
|         """check power saturation and correct target_gain accordingly:""" |         """check power saturation and correct target_gain accordingly:""" | ||||||
|         #print(self.uid, self.effective_gain, self.pin_db, pref.p_spani) |  | ||||||
|         self.nf = self._calc_nf() |         self.nf = self._calc_nf() | ||||||
|         self.gprofile = self._gain_profile(pin) |         self.gprofile = self._gain_profile(pin) | ||||||
|  |  | ||||||
| @@ -891,6 +1025,8 @@ class Edfa(_Node): | |||||||
|         spectral_info.apply_gain_db(self.gprofile - self.out_voa) |         spectral_info.apply_gain_db(self.gprofile - self.out_voa) | ||||||
|         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2) |         spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2) | ||||||
|         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2) |         spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2) | ||||||
|  |         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): |     def update_pref(self, spectral_info): | ||||||
|         spectral_info.pref = \ |         spectral_info.pref = \ | ||||||
|   | |||||||
| @@ -66,9 +66,6 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F | |||||||
|             trx_params['roll_off'] = default_si_data.roll_off |             trx_params['roll_off'] = default_si_data.roll_off | ||||||
|             trx_params['tx_osnr'] = default_si_data.tx_osnr |             trx_params['tx_osnr'] = default_si_data.tx_osnr | ||||||
|             trx_params['min_spacing'] = None |             trx_params['min_spacing'] = None | ||||||
|             nch = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing']) |  | ||||||
|             trx_params['nb_channel'] = nch |  | ||||||
|             print(f'There are {nch} channels propagating') |  | ||||||
|  |  | ||||||
|     trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3 |     trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,9 +12,10 @@ from __future__ import annotations | |||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| from collections.abc import Iterable | from collections.abc import Iterable | ||||||
| from typing import Union | from typing import Union | ||||||
|  | from dataclasses import dataclass | ||||||
| from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray | from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray | ||||||
|  |  | ||||||
| from gnpy.core.utils import automatic_nch, lin2db, db2lin | from gnpy.core.utils import automatic_nch, db2lin, watt2dbm | ||||||
| from gnpy.core.exceptions import SpectrumError | from gnpy.core.exceptions import SpectrumError | ||||||
|  |  | ||||||
| DEFAULT_SLOT_WIDTH_STEP = 12.5e9  # Hz | DEFAULT_SLOT_WIDTH_STEP = 12.5e9  # Hz | ||||||
| @@ -41,18 +42,21 @@ class Channel(namedtuple('Channel', | |||||||
|     """ |     """ | ||||||
|  |  | ||||||
|  |  | ||||||
| class Pref(namedtuple('Pref', 'p_span0, p_spani, neq_ch ')): | class Pref(namedtuple('Pref', 'p_span0, p_spani, ref_carrier')): | ||||||
|     """noiseless reference power in dBm: |     """noiseless reference power in dBm: | ||||||
|     p_span0: inital target carrier power |     p_span0: inital target carrier power for a reference channel defined by user | ||||||
|     p_spani: carrier power after element i |     p_spani: carrier power after element i for a reference channel defined by user | ||||||
|     neq_ch: equivalent channel count in dB""" |     ref_carrier records the baud rate of the reference channel | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |  | ||||||
| class SpectralInformation(object): | 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, |     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): |                  roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, delta_pdb_per_channel: array, | ||||||
|  |                  tx_osnr: array, ref_power: Pref, label: array): | ||||||
|         indices = argsort(frequency) |         indices = argsort(frequency) | ||||||
|         self._frequency = frequency[indices] |         self._frequency = frequency[indices] | ||||||
|         self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape)) |         self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape)) | ||||||
| @@ -77,8 +81,10 @@ class SpectralInformation(object): | |||||||
|         self._chromatic_dispersion = chromatic_dispersion[indices] |         self._chromatic_dispersion = chromatic_dispersion[indices] | ||||||
|         self._pmd = pmd[indices] |         self._pmd = pmd[indices] | ||||||
|         self._pdl = pdl[indices] |         self._pdl = pdl[indices] | ||||||
|         pref = lin2db(mean(signal) * 1e3) |         self._delta_pdb_per_channel = delta_pdb_per_channel[indices] | ||||||
|         self._pref = Pref(pref, pref, lin2db(self._number_of_channels)) |         self._tx_osnr = tx_osnr[indices] | ||||||
|  |         self._pref = ref_power | ||||||
|  |         self._label = label[indices] | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def pref(self): |     def pref(self): | ||||||
| @@ -155,6 +161,10 @@ class SpectralInformation(object): | |||||||
|     def pmd(self): |     def pmd(self): | ||||||
|         return self._pmd |         return self._pmd | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def label(self): | ||||||
|  |         return self._label | ||||||
|  |  | ||||||
|     @pmd.setter |     @pmd.setter | ||||||
|     def pmd(self, pmd): |     def pmd(self, pmd): | ||||||
|         self._pmd = pmd |         self._pmd = pmd | ||||||
| @@ -167,6 +177,22 @@ class SpectralInformation(object): | |||||||
|     def pdl(self, pdl): |     def pdl(self, pdl): | ||||||
|         self._pdl = pdl |         self._pdl = pdl | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def delta_pdb_per_channel(self): | ||||||
|  |         return self._delta_pdb_per_channel | ||||||
|  |  | ||||||
|  |     @delta_pdb_per_channel.setter | ||||||
|  |     def delta_pdb_per_channel(self, delta_pdb_per_channel): | ||||||
|  |         self._delta_pdb_per_channel = delta_pdb_per_channel | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def tx_osnr(self): | ||||||
|  |         return self._tx_osnr | ||||||
|  |  | ||||||
|  |     @tx_osnr.setter | ||||||
|  |     def tx_osnr(self, tx_osnr): | ||||||
|  |         self._tx_osnr = tx_osnr | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def channel_number(self): |     def channel_number(self): | ||||||
|         return self._channel_number |         return self._channel_number | ||||||
| @@ -197,6 +223,12 @@ class SpectralInformation(object): | |||||||
|  |  | ||||||
|     def __add__(self, other: SpectralInformation): |     def __add__(self, other: SpectralInformation): | ||||||
|         try: |         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), |             return SpectralInformation(frequency=append(self.frequency, other.frequency), | ||||||
|                                        slot_width=append(self.slot_width, other.slot_width), |                                        slot_width=append(self.slot_width, other.slot_width), | ||||||
|                                        signal=append(self.signal, other.signal), nli=append(self.nli, other.nli), |                                        signal=append(self.signal, other.signal), nli=append(self.nli, other.nli), | ||||||
| @@ -206,10 +238,16 @@ class SpectralInformation(object): | |||||||
|                                        chromatic_dispersion=append(self.chromatic_dispersion, |                                        chromatic_dispersion=append(self.chromatic_dispersion, | ||||||
|                                                                    other.chromatic_dispersion), |                                                                    other.chromatic_dispersion), | ||||||
|                                        pmd=append(self.pmd, other.pmd), |                                        pmd=append(self.pmd, other.pmd), | ||||||
|                                        pdl=append(self.pdl, other.pdl)) |                                        pdl=append(self.pdl, other.pdl), | ||||||
|  |                                        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: |         except SpectrumError: | ||||||
|             raise SpectrumError('Spectra cannot be summed: channels overlapping.') |             raise SpectrumError('Spectra cannot be summed: channels overlapping.') | ||||||
|  |  | ||||||
|  |  | ||||||
|     def _replace(self, carriers, pref): |     def _replace(self, carriers, pref): | ||||||
|         self.chromatic_dispersion = array([c.chromatic_dispersion for c in carriers]) |         self.chromatic_dispersion = array([c.chromatic_dispersion for c in carriers]) | ||||||
|         self.pmd = array([c.pmd for c in carriers]) |         self.pmd = array([c.pmd for c in carriers]) | ||||||
| @@ -221,14 +259,18 @@ class SpectralInformation(object): | |||||||
|         return self |         return self | ||||||
|  |  | ||||||
|  |  | ||||||
| def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, int, float], | def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, float], | ||||||
|                                           signal: Union[int, float, ndarray, Iterable], |                                           signal: Union[float, ndarray, Iterable], | ||||||
|                                           baud_rate: Union[int, float, ndarray, Iterable], |                                           baud_rate: Union[float, ndarray, Iterable], | ||||||
|                                           slot_width: Union[int, float, ndarray, Iterable] = None, |                                           tx_osnr: Union[float, ndarray, Iterable], | ||||||
|                                           roll_off: Union[int, float, ndarray, Iterable] = 0., |                                           delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0., | ||||||
|                                           chromatic_dispersion: Union[int, float, ndarray, Iterable] = 0., |                                           slot_width: Union[float, ndarray, Iterable] = None, | ||||||
|                                           pmd: Union[int, float, ndarray, Iterable] = 0., |                                           roll_off: Union[float, ndarray, Iterable] = 0., | ||||||
|                                           pdl: Union[int, float, ndarray, Iterable] = 0.): |                                           chromatic_dispersion: Union[float, ndarray, Iterable] = 0., | ||||||
|  |                                           pmd: Union[float, ndarray, Iterable] = 0., | ||||||
|  |                                           pdl: Union[float, ndarray, Iterable] = 0., | ||||||
|  |                                           ref_power: Pref = None, | ||||||
|  |                                           label: Union[str, ndarray, Iterable] = None): | ||||||
|     """This is just a wrapper around the SpectralInformation.__init__() that simplifies the creation of |     """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.""" |     a non-uniform spectral information with NLI and ASE powers set to zero.""" | ||||||
|     frequency = asarray(frequency) |     frequency = asarray(frequency) | ||||||
| @@ -244,11 +286,17 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, in | |||||||
|         pdl = full(number_of_channels, pdl) |         pdl = full(number_of_channels, pdl) | ||||||
|         nli = zeros(number_of_channels) |         nli = zeros(number_of_channels) | ||||||
|         ase = zeros(number_of_channels) |         ase = zeros(number_of_channels) | ||||||
|  |         delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel) | ||||||
|  |         tx_osnr = full(number_of_channels, tx_osnr) | ||||||
|  |         label = full(number_of_channels, label) | ||||||
|         return SpectralInformation(frequency=frequency, slot_width=slot_width, |         return SpectralInformation(frequency=frequency, slot_width=slot_width, | ||||||
|                                    signal=signal, nli=nli, ase=ase, |                                    signal=signal, nli=nli, ase=ase, | ||||||
|                                    baud_rate=baud_rate, roll_off=roll_off, |                                    baud_rate=baud_rate, roll_off=roll_off, | ||||||
|                                    chromatic_dispersion=chromatic_dispersion, |                                    chromatic_dispersion=chromatic_dispersion, | ||||||
|                                    pmd=pmd, pdl=pdl) |                                    pmd=pmd, pdl=pdl, | ||||||
|  |                                    delta_pdb_per_channel=delta_pdb_per_channel, | ||||||
|  |                                    tx_osnr=tx_osnr, | ||||||
|  |                                    ref_power=ref_power, label=label) | ||||||
|     except ValueError as e: |     except ValueError as e: | ||||||
|         if 'could not broadcast' in str(e): |         if 'could not broadcast' in str(e): | ||||||
|             raise SpectrumError('Dimension mismatch in input fields.') |             raise SpectrumError('Dimension mismatch in input fields.') | ||||||
| @@ -256,9 +304,82 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, in | |||||||
|             raise |             raise | ||||||
|  |  | ||||||
|  |  | ||||||
| def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing): | 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 """ |     """ Creates a fixed slot width spectral information with flat power. | ||||||
|     nb_channel = automatic_nch(f_min, f_max, spacing) |     all arguments are scalar values""" | ||||||
|     frequency = [(f_min + spacing * i) for i in range(1, nb_channel + 1)] |     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) | ||||||
|  |     label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)] | ||||||
|     return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate, |     return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate, | ||||||
|                                                  roll_off=roll_off) |                                                  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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier], power: float, | ||||||
|  |                                      ref_carrier: ReferenceCarrier) -> 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()] | ||||||
|  |     roll_off = [c.roll_off for c in initial_spectrum.values()] | ||||||
|  |     baud_rate = [c.baud_rate for c in initial_spectrum.values()] | ||||||
|  |     delta_pdb_per_channel = [c.delta_pdb for c in initial_spectrum.values()] | ||||||
|  |     slot_width = [c.slot_width for c in initial_spectrum.values()] | ||||||
|  |     tx_osnr = [c.tx_osnr for c in initial_spectrum.values()] | ||||||
|  |     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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @dataclass | ||||||
|  | class Carrier: | ||||||
|  |     """One channel in the initial mixed-type spectrum definition, each type being defined by | ||||||
|  |     its delta_pdb (power offset with respect to reference power), baud rate, slot_width, roll_off | ||||||
|  |     and tx_osnr. delta_pdb offset is applied to target power out of Roadm. | ||||||
|  |     Label is used to group carriers which belong to the same partition when printing results. | ||||||
|  |     """ | ||||||
|  |     delta_pdb: float | ||||||
|  |     baud_rate: float | ||||||
|  |     slot_width: float | ||||||
|  |     roll_off: float | ||||||
|  |     tx_osnr: float | ||||||
|  |     label: str | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @dataclass | ||||||
|  | class ReferenceCarrier: | ||||||
|  |     """Reference channel type is used to determine target power out of ROADM for the reference channel when | ||||||
|  |     constant power spectral density (PSD) equalization is set. Reference channel is the type that has been defined | ||||||
|  |     in SI block and used for the initial design of the network. | ||||||
|  |     Computing the power out of ROADM for the reference channel is required to correctly compute the loss | ||||||
|  |     experienced by p_span_i in Roadm element. | ||||||
|  |  | ||||||
|  |     Baud rate is required to find the target power in constant PSD: power = PSD_target * baud_rate. | ||||||
|  |     For example, if target PSD is 3.125e4mW/GHz and reference carrier type a 32 GBaud channel then | ||||||
|  |     output power should be -20 dBm and for a 64 GBaud channel power target would need 3 dB more: -17 dBm. | ||||||
|  |  | ||||||
|  |     Slot width is required to find the target power in constant PSW (constant power per slot width equalization): | ||||||
|  |     power = PSW_target * slot_width. | ||||||
|  |     For example, if target PSW is 2e4mW/GHz and reference carrier type a 32 GBaud channel in a 50GHz slot width then | ||||||
|  |     output power should be -20 dBm and for a 64 GBaud channel  in a 75 GHz slot width, power target would be -18.24 dBm. | ||||||
|  |  | ||||||
|  |     Other attributes (like slot_width or roll-off) may be added there for future equalization purpose. | ||||||
|  |     """ | ||||||
|  |     baud_rate: float | ||||||
|  |     slot_width: float | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ from operator import attrgetter | |||||||
| from gnpy.core import ansi_escapes, elements | from gnpy.core import ansi_escapes, elements | ||||||
| from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError | from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError | ||||||
| from gnpy.core.utils import round2float, convert_length | from gnpy.core.utils import round2float, convert_length | ||||||
|  | from gnpy.core.info import ReferenceCarrier | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -237,22 +238,20 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d | |||||||
|     """ this node can be a transceiver or a ROADM (same function called in both cases) |     """ this node can be a transceiver or a ROADM (same function called in both cases) | ||||||
|     """ |     """ | ||||||
|     power_mode = equipment['Span']['default'].power_mode |     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)) |     next_oms = (n for n in network.successors(this_node) if not isinstance(n, elements.Transceiver)) | ||||||
|     this_node_degree = {k: v for k, v in this_node.per_degree_pch_out_db.items()} if hasattr(this_node, 'per_degree_pch_out_db') else {} |  | ||||||
|     for oms in next_oms: |     for oms in next_oms: | ||||||
|         # go through all the OMS departing from the ROADM |         # go through all the OMS departing from the ROADM | ||||||
|         prev_node = this_node |         prev_node = this_node | ||||||
|         node = oms |         node = oms | ||||||
|         # if isinstance(next_node, elements.Fused): #support ROADM wo egress amp for metro applications |         if isinstance(this_node, elements.Transceiver): | ||||||
|         #     node = find_last_node(next_node) |             this_node_out_power = 0.0     # default value if this_node is a transceiver | ||||||
|         #     next_node = next(n for n in network.successors(node)) |         if isinstance(this_node, elements.Roadm): | ||||||
|         #     next_node = find_last_node(next_node) |             # get target power out from ROADM for the reference carrier based on equalization settings | ||||||
|         if node.uid not in this_node_degree: |             this_node_out_power = this_node.get_per_degree_ref_power(degree=node.uid, ref_carrier=ref_carrier) | ||||||
|             # if no target power is defined on this degree or no per degree target power is given use the global one |  | ||||||
|             # if target_pch_out_db  is not an attribute, then the element must be a transceiver |  | ||||||
|             this_node_degree[node.uid] = getattr(this_node.params, 'target_pch_out_db', 0) |  | ||||||
|         # use the target power on this degree |         # use the target power on this degree | ||||||
|         prev_dp = this_node_degree[node.uid] - pref_ch_db |         prev_dp = this_node_out_power - pref_ch_db | ||||||
|         dp = prev_dp |         dp = prev_dp | ||||||
|         prev_voa = 0 |         prev_voa = 0 | ||||||
|         voa = 0 |         voa = 0 | ||||||
| @@ -331,10 +330,28 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d | |||||||
|             prev_voa = voa |             prev_voa = voa | ||||||
|             prev_node = node |             prev_node = node | ||||||
|             node = next_node |             node = next_node | ||||||
|             # print(f'{node.uid}') |  | ||||||
|  |  | ||||||
|     if isinstance(this_node, elements.Roadm): |  | ||||||
|         this_node.per_degree_pch_out_db = {k: v for k, v in this_node_degree.items()} | 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 | ||||||
|  |     they are not initialized by users. | ||||||
|  |     """ | ||||||
|  |     next_oms = (n for n in network.successors(roadm) if not isinstance(n, elements.Transceiver)) | ||||||
|  |  | ||||||
|  |     for node in next_oms: | ||||||
|  |         # go through all the OMS departing from the ROADM | ||||||
|  |         if node.uid not in roadm.per_degree_pch_out_dbm and node.uid not in roadm.per_degree_pch_psd and \ | ||||||
|  |                 node.uid not in roadm.per_degree_pch_psw: | ||||||
|  |             # if no target power is defined on this degree or no per degree target power is given use the global one | ||||||
|  |             if roadm.params.target_pch_out_db: | ||||||
|  |                 roadm.per_degree_pch_out_dbm[node.uid] = roadm.params.target_pch_out_db | ||||||
|  |             elif roadm.params.target_psd_out_mWperGHz: | ||||||
|  |                 roadm.per_degree_pch_psd[node.uid] = roadm.params.target_psd_out_mWperGHz | ||||||
|  |             elif roadm.params.target_out_mWperSlotWidth: | ||||||
|  |                 roadm.per_degree_pch_psw[node.uid] = roadm.params.target_out_mWperSlotWidth | ||||||
|  |             else: | ||||||
|  |                 raise ConfigurationError(roadm.uid, 'needs an equalization target') | ||||||
|  |  | ||||||
|  |  | ||||||
| def add_roadm_booster(network, roadm): | def add_roadm_booster(network, roadm): | ||||||
| @@ -432,10 +449,10 @@ def calculate_new_length(fiber_length, bounds, target_length): | |||||||
|         return (length1, n_spans1) |         return (length1, n_spans1) | ||||||
|     elif (bounds.start <= length2 <= bounds.stop) and not(bounds.start <= length1 <= bounds.stop): |     elif (bounds.start <= length2 <= bounds.stop) and not(bounds.start <= length1 <= bounds.stop): | ||||||
|         return (length2, n_spans2) |         return (length2, n_spans2) | ||||||
|     elif target_length - length1 < length2 - target_length: |     elif length2 - target_length <= target_length - length1 and length2 <= bounds.stop: | ||||||
|         return (length1, n_spans1) |  | ||||||
|     else: |  | ||||||
|         return (length2, n_spans2) |         return (length2, n_spans2) | ||||||
|  |     else: | ||||||
|  |         return (length1, n_spans1) | ||||||
|  |  | ||||||
|  |  | ||||||
| def split_fiber(network, fiber, bounds, target_length, equipment): | def split_fiber(network, fiber, bounds, target_length, equipment): | ||||||
| @@ -547,6 +564,7 @@ def build_network(network, equipment, pref_ch_db, pref_total_db, no_insert_edfas | |||||||
|     add_fiber_padding(network, fibers, default_span_data.padding) |     add_fiber_padding(network, fibers, default_span_data.padding) | ||||||
|  |  | ||||||
|     for roadm in roadms: |     for roadm in roadms: | ||||||
|  |         set_roadm_per_degree_targets(roadm, network) | ||||||
|         set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db) |         set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db) | ||||||
|  |  | ||||||
|     trx = [t for t in network.nodes() if isinstance(t, elements.Transceiver)] |     trx = [t for t in network.nodes() if isinstance(t, elements.Transceiver)] | ||||||
|   | |||||||
| @@ -88,13 +88,22 @@ class SimParams(Parameters): | |||||||
|  |  | ||||||
| class RoadmParams(Parameters): | class RoadmParams(Parameters): | ||||||
|     def __init__(self, **kwargs): |     def __init__(self, **kwargs): | ||||||
|  |         self.target_pch_out_db = kwargs.get('target_pch_out_db') | ||||||
|  |         self.target_psd_out_mWperGHz = kwargs.get('target_psd_out_mWperGHz') | ||||||
|  |         self.target_out_mWperSlotWidth = kwargs.get('target_out_mWperSlotWidth') | ||||||
|  |         equalisation_type = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth'] | ||||||
|  |         temp = [kwargs.get(k) is not None for k in equalisation_type] | ||||||
|  |         if sum(temp) > 1: | ||||||
|  |             raise ParametersError('ROADM config contains more than one equalisation type.' | ||||||
|  |                                   + 'Please choose only one', kwargs) | ||||||
|  |         self.per_degree_pch_out_db = kwargs.get('per_degree_pch_out_db', {}) | ||||||
|  |         self.per_degree_pch_psd = kwargs.get('per_degree_psd_out_mWperGHz', {}) | ||||||
|  |         self.per_degree_pch_psw = kwargs.get('per_degree_psd_out_mWperSlotWidth', {}) | ||||||
|         try: |         try: | ||||||
|             self.target_pch_out_db = kwargs['target_pch_out_db'] |  | ||||||
|             self.add_drop_osnr = kwargs['add_drop_osnr'] |             self.add_drop_osnr = kwargs['add_drop_osnr'] | ||||||
|             self.pmd = kwargs['pmd'] |             self.pmd = kwargs['pmd'] | ||||||
|             self.pdl = kwargs['pdl'] |             self.pdl = kwargs['pdl'] | ||||||
|             self.restrictions = kwargs['restrictions'] |             self.restrictions = kwargs['restrictions'] | ||||||
|             self.per_degree_pch_out_db = kwargs['per_degree_pch_out_db'] if 'per_degree_pch_out_db' in kwargs else {} |  | ||||||
|         except KeyError as e: |         except KeyError as e: | ||||||
|             raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}') |             raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}') | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ 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 | 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, empty, trapz, arcsinh, \ | 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, \ |     clip, abs, sum, concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, prod, argwhere, \ | ||||||
|     unique, argsort, cumprod |     unique, argsort, cumprod | ||||||
| from logging import getLogger | from logging import getLogger | ||||||
| @@ -131,20 +131,20 @@ class RamanSolver: | |||||||
|                 cnt_frequency = array([pump.frequency for pump in fiber.raman_pumps |                 cnt_frequency = array([pump.frequency for pump in fiber.raman_pumps | ||||||
|                                        if pump.propagation_direction == 'counterprop']) |                                        if pump.propagation_direction == 'counterprop']) | ||||||
|                 # Co-propagating profile initialization |                 # Co-propagating profile initialization | ||||||
|                 co_power_profile = empty([co_frequency.size, z.size]) |                 co_power_profile = zeros([co_frequency.size, z.size]) | ||||||
|                 if co_frequency.size: |                 if co_frequency.size: | ||||||
|                     co_cr = fiber.cr(co_frequency) |                     co_cr = fiber.cr(co_frequency) | ||||||
|                     co_alpha = fiber.alpha(co_frequency) |                     co_alpha = fiber.alpha(co_frequency) | ||||||
|                     co_power_profile = \ |                     co_power_profile = \ | ||||||
|                         RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z, lumped_losses) |                         RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z, lumped_losses) | ||||||
|                 # Counter-propagating profile initialization |                 # Counter-propagating profile initialization | ||||||
|                 cnt_power_profile = empty([co_frequency.size, z.size]) |                 cnt_power_profile = zeros([cnt_frequency.size, z.size]) | ||||||
|                 if cnt_frequency.size: |                 if cnt_frequency.size: | ||||||
|                     cnt_cr = fiber.cr(cnt_frequency) |                     cnt_cr = fiber.cr(cnt_frequency) | ||||||
|                     cnt_alpha = fiber.alpha(cnt_frequency) |                     cnt_alpha = fiber.alpha(cnt_frequency) | ||||||
|                     cnt_power_profile = \ |                     cnt_power_profile = \ | ||||||
|                         flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr, |                         flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr, | ||||||
|                                                                          z[-1] - flip(z), flip(lumped_losses))) |                                                                          z[-1] - flip(z), flip(lumped_losses)), axis=1) | ||||||
|                 # Co-propagating and Counter-propagating Profile Computation |                 # Co-propagating and Counter-propagating Profile Computation | ||||||
|                 if co_frequency.size and cnt_frequency.size: |                 if co_frequency.size and cnt_frequency.size: | ||||||
|                     co_power_profile, cnt_power_profile = \ |                     co_power_profile, cnt_power_profile = \ | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ This module contains utility functions that are used with gnpy. | |||||||
| """ | """ | ||||||
|  |  | ||||||
| from csv import writer | from csv import writer | ||||||
| from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and | from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean | ||||||
| from scipy import constants | from scipy import constants | ||||||
|  |  | ||||||
| from gnpy.core.exceptions import ConfigurationError | from gnpy.core.exceptions import ConfigurationError | ||||||
| @@ -106,6 +106,69 @@ def db2lin(value): | |||||||
|     return 10**(value / 10) |     return 10**(value / 10) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def watt2dbm(value): | ||||||
|  |     """Convert Watt units to dBm | ||||||
|  |  | ||||||
|  |     >>> round(watt2dbm(0.001), 1) | ||||||
|  |     0.0 | ||||||
|  |     >>> round(watt2dbm(0.02), 1) | ||||||
|  |     13.0 | ||||||
|  |     """ | ||||||
|  |     return lin2db(value * 1e3) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dbm2watt(value): | ||||||
|  |     """Convert dBm units to Watt | ||||||
|  |  | ||||||
|  |     >>> round(dbm2watt(0), 4) | ||||||
|  |     0.001 | ||||||
|  |     >>> round(dbm2watt(-3), 4) | ||||||
|  |     0.0005 | ||||||
|  |     >>> round(dbm2watt(13), 4) | ||||||
|  |     0.02 | ||||||
|  |     """ | ||||||
|  |     return db2lin(value) * 1e-3 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def psd2powerdbm(psd_mwperghz, baudrate_baud): | ||||||
|  |     """computes power in dBm based on baudrate in bauds and psd in mW/GHz | ||||||
|  |  | ||||||
|  |     >>> round(psd2powerdbm(0.031176, 64e9),3) | ||||||
|  |     3.0 | ||||||
|  |     >>> round(psd2powerdbm(0.062352, 32e9),3) | ||||||
|  |     3.0 | ||||||
|  |     >>> round(psd2powerdbm(0.015625, 64e9),3) | ||||||
|  |     0.0 | ||||||
|  |     """ | ||||||
|  |     return lin2db(baudrate_baud * psd_mwperghz * 1e-9) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def power_dbm_to_psd_mw_ghz(power_dbm, baudrate_baud): | ||||||
|  |     """computes power spectral density in  mW/GHz based on baudrate in bauds and power in dBm | ||||||
|  |  | ||||||
|  |     >>> power_dbm_to_psd_mw_ghz(0, 64e9) | ||||||
|  |     0.015625 | ||||||
|  |     >>> round(power_dbm_to_psd_mw_ghz(3, 64e9), 6) | ||||||
|  |     0.031176 | ||||||
|  |     >>> round(power_dbm_to_psd_mw_ghz(3, 32e9), 6) | ||||||
|  |     0.062352 | ||||||
|  |     """ | ||||||
|  |     return db2lin(power_dbm) / (baudrate_baud * 1e-9) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def psd_mw_per_ghz(power_watt, baudrate_baud): | ||||||
|  |     """computes power spectral density in  mW/GHz based on baudrate in bauds and power in W | ||||||
|  |  | ||||||
|  |     >>> psd_mw_per_ghz(2e-3, 32e9) | ||||||
|  |     0.0625 | ||||||
|  |     >>> psd_mw_per_ghz(1e-3, 64e9) | ||||||
|  |     0.015625 | ||||||
|  |     >>> psd_mw_per_ghz(0.5e-3, 32e9) | ||||||
|  |     0.015625 | ||||||
|  |     """ | ||||||
|  |     return power_watt * 1e3 / (baudrate_baud * 1e-9) | ||||||
|  |  | ||||||
|  |  | ||||||
| def round2float(number, step): | def round2float(number, step): | ||||||
|     """Round a floating point number so that its "resolution" is not bigger than 'step' |     """Round a floating point number so that its "resolution" is not bigger than 'step' | ||||||
|  |  | ||||||
| @@ -166,6 +229,32 @@ def snr_sum(snr, bw, snr_added, bw_added=12.5e9): | |||||||
|     return snr |     return snr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def per_label_average(values, labels): | ||||||
|  |     """computes the average per defined spectrum band, using labels | ||||||
|  |  | ||||||
|  |     >>> labels = ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'D', 'D', 'D', 'D'] | ||||||
|  |     >>> values = [28.51, 28.23, 28.15, 28.17, 28.36, 28.53, 28.64, 28.68, 28.7, 28.71, 28.72, 28.73, 28.74, 28.91, 27.96, 27.85, 27.87, 28.02] | ||||||
|  |     >>> per_label_average(values, labels) | ||||||
|  |     {'A': 28.28, 'B': 28.68, 'C': 28.91, 'D': 27.92} | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     label_set = sorted(set(labels)) | ||||||
|  |     summary = {} | ||||||
|  |     for label in label_set: | ||||||
|  |         vals = [val for val, lab in zip(values, labels) if lab == label] | ||||||
|  |         summary[label] = round(mean(vals), 2) | ||||||
|  |     return summary | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def pretty_summary_print(summary): | ||||||
|  |     """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()]) | ||||||
|  |     return text | ||||||
|  |  | ||||||
|  |  | ||||||
| def deltawl2deltaf(delta_wl, wavelength): | def deltawl2deltaf(delta_wl, wavelength): | ||||||
|     """ deltawl2deltaf(delta_wl, wavelength): |     """ deltawl2deltaf(delta_wl, wavelength): | ||||||
|     delta_wl is BW in wavelength units |     delta_wl is BW in wavelength units | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								gnpy/example-data/initial_spectrum1.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								gnpy/example-data/initial_spectrum1.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | { | ||||||
|  |       "spectrum":[ | ||||||
|  |             { | ||||||
|  |             "f_min": 191.35e12, | ||||||
|  |             "f_max": 195.1e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "slot_width": 50e9, | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40 | ||||||
|  |             } | ||||||
|  |       ] | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								gnpy/example-data/initial_spectrum2.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								gnpy/example-data/initial_spectrum2.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | { | ||||||
|  |       "spectrum":[ | ||||||
|  |             { | ||||||
|  |             "f_min": 191.4e12, | ||||||
|  |             "f_max":193.1e12, | ||||||
|  |             "baud_rate": 32e9, | ||||||
|  |             "slot_width": 50e9, | ||||||
|  |             "delta_pdb": 0, | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "label": "mode_1" | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |             "f_min": 193.1625e12, | ||||||
|  |             "f_max":195e12, | ||||||
|  |             "baud_rate": 64e9, | ||||||
|  |             "slot_width": 75e9, | ||||||
|  |             "roll_off": 0.15, | ||||||
|  |             "tx_osnr": 40, | ||||||
|  |             "label": "mode_2" | ||||||
|  |             } | ||||||
|  |       ] | ||||||
|  | } | ||||||
| @@ -14,6 +14,7 @@ import sys | |||||||
| from math import ceil | from math import ceil | ||||||
| from numpy import linspace, mean | from numpy import linspace, mean | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
|  |  | ||||||
| import gnpy.core.ansi_escapes as ansi_escapes | import gnpy.core.ansi_escapes as ansi_escapes | ||||||
| from gnpy.core.elements import Transceiver, Fiber, RamanFiber | from gnpy.core.elements import Transceiver, Fiber, RamanFiber | ||||||
| from gnpy.core.equipment import trx_mode_params | from gnpy.core.equipment import trx_mode_params | ||||||
| @@ -26,8 +27,8 @@ from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn | |||||||
|                                    deduplicate_disjunctions, compute_path_with_disjunction, |                                    deduplicate_disjunctions, compute_path_with_disjunction, | ||||||
|                                    PathRequest, compute_constrained_path, propagate) |                                    PathRequest, compute_constrained_path, propagate) | ||||||
| from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum | from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum | ||||||
| from gnpy.tools.json_io import load_equipment, load_network, load_json, load_requests, save_network, \ | from gnpy.tools.json_io import (load_equipment, load_network, load_json, load_requests, save_network, | ||||||
|                                requests_from_json, disjunctions_from_json, save_json |                                 requests_from_json, disjunctions_from_json, save_json, load_initial_spectrum) | ||||||
| from gnpy.tools.plots import plot_baseline, plot_results | from gnpy.tools.plots import plot_baseline, plot_results | ||||||
|  |  | ||||||
| _logger = logging.getLogger(__name__) | _logger = logging.getLogger(__name__) | ||||||
| @@ -118,6 +119,7 @@ def transmission_main_example(args=None): | |||||||
|     parser.add_argument('-pl', '--plot', action='store_true') |     parser.add_argument('-pl', '--plot', action='store_true') | ||||||
|     parser.add_argument('-l', '--list-nodes', action='store_true', help='list all transceiver nodes') |     parser.add_argument('-l', '--list-nodes', action='store_true', help='list all transceiver nodes') | ||||||
|     parser.add_argument('-po', '--power', default=0, help='channel ref power in dBm') |     parser.add_argument('-po', '--power', default=0, help='channel ref power in dBm') | ||||||
|  |     parser.add_argument('--spectrum', type=Path, help='user defined mixed rate spectrum JSON file') | ||||||
|     parser.add_argument('source', nargs='?', help='source node') |     parser.add_argument('source', nargs='?', help='source node') | ||||||
|     parser.add_argument('destination', nargs='?', help='destination node') |     parser.add_argument('destination', nargs='?', help='destination node') | ||||||
|  |  | ||||||
| @@ -194,12 +196,21 @@ def transmission_main_example(args=None): | |||||||
|     if args.power: |     if args.power: | ||||||
|         trx_params['power'] = db2lin(float(args.power)) * 1e-3 |         trx_params['power'] = db2lin(float(args.power)) * 1e-3 | ||||||
|     params.update(trx_params) |     params.update(trx_params) | ||||||
|  |     initial_spectrum = None | ||||||
|  |     nb_channels = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing']) | ||||||
|  |     if args.spectrum: | ||||||
|  |         initial_spectrum = load_initial_spectrum(args.spectrum) | ||||||
|  |         nb_channels = len(initial_spectrum) | ||||||
|  |         print('User input for spectrum used for propagation instead of SI') | ||||||
|  |     params['nb_channel'] = nb_channels | ||||||
|     req = PathRequest(**params) |     req = PathRequest(**params) | ||||||
|  |     req.initial_spectrum = initial_spectrum | ||||||
|  |     print(f'There are {nb_channels} channels propagating') | ||||||
|     power_mode = equipment['Span']['default'].power_mode |     power_mode = equipment['Span']['default'].power_mode | ||||||
|     print('\n'.join([f'Power mode is set to {power_mode}', |     print('\n'.join([f'Power mode is set to {power_mode}', | ||||||
|                      f'=> it can be modified in eqpt_config.json - Span'])) |                      f'=> it can be modified in eqpt_config.json - Span'])) | ||||||
|  |  | ||||||
|  |     # Keep the reference channel for design: the one from SI, with full load same channels | ||||||
|     pref_ch_db = lin2db(req.power * 1e3)  # reference channel power / span (SL=20dB) |     pref_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) |     pref_total_db = pref_ch_db + lin2db(req.nb_channel)  # reference total power / span (SL=20dB) | ||||||
|     try: |     try: | ||||||
| @@ -226,9 +237,13 @@ def transmission_main_example(args=None): | |||||||
|             power_range = list(linspace(p_start, p_stop, p_num)) |             power_range = list(linspace(p_start, p_stop, p_num)) | ||||||
|         except TypeError: |         except TypeError: | ||||||
|             print('invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]') |             print('invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]') | ||||||
|  |  | ||||||
|     for dp_db in power_range: |     for dp_db in power_range: | ||||||
|         req.power = db2lin(pref_ch_db + dp_db) * 1e-3 |         req.power = db2lin(pref_ch_db + dp_db) * 1e-3 | ||||||
|  |         # if initial spectrum did not contain any power, now we need to use this one. | ||||||
|  |         # note the initial power defines a differential wrt req.power so that if req.power is set to 2mW (3dBm) | ||||||
|  |         # and initial spectrum was set to 0, this sets a initial per channel delta power to -3dB, so that | ||||||
|  |         # whatever the equalization, -3 dB is applied on all channels (ie initial power in initial spectrum pre-empts | ||||||
|  |         # "--power" option) | ||||||
|         if power_mode: |         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}{lin2db(req.power*1e3):.2f} dBm{ansi_escapes.reset}:') | ||||||
|         else: |         else: | ||||||
| @@ -264,9 +279,9 @@ def transmission_main_example(args=None): | |||||||
|             ch_freq = final_carrier.frequency * 1e-12 |             ch_freq = final_carrier.frequency * 1e-12 | ||||||
|             ch_power = lin2db(final_carrier.power.signal * 1e3) |             ch_power = lin2db(final_carrier.power.signal * 1e3) | ||||||
|             print( |             print( | ||||||
|                 '{:5}{:26.2f}{:26.2f}{:28.2f}{:28.2f}{:28.2f}' .format( |                 '{:5}{:26.5f}{:26.2f}{:28.2f}{:28.2f}{:28.2f}' .format( | ||||||
|                     final_carrier.channel_number, round( |                     final_carrier.channel_number, round( | ||||||
|                         ch_freq, 2), round( |                         ch_freq, 5), round( | ||||||
|                         ch_power, 2), round( |                         ch_power, 2), round( | ||||||
|                         ch_osnr, 2), round( |                         ch_osnr, 2), round( | ||||||
|                         ch_snr_nl, 2), round( |                         ch_snr_nl, 2), round( | ||||||
|   | |||||||
| @@ -13,10 +13,13 @@ from logging import getLogger | |||||||
| from pathlib import Path | from pathlib import Path | ||||||
| import json | import json | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  | from numpy import arange | ||||||
|  |  | ||||||
| from gnpy.core import ansi_escapes, elements | from gnpy.core import ansi_escapes, elements | ||||||
| from gnpy.core.equipment import trx_mode_params | from gnpy.core.equipment import trx_mode_params | ||||||
| from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError | from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError | ||||||
| from gnpy.core.science_utils import estimate_nf_model | 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.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions | ||||||
| from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth | from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth | ||||||
| from gnpy.tools.convert import xls_to_json_data | from gnpy.tools.convert import xls_to_json_data | ||||||
| @@ -91,7 +94,6 @@ class Span(_JsonThing): | |||||||
|  |  | ||||||
| class Roadm(_JsonThing): | class Roadm(_JsonThing): | ||||||
|     default_values = { |     default_values = { | ||||||
|         'target_pch_out_db': -17, |  | ||||||
|         'add_drop_osnr': 100, |         'add_drop_osnr': 100, | ||||||
|         'pmd': 0, |         'pmd': 0, | ||||||
|         'pdl': 0, |         'pdl': 0, | ||||||
| @@ -102,6 +104,20 @@ class Roadm(_JsonThing): | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     def __init__(self, **kwargs): |     def __init__(self, **kwargs): | ||||||
|  |         # If equalization is not defined in equipment, then raise an error. | ||||||
|  |         # Only one type of equalization must be defined. | ||||||
|  |         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)) | ||||||
|  |         if not any(requested_eq_mask): | ||||||
|  |             raise EquipmentConfigError('No equalization type set in ROADM') | ||||||
|  |  | ||||||
|  |         for key in allowed_equalisations: | ||||||
|  |             if key in kwargs: | ||||||
|  |                 setattr(self, key, kwargs[key]) | ||||||
|  |                 break | ||||||
|         self.update_attr(self.default_values, kwargs, 'Roadm') |         self.update_attr(self.default_values, kwargs, 'Roadm') | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -249,11 +265,89 @@ def _automatic_spacing(baud_rate): | |||||||
|     return min((s[1] for s in spacing_list if s[0] > baud_rate), default=baud_rate * 1.2) |     return min((s[1] for s in spacing_list if s[0] > baud_rate), default=baud_rate * 1.2) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _spectrum_from_json(json_data): | ||||||
|  |     """JSON_data is a list of spectrum partitions each with | ||||||
|  |     {f_min, f_max, baud_rate, roll_off, delta_pdb, slot_width, tx_osnr, label} | ||||||
|  |     Creates the per freq Carrier's dict. | ||||||
|  |     f_min, f_max, baud_rate, slot_width and roll_off are mandatory | ||||||
|  |     label, tx_osnr and delta_pdb are created if not present | ||||||
|  |     label should be different for each partition | ||||||
|  |     >>> json_data = {'spectrum': \ | ||||||
|  |         [{'f_min': 193.2e12, 'f_max': 193.4e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15, \ | ||||||
|  |             'delta_pdb': 1, 'tx_osnr': 45},\ | ||||||
|  |         {'f_min': 193.4625e12, 'f_max': 193.9875e12, 'slot_width': 75e9, 'baud_rate': 64e9, 'roll_off': 0.15},\ | ||||||
|  |         {'f_min': 194.075e12, 'f_max': 194.075e12, 'slot_width': 100e9, 'baud_rate': 90e9, 'roll_off': 0.15},\ | ||||||
|  |         {'f_min': 194.2e12, 'f_max': 194.35e12, 'slot_width': 50e9, 'baud_rate': 32e9, 'roll_off': 0.15}]} | ||||||
|  |     >>> spectrum = _spectrum_from_json(json_data['spectrum']) | ||||||
|  |     >>> for k, v in spectrum.items(): | ||||||
|  |     ...     print(f'{k}: {v}') | ||||||
|  |     ... | ||||||
|  |     193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G') | ||||||
|  |     193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G') | ||||||
|  |     193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G') | ||||||
|  |     193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G') | ||||||
|  |     193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, label='0-32.00G') | ||||||
|  |     193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, label='1-64.00G') | ||||||
|  |     194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, label='2-90.00G') | ||||||
|  |     194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G') | ||||||
|  |     194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G') | ||||||
|  |     194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G') | ||||||
|  |     194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, label='3-32.00G') | ||||||
|  |     """ | ||||||
|  |     spectrum = {} | ||||||
|  |     json_data = sorted(json_data, key=lambda x: x['f_min']) | ||||||
|  |     # min freq of occupation is f_min - slot_width/2 (numbering starts at 0) | ||||||
|  |     previous_part_max_freq = 0.0 | ||||||
|  |     for index, part in enumerate(json_data): | ||||||
|  |         # default delta_pdb is 0 dB | ||||||
|  |         if 'delta_pdb' not in part: | ||||||
|  |             part['delta_pdb'] = 0 | ||||||
|  |         # add a label to the partition for the printings | ||||||
|  |         if 'label' not in part: | ||||||
|  |             part['label'] = f'{index}-{part["baud_rate"] * 1e-9 :.2f}G' | ||||||
|  |         # default tx_osnr is set to 40 dB | ||||||
|  |         if 'tx_osnr' not in part: | ||||||
|  |             part['tx_osnr'] = 40 | ||||||
|  |         # starting freq is exactly f_min to be consistent with utils.automatic_nch | ||||||
|  |         # first partition min occupation is f_min - slot_width / 2 (central_frequency is f_min) | ||||||
|  |         # supposes that carriers are centered on frequency | ||||||
|  |         if previous_part_max_freq > (part['f_min'] - part['slot_width'] / 2): | ||||||
|  |             # check that previous part last channel does not overlap on next part first channel | ||||||
|  |             # max center of the part should be below part['f_max'] and aligned on the slot_width | ||||||
|  |             msg = 'Not a valid initial spectrum definition:\nprevious spectrum last carrier max occupation ' +\ | ||||||
|  |                 f'{previous_part_max_freq * 1e-12 :.5f}GHz ' +\ | ||||||
|  |                 'overlaps on next spectrum first carrier occupation ' +\ | ||||||
|  |                 f'{(part["f_min"] - part["slot_width"] / 2) * 1e-12 :.5f}GHz' | ||||||
|  |             raise ValueError(msg) | ||||||
|  |  | ||||||
|  |         max_range = ((part['f_max'] - part['f_min']) // part['slot_width'] + 1) * part['slot_width'] | ||||||
|  |         for current_freq in arange(part['f_min'], | ||||||
|  |                                    part['f_min'] + max_range, | ||||||
|  |                                    part['slot_width']): | ||||||
|  |             spectrum[current_freq] = Carrier(delta_pdb=part['delta_pdb'], baud_rate=part['baud_rate'], | ||||||
|  |                                              slot_width=part['slot_width'], roll_off=part['roll_off'], | ||||||
|  |                                              tx_osnr=part['tx_osnr'], label=part['label']) | ||||||
|  |         previous_part_max_freq = current_freq + part['slot_width'] / 2 | ||||||
|  |     return spectrum | ||||||
|  |  | ||||||
|  |  | ||||||
| def load_equipment(filename): | def load_equipment(filename): | ||||||
|     json_data = load_json(filename) |     json_data = load_json(filename) | ||||||
|     return _equipment_from_json(json_data, filename) |     return _equipment_from_json(json_data, filename) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def load_initial_spectrum(filename): | ||||||
|  |     json_data = load_json(filename) | ||||||
|  |     return _spectrum_from_json(json_data['spectrum']) | ||||||
|  |  | ||||||
|  |  | ||||||
| def _update_dual_stage(equipment): | def _update_dual_stage(equipment): | ||||||
|     edfa_dict = equipment['Edfa'] |     edfa_dict = equipment['Edfa'] | ||||||
|     for edfa in edfa_dict.values(): |     for edfa in edfa_dict.values(): | ||||||
| @@ -384,9 +478,16 @@ def network_from_json(json_data, equipment): | |||||||
|             # well, there's no variety for the 'Fused' node type |             # well, there's no variety for the 'Fused' node type | ||||||
|             pass |             pass | ||||||
|         elif variety in equipment[typ]: |         elif variety in equipment[typ]: | ||||||
|             extra_params = equipment[typ][variety] |             extra_params = equipment[typ][variety].__dict__ | ||||||
|             temp = el_config.setdefault('params', {}) |             temp = el_config.setdefault('params', {}) | ||||||
|             temp = merge_amplifier_restrictions(temp, extra_params.__dict__) |             if typ == 'Roadm': | ||||||
|  |                 # if equalization is defined, remove default equalization from the extra_params | ||||||
|  |                 # If equalisation is not defined in the element config, then use the default one from 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') | ||||||
|  |             temp = merge_amplifier_restrictions(temp, extra_params) | ||||||
|             el_config['params'] = temp |             el_config['params'] = temp | ||||||
|             el_config['type_variety'] = variety |             el_config['type_variety'] = variety | ||||||
|         elif (typ in ['Fiber', 'RamanFiber']) or (typ == 'Edfa' and variety not in ['default', '']): |         elif (typ in ['Fiber', 'RamanFiber']) or (typ == 'Edfa' and variety not in ['default', '']): | ||||||
| @@ -457,16 +558,16 @@ def requests_from_json(json_data, equipment): | |||||||
|     for req in json_data['path-request']: |     for req in json_data['path-request']: | ||||||
|         # init all params from request |         # init all params from request | ||||||
|         params = {} |         params = {} | ||||||
|         params['request_id'] = req['request-id'] |         params['request_id'] = f'{req["request-id"]}' | ||||||
|         params['source'] = req['source'] |         params['source'] = req['source'] | ||||||
|         params['bidir'] = req['bidirectional'] |         params['bidir'] = req['bidirectional'] | ||||||
|         params['destination'] = req['destination'] |         params['destination'] = req['destination'] | ||||||
|         params['trx_type'] = req['path-constraints']['te-bandwidth']['trx_type'] |         params['trx_type'] = req['path-constraints']['te-bandwidth']['trx_type'] | ||||||
|         params['trx_mode'] = req['path-constraints']['te-bandwidth']['trx_mode'] |         params['trx_mode'] = req['path-constraints']['te-bandwidth'].get('trx_mode', None) | ||||||
|         params['format'] = params['trx_mode'] |         params['format'] = params['trx_mode'] | ||||||
|         params['spacing'] = req['path-constraints']['te-bandwidth']['spacing'] |         params['spacing'] = req['path-constraints']['te-bandwidth']['spacing'] | ||||||
|         try: |         try: | ||||||
|             nd_list = req['explicit-route-objects']['route-object-include-exclude'] |             nd_list = sorted(req['explicit-route-objects']['route-object-include-exclude'], key=lambda x: x['index']) | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             nd_list = [] |             nd_list = [] | ||||||
|         params['nodes_list'] = [n['num-unnum-hop']['node-id'] for n in nd_list] |         params['nodes_list'] = [n['num-unnum-hop']['node-id'] for n in nd_list] | ||||||
| @@ -576,3 +677,42 @@ def convert_service_sheet( | |||||||
|     data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir) |     data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir) | ||||||
|     save_json(data, output_filename) |     save_json(data, output_filename) | ||||||
|     return data |     return data | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def find_equalisation(params, equalization_types): | ||||||
|  |     """Find the equalization(s) defined in params. params can be a dict or a Roadm object. | ||||||
|  |  | ||||||
|  |     >>> roadm = {'add_drop_osnr': 100, 'pmd': 1, 'pdl': 0.5, | ||||||
|  |     ...     'restrictions': {'preamp_variety_list': ['a'], 'booster_variety_list': ['b']}, | ||||||
|  |     ...     'target_psd_out_mWperGHz': 4e-4} | ||||||
|  |     >>> equalization_types = ['target_pch_out_db', 'target_psd_out_mWperGHz'] | ||||||
|  |     >>> find_equalisation(roadm, equalization_types) | ||||||
|  |     {'target_pch_out_db': False, 'target_psd_out_mWperGHz': True} | ||||||
|  |     """ | ||||||
|  |     equalization = {e: False for e in equalization_types} | ||||||
|  |     for equ in equalization_types: | ||||||
|  |         if equ in params: | ||||||
|  |             equalization[equ] = True | ||||||
|  |     return equalization | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def merge_equalization(params, extra_params): | ||||||
|  |     """params contains ROADM element config and extra_params default values from equipment library. | ||||||
|  |     If equalization is not defined in ROADM element use the one defined in equipment library. | ||||||
|  |     Only one type of equalization must be defined: power (target_pch_out_db) or PSD (target_psd_out_mWperGHz) | ||||||
|  |     or PSW (target_out_mWperSlotWidth) | ||||||
|  |     params and extra_params are dict | ||||||
|  |     """ | ||||||
|  |     equalization_types = ['target_pch_out_db', 'target_psd_out_mWperGHz', 'target_out_mWperSlotWidth'] | ||||||
|  |     roadm_equalizations = find_equalisation(params, equalization_types) | ||||||
|  |     if sum(roadm_equalizations.values()) > 1: | ||||||
|  |         # if ROADM config contains more than one equalization type then this is an error | ||||||
|  |         return None | ||||||
|  |     if sum(roadm_equalizations.values()) == 1: | ||||||
|  |         # if ROADM config contains one equalization | ||||||
|  |         # don't use the default equalization | ||||||
|  |         return {k: v for k, v in extra_params.items() if k not in equalization_types} | ||||||
|  |     if sum(roadm_equalizations.values()) == 0: | ||||||
|  |         # If ROADM config doesn't contain any equalization type, keep the default one | ||||||
|  |         return extra_params | ||||||
|  |     return None | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ from networkx.utils import pairwise | |||||||
| from numpy import mean, argmin | from numpy import mean, argmin | ||||||
| from gnpy.core.elements import Transceiver, Roadm | from gnpy.core.elements import Transceiver, Roadm | ||||||
| from gnpy.core.utils import lin2db | from gnpy.core.utils import lin2db | ||||||
| from gnpy.core.info import create_input_spectral_information | from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, ReferenceCarrier | ||||||
| from gnpy.core.exceptions import ServiceError, DisjunctionError | from gnpy.core.exceptions import ServiceError, DisjunctionError | ||||||
| import gnpy.core.ansi_escapes as ansi_escapes | import gnpy.core.ansi_escapes as ansi_escapes | ||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
| @@ -72,6 +72,7 @@ class PathRequest: | |||||||
|         if params.effective_freq_slot is not None: |         if params.effective_freq_slot is not None: | ||||||
|             self.N = params.effective_freq_slot['N'] |             self.N = params.effective_freq_slot['N'] | ||||||
|             self.M = params.effective_freq_slot['M'] |             self.M = params.effective_freq_slot['M'] | ||||||
|  |         self.initial_spectrum = None | ||||||
|  |  | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return '\n\t'.join([f'{type(self).__name__} {self.request_id}', |         return '\n\t'.join([f'{type(self).__name__} {self.request_id}', | ||||||
| @@ -339,21 +340,36 @@ def compute_constrained_path(network, req): | |||||||
|     return 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): | def propagate(path, req, equipment): | ||||||
|     si = create_input_spectral_information( |     """ propagates signals in each element according to initial spectrum set by user | ||||||
|         req.f_min, req.f_max, req.roll_off, req.baud_rate, |     """ | ||||||
|         req.power, req.spacing) |     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)) | ||||||
|  |     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)) | ||||||
|     for i, el in enumerate(path): |     for i, el in enumerate(path): | ||||||
|         if isinstance(el, Roadm): |         if isinstance(el, Roadm): | ||||||
|             si = el(si, degree=path[i+1].uid) |             si = el(si, degree=path[i+1].uid) | ||||||
|         else: |         else: | ||||||
|             si = el(si) |             si = el(si) | ||||||
|     path[0].update_snr(req.tx_osnr) |     path[0].update_snr(si.tx_osnr) | ||||||
|     path[0].calc_penalties(req.penalties) |     path[0].calc_penalties(req.penalties) | ||||||
|     if any(isinstance(el, Roadm) for el in path): |     if any(isinstance(el, Roadm) for el in path): | ||||||
|         path[-1].update_snr(req.tx_osnr, equipment['Roadm']['default'].add_drop_osnr) |         path[-1].update_snr(si.tx_osnr, equipment['Roadm']['default'].add_drop_osnr) | ||||||
|     else: |     else: | ||||||
|         path[-1].update_snr(req.tx_osnr) |         path[-1].update_snr(si.tx_osnr) | ||||||
|     path[-1].calc_penalties(req.penalties) |     path[-1].calc_penalties(req.penalties) | ||||||
|     return si |     return si | ||||||
|  |  | ||||||
| @@ -374,13 +390,18 @@ def propagate_and_optimize_mode(path, req, equipment): | |||||||
|                                 float(this_mode['min_spacing']) <= req.spacing] |                                 float(this_mode['min_spacing']) <= req.spacing] | ||||||
|             modes_to_explore = sorted(modes_to_explore, |             modes_to_explore = sorted(modes_to_explore, | ||||||
|                                       key=lambda x: x['bit_rate'], reverse=True) |                                       key=lambda x: x['bit_rate'], reverse=True) | ||||||
|             # print(modes_to_explore) |  | ||||||
|             # step2: computes propagation for each baudrate: stop and select the first that passes |             # step2: computes propagation for each baudrate: stop and select the first that passes | ||||||
|             # TODO: the case of roll of is not included: for now use SI one |             # 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 |             # TODO: if the loop in mode optimization does not have a feasible path, then bugs | ||||||
|             spc_info = create_input_spectral_information(req.f_min, req.f_max, |             if req.initial_spectrum is not None: | ||||||
|                                                          equipment['SI']['default'].roll_off, |                 # this case is not yet handled: spectrum can not be defined for the path-request-run function | ||||||
|                                                          this_br, req.power, req.spacing) |                 # and this function is only called in this case. so coming here should not be considered yet. | ||||||
|  |                 msg = f'Request: {req.request_id} contains a unexpected initial_spectrum.' | ||||||
|  |                 raise ServiceError(msg) | ||||||
|  |             spc_info = create_input_spectral_information(f_min=req.f_min, f_max=req.f_max, | ||||||
|  |                                                          roll_off=equipment['SI']['default'].roll_off, | ||||||
|  |                                                          baud_rate=this_br, power=req.power, spacing=req.spacing, | ||||||
|  |                                                          tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment)) | ||||||
|             for i, el in enumerate(path): |             for i, el in enumerate(path): | ||||||
|                 if isinstance(el, Roadm): |                 if isinstance(el, Roadm): | ||||||
|                     spc_info = el(spc_info, degree=path[i+1].uid) |                     spc_info = el(spc_info, degree=path[i+1].uid) | ||||||
| @@ -1142,6 +1163,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist): | |||||||
|                         pathreq.OSNR = mode['OSNR'] |                         pathreq.OSNR = mode['OSNR'] | ||||||
|                         pathreq.tx_osnr = mode['tx_osnr'] |                         pathreq.tx_osnr = mode['tx_osnr'] | ||||||
|                         pathreq.bit_rate = mode['bit_rate'] |                         pathreq.bit_rate = mode['bit_rate'] | ||||||
|  |                         pathreq.penalties = mode['penalties'] | ||||||
|                     # other blocking reason should not appear at this point |                     # other blocking reason should not appear at this point | ||||||
|                 except AttributeError: |                 except AttributeError: | ||||||
|                     pathreq.baud_rate = mode['baud_rate'] |                     pathreq.baud_rate = mode['baud_rate'] | ||||||
| @@ -1150,6 +1172,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist): | |||||||
|                     pathreq.OSNR = mode['OSNR'] |                     pathreq.OSNR = mode['OSNR'] | ||||||
|                     pathreq.tx_osnr = mode['tx_osnr'] |                     pathreq.tx_osnr = mode['tx_osnr'] | ||||||
|                     pathreq.bit_rate = mode['bit_rate'] |                     pathreq.bit_rate = mode['bit_rate'] | ||||||
|  |                     pathreq.penalties = mode['penalties'] | ||||||
|  |  | ||||||
|             # reversed path is needed for correct spectrum assignment |             # reversed path is needed for correct spectrum assignment | ||||||
|             reversed_path = find_reversed_path(pathlist[i]) |             reversed_path = find_reversed_path(pathlist[i]) | ||||||
|   | |||||||
| @@ -365,12 +365,6 @@ def spectrum_selection(pth, oms_list, requested_m, requested_n=None): | |||||||
|             candidate = (requested_n, requested_n - requested_m, requested_n + requested_m - 1) |             candidate = (requested_n, requested_n - requested_m, requested_n + requested_m - 1) | ||||||
|         else: |         else: | ||||||
|             candidate = (None, None, None) |             candidate = (None, None, None) | ||||||
|         # print("coucou11") |  | ||||||
|         # print(candidate) |  | ||||||
|     # print(freq_availability[321:321+2*m]) |  | ||||||
|     # a = [i+321 for i in range(2*m)] |  | ||||||
|     # print(a) |  | ||||||
|     # print(candidate) |  | ||||||
|     return candidate, path_oms |     return candidate, path_oms | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| matplotlib>=3.5.1,<4 | matplotlib>=3.5.1,<4 | ||||||
| networkx>=2.6,<3 | networkx>=2.6,<3 | ||||||
| numpy>=1.22.0,<2 | numpy>=1.22.0,<2 | ||||||
| pandas>=1.3.5,<2 |  | ||||||
| pbr>=5.7.0,<6 | pbr>=5.7.0,<6 | ||||||
| scipy>=1.7.3,<2 | scipy>=1.7.3,<2 | ||||||
| xlrd>=1.2.0,<2 | xlrd>=1.2.0,<2 | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ name = gnpy | |||||||
| description-file = README.md | description-file = README.md | ||||||
| description-content-type = text/markdown; variant=GFM | description-content-type = text/markdown; variant=GFM | ||||||
| author = Telecom Infra Project | author = Telecom Infra Project | ||||||
| author-email = jan.kundrat@telecominfraproject.com | author-email = jkt@jankundrat.com | ||||||
| license = BSD-3-Clause | license = BSD-3-Clause | ||||||
| home-page = https://github.com/Telecominfraproject/oopt-gnpy | home-page = https://github.com/Telecominfraproject/oopt-gnpy | ||||||
| project_urls = | project_urls = | ||||||
| @@ -22,6 +22,7 @@ classifier = | |||||||
|     Programming Language :: Python :: 3.8 |     Programming Language :: Python :: 3.8 | ||||||
|     Programming Language :: Python :: 3.9 |     Programming Language :: Python :: 3.9 | ||||||
|     Programming Language :: Python :: 3.10 |     Programming Language :: Python :: 3.10 | ||||||
|  |     Programming Language :: Python :: 3.11 | ||||||
|     Programming Language :: Python :: Implementation :: CPython |     Programming Language :: Python :: Implementation :: CPython | ||||||
|     Topic :: Scientific/Engineering |     Topic :: Scientific/Engineering | ||||||
|     Topic :: Scientific/Engineering :: Physics |     Topic :: Scientific/Engineering :: Physics | ||||||
|   | |||||||
| @@ -196,101 +196,101 @@ | |||||||
|         0.0 |         0.0 | ||||||
|     ], |     ], | ||||||
|     "dgt": [ |     "dgt": [ | ||||||
|         2.714526681131686, |         1.0, | ||||||
|         2.705443819238505, |  | ||||||
|         2.6947834587664494, |  | ||||||
|         2.6841217449620203, |  | ||||||
|         2.6681935771243177, |  | ||||||
|         2.6521732021128046, |  | ||||||
|         2.630396440815385, |  | ||||||
|         2.602860350286428, |  | ||||||
|         2.5696460593920065, |  | ||||||
|         2.5364027376452056, |  | ||||||
|         2.499446286796604, |  | ||||||
|         2.4587748041127506, |  | ||||||
|         2.414398437185221, |  | ||||||
|         2.3699990328716107, |  | ||||||
|         2.322373696229342, |  | ||||||
|         2.271520771371253, |  | ||||||
|         2.2174389328192197, |  | ||||||
|         2.16337565384239, |  | ||||||
|         2.1183028432496016, |  | ||||||
|         2.082225099873648, |  | ||||||
|         2.055100772005235, |  | ||||||
|         2.0279625371819305, |  | ||||||
|         2.0008103857988204, |  | ||||||
|         1.9736443063300082, |  | ||||||
|         1.9482128147680253, |  | ||||||
|         1.9245345552113182, |  | ||||||
|         1.9026104247588487, |  | ||||||
|         1.8806927939516411, |  | ||||||
|         1.862235672444246, |  | ||||||
|         1.847275503201129, |  | ||||||
|         1.835814081380705, |  | ||||||
|         1.824381436842932, |  | ||||||
|         1.8139629377087627, |  | ||||||
|         1.8045606557581335, |  | ||||||
|         1.7961751115773796, |  | ||||||
|         1.7877868031023945, |  | ||||||
|         1.7793941781790852, |  | ||||||
|         1.7709972329654864, |  | ||||||
|         1.7625959636196327, |  | ||||||
|         1.7541903672600494, |  | ||||||
|         1.7459181197626403, |  | ||||||
|         1.737780757913635, |  | ||||||
|         1.7297783508684146, |  | ||||||
|         1.7217732861435076, |  | ||||||
|         1.7137640932265894, |  | ||||||
|         1.7057507692361864, |  | ||||||
|         1.6918150918099673, |  | ||||||
|         1.6719047669939942, |  | ||||||
|         1.6460167077689267, |  | ||||||
|         1.6201194134191075, |  | ||||||
|         1.5986915141218316, |  | ||||||
|         1.5817353179379183, |  | ||||||
|         1.569199764184379, |  | ||||||
|         1.5566577309558969, |  | ||||||
|         1.545374152761467, |  | ||||||
|         1.5353620432989845, |  | ||||||
|         1.5266220576235803, |  | ||||||
|         1.5178910621476225, |  | ||||||
|         1.5097346239790443, |  | ||||||
|         1.502153039909686, |  | ||||||
|         1.495145456062699, |  | ||||||
|         1.488134243479226, |  | ||||||
|         1.48111939735681, |  | ||||||
|         1.474100442252211, |  | ||||||
|         1.4670307626366115, |  | ||||||
|         1.4599103316162523, |  | ||||||
|         1.45273959485914, |  | ||||||
|         1.445565137158368, |  | ||||||
|         1.4340878115214444, |  | ||||||
|         1.418273806730323, |  | ||||||
|         1.3981208704326855, |  | ||||||
|         1.3779439775587023, |  | ||||||
|         1.3598972673004606, |  | ||||||
|         1.3439818461440451, |  | ||||||
|         1.3301807335621048, |  | ||||||
|         1.316383926863083, |  | ||||||
|         1.3040618749785347, |  | ||||||
|         1.2932153453410835, |  | ||||||
|         1.2838336236692311, |  | ||||||
|         1.2744470198196236, |  | ||||||
|         1.2650555289898042, |  | ||||||
|         1.2556591482982988, |  | ||||||
|         1.2428104897182262, |  | ||||||
|         1.2264996957264114, |  | ||||||
|         1.2067249615595257, |  | ||||||
|         1.1869318618366975, |  | ||||||
|         1.1672278304018044, |  | ||||||
|         1.1476135933863398, |  | ||||||
|         1.1280891949729075, |  | ||||||
|         1.108555289615659, |  | ||||||
|         1.0895983485572227, |  | ||||||
|         1.0712204022764056, |  | ||||||
|         1.0534217504465226, |  | ||||||
|         1.0356155337864215, |  | ||||||
|         1.017807767853702, |         1.017807767853702, | ||||||
|         1.0 |         1.0356155337864215, | ||||||
|  |         1.0534217504465226, | ||||||
|  |         1.0712204022764056, | ||||||
|  |         1.0895983485572227, | ||||||
|  |         1.108555289615659, | ||||||
|  |         1.1280891949729075, | ||||||
|  |         1.1476135933863398, | ||||||
|  |         1.1672278304018044, | ||||||
|  |         1.1869318618366975, | ||||||
|  |         1.2067249615595257, | ||||||
|  |         1.2264996957264114, | ||||||
|  |         1.2428104897182262, | ||||||
|  |         1.2556591482982988, | ||||||
|  |         1.2650555289898042, | ||||||
|  |         1.2744470198196236, | ||||||
|  |         1.2838336236692311, | ||||||
|  |         1.2932153453410835, | ||||||
|  |         1.3040618749785347, | ||||||
|  |         1.316383926863083, | ||||||
|  |         1.3301807335621048, | ||||||
|  |         1.3439818461440451, | ||||||
|  |         1.3598972673004606, | ||||||
|  |         1.3779439775587023, | ||||||
|  |         1.3981208704326855, | ||||||
|  |         1.418273806730323, | ||||||
|  |         1.4340878115214444, | ||||||
|  |         1.445565137158368, | ||||||
|  |         1.45273959485914, | ||||||
|  |         1.4599103316162523, | ||||||
|  |         1.4670307626366115, | ||||||
|  |         1.474100442252211, | ||||||
|  |         1.48111939735681, | ||||||
|  |         1.488134243479226, | ||||||
|  |         1.495145456062699, | ||||||
|  |         1.502153039909686, | ||||||
|  |         1.5097346239790443, | ||||||
|  |         1.5178910621476225, | ||||||
|  |         1.5266220576235803, | ||||||
|  |         1.5353620432989845, | ||||||
|  |         1.545374152761467, | ||||||
|  |         1.5566577309558969, | ||||||
|  |         1.569199764184379, | ||||||
|  |         1.5817353179379183, | ||||||
|  |         1.5986915141218316, | ||||||
|  |         1.6201194134191075, | ||||||
|  |         1.6460167077689267, | ||||||
|  |         1.6719047669939942, | ||||||
|  |         1.6918150918099673, | ||||||
|  |         1.7057507692361864, | ||||||
|  |         1.7137640932265894, | ||||||
|  |         1.7217732861435076, | ||||||
|  |         1.7297783508684146, | ||||||
|  |         1.737780757913635, | ||||||
|  |         1.7459181197626403, | ||||||
|  |         1.7541903672600494, | ||||||
|  |         1.7625959636196327, | ||||||
|  |         1.7709972329654864, | ||||||
|  |         1.7793941781790852, | ||||||
|  |         1.7877868031023945, | ||||||
|  |         1.7961751115773796, | ||||||
|  |         1.8045606557581335, | ||||||
|  |         1.8139629377087627, | ||||||
|  |         1.824381436842932, | ||||||
|  |         1.835814081380705, | ||||||
|  |         1.847275503201129, | ||||||
|  |         1.862235672444246, | ||||||
|  |         1.8806927939516411, | ||||||
|  |         1.9026104247588487, | ||||||
|  |         1.9245345552113182, | ||||||
|  |         1.9482128147680253, | ||||||
|  |         1.9736443063300082, | ||||||
|  |         2.0008103857988204, | ||||||
|  |         2.0279625371819305, | ||||||
|  |         2.055100772005235, | ||||||
|  |         2.082225099873648, | ||||||
|  |         2.1183028432496016, | ||||||
|  |         2.16337565384239, | ||||||
|  |         2.2174389328192197, | ||||||
|  |         2.271520771371253, | ||||||
|  |         2.322373696229342, | ||||||
|  |         2.3699990328716107, | ||||||
|  |         2.414398437185221, | ||||||
|  |         2.4587748041127506, | ||||||
|  |         2.499446286796604, | ||||||
|  |         2.5364027376452056, | ||||||
|  |         2.5696460593920065, | ||||||
|  |         2.602860350286428, | ||||||
|  |         2.630396440815385, | ||||||
|  |         2.6521732021128046, | ||||||
|  |         2.6681935771243177, | ||||||
|  |         2.6841217449620203, | ||||||
|  |         2.6947834587664494, | ||||||
|  |         2.705443819238505, | ||||||
|  |         2.714526681131686 | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1258,7 +1258,7 @@ | |||||||
|           }, |           }, | ||||||
|           { |           { | ||||||
|             "metric-type": "SNR-0.1nm", |             "metric-type": "SNR-0.1nm", | ||||||
|             "accumulative-value": 28.77 |             "accumulative-value": 28.78 | ||||||
|           }, |           }, | ||||||
|           { |           { | ||||||
|             "metric-type": "OSNR-bandwidth", |             "metric-type": "OSNR-bandwidth", | ||||||
|   | |||||||
| @@ -3,5 +3,5 @@ response-id,source,destination,path_bandwidth,Pass?,nb of tsp pairs,total cost,t | |||||||
| 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",,, | 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",,, | 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",,, | 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.77,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",,, | 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",,, | ||||||
| 6,,,,NO_PATH,,,,,,,,,,,,,, | 6,,,,NO_PATH,,,,,,,,,,,,,, | ||||||
|   | |||||||
| 
 | 
							
								
								
									
										809
									
								
								tests/data/test_long_network.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										809
									
								
								tests/data/test_long_network.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,809 @@ | |||||||
|  | { | ||||||
|  |     "network_name": "Example Network - long path", | ||||||
|  |     "elements": [{ | ||||||
|  |             "uid": "Site_A", | ||||||
|  |             "type": "Transceiver", | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "city": "Site A", | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 0, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "uid": "roadm Site A", | ||||||
|  |           "metadata": { | ||||||
|  |             "location": { | ||||||
|  |               "city": "Site A", | ||||||
|  |               "region": "RLD", | ||||||
|  |               "latitude": 0.0, | ||||||
|  |               "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "type": "Roadm" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "booster A", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 0, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span1", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa1", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span2", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa2", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span3", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa3", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span4", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa4", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span5", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa5", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "uid": "roadm Site C", | ||||||
|  |           "metadata": { | ||||||
|  |             "location": { | ||||||
|  |               "city": "Site A", | ||||||
|  |               "region": "RLD", | ||||||
|  |               "latitude": 0.0, | ||||||
|  |               "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "type": "Roadm" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "booster C", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 0, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span6", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa6", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span7", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa7", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span8", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa8", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span9", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa9", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span10", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa10", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "uid": "roadm Site D", | ||||||
|  |           "metadata": { | ||||||
|  |             "location": { | ||||||
|  |               "city": "Site A", | ||||||
|  |               "region": "RLD", | ||||||
|  |               "latitude": 0.0, | ||||||
|  |               "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "type": "Roadm" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "booster D", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 0, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span11", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa11", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span12", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa12", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "uid": "roadm Site E", | ||||||
|  |           "metadata": { | ||||||
|  |             "location": { | ||||||
|  |               "city": "Site A", | ||||||
|  |               "region": "RLD", | ||||||
|  |               "latitude": 0.0, | ||||||
|  |               "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "type": "Roadm" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "booster E", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "std_medium_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 0, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span13", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa13", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span14", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa14", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test_fixed_gain", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Span15", | ||||||
|  |             "type": "Fiber", | ||||||
|  |             "type_variety": "SSMF", | ||||||
|  |             "params": { | ||||||
|  |                 "length": 80, | ||||||
|  |                 "loss_coef": 0.2, | ||||||
|  |                 "length_units": "km" | ||||||
|  |                 }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 1, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Edfa15", | ||||||
|  |             "type": "Edfa", | ||||||
|  |             "type_variety": "test", | ||||||
|  |             "operational": { | ||||||
|  |                 "gain_target": 16, | ||||||
|  |                 "tilt_target": 0 | ||||||
|  |             }, | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 2, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "uid": "roadm Site B", | ||||||
|  |           "metadata": { | ||||||
|  |             "location": { | ||||||
|  |               "city": "Site B", | ||||||
|  |               "region": "RLD", | ||||||
|  |               "latitude": 0.0, | ||||||
|  |               "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           "type": "Roadm" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "uid": "Site_B", | ||||||
|  |             "type": "Transceiver", | ||||||
|  |             "metadata": { | ||||||
|  |                 "location": { | ||||||
|  |                     "city": "Site B", | ||||||
|  |                     "region": "", | ||||||
|  |                     "latitude": 3, | ||||||
|  |                     "longitude": 0 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     ], | ||||||
|  |     "connections": [{ | ||||||
|  |             "from_node": "Site_A", | ||||||
|  |             "to_node": "roadm Site A" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "roadm Site A", | ||||||
|  |             "to_node": "booster A" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "booster A", | ||||||
|  |             "to_node": "Span1" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span1", | ||||||
|  |             "to_node": "Edfa1" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa1", | ||||||
|  |             "to_node": "Span2" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span2", | ||||||
|  |             "to_node": "Edfa2" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa2", | ||||||
|  |             "to_node": "Span3" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span3", | ||||||
|  |             "to_node": "Edfa3" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa3", | ||||||
|  |             "to_node": "Span4" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span4", | ||||||
|  |             "to_node": "Edfa4" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa4", | ||||||
|  |             "to_node": "Span5" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span5", | ||||||
|  |             "to_node": "Edfa5" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa5", | ||||||
|  |             "to_node": "roadm Site C" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "roadm Site C", | ||||||
|  |             "to_node": "booster C" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "booster C", | ||||||
|  |             "to_node": "Span6" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span6", | ||||||
|  |             "to_node": "Edfa6" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa6", | ||||||
|  |             "to_node": "Span7" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span7", | ||||||
|  |             "to_node": "Edfa7" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa7", | ||||||
|  |             "to_node": "Span8" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span8", | ||||||
|  |             "to_node": "Edfa8" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa8", | ||||||
|  |             "to_node": "Span9" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span9", | ||||||
|  |             "to_node": "Edfa9" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa9", | ||||||
|  |             "to_node": "Span10" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span10", | ||||||
|  |             "to_node": "Edfa10" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa10", | ||||||
|  |             "to_node": "roadm Site D" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "roadm Site D", | ||||||
|  |             "to_node": "booster D" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "booster D", | ||||||
|  |             "to_node": "Span11" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span11", | ||||||
|  |             "to_node": "Edfa11" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa11", | ||||||
|  |             "to_node": "Span12" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span12", | ||||||
|  |             "to_node": "Edfa12" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa12", | ||||||
|  |             "to_node": "roadm Site E" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "roadm Site E", | ||||||
|  |             "to_node": "booster E" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "booster E", | ||||||
|  |             "to_node": "Span13" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span13", | ||||||
|  |             "to_node": "Edfa13" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa13", | ||||||
|  |             "to_node": "Span14" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span14", | ||||||
|  |             "to_node": "Edfa14" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa14", | ||||||
|  |             "to_node": "Span15" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "Span15", | ||||||
|  |             "to_node": "Edfa15" | ||||||
|  |         },        | ||||||
|  |         { | ||||||
|  |             "from_node": "Edfa15", | ||||||
|  |             "to_node": "roadm Site B" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "from_node": "roadm Site B", | ||||||
|  |             "to_node": "Site_B" | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -1,98 +1,98 @@ | |||||||
| 1.000000000000000021e-03,6.059428294303585358e-04,4.124436878765448634e-04,2.874462507798667202e-04,2.103923932407651741e-04,1.678414792051835720e-04,1.547359756068614396e-04,1.816771264024174659e-04,3.223716208702616772e-04 | 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.053134417926274479e-04,4.117055522849718272e-04,2.867345754340725936e-04,2.097129658661858059e-04,1.671408382188599656e-04,1.538980727463440737e-04,1.804148897825019347e-04,3.196786917797407482e-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.046849734433535663e-04,4.109690875237402238e-04,2.860250085842350751e-04,2.090360511584246736e-04,1.664434237997556567e-04,1.530650313352837862e-04,1.791618737991747007e-04,3.170092948646618079e-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.040574211994215528e-04,4.102342878398261821e-04,2.853175420730359193e-04,2.083616379079277403e-04,1.657492189637676920e-04,1.522368203677859210e-04,1.779180061767344980e-04,3.143632101370558260e-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.034068048547004811e-04,4.094522032835132145e-04,2.845379038962591819e-04,2.075849237814657072e-04,1.649065028354379026e-04,1.511673145690444625e-04,1.761800891032866087e-04,3.101696013411107001e-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.027571485450614400e-04,4.086719523190792173e-04,2.837607352174946669e-04,2.068114158243908936e-04,1.640683639230874002e-04,1.501056331894667201e-04,1.744595725998800725e-04,3.060328853710948794e-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.021084488423111532e-04,4.078935283235860985e-04,2.829860258399657913e-04,2.060410983394430761e-04,1.632347745793864737e-04,1.490517152618393740e-04,1.727562758069566841e-04,3.019522704750103072e-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.014584946769776846e-04,4.071145901524401327e-04,2.822117789926256531e-04,2.052723360542508288e-04,1.624043320606193702e-04,1.480041851535097400e-04,1.710684425093964716e-04,2.979241342510260699e-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.008072907871274187e-04,4.063351463691671850e-04,2.814380028310788616e-04,2.045051334722086352e-04,1.615770319309204608e-04,1.469630126571907884e-04,1.693959447695294284e-04,2.939478272988644745e-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.001497788207915121e-04,4.055445944921290597e-04,2.806482406689155018e-04,2.037157793952982566e-04,1.607178158735042268e-04,1.458699426620449350e-04,1.676159912510077627e-04,2.896237141368235984e-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.994910374944025042e-04,4.047535948218318100e-04,2.798590565363265966e-04,2.029281739019909579e-04,1.598620980598530251e-04,1.447840125437445142e-04,1.658536074234625343e-04,2.853613427461420497e-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.988260139740232213e-04,4.039566207302157830e-04,2.790656268334378021e-04,2.021383019157014865e-04,1.590064003284783227e-04,1.437018088215471850e-04,1.641044980680633682e-04,2.811520890672289147e-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.981547295973556680e-04,4.031537149116132062e-04,2.782680029999613086e-04,2.013462168991827844e-04,1.581507747250400562e-04,1.426233730149128554e-04,1.623686402996199669e-04,2.769954674673250896e-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.974772058480589884e-04,4.023449202032754039e-04,2.774662364916018848e-04,2.005519721420980883e-04,1.572952728586730247e-04,1.415487458023807841e-04,1.606460099014084351e-04,2.728909933446289080e-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.967924602151245417e-04,4.015280354275974962e-04,2.766567170422079059e-04,1.997501120648868605e-04,1.564314572956195643e-04,1.404632320601022135e-04,1.589039550526354799e-04,2.687258582080010155e-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.961015210291329552e-04,4.007053572943599577e-04,2.758431797434220318e-04,1.989462429758611403e-04,1.555679612182393453e-04,1.393818318435550562e-04,1.571757793000612348e-04,2.646152969711955188e-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.954044103428367566e-04,3.998769294251378363e-04,2.750256766566040972e-04,1.981404183299118591e-04,1.547048355449558708e-04,1.383045830163869136e-04,1.554614480121203164e-04,2.605587686095252363e-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.947013777400173224e-04,3.990430339362700481e-04,2.742044609070656662e-04,1.973328535702731791e-04,1.538422664307762401e-04,1.372316495983985922e-04,1.537610729441031576e-04,2.565559887984316962e-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.939924446448691022e-04,3.982037130272156897e-04,2.733795825341983144e-04,1.965235995659166514e-04,1.529803013963573505e-04,1.361630645638145173e-04,1.520746117923915490e-04,2.526064078268458078e-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.932708072008613994e-04,3.973448313523968048e-04,2.725292879585060313e-04,1.956816407574392804e-04,1.520737532268283138e-04,1.350253536692922732e-04,1.502520417395671493e-04,2.482429369311983419e-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.925433291275937313e-04,3.964806700993557770e-04,2.716755655440644093e-04,1.948383564731119815e-04,1.511684275731327428e-04,1.338932464840604031e-04,1.484467502756363724e-04,2.439468427807235304e-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.918101288584805405e-04,3.956113769664689763e-04,2.708185566039283476e-04,1.939938721213093850e-04,1.502644330979066827e-04,1.327668256867655240e-04,1.466587172007617287e-04,2.397173806066686273e-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.910712282476807177e-04,3.947369945531709078e-04,2.699583111402765676e-04,1.931482375169864133e-04,1.493618135415682949e-04,1.316461114156967569e-04,1.448878476419733323e-04,2.355536787532183434e-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.903266492974269808e-04,3.938575655934699066e-04,2.690948791496987824e-04,1.923015022699072797e-04,1.484606121781560119e-04,1.305311230155930472e-04,1.431340460611192763e-04,2.314548735305102924e-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.895916361077759233e-04,3.930015889157450278e-04,2.682679585446747167e-04,1.915046725018171748e-04,1.476265343831741983e-04,1.295122987364192039e-04,1.415403000102364922e-04,2.277048762028301403e-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.888509505821538188e-04,3.921405251235485093e-04,2.674377005486313469e-04,1.907064029438769275e-04,1.467931904457939435e-04,1.284977589807231727e-04,1.399600943498011466e-04,2.240084844157824847e-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.881046147353881284e-04,3.912744162777674595e-04,2.666041537474170709e-04,1.899067416692393098e-04,1.459606238177286390e-04,1.274875313353729649e-04,1.383933775516596422e-04,2.203650745808937968e-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.873535041835053691e-04,3.904041908037584924e-04,2.657681073335506784e-04,1.891063272435359547e-04,1.451293640595985746e-04,1.264820875947550167e-04,1.368405966876043531e-04,2.167748460671411873e-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.865976375297720377e-04,3.895298843642901903e-04,2.649296021207307814e-04,1.883051991594097421e-04,1.442994447916011967e-04,1.254814426573682665e-04,1.353016807452276011e-04,2.132371421364682767e-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.858370334908887412e-04,3.886515327161476187e-04,2.640886789067201177e-04,1.875033967487228748e-04,1.434708992929061271e-04,1.244856108614830043e-04,1.337765582492128895e-04,2.097513117892475961e-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.850717109173866415e-04,3.877691717638952012e-04,2.632453785571107932e-04,1.867009592919541521e-04,1.426437606415217971e-04,1.234946061839636009e-04,1.322651576281378186e-04,2.063167108712882474e-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.843017841779564719e-04,3.868829399849727933e-04,2.623998297381095117e-04,1.858979973489535589e-04,1.418181214209275826e-04,1.225084976697060233e-04,1.307674705482058720e-04,2.029328092689827875e-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.835272719783185817e-04,3.859928727352694559e-04,2.615520723807220407e-04,1.850945488934469029e-04,1.409940129261724197e-04,1.215272967897141737e-04,1.292834223062770812e-04,1.995989685833853672e-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.827481931390192209e-04,3.850990054645316799e-04,2.607021463995574332e-04,1.842906517410432266e-04,1.401714661235729505e-04,1.205510144929276286e-04,1.278129378421479238e-04,1.963145562589016025e-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.819741190680906414e-04,3.842186528659996786e-04,2.598733678747139103e-04,1.835150990942780922e-04,1.393856353878371876e-04,1.196241043053028848e-04,1.264157249384978508e-04,1.931533527071859933e-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.811954906857532679e-04,3.833344911530978875e-04,2.590423495637437460e-04,1.827389251971546448e-04,1.386010231640464696e-04,1.187014313463915350e-04,1.250305871218520724e-04,1.900379005692562904e-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.804123268686601621e-04,3.824465553881609072e-04,2.582091305240798466e-04,1.819621668943112273e-04,1.378176602140172575e-04,1.177830097537161525e-04,1.236574657124121280e-04,1.869676369318762604e-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.796261981805348861e-04,3.815564763513873891e-04,2.573750710547324729e-04,1.811859034357266680e-04,1.370364232713841633e-04,1.168696105278517803e-04,1.222971239749574140e-04,1.839432835829867073e-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.788371166298537929e-04,3.806642767897665215e-04,2.565401959245502722e-04,1.804101566728638260e-04,1.362573268495191094e-04,1.159612279572367423e-04,1.209494737333099285e-04,1.809642226433420603e-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.780450942923127944e-04,3.797699794962239458e-04,2.557045298790712744e-04,1.796349483543752492e-04,1.354803852765658562e-04,1.150578560981921263e-04,1.196144270262388971e-04,1.780298433107154344e-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.772501433097143196e-04,3.788736073065085246e-04,2.548680976361037374e-04,1.788603001211915217e-04,1.347056126906417029e-04,1.141594887707218423e-04,1.182918961012392148e-04,1.751395417672447184e-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.764543993312114430e-04,3.779774418763772749e-04,2.540328419678222955e-04,1.780877776040980329e-04,1.339342982068885400e-04,1.132672798320007770e-04,1.169830787460522149e-04,1.722947974180976999e-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.756578658699793754e-04,3.770814893242558957e-04,2.531987675065141240e-04,1.773173809352787060e-04,1.331664323570320042e-04,1.123811939733057949e-04,1.156878429947367658e-04,1.694949148917899182e-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.748605464740858808e-04,3.761857558021953151e-04,2.523658789003789082e-04,1.765491102506614579e-04,1.324020056947932127e-04,1.115011960644554309e-04,1.144060580710201219e-04,1.667392091004694466e-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.740605208264367093e-04,3.752860221900411030e-04,2.515274179172670150e-04,1.757730484194969538e-04,1.316262968484167275e-04,1.106031805667756002e-04,1.130890327345630944e-04,1.638824360782746060e-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.732597217139582440e-04,3.743865400085843336e-04,2.506901966657434509e-04,1.749991992264989145e-04,1.308541788026545852e-04,1.097115653341001649e-04,1.117862964715498958e-04,1.610733229285059244e-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.724581527307928295e-04,3.734873153380866809e-04,2.498542195054800734e-04,1.742275621656188764e-04,1.300856406740597557e-04,1.088263113284397853e-04,1.104977038827086933e-04,1.583110954216201049e-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.716575664778975139e-04,3.725901351223118402e-04,2.490209518882956956e-04,1.734592774731394025e-04,1.293215843757922266e-04,1.079481792373105579e-04,1.092239503861538297e-04,1.555962288273640454e-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.708579584178212615e-04,3.716949912014026899e-04,2.481903820156593069e-04,1.726943281050015661e-04,1.285619816677677630e-04,1.070771097820554131e-04,1.079648627815312081e-04,1.529279069228532445e-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.700593240595020362e-04,3.708018755033176054e-04,2.473624982033243466e-04,1.719326971657234189e-04,1.278068045492097274e-04,1.062130442456755448e-04,1.067202699871894330e-04,1.503053277730467872e-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.692616589508734098e-04,3.699107800243283187e-04,2.465372888514933574e-04,1.711743678703278799e-04,1.270560252111956913e-04,1.053559244063845252e-04,1.054900029091859618e-04,1.477277031714797602e-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.684668249800580104e-04,3.690236622787805977e-04,2.457163959794073484e-04,1.704206404911772779e-04,1.263106878677109810e-04,1.045066466916437628e-04,1.042749156168111009e-04,1.451958181660296986e-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.676748100054150635e-04,3.681404996529084395e-04,2.448997907163580324e-04,1.696714800685054925e-04,1.255707452244580493e-04,1.036651297187654374e-04,1.030748062779383314e-04,1.427088285865420875e-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.668856019606317766e-04,3.672612697075048303e-04,2.440874444423345342e-04,1.689268519744038289e-04,1.248361504800705925e-04,1.028312930702206035e-04,1.018894759794533339e-04,1.402659065748177792e-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.660978860040193896e-04,3.663833351346186431e-04,2.432754355983019401e-04,1.681813812071888568e-04,1.240994738987429935e-04,1.019939514788640786e-04,1.006986246362622330e-04,1.378144424939918523e-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.653129566917403656e-04,3.655093013788168949e-04,2.424676550876819162e-04,1.674404214250226010e-04,1.233681396595080271e-04,1.011643116013039457e-04,9.952262825359122704e-05,1.354072260989254840e-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.645308021917731225e-04,3.646391464999218838e-04,2.416640749146854532e-04,1.667039386446287719e-04,1.226421015627000995e-04,1.003422934745905857e-04,9.836128786277046102e-05,1.330434286087782230e-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.637533512715803535e-04,3.637748048842355184e-04,2.408662573039999728e-04,1.659731272165147797e-04,1.219222820499958832e-04,9.952864742131557339e-05,9.721524794079934454e-05,1.307234068834026641e-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.629805832911210584e-04,3.629162394326295588e-04,2.400741573155354143e-04,1.652479360999081315e-04,1.212086174287677493e-04,9.872327382660381703e-05,9.608428430098295324e-05,1.284463004684426848e-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.622124777547171659e-04,3.620634133660168507e-04,2.392877304473862261e-04,1.645283148026117340e-04,1.205010447638324016e-04,9.792607442008048754e-05,9.496817636981473815e-05,1.262112668660531425e-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.614490142952067260e-04,3.612162901840461500e-04,2.385069325732311319e-04,1.638142133018547766e-04,1.197995017798251111e-04,9.713695214164584071e-05,9.386670693673759554e-05,1.240174806289624668e-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.606917876274927293e-04,3.603765175920537237e-04,2.377331235014221514e-04,1.631066878653574946e-04,1.191048135885559178e-04,9.635658300529022745e-05,9.278045936752733660e-05,1.218652818497198865e-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.599407711882442139e-04,3.595440474626148916e-04,2.369662455139816704e-04,1.624056743525901679e-04,1.184169030927857740e-04,9.558485302446070387e-05,9.170919453133945438e-05,1.197538170918552259e-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.591959386362445371e-04,3.587188321446053963e-04,2.362062415256148103e-04,1.617111093879153761e-04,1.177356942042864595e-04,9.482164989506947420e-05,9.065267746151001182e-05,1.176822517560764241e-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.584679347085343051e-04,3.579204847030152616e-04,2.354801209260217886e-04,1.610571916563278928e-04,1.171042314833950021e-04,9.412413419793498636e-05,8.969710985766721223e-05,1.158171674873524301e-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.577460350040716044e-04,3.571292104088583889e-04,2.347605938090600918e-04,1.604093154405005178e-04,1.164788453357124725e-04,9.343405219685640224e-05,8.875393403591714169e-05,1.139848385910069905e-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.570302142000897652e-04,3.563449642017089015e-04,2.340476072540025119e-04,1.597674235279283352e-04,1.158594695166401697e-04,9.275131062844492946e-05,8.782296490203555085e-05,1.121846347113116888e-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.563205323021954991e-04,3.555677864531773679e-04,2.333411773810724506e-04,1.591315117132938270e-04,1.152460793074575203e-04,9.207585166649024939e-05,8.690405384945894284e-05,1.104159825692847303e-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.556169640414684949e-04,3.547976323593042547e-04,2.326412517183593022e-04,1.585015234268918286e-04,1.146386094395640093e-04,9.140758389001004606e-05,8.599702078916069998e-05,1.086782756746748250e-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.549194843577821444e-04,3.540344575531629255e-04,2.319477783590319386e-04,1.578774027587701891e-04,1.140369954748351631e-04,9.074641718074756330e-05,8.510168863112195785e-05,1.069709201912467553e-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.542280683854123842e-04,3.532782180675540329e-04,2.312607059053527040e-04,1.572590943887706505e-04,1.134411737206307899e-04,9.009226260907148270e-05,8.421788308143062266e-05,1.052933342707317640e-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.535435592528614506e-04,3.525297669260542646e-04,2.305807244353639423e-04,1.566471216497641210e-04,1.128515385449576329e-04,8.944542244330133641e-05,8.334582247054855841e-05,1.036454797753234207e-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.528659293179593237e-04,3.517890550472092793e-04,2.299077767025847687e-04,1.560414233076215052e-04,1.122680202866636689e-04,8.880580140054516926e-05,8.248532556564376009e-05,1.020267728319692934e-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.521951511907441769e-04,3.510560338657343622e-04,2.292418061160320900e-04,1.554419388795865483e-04,1.116905502099227850e-04,8.817330560855271690e-05,8.163621425685595255e-05,1.004366420798761639e-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.515357570680511773e-04,3.503384240935171457e-04,2.285926195257032088e-04,1.548599664871607589e-04,1.111316359132737570e-04,8.756139732097920178e-05,8.081143045355856274e-05,9.887558842870256459e-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.508831499695134287e-04,3.496283778737561509e-04,2.279502431225978031e-04,1.542840041018178729e-04,1.105785086338880569e-04,8.695624145470242240e-05,7.999741899881025698e-05,9.734197099681332458e-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.502373034395177318e-04,3.489258487042028742e-04,2.273146231686837553e-04,1.537139948092133693e-04,1.100311043442569531e-04,8.635775141128424154e-05,7.919401605398894981e-05,9.583525507692383649e-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.495982753581815606e-04,3.482308738101717264e-04,2.266857730549029851e-04,1.531499327576744506e-04,1.094893985055618503e-04,8.576587362490598130e-05,7.840109070036870779e-05,9.435495486246966317e-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.489660394111083985e-04,3.475434070850742167e-04,2.260636396270461598e-04,1.525917617808240120e-04,1.089533281238570496e-04,8.518052329278025009e-05,7.761848365092111231e-05,9.290055631012179708e-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.483405695169031721e-04,3.468634028939242666e-04,2.254481703234268038e-04,1.520394263837190755e-04,1.084228310216190315e-04,8.460161684084565312e-05,7.684603831721497692e-05,9.147155629123523643e-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.477218398160970184e-04,3.461908160447295835e-04,2.248393131323322177e-04,1.514928716901747189e-04,1.078978457743454979e-04,8.402907183940372035e-05,7.608360066029366266e-05,9.006746210081428210e-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.471100509830739483e-04,3.455258336641454844e-04,2.242372067336963117e-04,1.509521904405796073e-04,1.073784265457052923e-04,8.346290305268591516e-05,7.533111218717854750e-05,8.868791149478115541e-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.465051768578450733e-04,3.448684100639811626e-04,2.236417986238402995e-04,1.504173273640432558e-04,1.068645117117092864e-04,8.290302835464549746e-05,7.458842111919879593e-05,8.733242665255502488e-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.459071915129861232e-04,3.442185000233075119e-04,2.230530368831633737e-04,1.498882278486614187e-04,1.063560404456327061e-04,8.234936680962616474e-05,7.385537825478157199e-05,8.600053991717240256e-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.453277270883248422e-04,3.435968835063559607e-04,2.224987019123045480e-04,1.493989071766017103e-04,1.058939742146122178e-04,8.185283432112488435e-05,7.320083692872619591e-05,8.480120525436834187e-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.447550756300442850e-04,3.429826158632724655e-04,2.219507707465509202e-04,1.489150144895505707e-04,1.054368625228528346e-04,8.136171358212484941e-05,7.255437084770181432e-05,8.362138199130290570e-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.441892122953419404e-04,3.423756544954533452e-04,2.214091954721005766e-04,1.484365007267826825e-04,1.049846526338566485e-04,8.087593753205775274e-05,7.191586230794716592e-05,8.246071125248328093e-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.436257869834306257e-04,3.417717090501741430e-04,2.208705585733095858e-04,1.479607869104501987e-04,1.045353737048878776e-04,8.039389156994272538e-05,7.128377081045688692e-05,8.131715986317171246e-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.430647907230928004e-04,3.411707635569704330e-04,2.203348411819341208e-04,1.474878525008424264e-04,1.040890016129762040e-04,7.991554062444546221e-05,7.065802258502740848e-05,8.019045690600123673e-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.425062145452035425e-04,3.405728020832017003e-04,2.198020245085192449e-04,1.470176770797095381e-04,1.036455124224165388e-04,7.944084996986793814e-05,7.003854478529189314e-05,7.908033605497744685e-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.419500494783734655e-04,3.399778087230425684e-04,2.192720898259863408e-04,1.465502403299397984e-04,1.032048823605461293e-04,7.896978519468913008e-05,6.942526543493823701e-05,7.798653539704048551e-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.413941311127808435e-04,3.393835756573481376e-04,2.187432334857416756e-04,1.460841531649274296e-04,1.027660304092932323e-04,7.850144313387483587e-05,6.881729624423716459e-05,7.690779566810491681e-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.408384570747234218e-04,3.387900992487282684e-04,2.182154508640741402e-04,1.456194096560940569e-04,1.023289477092565169e-04,7.803580657419308998e-05,6.821458972979072498e-05,7.584390730667668775e-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.402830249660243826e-04,3.381973758275843189e-04,2.176887373150658610e-04,1.451560038709627043e-04,1.018936254270842219e-04,7.757285840469518032e-05,6.761709884283491779e-05,7.479466373034050742e-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.397131798668998448e-04,3.375789411508863902e-04,2.171273238640323091e-04,1.446496280566233409e-04,1.014059885387841374e-04,7.704415358894297196e-05,6.692941074150365747e-05,7.359880640935691578e-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.391436022217508317e-04,3.369613465901344558e-04,2.165671485747253328e-04,1.441448734692186333e-04,1.009205829600201576e-04,7.651897498112265308e-05,6.624864922679121694e-05,7.242198835523922060e-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.223599761281599736e-03,2.870574988594920204e-03,5.410558860144323162e-03,9.740321680379944794e-03,1.718226620812626088e-02,3.032327552654904765e-02,5.460894525232919822e-02,1.025522470341594938e-01,2.059999999999999887e-01 | 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.083745694274921144e-03,8.369042825128880300e-03,1.439530071705045523e-02,2.397223043565064812e-02,3.897486419880552555e-02,6.202545653148217042e-02,9.626510461383173956e-02,1.437785279168776742e-01,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 | ||||||
|   | |||||||
| 
 | 
| @@ -1,97 +1,97 @@ | |||||||
| ,signal,ase,nli | ,Unnamed: 0,signal,ase,nli | ||||||
| 0,0.0002866683470642085,3.455694800734997e-08,2.1767706055953313e-07 | 0,0,0.00028461768874888705,3.436639817118301e-08,2.1584395398371026e-07 | ||||||
| 1,0.0002842930902246378,3.4445260342151434e-08,2.20064716108892e-07 | 1,1,0.00028211666293476406,3.423996759499589e-08,2.1809245861954257e-07 | ||||||
| 2,0.00028193841273409963,3.4334217950641774e-08,2.2239856929822977e-07 | 2,2,0.0002796385058453953,3.411427963331182e-08,2.2028548201656645e-07 | ||||||
| 3,0.0002796041237984927,3.422381587730477e-08,2.2467937700272344e-07 | 3,3,0.0002771829951915728,3.398932824433299e-08,2.224238538437057e-07 | ||||||
| 4,0.00027589218358262,3.3956266402003705e-08,2.2576401766047814e-07 | 4,4,0.00027338904730863836,3.371109366484941e-08,2.2339638015421542e-07 | ||||||
| 5,0.0002722303444814487,3.3690926476196685e-08,2.2678094635121413e-07 | 5,5,0.0002696478418176822,3.3435235312069656e-08,2.2430128879557504e-07 | ||||||
| 6,0.00026861791294303266,3.342777134334201e-08,2.2773179097640802e-07 | 6,6,0.00026595862771951147,3.316172589770091e-08,2.2514026889123164e-07 | ||||||
| 7,0.00026505174756069215,3.316675429137828e-08,2.2861602718115889e-07 | 7,7,0.0002623182345801782,3.289051654795761e-08,2.2591288176837496e-07 | ||||||
| 8,0.0002615312775878486,3.290785186664305e-08,2.294352005376256e-07 | 8,8,0.00025872603823298804,3.262158136113203e-08,2.2662073272007013e-07 | ||||||
| 9,0.0002577007690018081,3.26092154155734e-08,2.2987401053105823e-07 | 9,9,0.0002548422077504841,3.231480491053109e-08,2.269632917207947e-07 | ||||||
| 10,0.00025392474812815994,3.231329178154223e-08,2.3024928325076607e-07 | 10,10,0.0002510150800727548,3.201089350512762e-08,2.2724305184561305e-07 | ||||||
| 11,0.0002501957390130402,3.201993265117851e-08,2.3055653947072044e-07 | 11,11,0.0002472372108596339,3.1709697987730424e-08,2.274556638142854e-07 | ||||||
| 12,0.0002465133077961936,3.172911082648897e-08,2.3079745224174315e-07 | 12,12,0.0002435081184388883,3.1411188710954923e-08,2.2760284870806473e-07 | ||||||
| 13,0.00024287702172285261,3.144079924487205e-08,2.309736700807475e-07 | 13,13,0.0002398273228957255,3.1115336193393125e-08,2.2768630096746835e-07 | ||||||
| 14,0.00023918644496802598,3.1142660565561954e-08,2.3099023972100006e-07 | 14,14,0.00023610099948769217,3.081056270085416e-08,2.27617695956038e-07 | ||||||
| 15,0.00023554415781363666,3.084719002003063e-08,2.3094533745656626e-07 | 15,15,0.00023242489102440902,3.050859262250336e-08,2.274887362838919e-07 | ||||||
| 16,0.0002319496781605366,3.0554358283826426e-08,2.3084061926161906e-07 | 16,16,0.00022879847092097078,3.020939430576677e-08,2.273011122655665e-07 | ||||||
| 17,0.000228402746264896,3.026413819712743e-08,2.306779372506828e-07 | 17,17,0.00022522143236587835,2.991293825364657e-08,2.27056704831033e-07 | ||||||
| 18,0.00022490287297566154,2.997650061885732e-08,2.2679314039447925e-07 | 18,18,0.00022169324298613107,2.9619193056612953e-08,2.2315585168570266e-07 | ||||||
| 19,0.0002210339853226993,2.9639081336421986e-08,2.225476971173533e-07 | 19,19,0.0002178178461312317,2.9278097616561043e-08,2.189169855906453e-07 | ||||||
| 20,0.00021722472675673681,2.9305156366940595e-08,2.1837424228396343e-07 | 20,20,0.0002140033759047069,2.8940600865395135e-08,2.1475128288390263e-07 | ||||||
| 21,0.00021347443350916938,2.8974683300060073e-08,2.1427183120915025e-07 | 21,21,0.00021024912752446947,2.8606658136588645e-08,2.1065775386659407e-07 | ||||||
| 22,0.00020978233224910872,2.864761802749998e-08,2.1023941353936252e-07 | 22,22,0.000206554289175574,2.827622313698371e-08,2.0663530613832196e-07 | ||||||
| 23,0.0002061476568412488,2.832391679540816e-08,2.0627595093585302e-07 | 23,23,0.00020291805701626135,2.7949249962519028e-08,2.0268286030011824e-07 | ||||||
| 24,0.0002028237056285935,2.8034565895618217e-08,2.0263423697267893e-07 | 24,24,0.00019961589106178864,2.765975998385304e-08,1.9907485701921993e-07 | ||||||
| 25,0.00019954715529254185,2.7748013284124615e-08,1.9905015325521452e-07 | 25,25,0.00019636137150032674,2.7373095433009936e-08,1.9552454239910457e-07 | ||||||
| 26,0.0001963174528000437,2.7464226779716075e-08,1.9552292765090665e-07 | 26,26,0.0001931539326017224,2.7089223372231097e-08,1.9203113225618846e-07 | ||||||
| 27,0.00019313475803109547,2.718318103861899e-08,1.920525003885138e-07 | 27,27,0.00018999370973089413,2.68081175642488e-08,1.885945418493717e-07 | ||||||
| 28,0.00018999848980183525,2.6904843987797665e-08,1.8863807494364378e-07 | 28,28,0.00018688010986276862,2.6529745205109403e-08,1.8521396370161997e-07 | ||||||
| 29,0.00018690807208013476,2.6629183784477213e-08,1.852788635171717e-07 | 29,29,0.00018381254538966195,2.6254073731438793e-08,1.818885993764317e-07 | ||||||
| 30,0.00018386293497138034,2.635616888672288e-08,1.8197408797080072e-07 | 30,30,0.00018079043504395085,2.5981070886269e-08,1.78617660347401e-07 | ||||||
| 31,0.0001808626075954048,2.608576967648626e-08,1.7872307155753016e-07 | 31,31,0.00017781329518445636,2.5710706310905614e-08,1.7540045799671345e-07 | ||||||
| 32,0.00017790652540681915,2.5817954962418864e-08,1.7552504805064169e-07 | 32,32,0.00017488055045064023,2.544294811944895e-08,1.7223621637516225e-07 | ||||||
| 33,0.00017499412908771533,2.5552693765056307e-08,1.723792598876346e-07 | 33,33,0.00017199163096488036,2.5177764647772334e-08,1.691241684952796e-07 | ||||||
| 34,0.0001721914205512116,2.529821177538242e-08,1.69350416018518e-07 | 34,34,0.00016923198600435235,2.4926164244345613e-08,1.6614800249846462e-07 | ||||||
| 35,0.00016942913344260413,2.5046172734840803e-08,1.663699885487624e-07 | 35,35,0.00016651223518287261,2.4676978561810828e-08,1.632195038378843e-07 | ||||||
| 36,0.0001667067703020692,2.4796549229968703e-08,1.6343730102750106e-07 | 36,36,0.00016383188581753214,2.443018036493577e-08,1.6033800467387247e-07 | ||||||
| 37,0.00016402494737034808,2.4549324625938814e-08,1.602954566731582e-07 | 37,37,0.0001611915388800597,2.418575294396746e-08,1.5725354810318075e-07 | ||||||
| 38,0.0001613831201060569,2.430447139995257e-08,1.5720933628441338e-07 | 38,38,0.0001585906555197023,2.394366896238391e-08,1.5422386234766858e-07 | ||||||
| 39,0.00015878075021906192,2.406196225171638e-08,1.541780421866172e-07 | 39,39,0.00015602870309712287,2.3703901303924173e-08,1.5124806354481474e-07 | ||||||
| 40,0.00015621730558753943,2.3821770097360405e-08,1.5120068940449393e-07 | 40,40,0.0001535051551031788,2.3466423066629146e-08,1.4832528036973196e-07 | ||||||
| 41,0.000153694061439545,2.3583901792213434e-08,1.4827814327673852e-07 | 41,41,0.0001510212597387019,2.3231240549132765e-08,1.4545635735033158e-07 | ||||||
| 42,0.00015121040694331307,2.3348329147104765e-08,1.4540943949658482e-07 | 42,42,0.00014857641307701306,2.2998325757462813e-08,1.4264034538487909e-07 | ||||||
| 43,0.00014876574026315321,2.3115024224465226e-08,1.425936300160931e-07 | 43,43,0.00014617002011358969,2.276765094680208e-08,1.3987631140917146e-07 | ||||||
| 44,0.00014623043935025647,2.2864250993313975e-08,1.397065102093322e-07 | 44,44,0.00014368188097051016,2.252080862505795e-08,1.3704924606778587e-07 | ||||||
| 45,0.00014373723010448477,2.2616046400344574e-08,1.3687531950007013e-07 | 45,45,0.00014123500136325632,2.227648394665253e-08,1.342768563640109e-07 | ||||||
| 46,0.0001412854316913198,2.2370377299191064e-08,1.3409901704421416e-07 | 46,46,0.00013882871459443323,2.2034644371118186e-08,1.31558126246417e-07 | ||||||
| 47,0.00013887544742801196,2.2127221340618422e-08,1.313775961274423e-07 | 47,47,0.00013646341840215168,2.1795267893415555e-08,1.2889305332810146e-07 | ||||||
| 48,0.0001365065605420479,2.1886545482453933e-08,1.2870998887773554e-07 | 48,48,0.00013413841082142,2.155832207437193e-08,1.2628059500046815e-07 | ||||||
| 49,0.00013417806673897108,2.164831702445933e-08,1.2609514810979993e-07 | 49,49,0.00013185300210097483,2.132377480769977e-08,1.2371972883222934e-07 | ||||||
| 50,0.00013188927370907155,2.1412503578881085e-08,1.2353204666803017e-07 | 50,50,0.00012960651423053282,2.1091594291962705e-08,1.2120945193769904e-07 | ||||||
| 51,0.00012964085531237725,2.117909919147538e-08,1.2102094138348867e-07 | 51,51,0.00012739961074346843,2.0861774576065466e-08,1.1875002031242091e-07 | ||||||
| 52,0.00012743207116500861,2.094807084934547e-08,1.1856076487337955e-07 | 52,52,0.00012523156633255863,2.0634283235397628e-08,1.1634039147633555e-07 | ||||||
| 53,0.0001252621950917354,2.0719385892834214e-08,1.161504721855161e-07 | 53,53,0.00012310166960708747,2.0409088189365173e-08,1.1397954484148417e-07 | ||||||
| 54,0.00012308423338164536,2.0485363383535514e-08,1.1374627006340893e-07 | 54,54,0.00012096529298347188,2.0178855168888422e-08,1.1162594309222065e-07 | ||||||
| 55,0.00012094535834842106,2.0253755300794944e-08,1.1139168040879032e-07 | 55,55,0.00011886718830718708,1.9950983760858723e-08,1.093208043434055e-07 | ||||||
| 56,0.00011884484242431182,2.0024527468430072e-08,1.0897675288127846e-07 | 56,56,0.00011680664424128133,1.9725440474060072e-08,1.0695583879566178e-07 | ||||||
| 57,0.00011678298769107047,1.9797656169961167e-08,1.0661409941810817e-07 | 57,57,0.00011478396058700633,1.950220202088885e-08,1.0464196732373097e-07 | ||||||
| 58,0.0001147590394591346,1.9573107382367898e-08,1.0430256532408603e-07 | 58,58,0.00011279839933843229,1.9281235055452333e-08,1.0237806316789167e-07 | ||||||
| 59,0.00011277225867179729,1.935084744632288e-08,1.0204102225018314e-07 | 59,59,0.00011084923776207272,1.906250658388995e-08,1.0016302524437989e-07 | ||||||
| 60,0.00011082192110664448,1.913084301808743e-08,9.982836715827351e-08 | 60,60,0.00010893576763351642,1.884598391874928e-08,9.79957771514819e-08 | ||||||
| 61,0.00010890831555726861,1.8913080844667903e-08,9.76644171489201e-08 | 61,61,0.00010705827573621923,1.8631654017664683e-08,9.587614496435341e-08 | ||||||
| 62,0.00010703069380321927,1.8697527263494167e-08,9.554805889434612e-08 | 62,62,0.00010521603014069265,1.8419483867548078e-08,9.380304193213288e-08 | ||||||
| 63,0.00010518832400867466,1.8484148971365717e-08,9.347820572370307e-08 | 63,63,0.00010340831493293095,1.8209440802910146e-08,9.1775407295826e-08 | ||||||
| 64,0.00010353027948847247,1.8300360477604286e-08,9.158630538270034e-08 | 64,64,0.00010178667717264663,1.8029552937387797e-08,8.992671343771878e-08 | ||||||
| 65,0.00010190114820620951,1.8118339508838893e-08,8.97332684173061e-08 | 65,65,0.00010019319833745167,1.7851381317094802e-08,8.811583172055121e-08 | ||||||
| 66,0.00010030037817345079,1.7938063167097722e-08,8.791826040657302e-08 | 66,66,9.86273426809622e-05,1.767490377589294e-08,8.634195328719705e-08 | ||||||
| 67,9.872746699919663e-05,1.775950920143011e-08,8.614049912759125e-08 | 67,67,9.70886230248071e-05,1.7500098774413897e-08,8.460432022445385e-08 | ||||||
| 68,9.718188342878233e-05,1.7582655209782296e-08,8.439918541238176e-08 | 68,68,9.557652367577673e-05,1.7326944621204857e-08,8.290215772518696e-08 | ||||||
| 69,9.566310719955732e-05,1.740747903977101e-08,8.269353818341506e-08 | 69,69,9.409053958216297e-05,1.7155419863785074e-08,8.123470846820667e-08 | ||||||
| 70,9.417062845393912e-05,1.7233958752991638e-08,8.102279372648069e-08 | 70,70,9.263017577528553e-05,1.698550325493719e-08,7.960123192429599e-08 | ||||||
| 71,9.27044102709892e-05,1.7062082036004708e-08,7.938660156523957e-08 | 71,71,9.119540203213482e-05,1.681718296074974e-08,7.800139303615196e-08 | ||||||
| 72,9.12639411274833e-05,1.6891826998956218e-08,7.778420731697601e-08 | 72,72,8.978572151582878e-05,1.6650437769918198e-08,7.643446000507212e-08 | ||||||
| 73,8.984872036936478e-05,1.6723171993235663e-08,7.621487408851861e-08 | 73,73,8.840064792008674e-05,1.648524670194174e-08,7.489971794966337e-08 | ||||||
| 74,8.845926525396718e-05,1.6557077218868872e-08,7.467873241780861e-08 | 74,74,8.704752218385389e-05,1.6323921332107853e-08,7.340306015991841e-08 | ||||||
| 75,8.709405706837696e-05,1.6392620086127443e-08,7.352620174175576e-08 | 75,75,8.571782151670807e-05,1.616417166590195e-08,7.228178645083984e-08 | ||||||
| 76,8.575262707251024e-05,1.6229781230847938e-08,7.239374499535451e-08 | 76,76,8.441109599127084e-05,1.6005979385519616e-08,7.117988659258102e-08 | ||||||
| 77,8.44345490553445e-05,1.6068541919248203e-08,7.128100236441453e-08 | 77,77,8.312693723019766e-05,1.584932678267078e-08,7.009701621983393e-08 | ||||||
| 78,8.313937224726923e-05,1.5908883354530017e-08,7.018759330199112e-08 | 78,78,8.186491243372442e-05,1.569419608150936e-08,6.90328103730187e-08 | ||||||
| 79,8.18666553697718e-05,1.5750787028460176e-08,6.91131452736768e-08 | 79,79,8.062459786565112e-05,1.554056978222129e-08,6.798691173543069e-08 | ||||||
| 80,8.061596620368467e-05,1.5594234699428168e-08,6.80572933931087e-08 | 80,80,7.94055784447779e-05,1.538843064058219e-08,6.695897028871753e-08 | ||||||
| 81,7.93869860927298e-05,1.54392105845737e-08,6.701976864553917e-08 | 81,81,7.820755061857071e-05,1.523776381588298e-08,6.594873006137818e-08 | ||||||
| 82,7.81792957880057e-05,1.528569691328632e-08,6.600021709431229e-08 | 82,82,7.703011159024537e-05,1.5088552513719166e-08,6.495585139392737e-08 | ||||||
| 83,7.69924848842345e-05,1.5133676199095668e-08,6.499829226870119e-08 | 83,83,7.587286701386211e-05,1.494078021244127e-08,6.398000175307732e-08 | ||||||
| 84,7.592423495462984e-05,1.5006007729453082e-08,6.40964585216171e-08 | 84,84,7.483848702669918e-05,1.481852757489104e-08,6.310775801171533e-08 | ||||||
| 85,7.487323130273564e-05,1.4879695488874347e-08,6.320918435915818e-08 | 85,85,7.382059659354297e-05,1.4697575551136038e-08,6.224941913167962e-08 | ||||||
| 86,7.383915942693816e-05,1.475473179887786e-08,6.233620427401105e-08 | 86,86,7.281889798107282e-05,1.4577917663325962e-08,6.140473404853674e-08 | ||||||
| 87,7.282024738915393e-05,1.4631093950979863e-08,6.147602236758762e-08 | 87,87,7.183165666349203e-05,1.4459532716368791e-08,6.057224011868445e-08 | ||||||
| 88,7.181625694043332e-05,1.4508775744557438e-08,6.062843750629826e-08 | 88,88,7.08586484091438e-05,1.4342415672865158e-08,5.975174825816752e-08 | ||||||
| 89,7.082695384072487e-05,1.4387771381868581e-08,5.979325194092954e-08 | 89,89,6.989965271824705e-05,1.422656189652791e-08,5.8943072529944956e-08 | ||||||
| 90,6.985210770121701e-05,1.4268075471622408e-08,5.8970271173546604e-08 | 90,90,6.895445267562359e-05,1.411196715686287e-08,5.814603001970201e-08 | ||||||
| 91,6.889061932028676e-05,1.414966436041678e-08,5.8158567240485706e-08 | 91,91,6.802197391413278e-05,1.3998609279853771e-08,5.735971476442124e-08 | ||||||
| 92,6.79423037538828e-05,1.4032534237451406e-08,5.7357984009008465e-08 | 92,92,6.710204336793658e-05,1.3886485591019257e-08,5.6583980825863337e-08 | ||||||
| 93,6.700697867481953e-05,1.3916681725635683e-08,5.656836755557654e-08 | 93,93,6.619449037899918e-05,1.3775593851234834e-08,5.581868429617485e-08 | ||||||
| 94,6.594003301527265e-05,1.3765768410137306e-08,5.5667634894222326e-08 | 94,94,6.515268324911003e-05,1.3628882565600955e-08,5.494017759648076e-08 | ||||||
| 95,6.489000516837228e-05,1.3616343300622314e-08,5.4781184522010985e-08 | 95,95,6.412720169535454e-05,1.3483606920728348e-08,5.407543748332493e-08 | ||||||
|   | |||||||
| 
 | 
| @@ -16,8 +16,9 @@ Transceiver trx_Stockholm | |||||||
|   PMD (ps):                  0.00 |   PMD (ps):                  0.00 | ||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
| Roadm roadm_Stockholm | Roadm roadm_Stockholm | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -30,6 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Stockholm → Norrköping)_(1/2) | Fiber          fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -38,7 +40,8 @@ Fiber          fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   total loss (dB):             16.33 |   total loss (dB):             16.33 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -14.33 |   reference pch out (dBm):     -14.33 | ||||||
|  |   actual pch out (dBm):        -14.31 | ||||||
| Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:           openroadm_ila_low_noise |   type_variety:           openroadm_ila_low_noise | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
| @@ -51,6 +54,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.02 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Stockholm → Norrköping)_(2/2) | Fiber          fiber (Stockholm → Norrköping)_(2/2) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -59,7 +63,8 @@ Fiber          fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   total loss (dB):             16.33 |   total loss (dB):             16.33 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -14.33 |   reference pch out (dBm):     -14.33 | ||||||
|  |   actual pch out (dBm):        -14.30 | ||||||
| Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | ||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
| @@ -72,10 +77,12 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.04 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Norrköping | Roadm roadm_Norrköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -88,6 +95,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Norrköping → Linköping) | Fiber          fiber (Norrköping → Linköping) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -96,7 +104,8 @@ Fiber          fiber (Norrköping → Linköping) | |||||||
|   total loss (dB):             11.00 |   total loss (dB):             11.00 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -9.00 |   reference pch out (dBm):     -9.00 | ||||||
|  |   actual pch out (dBm):        -9.00 | ||||||
| Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | ||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     11.00 |   effective gain(dB):     11.00 | ||||||
| @@ -109,10 +118,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.01 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Linköping | Roadm roadm_Linköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -125,6 +136,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Linköping → Jönköping) | Fiber          fiber (Linköping → Jönköping) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -133,7 +145,8 @@ Fiber          fiber (Linköping → Jönköping) | |||||||
|   total loss (dB):             26.80 |   total loss (dB):             26.80 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -24.80 |   reference pch out (dBm):     -24.80 | ||||||
|  |   actual pch out (dBm):        -24.79 | ||||||
| Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | ||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     26.80 |   effective gain(dB):     26.80 | ||||||
| @@ -146,10 +159,12 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.04 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Jönköping | Roadm roadm_Jönköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -162,6 +177,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Jönköping → Borås) | Fiber          fiber (Jönköping → Borås) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -170,7 +186,8 @@ Fiber          fiber (Jönköping → Borås) | |||||||
|   total loss (dB):             17.82 |   total loss (dB):             17.82 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -15.82 |   reference pch out (dBm):     -15.82 | ||||||
|  |   actual pch out (dBm):        -15.81 | ||||||
| Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | ||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     17.82 |   effective gain(dB):     17.82 | ||||||
| @@ -183,10 +200,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.02 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Borås | Roadm roadm_Borås | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -199,6 +218,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Borås → Gothenburg) | Fiber          fiber (Borås → Gothenburg) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -207,7 +227,8 @@ Fiber          fiber (Borås → Gothenburg) | |||||||
|   total loss (dB):             13.53 |   total loss (dB):             13.53 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -11.53 |   reference pch out (dBm):     -11.53 | ||||||
|  |   actual pch out (dBm):        -11.52 | ||||||
| Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | ||||||
|   type_variety:           openroadm_mw_mw_preamp |   type_variety:           openroadm_mw_mw_preamp | ||||||
|   effective gain(dB):     13.53 |   effective gain(dB):     13.53 | ||||||
| @@ -220,10 +241,12 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.02 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Gothenburg | Roadm roadm_Gothenburg | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Transceiver trx_Gothenburg | Transceiver trx_Gothenburg | ||||||
|   GSNR (0.1nm, dB):          18.90 |   GSNR (0.1nm, dB):          18.90 | ||||||
|   GSNR (signal bw, dB):      14.88 |   GSNR (signal bw, dB):      14.88 | ||||||
|   | |||||||
| @@ -16,8 +16,9 @@ Transceiver trx_Stockholm | |||||||
|   PMD (ps):                  0.00 |   PMD (ps):                  0.00 | ||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
| Roadm roadm_Stockholm | Roadm roadm_Stockholm | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -30,6 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Stockholm → Norrköping)_(1/2) | Fiber          fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -38,7 +40,8 @@ Fiber          fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   total loss (dB):             16.33 |   total loss (dB):             16.33 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -14.33 |   reference pch out (dBm):     -14.33 | ||||||
|  |   actual pch out (dBm):        -14.31 | ||||||
| Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | ||||||
|   type_variety:           openroadm_ila_low_noise |   type_variety:           openroadm_ila_low_noise | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
| @@ -51,6 +54,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.02 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Stockholm → Norrköping)_(2/2) | Fiber          fiber (Stockholm → Norrköping)_(2/2) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -59,7 +63,8 @@ Fiber          fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   total loss (dB):             16.33 |   total loss (dB):             16.33 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -14.33 |   reference pch out (dBm):     -14.33 | ||||||
|  |   actual pch out (dBm):        -14.30 | ||||||
| Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | ||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     16.33 |   effective gain(dB):     16.33 | ||||||
| @@ -72,10 +77,12 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.04 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Norrköping | Roadm roadm_Norrköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -88,6 +95,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Norrköping → Linköping) | Fiber          fiber (Norrköping → Linköping) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -96,7 +104,8 @@ Fiber          fiber (Norrköping → Linköping) | |||||||
|   total loss (dB):             11.00 |   total loss (dB):             11.00 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -9.00 |   reference pch out (dBm):     -9.00 | ||||||
|  |   actual pch out (dBm):        -9.00 | ||||||
| Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | ||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     11.00 |   effective gain(dB):     11.00 | ||||||
| @@ -109,10 +118,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.01 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Linköping | Roadm roadm_Linköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -125,6 +136,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Linköping → Jönköping) | Fiber          fiber (Linköping → Jönköping) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -133,7 +145,8 @@ Fiber          fiber (Linköping → Jönköping) | |||||||
|   total loss (dB):             26.80 |   total loss (dB):             26.80 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -24.80 |   reference pch out (dBm):     -24.80 | ||||||
|  |   actual pch out (dBm):        -24.79 | ||||||
| Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | ||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     26.80 |   effective gain(dB):     26.80 | ||||||
| @@ -146,10 +159,12 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.04 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Jönköping | Roadm roadm_Jönköping | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -162,6 +177,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Jönköping → Borås) | Fiber          fiber (Jönköping → Borås) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -170,7 +186,8 @@ Fiber          fiber (Jönköping → Borås) | |||||||
|   total loss (dB):             17.82 |   total loss (dB):             17.82 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -15.82 |   reference pch out (dBm):     -15.82 | ||||||
|  |   actual pch out (dBm):        -15.81 | ||||||
| Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | ||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     17.82 |   effective gain(dB):     17.82 | ||||||
| @@ -183,10 +200,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.01 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Borås | Roadm roadm_Borås | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | ||||||
|   type_variety:           openroadm_mw_mw_booster |   type_variety:           openroadm_mw_mw_booster | ||||||
|   effective gain(dB):     22.00 |   effective gain(dB):     22.00 | ||||||
| @@ -199,6 +218,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.00 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Borås → Gothenburg) | Fiber          fiber (Borås → Gothenburg) | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -207,7 +227,8 @@ Fiber          fiber (Borås → Gothenburg) | |||||||
|   total loss (dB):             13.53 |   total loss (dB):             13.53 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -11.53 |   reference pch out (dBm):     -11.53 | ||||||
|  |   actual pch out (dBm):        -11.52 | ||||||
| Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | ||||||
|   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 |   type_variety:           openroadm_mw_mw_preamp_worstcase_ver5 | ||||||
|   effective gain(dB):     13.53 |   effective gain(dB):     13.53 | ||||||
| @@ -220,10 +241,12 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg) | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       2.00 |   target pch (dBm):       2.00 | ||||||
|   effective pch (dBm):    2.00 |   effective pch (dBm):    2.00 | ||||||
|  |   actual pch out (dBm):   2.02 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm_Gothenburg | Roadm roadm_Gothenburg | ||||||
|   effective loss (dB):  22.00 |   effective loss (dB):     22.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Transceiver trx_Gothenburg | Transceiver trx_Gothenburg | ||||||
|   GSNR (0.1nm, dB):          19.27 |   GSNR (0.1nm, dB):          19.27 | ||||||
|   GSNR (signal bw, dB):      15.24 |   GSNR (signal bw, dB):      15.24 | ||||||
|   | |||||||
| @@ -146,7 +146,7 @@ req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0 | |||||||
| 0       trx Lorient_KMA to trx Vannes_KBE :             24.83                    28.92                      14                     mode 1                   100.0                      1                     (-284,4)         | 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)         | 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)         | 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.07                    23.29                      17                     mode 2                   150.0                      1                     (-258,6)         | 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)         | 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)         | 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)         | 7b      trx Lannion_CAS to trx Lorient_KMA :            19.61                    23.69                      14                     mode 1                   400.0                      4                    (-172,24)         | ||||||
|   | |||||||
							
								
								
									
										100
									
								
								tests/invocation/spectrum1_transmission_main_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								tests/invocation/spectrum1_transmission_main_example
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | User input for spectrum used for propagation instead of SI | ||||||
|  | There are 76 channels propagating | ||||||
|  | Power mode is set to True | ||||||
|  | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
|  | There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  |  | ||||||
|  | Now propagating between trx Lannion_CAS and trx Lorient_KMA: | ||||||
|  |  | ||||||
|  | Propagating with input power = [1;36;40m0.00 dBm[0m: | ||||||
|  | Transceiver trx Lannion_CAS | ||||||
|  |   GSNR (0.1nm, dB):          40.00 | ||||||
|  |   GSNR (signal bw, dB):      35.92 | ||||||
|  |   OSNR ASE (0.1nm, dB):      40.00 | ||||||
|  |   OSNR ASE (signal bw, dB):  35.92 | ||||||
|  |   CD (ps/nm):                0.00 | ||||||
|  |   PMD (ps):                  0.00 | ||||||
|  |   PDL (dB):                  0.00 | ||||||
|  | Roadm roadm Lannion_CAS | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | Edfa east edfa in Lannion_CAS to Corlay | ||||||
|  |   type_variety:           std_medium_gain | ||||||
|  |   effective gain(dB):     21.00 | ||||||
|  |   (before att_in and before output VOA) | ||||||
|  |   noise figure (dB):      6.36 | ||||||
|  |   (including att_in) | ||||||
|  |   pad att_in (dB):        0.00 | ||||||
|  |   Power In (dBm):         -1.19 | ||||||
|  |   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 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 20.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             4.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):     -3.00 | ||||||
|  |   actual pch out (dBm):        -2.99 | ||||||
|  | Fused west fused spans in Corlay | ||||||
|  |   loss (dB): 1.00 | ||||||
|  | Fiber          fiber (Corlay → Loudeac)-F010 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 50.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             10.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):     -14.00 | ||||||
|  |   actual pch out (dBm):        -13.99 | ||||||
|  | Fused west fused spans in Loudeac | ||||||
|  |   loss (dB): 1.00 | ||||||
|  | Fiber          fiber (Loudeac → Lorient_KMA)-F054 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 60.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             12.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):     -27.00 | ||||||
|  |   actual pch out (dBm):        -26.99 | ||||||
|  | Edfa west edfa in Lorient_KMA to Loudeac | ||||||
|  |   type_variety:           std_high_gain | ||||||
|  |   effective gain(dB):     28.00 | ||||||
|  |   (before att_in and before output VOA) | ||||||
|  |   noise figure (dB):      5.92 | ||||||
|  |   (including att_in) | ||||||
|  |   pad att_in (dB):        0.00 | ||||||
|  |   Power In (dBm):         -8.18 | ||||||
|  |   Power Out (dBm):        19.85 | ||||||
|  |   Delta_P (dB):           1.00 | ||||||
|  |   target pch (dBm):       1.00 | ||||||
|  |   effective pch (dBm):    1.00 | ||||||
|  |   actual pch out (dBm):   1.05 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Lorient_KMA | ||||||
|  |   effective loss (dB):     21.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | Transceiver trx Lorient_KMA | ||||||
|  |   GSNR (0.1nm, dB):          23.61 | ||||||
|  |   GSNR (signal bw, dB):      19.52 | ||||||
|  |   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 | ||||||
|  |  | ||||||
|  | Transmission result for input power = 0.00 dBm: | ||||||
|  |   Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m | ||||||
|  |  | ||||||
|  | (No source node specified: picked trx Lannion_CAS) | ||||||
|  |  | ||||||
|  | (No destination node specified: picked trx Lorient_KMA) | ||||||
							
								
								
									
										163
									
								
								tests/invocation/spectrum2_transmission_main_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								tests/invocation/spectrum2_transmission_main_example
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | |||||||
|  | User input for spectrum used for propagation instead of SI | ||||||
|  | There are 60 channels propagating | ||||||
|  | Power mode is set to True | ||||||
|  | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
|  | There are 3 fiber spans over 130 km between trx Lannion_CAS and trx Lorient_KMA | ||||||
|  |  | ||||||
|  | Now propagating between trx Lannion_CAS and trx Lorient_KMA: | ||||||
|  |  | ||||||
|  | Propagating with input power = [1;36;40m0.00 dBm[0m: | ||||||
|  | Transceiver trx Lannion_CAS | ||||||
|  |   GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00 | ||||||
|  |   GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91 | ||||||
|  |   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 | ||||||
|  | Roadm roadm Lannion_CAS | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00 | ||||||
|  | Edfa east edfa in Lannion_CAS to Corlay | ||||||
|  |   type_variety:           std_medium_gain | ||||||
|  |   effective gain(dB):     21.00 | ||||||
|  |   (before att_in and before output VOA) | ||||||
|  |   noise figure (dB):      6.36 | ||||||
|  |   (including att_in) | ||||||
|  |   pad att_in (dB):        0.00 | ||||||
|  |   Power In (dBm):         -2.22 | ||||||
|  |   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 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 20.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             4.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):     -3.00 | ||||||
|  |   actual pch out (dBm):        mode_1: -2.99, mode_2: -2.98 | ||||||
|  | Fused west fused spans in Corlay | ||||||
|  |   loss (dB): 1.00 | ||||||
|  | Fiber          fiber (Corlay → Loudeac)-F010 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 50.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             10.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):     -14.00 | ||||||
|  |   actual pch out (dBm):        mode_1: -13.99, mode_2: -13.98 | ||||||
|  | Fused west fused spans in Loudeac | ||||||
|  |   loss (dB): 1.00 | ||||||
|  | Fiber          fiber (Loudeac → Lorient_KMA)-F054 | ||||||
|  |   type_variety:                SSMF | ||||||
|  |   length (km):                 60.00 | ||||||
|  |   pad att_in (dB):             0.00 | ||||||
|  |   total loss (dB):             12.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):     -27.00 | ||||||
|  |   actual pch out (dBm):        mode_1: -26.99, mode_2: -26.98 | ||||||
|  | Edfa west edfa in Lorient_KMA to Loudeac | ||||||
|  |   type_variety:           std_high_gain | ||||||
|  |   effective gain(dB):     28.00 | ||||||
|  |   (before att_in and before output VOA) | ||||||
|  |   noise figure (dB):      5.92 | ||||||
|  |   (including att_in) | ||||||
|  |   pad att_in (dB):        0.00 | ||||||
|  |   Power In (dBm):         -9.21 | ||||||
|  |   Power Out (dBm):        18.84 | ||||||
|  |   Delta_P (dB):           1.00 | ||||||
|  |   target pch (dBm):       1.00 | ||||||
|  |   effective pch (dBm):    1.00 | ||||||
|  |   actual pch out (dBm):   mode_1: 1.04, mode_2: 1.09 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Lorient_KMA | ||||||
|  |   effective loss (dB):     21.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00 | ||||||
|  | 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 | ||||||
|  |   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 | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  |    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 | ||||||
|  |  | ||||||
|  | (No source node specified: picked trx Lannion_CAS) | ||||||
|  |  | ||||||
|  | (No destination node specified: picked trx Lorient_KMA) | ||||||
| @@ -22,7 +22,8 @@ Fiber          Span1 | |||||||
|   total loss (dB):             17.00 |   total loss (dB):             17.00 | ||||||
|   (includes conn loss (dB) in: 0.50 out: 0.50) |   (includes conn loss (dB) in: 0.50 out: 0.50) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -17.00 |   reference pch out (dBm):     -17.00 | ||||||
|  |   actual pch out (dBm):        -17.00 | ||||||
| Edfa Edfa1 | Edfa Edfa1 | ||||||
|   type_variety:           std_low_gain |   type_variety:           std_low_gain | ||||||
|   effective gain(dB):     15.00 |   effective gain(dB):     15.00 | ||||||
| @@ -35,6 +36,7 @@ Edfa Edfa1 | |||||||
|   Delta_P (dB):           -2.00 |   Delta_P (dB):           -2.00 | ||||||
|   target pch (dBm):       -2.00 |   target pch (dBm):       -2.00 | ||||||
|   effective pch (dBm):    -2.00 |   effective pch (dBm):    -2.00 | ||||||
|  |   actual pch out (dBm):   -1.99 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Transceiver Site_B | Transceiver Site_B | ||||||
|   GSNR (0.1nm, dB):          31.17 |   GSNR (0.1nm, dB):          31.17 | ||||||
|   | |||||||
| @@ -22,27 +22,29 @@ RamanFiber          Span1 | |||||||
|   total loss (dB):             17.00 |   total loss (dB):             17.00 | ||||||
|   (includes conn loss (dB) in: 0.50 out: 0.50) |   (includes conn loss (dB) in: 0.50 out: 0.50) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -7.71 |   reference pch out (dBm):     -7.77 | ||||||
|  |   actual pch out (dBm):        -8.03 | ||||||
| Fused Fused1 | Fused Fused1 | ||||||
|   loss (dB): 0.00 |   loss (dB): 0.00 | ||||||
| Edfa Edfa1 | Edfa Edfa1 | ||||||
|   type_variety:           std_low_gain |   type_variety:           std_low_gain | ||||||
|   effective gain(dB):     5.71 |   effective gain(dB):     5.77 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|   noise figure (dB):      13.29 |   noise figure (dB):      13.23 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        2.29 |   pad att_in (dB):        2.23 | ||||||
|   Power In (dBm):         11.11 |   Power In (dBm):         11.04 | ||||||
|   Power Out (dBm):        16.82 |   Power Out (dBm):        16.81 | ||||||
|   Delta_P (dB):           -2.00 |   Delta_P (dB):           -2.00 | ||||||
|   target pch (dBm):       -2.00 |   target pch (dBm):       -2.00 | ||||||
|   effective pch (dBm):    -2.00 |   effective pch (dBm):    -2.00 | ||||||
|  |   actual pch out (dBm):   -2.26 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Transceiver Site_B | Transceiver Site_B | ||||||
|   GSNR (0.1nm, dB):          31.44 |   GSNR (0.1nm, dB):          31.44 | ||||||
|   GSNR (signal bw, dB):      27.36 |   GSNR (signal bw, dB):      27.36 | ||||||
|   OSNR ASE (0.1nm, dB):      34.22 |   OSNR ASE (0.1nm, dB):      34.21 | ||||||
|   OSNR ASE (signal bw, dB):  30.14 |   OSNR ASE (signal bw, dB):  30.13 | ||||||
|   CD (ps/nm):                1336.00 |   CD (ps/nm):                1336.00 | ||||||
|   PMD (ps):                  0.36 |   PMD (ps):                  0.36 | ||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
| @@ -52,82 +54,82 @@ Transmission result for input power = 0.00 dBm: | |||||||
|  |  | ||||||
| The GSNR per channel at the end of the line is: | 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) | Ch. #   Channel frequency (THz)       Channel power (dBm)    OSNR ASE (signal bw, dB)     SNR NLI (signal bw, dB)        GSNR (signal bw, dB) | ||||||
|     1                    191.35                      0.18                       31.61                       31.43                       28.51 |     1                 191.35000                      0.21                       31.62                       31.43                       28.52 | ||||||
|     2                    191.40                      0.14                       31.59                       31.34                       28.45 |     2                 191.40000                      0.17                       31.60                       31.35                       28.46 | ||||||
|     3                    191.45                      0.11                       31.57                       31.26                       28.40 |     3                 191.45000                      0.13                       31.58                       31.26                       28.41 | ||||||
|     4                    191.50                      0.07                       31.55                       31.17                       28.35 |     4                 191.50000                      0.09                       31.56                       31.18                       28.36 | ||||||
|     5                    191.55                      0.02                       31.52                       31.09                       28.29 |     5                 191.55000                      0.03                       31.53                       31.10                       28.30 | ||||||
|     6                    191.60                     -0.04                       31.49                       31.02                       28.24 |     6                 191.60000                     -0.02                       31.50                       31.02                       28.24 | ||||||
|     7                    191.65                     -0.10                       31.46                       30.94                       28.18 |     7                 191.65000                     -0.08                       31.46                       30.94                       28.19 | ||||||
|     8                    191.70                     -0.16                       31.43                       30.86                       28.13 |     8                 191.70000                     -0.14                       31.43                       30.87                       28.13 | ||||||
|     9                    191.75                     -0.21                       31.40                       30.79                       28.07 |     9                 191.75000                     -0.20                       31.40                       30.79                       28.08 | ||||||
|    10                    191.80                     -0.28                       31.36                       30.71                       28.02 |    10                 191.80000                     -0.27                       31.37                       30.72                       28.02 | ||||||
|    11                    191.85                     -0.34                       31.33                       30.64                       27.96 |    11                 191.85000                     -0.33                       31.33                       30.65                       27.97 | ||||||
|    12                    191.90                     -0.40                       31.29                       30.57                       27.91 |    12                 191.90000                     -0.40                       31.29                       30.58                       27.91 | ||||||
|    13                    191.95                     -0.47                       31.26                       30.50                       27.85 |    13                 191.95000                     -0.46                       31.26                       30.51                       27.86 | ||||||
|    14                    192.00                     -0.53                       31.22                       30.43                       27.80 |    14                 192.00000                     -0.53                       31.22                       30.44                       27.80 | ||||||
|    15                    192.05                     -0.60                       31.18                       30.36                       27.74 |    15                 192.05000                     -0.59                       31.18                       30.37                       27.75 | ||||||
|    16                    192.10                     -0.66                       31.15                       30.30                       27.69 |    16                 192.10000                     -0.66                       31.15                       30.30                       27.69 | ||||||
|    17                    192.15                     -0.73                       31.11                       30.23                       27.64 |    17                 192.15000                     -0.73                       31.11                       30.24                       27.64 | ||||||
|    18                    192.20                     -0.79                       31.07                       30.16                       27.58 |    18                 192.20000                     -0.80                       31.07                       30.17                       27.59 | ||||||
|    19                    192.25                     -0.86                       31.04                       30.17                       27.57 |    19                 192.25000                     -0.86                       31.03                       30.18                       27.57 | ||||||
|    20                    192.30                     -0.94                       30.99                       30.18                       27.56 |    20                 192.30000                     -0.94                       30.99                       30.19                       27.56 | ||||||
|    21                    192.35                     -1.01                       30.95                       30.19                       27.54 |    21                 192.35000                     -1.02                       30.94                       30.20                       27.54 | ||||||
|    22                    192.40                     -1.08                       30.91                       30.20                       27.53 |    22                 192.40000                     -1.09                       30.90                       30.20                       27.53 | ||||||
|    23                    192.45                     -1.16                       30.86                       30.20                       27.51 |    23                 192.45000                     -1.17                       30.86                       30.21                       27.51 | ||||||
|    24                    192.50                     -1.23                       30.82                       30.21                       27.49 |    24                 192.50000                     -1.24                       30.81                       30.22                       27.50 | ||||||
|    25                    192.55                     -1.30                       30.78                       30.22                       27.48 |    25                 192.55000                     -1.31                       30.77                       30.23                       27.48 | ||||||
|    26                    192.60                     -1.37                       30.74                       30.23                       27.46 |    26                 192.60000                     -1.38                       30.73                       30.23                       27.46 | ||||||
|    27                    192.65                     -1.44                       30.70                       30.23                       27.45 |    27                 192.65000                     -1.45                       30.69                       30.24                       27.45 | ||||||
|    28                    192.70                     -1.51                       30.65                       30.24                       27.43 |    28                 192.70000                     -1.52                       30.65                       30.25                       27.43 | ||||||
|    29                    192.75                     -1.58                       30.61                       30.25                       27.42 |    29                 192.75000                     -1.59                       30.60                       30.26                       27.42 | ||||||
|    30                    192.80                     -1.65                       30.57                       30.26                       27.40 |    30                 192.80000                     -1.67                       30.56                       30.27                       27.40 | ||||||
|    31                    192.85                     -1.72                       30.53                       30.27                       27.38 |    31                 192.85000                     -1.74                       30.52                       30.27                       27.38 | ||||||
|    32                    192.90                     -1.79                       30.48                       30.27                       27.37 |    32                 192.90000                     -1.81                       30.47                       30.28                       27.37 | ||||||
|    33                    192.95                     -1.86                       30.44                       30.28                       27.35 |    33                 192.95000                     -1.88                       30.43                       30.29                       27.35 | ||||||
|    34                    193.00                     -1.93                       30.40                       30.29                       27.33 |    34                 193.00000                     -1.95                       30.39                       30.30                       27.33 | ||||||
|    35                    193.05                     -2.00                       30.35                       30.30                       27.32 |    35                 193.05000                     -2.02                       30.34                       30.30                       27.31 | ||||||
|    36                    193.10                     -2.07                       30.31                       30.30                       27.30 |    36                 193.10000                     -2.08                       30.30                       30.31                       27.30 | ||||||
|    37                    193.15                     -2.14                       30.27                       30.31                       27.28 |    37                 193.15000                     -2.15                       30.26                       30.32                       27.28 | ||||||
|    38                    193.20                     -2.20                       30.22                       30.33                       27.27 |    38                 193.20000                     -2.22                       30.21                       30.34                       27.26 | ||||||
|    39                    193.25                     -2.27                       30.18                       30.35                       27.25 |    39                 193.25000                     -2.29                       30.17                       30.36                       27.25 | ||||||
|    40                    193.30                     -2.34                       30.14                       30.37                       27.24 |    40                 193.30000                     -2.36                       30.13                       30.37                       27.24 | ||||||
|    41                    193.35                     -2.41                       30.09                       30.38                       27.23 |    41                 193.35000                     -2.43                       30.08                       30.39                       27.22 | ||||||
|    42                    193.40                     -2.48                       30.05                       30.40                       27.21 |    42                 193.40000                     -2.50                       30.04                       30.41                       27.21 | ||||||
|    43                    193.45                     -2.55                       30.00                       30.42                       27.20 |    43                 193.45000                     -2.56                       29.99                       30.43                       27.19 | ||||||
|    44                    193.50                     -2.61                       29.96                       30.44                       27.18 |    44                 193.50000                     -2.63                       29.95                       30.44                       27.18 | ||||||
|    45                    193.55                     -2.69                       29.91                       30.46                       27.16 |    45                 193.55000                     -2.70                       29.90                       30.46                       27.16 | ||||||
|    46                    193.60                     -2.76                       29.86                       30.47                       27.15 |    46                 193.60000                     -2.78                       29.85                       30.48                       27.15 | ||||||
|    47                    193.65                     -2.83                       29.82                       30.49                       27.13 |    47                 193.65000                     -2.85                       29.80                       30.50                       27.13 | ||||||
|    48                    193.70                     -2.90                       29.77                       30.51                       27.11 |    48                 193.70000                     -2.92                       29.76                       30.52                       27.11 | ||||||
|    49                    193.75                     -2.98                       29.72                       30.53                       27.10 |    49                 193.75000                     -2.99                       29.71                       30.54                       27.09 | ||||||
|    50                    193.80                     -3.05                       29.67                       30.55                       27.08 |    50                 193.80000                     -3.06                       29.66                       30.55                       27.07 | ||||||
|    51                    193.85                     -3.12                       29.62                       30.57                       27.06 |    51                 193.85000                     -3.14                       29.61                       30.57                       27.06 | ||||||
|    52                    193.90                     -3.19                       29.58                       30.58                       27.04 |    52                 193.90000                     -3.21                       29.56                       30.59                       27.04 | ||||||
|    53                    193.95                     -3.26                       29.53                       30.60                       27.02 |    53                 193.95000                     -3.28                       29.52                       30.61                       27.02 | ||||||
|    54                    194.00                     -3.33                       29.48                       30.62                       27.00 |    54                 194.00000                     -3.35                       29.47                       30.63                       27.00 | ||||||
|    55                    194.05                     -3.41                       29.43                       30.64                       26.98 |    55                 194.05000                     -3.42                       29.42                       30.65                       26.98 | ||||||
|    56                    194.10                     -3.48                       29.38                       30.66                       26.96 |    56                 194.10000                     -3.50                       29.37                       30.67                       26.96 | ||||||
|    57                    194.15                     -3.55                       29.33                       30.72                       26.96 |    57                 194.15000                     -3.57                       29.32                       30.72                       26.95 | ||||||
|    58                    194.20                     -3.63                       29.28                       30.78                       26.95 |    58                 194.20000                     -3.64                       29.26                       30.78                       26.95 | ||||||
|    59                    194.25                     -3.70                       29.23                       30.83                       26.95 |    59                 194.25000                     -3.72                       29.21                       30.84                       26.94 | ||||||
|    60                    194.30                     -3.77                       29.18                       30.89                       26.94 |    60                 194.30000                     -3.79                       29.16                       30.90                       26.94 | ||||||
|    61                    194.35                     -3.85                       29.12                       30.96                       26.93 |    61                 194.35000                     -3.86                       29.11                       30.96                       26.93 | ||||||
|    62                    194.40                     -3.92                       29.07                       31.02                       26.93 |    62                 194.40000                     -3.93                       29.06                       31.02                       26.92 | ||||||
|    63                    194.45                     -3.99                       29.02                       31.08                       26.92 |    63                 194.45000                     -4.01                       29.01                       31.09                       26.91 | ||||||
|    64                    194.50                     -4.06                       28.97                       31.14                       26.91 |    64                 194.50000                     -4.08                       28.96                       31.15                       26.91 | ||||||
|    65                    194.55                     -4.13                       28.92                       31.21                       26.91 |    65                 194.55000                     -4.14                       28.91                       31.21                       26.90 | ||||||
|    66                    194.60                     -4.19                       28.88                       31.27                       26.90 |    66                 194.60000                     -4.21                       28.86                       31.28                       26.90 | ||||||
|    67                    194.65                     -4.26                       28.83                       31.34                       26.89 |    67                 194.65000                     -4.27                       28.82                       31.34                       26.89 | ||||||
|    68                    194.70                     -4.33                       28.78                       31.41                       26.89 |    68                 194.70000                     -4.34                       28.77                       31.41                       26.88 | ||||||
|    69                    194.75                     -4.39                       28.73                       31.47                       26.88 |    69                 194.75000                     -4.41                       28.72                       31.48                       26.88 | ||||||
|    70                    194.80                     -4.46                       28.68                       31.54                       26.87 |    70                 194.80000                     -4.47                       28.67                       31.55                       26.87 | ||||||
|    71                    194.85                     -4.52                       28.64                       31.61                       26.86 |    71                 194.85000                     -4.54                       28.63                       31.62                       26.86 | ||||||
|    72                    194.90                     -4.59                       28.59                       31.68                       26.86 |    72                 194.90000                     -4.60                       28.58                       31.69                       26.85 | ||||||
|    73                    194.95                     -4.65                       28.54                       31.76                       26.85 |    73                 194.95000                     -4.67                       28.53                       31.76                       26.84 | ||||||
|    74                    195.00                     -4.72                       28.49                       31.83                       26.84 |    74                 195.00000                     -4.73                       28.48                       31.84                       26.83 | ||||||
|    75                    195.05                     -4.78                       28.44                       31.91                       26.83 |    75                 195.05000                     -4.80                       28.43                       31.91                       26.82 | ||||||
|    76                    195.10                     -4.85                       28.39                       31.91                       26.79 |    76                 195.10000                     -4.86                       28.38                       31.91                       26.79 | ||||||
|  |  | ||||||
| (No source node specified: picked Site_A) | (No source node specified: picked Site_A) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										453
									
								
								tests/invocation/transmission_main_example_long
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										453
									
								
								tests/invocation/transmission_main_example_long
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,453 @@ | |||||||
|  | There are 96 channels propagating | ||||||
|  | Power mode is set to True | ||||||
|  | => it can be modified in eqpt_config.json - Span | ||||||
|  |  | ||||||
|  | There are 15 fiber spans over 1200 km between Site_A and Site_B | ||||||
|  |  | ||||||
|  | Now propagating between Site_A and Site_B: | ||||||
|  |  | ||||||
|  | Propagating with input power = [1;36;40m0.00 dBm[0m: | ||||||
|  | Transceiver Site_A | ||||||
|  |   GSNR (0.1nm, dB):          100.00 | ||||||
|  |   GSNR (signal bw, dB):      95.92 | ||||||
|  |   OSNR ASE (0.1nm, dB):      100.00 | ||||||
|  |   OSNR ASE (signal bw, dB):  95.92 | ||||||
|  |   CD (ps/nm):                0.00 | ||||||
|  |   PMD (ps):                  0.00 | ||||||
|  |   PDL (dB):                  0.00 | ||||||
|  | Roadm roadm Site A | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | Edfa booster A | ||||||
|  |   type_variety:           std_medium_gain | ||||||
|  |   effective gain(dB):     20.00 | ||||||
|  |   (before att_in and before output VOA) | ||||||
|  |   noise figure (dB):      6.58 | ||||||
|  |   (including att_in) | ||||||
|  |   pad att_in (dB):        0.00 | ||||||
|  |   Power In (dBm):         -0.18 | ||||||
|  |   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 | ||||||
|  |   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):        -15.99 | ||||||
|  | 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.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          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):        -15.98 | ||||||
|  | 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.84 | ||||||
|  |   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 | ||||||
|  |   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):        -15.97 | ||||||
|  | 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.85 | ||||||
|  |   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 | ||||||
|  |   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):        -15.96 | ||||||
|  | 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.86 | ||||||
|  |   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 | ||||||
|  |   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):        -15.95 | ||||||
|  | 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.87 | ||||||
|  |   Power Out (dBm):        19.88 | ||||||
|  |   Delta_P (dB):           0.00 | ||||||
|  |   target pch (dBm):       0.00 | ||||||
|  |   effective pch (dBm):    0.00 | ||||||
|  |   actual pch out (dBm):   0.06 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Site C | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | 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.18 | ||||||
|  |   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 | ||||||
|  |   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):        -15.99 | ||||||
|  | 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.83 | ||||||
|  |   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 | ||||||
|  |   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):        -15.98 | ||||||
|  | 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.84 | ||||||
|  |   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 | ||||||
|  |   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):        -15.97 | ||||||
|  | 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.85 | ||||||
|  |   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 | ||||||
|  |   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):        -15.96 | ||||||
|  | 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.86 | ||||||
|  |   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 | ||||||
|  |   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):        -15.95 | ||||||
|  | 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.87 | ||||||
|  |   Power Out (dBm):        19.88 | ||||||
|  |   Delta_P (dB):           0.00 | ||||||
|  |   target pch (dBm):       0.00 | ||||||
|  |   effective pch (dBm):    0.00 | ||||||
|  |   actual pch out (dBm):   0.06 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Site D | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | 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.18 | ||||||
|  |   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 | ||||||
|  |   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):        -15.99 | ||||||
|  | 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.83 | ||||||
|  |   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 | ||||||
|  |   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):        -15.98 | ||||||
|  | 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.84 | ||||||
|  |   Power Out (dBm):        19.85 | ||||||
|  |   Delta_P (dB):           0.00 | ||||||
|  |   target pch (dBm):       0.00 | ||||||
|  |   effective pch (dBm):    0.00 | ||||||
|  |   actual pch out (dBm):   0.03 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Site E | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | 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.18 | ||||||
|  |   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 | ||||||
|  |   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):        -15.99 | ||||||
|  | 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.83 | ||||||
|  |   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 | ||||||
|  |   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):        -15.98 | ||||||
|  | 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.84 | ||||||
|  |   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 | ||||||
|  |   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):        -15.97 | ||||||
|  | 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.85 | ||||||
|  |   Power Out (dBm):        19.86 | ||||||
|  |   Delta_P (dB):           0.00 | ||||||
|  |   target pch (dBm):       0.00 | ||||||
|  |   effective pch (dBm):    0.00 | ||||||
|  |   actual pch out (dBm):   0.04 | ||||||
|  |   output VOA (dB):        0.00 | ||||||
|  | Roadm roadm Site B | ||||||
|  |   effective loss (dB):     20.00 | ||||||
|  |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
|  | Transceiver Site_B | ||||||
|  |   GSNR (0.1nm, dB):          17.85 | ||||||
|  |   GSNR (signal bw, dB):      13.77 | ||||||
|  |   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 | ||||||
|  |  | ||||||
|  | Transmission result for input power = 0.00 dBm: | ||||||
|  |   Final GSNR (0.1 nm): [1;36;40m17.85 dB[0m | ||||||
|  |  | ||||||
|  | (No source node specified: picked Site_A) | ||||||
|  |  | ||||||
|  | (No destination node specified: picked Site_B) | ||||||
| @@ -252,8 +252,9 @@ Transceiver trx Lannion_CAS | |||||||
|   PMD (ps):                  0.00 |   PMD (ps):                  0.00 | ||||||
|   PDL (dB):                  0.00 |   PDL (dB):                  0.00 | ||||||
| Roadm roadm Lannion_CAS | Roadm roadm Lannion_CAS | ||||||
|   effective loss (dB):  23.00 |   effective loss (dB):     23.00 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Edfa east edfa in Lannion_CAS to Corlay | Edfa east edfa in Lannion_CAS to Corlay | ||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     21.18 |   effective gain(dB):     21.18 | ||||||
| @@ -266,6 +267,7 @@ Edfa east edfa in Lannion_CAS to Corlay | |||||||
|   Delta_P (dB):           0.00 |   Delta_P (dB):           0.00 | ||||||
|   target pch (dBm):       3.00 |   target pch (dBm):       3.00 | ||||||
|   effective pch (dBm):    1.18 |   effective pch (dBm):    1.18 | ||||||
|  |   actual pch out (dBm):   1.18 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Fiber          fiber (Lannion_CAS → Corlay)-F061 | Fiber          fiber (Lannion_CAS → Corlay)-F061 | ||||||
|   type_variety:                SSMF |   type_variety:                SSMF | ||||||
| @@ -274,7 +276,8 @@ Fiber          fiber (Lannion_CAS → Corlay)-F061 | |||||||
|   total loss (dB):             4.00 |   total loss (dB):             4.00 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -2.82 |   reference pch out (dBm):     -2.82 | ||||||
|  |   actual pch out (dBm):        -2.81 | ||||||
| Fused west fused spans in Corlay | Fused west fused spans in Corlay | ||||||
|   loss (dB): 1.00 |   loss (dB): 1.00 | ||||||
| Fiber          fiber (Corlay → Loudeac)-F010 | Fiber          fiber (Corlay → Loudeac)-F010 | ||||||
| @@ -284,7 +287,8 @@ Fiber          fiber (Corlay → Loudeac)-F010 | |||||||
|   total loss (dB):             10.00 |   total loss (dB):             10.00 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -13.82 |   reference pch out (dBm):     -13.82 | ||||||
|  |   actual pch out (dBm):        -13.81 | ||||||
| Fused west fused spans in Loudeac | Fused west fused spans in Loudeac | ||||||
|   loss (dB): 1.00 |   loss (dB): 1.00 | ||||||
| Fiber          fiber (Loudeac → Lorient_KMA)-F054 | Fiber          fiber (Loudeac → Lorient_KMA)-F054 | ||||||
| @@ -294,23 +298,26 @@ Fiber          fiber (Loudeac → Lorient_KMA)-F054 | |||||||
|   total loss (dB):             12.00 |   total loss (dB):             12.00 | ||||||
|   (includes conn loss (dB) in: 0.00 out: 0.00) |   (includes conn loss (dB) in: 0.00 out: 0.00) | ||||||
|   (conn loss out includes EOL margin defined in eqpt_config.json) |   (conn loss out includes EOL margin defined in eqpt_config.json) | ||||||
|   pch out (dBm): -26.82 |   reference pch out (dBm):     -26.82 | ||||||
|  |   actual pch out (dBm):        -26.81 | ||||||
| Edfa west edfa in Lorient_KMA to Loudeac | Edfa west edfa in Lorient_KMA to Loudeac | ||||||
|   type_variety:           test |   type_variety:           test | ||||||
|   effective gain(dB):     28.00 |   effective gain(dB):     27.99 | ||||||
|   (before att_in and before output VOA) |   (before att_in and before output VOA) | ||||||
|   noise figure (dB):      5.76 |   noise figure (dB):      5.76 | ||||||
|   (including att_in) |   (including att_in) | ||||||
|   pad att_in (dB):        0.00 |   pad att_in (dB):        0.00 | ||||||
|   Power In (dBm):         -6.99 |   Power In (dBm):         -6.99 | ||||||
|   Power Out (dBm):        21.04 |   Power Out (dBm):        21.03 | ||||||
|   Delta_P (dB):           -1.82 |   Delta_P (dB):           -1.82 | ||||||
|   target pch (dBm):       1.18 |   target pch (dBm):       1.18 | ||||||
|   effective pch (dBm):    1.18 |   effective pch (dBm):    1.17 | ||||||
|  |   actual pch out (dBm):   1.21 | ||||||
|   output VOA (dB):        0.00 |   output VOA (dB):        0.00 | ||||||
| Roadm roadm Lorient_KMA | Roadm roadm Lorient_KMA | ||||||
|   effective loss (dB):  21.18 |   effective loss (dB):     21.17 | ||||||
|   pch out (dBm):        -20.00 |   reference pch out (dBm): -20.00 | ||||||
|  |   actual pch out (dBm):    -20.00 | ||||||
| Transceiver trx Lorient_KMA | Transceiver trx Lorient_KMA | ||||||
|   GSNR (0.1nm, dB):          23.94 |   GSNR (0.1nm, dB):          23.94 | ||||||
|   GSNR (signal bw, dB):      19.85 |   GSNR (signal bw, dB):      19.85 | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								tests/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | 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 | ||||||
| @@ -6,7 +6,7 @@ | |||||||
| from numpy import zeros, array | from numpy import zeros, array | ||||||
| from gnpy.core.elements import Transceiver, Edfa | from gnpy.core.elements import Transceiver, Edfa | ||||||
| from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions | from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions | ||||||
| from gnpy.core.info import create_input_spectral_information, Pref | from gnpy.core.info import create_input_spectral_information, ReferenceCarrier | ||||||
| from gnpy.core.network import build_network | from gnpy.core.network import build_network | ||||||
| from gnpy.tools.json_io import load_network, load_equipment | from gnpy.tools.json_io import load_network, load_equipment | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| @@ -73,7 +73,9 @@ def si(nch_and_spacing, bw): | |||||||
|     nb_channel, spacing = nch_and_spacing |     nb_channel, spacing = nch_and_spacing | ||||||
|     f_min = 191.3e12 |     f_min = 191.3e12 | ||||||
|     f_max = automatic_fmax(f_min, spacing, nb_channel) |     f_max = automatic_fmax(f_min, spacing, nb_channel) | ||||||
|     return create_input_spectral_information(f_min, f_max, 0.15, bw, 1e-3, spacing) |     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)) | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)]) | @pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)]) | ||||||
| @@ -84,7 +86,7 @@ def test_variable_gain_nf(gain, nf_expected, setup_edfa_variable_gain, si): | |||||||
|     si.nli /= db2lin(gain) |     si.nli /= db2lin(gain) | ||||||
|     si.ase /= db2lin(gain) |     si.ase /= db2lin(gain) | ||||||
|     edfa.operational.gain_target = gain |     edfa.operational.gain_target = gain | ||||||
|     si.pref = si.pref._replace(p_span0=0, p_spani=-gain, neq_ch=lin2db(si.number_of_channels)) |     si.pref = si.pref._replace(p_span0=0, p_spani=-gain) | ||||||
|     edfa.interpol_params(si) |     edfa.interpol_params(si) | ||||||
|     result = edfa.nf |     result = edfa.nf | ||||||
|     assert pytest.approx(nf_expected, abs=0.01) == result[0] |     assert pytest.approx(nf_expected, abs=0.01) == result[0] | ||||||
| @@ -98,7 +100,7 @@ def test_fixed_gain_nf(gain, nf_expected, setup_edfa_fixed_gain, si): | |||||||
|     si.nli /= db2lin(gain) |     si.nli /= db2lin(gain) | ||||||
|     si.ase /= db2lin(gain) |     si.ase /= db2lin(gain) | ||||||
|     edfa.operational.gain_target = gain |     edfa.operational.gain_target = gain | ||||||
|     si.pref = si.pref._replace(p_span0=0, p_spani=-gain, neq_ch=lin2db(si.number_of_channels)) |     si.pref = si.pref._replace(p_span0=0, p_spani=-gain) | ||||||
|     edfa.interpol_params(si) |     edfa.interpol_params(si) | ||||||
|     assert pytest.approx(nf_expected, abs=0.01) == edfa.nf[0] |     assert pytest.approx(nf_expected, abs=0.01) == edfa.nf[0] | ||||||
|  |  | ||||||
| @@ -123,7 +125,7 @@ def test_compare_nf_models(gain, setup_edfa_variable_gain, si): | |||||||
|     si.ase /= db2lin(gain) |     si.ase /= db2lin(gain) | ||||||
|     edfa.operational.gain_target = gain |     edfa.operational.gain_target = gain | ||||||
|     # edfa is variable gain type |     # edfa is variable gain type | ||||||
|     si.pref = si.pref._replace(p_span0=0, p_spani=-gain, neq_ch=lin2db(si.number_of_channels)) |     si.pref = si.pref._replace(p_span0=0, p_spani=-gain) | ||||||
|     edfa.interpol_params(si) |     edfa.interpol_params(si) | ||||||
|     nf_model = edfa.nf[0] |     nf_model = edfa.nf[0] | ||||||
|  |  | ||||||
| @@ -178,7 +180,7 @@ def test_ase_noise(gain, si, setup_trx, bw): | |||||||
|     si = span(si) |     si = span(si) | ||||||
|     print(span) |     print(span) | ||||||
|  |  | ||||||
|     si.pref = si.pref._replace(p_span0=0, p_spani=-gain, neq_ch=lin2db(si.number_of_channels)) |     si.pref = si.pref._replace(p_span0=0, p_spani=-gain) | ||||||
|     edfa.interpol_params(si) |     edfa.interpol_params(si) | ||||||
|     nf = edfa.nf |     nf = edfa.nf | ||||||
|     print('nf', nf) |     print('nf', nf) | ||||||
|   | |||||||
							
								
								
									
										588
									
								
								tests/test_equalization.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										588
									
								
								tests/test_equalization.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,588 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # @Author: Esther Le Rouzic | ||||||
|  | # @Date:   2019-05-22 | ||||||
|  | """ | ||||||
|  | @author: esther.lerouzic | ||||||
|  | checks that new equalization option give the same output as old one: | ||||||
|  |  | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | from pathlib import Path | ||||||
|  | import pytest | ||||||
|  | from numpy.testing import assert_allclose, assert_array_equal, assert_raises | ||||||
|  | from numpy import array | ||||||
|  |  | ||||||
|  | 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.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 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | TEST_DIR = Path(__file__).parent | ||||||
|  | EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json' | ||||||
|  | NETWORK_FILENAME = TEST_DIR / 'data/testTopology_expected.json' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('degree, equalization_type, target, expected_pch_out_dbm, expected_si', | ||||||
|  |     [('east edfa in Lannion_CAS to Morlaix', 'target_pch_out_db', -20, -20, [-20, -20, -20, -20, -20]), | ||||||
|  |      ('east edfa in Lannion_CAS to Morlaix', 'target_psd_out_mWperGHz', 5e-4, -17.9588, | ||||||
|  |       [-17.9588, -16.7778, -14.9485, -16.7778, -17.9588]), | ||||||
|  |      ('east edfa in Lannion_CAS to Morlaix', 'target_out_mWperSlotWidth', 3e-4, -18.2390, | ||||||
|  |       [-19.4885, -18.2390, -16.4781, -18.2390, -19.4885]), | ||||||
|  |      ('east edfa in Lannion_CAS to Corlay', 'target_pch_out_db', -20, -16, [-16, -16, -16, -16, -16]), | ||||||
|  |      ('east edfa in Lannion_CAS to Corlay', 'target_psd_out_mWperGHz', 5e-4, -16, [-16, -16, -16, -16, -16]), | ||||||
|  |      ('east edfa in Lannion_CAS to Corlay', 'target_out_mWperSlotWidth', 5e-4, -16, [-16, -16, -16, -16, -16]), | ||||||
|  |      ('east edfa in Lannion_CAS to Stbrieuc', 'target_pch_out_db', -20, -17.16699, | ||||||
|  |       [-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771]), | ||||||
|  |      ('east edfa in Lannion_CAS to Stbrieuc', 'target_psd_out_mWperGHz', 5e-4, -17.16699, | ||||||
|  |       [-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771]), | ||||||
|  |      ('east edfa in Lannion_CAS to Stbrieuc', 'target_out_mWperSlotWidth', 5e-4, -17.16699, | ||||||
|  |       [-17.16698771, -15.98599459, -14.15668776, -15.98599459, -17.16698771])]) | ||||||
|  | @pytest.mark.parametrize('delta_pdb_per_channel', [[0, 0, 0, 0, 0], [1, 3, 0, -5, 0]]) | ||||||
|  | def test_equalization_combination_degree(delta_pdb_per_channel, degree, equalization_type, target, | ||||||
|  |                                          expected_pch_out_dbm, expected_si): | ||||||
|  |     """Check that ROADM correctly computes power of thr reference channel based on different | ||||||
|  |     combination of equalization for ROADM and per degree | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     roadm_config = { | ||||||
|  |         "uid": "roadm Lannion_CAS", | ||||||
|  |         "params": { | ||||||
|  |             "per_degree_pch_out_db": { | ||||||
|  |                 "east edfa in Lannion_CAS to Corlay": -16 | ||||||
|  |             }, | ||||||
|  |             "per_degree_psd_out_mWperGHz": { | ||||||
|  |                 "east edfa in Lannion_CAS to Stbrieuc": 6e-4 | ||||||
|  |             }, | ||||||
|  |             equalization_type: target, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": [] | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     roadm = Roadm(**roadm_config) | ||||||
|  |     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) | ||||||
|  |     to_json_before_propagation = { | ||||||
|  |         'uid': 'roadm Lannion_CAS', | ||||||
|  |         'type': 'Roadm', | ||||||
|  |         'params': { | ||||||
|  |             equalization_type: target, | ||||||
|  |             'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []}, | ||||||
|  |             'per_degree_pch_out_db': { | ||||||
|  |                 'east edfa in Lannion_CAS to Corlay': -16}, | ||||||
|  |             "per_degree_psd_out_mWperGHz": { | ||||||
|  |                 "east edfa in Lannion_CAS to Stbrieuc": 6e-4 | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         'metadata': {'location': {'latitude': 0, 'longitude': 0, 'city': None, 'region': None}} | ||||||
|  |     } | ||||||
|  |     assert roadm.to_json == to_json_before_propagation | ||||||
|  |     si = roadm(si, degree) | ||||||
|  |     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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('equalization_type', ["target_psd_out_mWperGHz", "target_out_mWperSlotWidth"]) | ||||||
|  | def test_wrong_element_config(equalization_type): | ||||||
|  |     """Check that 2 equalization correcty raise a config error | ||||||
|  |     """ | ||||||
|  |     roadm_config = { | ||||||
|  |         "uid": "roadm Brest_KLA", | ||||||
|  |         "params": { | ||||||
|  |             "per_degree_pch_out_db": {}, | ||||||
|  |             "target_pch_out_db": -20, | ||||||
|  |             equalization_type: 3.125e-4, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": [] | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "metadata": { | ||||||
|  |             "location": { | ||||||
|  |                 "city": "Brest_KLA", | ||||||
|  |                 "region": "RLD", | ||||||
|  |                 "latitude": 4.0, | ||||||
|  |                 "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     with pytest.raises(ConfigurationError): | ||||||
|  |         _ = Roadm(**roadm_config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_merge_equalization(): | ||||||
|  |     """Check that if equalization is not defined default one is correctly take and | ||||||
|  |     else that it is not overwritten | ||||||
|  |     """ | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [{ | ||||||
|  |             "uid": "roadm Brest_KLA", | ||||||
|  |             "type": "Roadm"}], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     equipment = load_equipment(EQPT_FILENAME) | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     roadm = [n for n in network.nodes()][0] | ||||||
|  |     assert roadm.target_pch_out_dbm == -20 | ||||||
|  |     delattr(equipment['Roadm']['default'], 'target_pch_out_db') | ||||||
|  |     setattr(equipment['Roadm']['default'], 'target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9)) | ||||||
|  |     # json_data is changed (type is popped from json_data with network_from_json_function). Create a new one: | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [{ | ||||||
|  |             "uid": "roadm Brest_KLA", | ||||||
|  |             "type": "Roadm"}], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     roadm = [n for n in network.nodes()][0] | ||||||
|  |     assert roadm.target_pch_out_dbm is None | ||||||
|  |     assert roadm.target_psd_out_mWperGHz == 3.125e-4 | ||||||
|  |     assert roadm.target_out_mWperSlotWidth is None | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [{ | ||||||
|  |             "uid": "roadm Brest_KLA", | ||||||
|  |             "type": "Roadm", | ||||||
|  |             "params": {"target_pch_out_db": -18}}], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     roadm = [n for n in network.nodes()][0] | ||||||
|  |     assert roadm.target_pch_out_dbm == -18 | ||||||
|  |     assert roadm.target_psd_out_mWperGHz is None | ||||||
|  |     assert roadm.target_out_mWperSlotWidth is None | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [{ | ||||||
|  |             "uid": "roadm Brest_KLA", | ||||||
|  |             "type": "Roadm", | ||||||
|  |             "params": {"target_psd_out_mWperGHz": 5e-4}}], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     roadm = [n for n in network.nodes()][0] | ||||||
|  |     assert roadm.target_pch_out_dbm is None | ||||||
|  |     assert roadm.target_psd_out_mWperGHz == 5e-4 | ||||||
|  |     assert roadm.target_out_mWperSlotWidth is None | ||||||
|  |     json_data = { | ||||||
|  |         "elements": [{ | ||||||
|  |             "uid": "roadm Brest_KLA", | ||||||
|  |             "type": "Roadm", | ||||||
|  |             "params": {"target_out_mWperSlotWidth": 3e-4}}], | ||||||
|  |         "connections": [] | ||||||
|  |     } | ||||||
|  |     network = network_from_json(json_data, equipment) | ||||||
|  |     roadm = [n for n in network.nodes()][0] | ||||||
|  |     assert roadm.target_pch_out_dbm is None | ||||||
|  |     assert roadm.target_psd_out_mWperGHz is None | ||||||
|  |     assert roadm.target_out_mWperSlotWidth == 3e-4 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('target_out, delta_pdb_per_channel, correction', | ||||||
|  |                          [(-20, [0, 1, 3, 0.5, -2], [0, 0, 5, 5.5, 0]), | ||||||
|  |                           (-20, [0, 0, 0, 0, 0], [0, 0, 2, 5, 0]), | ||||||
|  |                           (-20, [-2, -2, -2, -2, -2], [0, 0, 0, 3, 0]), | ||||||
|  |                           (-20, [0, 2, -2, -5, 4], [0, 0, 0, 0, 0]), | ||||||
|  |                           (-25.5, [0, 1, 3, 0.5, -2], [0, 0, 0, 0, 0]), ]) | ||||||
|  | def test_low_input_power(target_out, delta_pdb_per_channel, correction): | ||||||
|  |     """check that ROADM correctly equalizes on small examples, assumes p_span_0 = 0 | ||||||
|  |     case of power equalisation | ||||||
|  |     """ | ||||||
|  |     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])) | ||||||
|  |     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) | ||||||
|  |     roadm_config = { | ||||||
|  |         "uid": "roadm Brest_KLA", | ||||||
|  |         "params": { | ||||||
|  |             "per_degree_pch_out_db": {}, | ||||||
|  |             "target_pch_out_db": target_out, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": [] | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "metadata": { | ||||||
|  |             "location": { | ||||||
|  |                 "city": "Brest_KLA", | ||||||
|  |                 "region": "RLD", | ||||||
|  |                 "latitude": 4.0, | ||||||
|  |                 "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     roadm = Roadm(**roadm_config) | ||||||
|  |     si = roadm(si, 'toto') | ||||||
|  |     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), | ||||||
|  |                     watt2dbm(si.signal), rtol=1e-5) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('target_out, delta_pdb_per_channel, correction', | ||||||
|  |                          [(3.125e-4, | ||||||
|  |                            [0, 0, 0, 0, 0], | ||||||
|  |                            [0, 0, 2 + lin2db(64 / 32), 5 + lin2db(42 / 32), 0]), | ||||||
|  |                           (3.125e-4, | ||||||
|  |                            [1, 3, 0, -5, 0], | ||||||
|  |                            [1, 1 + lin2db(42 / 32), 2 + lin2db(64 / 32), 0 + lin2db(42 / 32), 0]), ]) | ||||||
|  | def test_2low_input_power(target_out, delta_pdb_per_channel, correction): | ||||||
|  |     """check that ROADM correctly equalizes on small examples, assumes p_span_0 = 0 | ||||||
|  |     case of PSD equalisation | ||||||
|  |     """ | ||||||
|  |     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])) | ||||||
|  |     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) | ||||||
|  |     roadm_config = { | ||||||
|  |         "uid": "roadm Brest_KLA", | ||||||
|  |         "params": { | ||||||
|  |             "per_degree_pch_out_db": {}, | ||||||
|  |             "target_psd_out_mWperGHz": target_out, | ||||||
|  |             "add_drop_osnr": 38, | ||||||
|  |             "pmd": 0, | ||||||
|  |             "pdl": 0, | ||||||
|  |             "restrictions": { | ||||||
|  |                 "preamp_variety_list": [], | ||||||
|  |                 "booster_variety_list": [] | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "metadata": { | ||||||
|  |             "location": { | ||||||
|  |                 "city": "Brest_KLA", | ||||||
|  |                 "region": "RLD", | ||||||
|  |                 "latitude": 4.0, | ||||||
|  |                 "longitude": 0.0 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     roadm = Roadm(**roadm_config) | ||||||
|  |     si = roadm(si, 'toto') | ||||||
|  |     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 | ||||||
|  |     """ | ||||||
|  |     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_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, mode, spacing, power_dbm): | ||||||
|  |     """ create the usual request list according to parameters | ||||||
|  |     """ | ||||||
|  |     params = {'request_id': 'test_request', | ||||||
|  |               'source': source, | ||||||
|  |               'bidir': bidir, | ||||||
|  |               'destination': dest, | ||||||
|  |               'trx_type': 'Voyager', | ||||||
|  |               'trx_mode': mode, | ||||||
|  |               'format': mode, | ||||||
|  |               'spacing': spacing, | ||||||
|  |               'nodes_list': nodes_list, | ||||||
|  |               'loose_list': loose_list, | ||||||
|  |               'path_bandwidth': 100.0e9, | ||||||
|  |               'effective_freq_slot': None} | ||||||
|  |     trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True) | ||||||
|  |     params.update(trx_params) | ||||||
|  |     params['power'] = dbm2watt(power_dbm) if power_dbm else dbm2watt(equipment['SI']['default'].power_dbm) | ||||||
|  |     f_min = params['f_min'] | ||||||
|  |     f_max_from_si = params['f_max'] | ||||||
|  |     params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing']) | ||||||
|  |     return PathRequest(**params) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @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 | ||||||
|  |     """ | ||||||
|  |     # 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'], | ||||||
|  |                              mode, slot_width, power_dbm) | ||||||
|  |     network = net_setup(equipment) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     infos_expected = propagate(path, req, equipment) | ||||||
|  |     # then creates req.initial_spectrum attribute exactly corresponding to -spectrum option files | ||||||
|  |     temp = [{ | ||||||
|  |         "f_min": 191.35e12 + slot_width, | ||||||
|  |         "f_max": 196.15e12 - slot_width, | ||||||
|  |         "baud_rate": req.baud_rate, | ||||||
|  |         "slot_width": slot_width, | ||||||
|  |         "roll_off": 0.15, | ||||||
|  |         "tx_osnr": 40 | ||||||
|  |     }] | ||||||
|  |     req.initial_spectrum = _spectrum_from_json(temp) | ||||||
|  |     infos_actual = propagate(path, req, equipment) | ||||||
|  |     print(infos_actual.frequency[0], infos_actual.frequency[-1]) | ||||||
|  |     print(infos_expected.frequency[0], infos_expected.frequency[-1]) | ||||||
|  |  | ||||||
|  |     assert_array_equal(infos_expected.frequency, infos_actual.frequency) | ||||||
|  |     assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate) | ||||||
|  |     assert_array_equal(infos_expected.slot_width, infos_actual.slot_width) | ||||||
|  |     assert_array_equal(infos_expected.signal, infos_actual.signal) | ||||||
|  |     assert_array_equal(infos_expected.nli, infos_actual.nli) | ||||||
|  |     assert_array_equal(infos_expected.ase, infos_actual.ase) | ||||||
|  |     assert_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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_initial_spectrum_not_identical(): | ||||||
|  |     """ checks that user defined spectrum overrides spectrum defined in 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'], | ||||||
|  |                              'mode 1', 50e9, 0) | ||||||
|  |     network = net_setup(equipment) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     infos_expected = propagate(path, req, equipment) | ||||||
|  |     # then creates req.initial_spectrum attribute exactly corresponding to -spectrum option files | ||||||
|  |     temp = [{ | ||||||
|  |         "f_min": 191.4e12,     # align f_min , f_max on Voyager f_min, f_mix and not SI ! | ||||||
|  |         "f_max": 196.1e12, | ||||||
|  |         "baud_rate": 40e9, | ||||||
|  |         "slot_width": 62.5e9, | ||||||
|  |         "roll_off": 0.15, | ||||||
|  |         "tx_osnr": 40 | ||||||
|  |     }] | ||||||
|  |     req.initial_spectrum = _spectrum_from_json(temp) | ||||||
|  |     infos_actual = propagate(path, req, equipment) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.frequency, infos_actual.frequency) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.baud_rate, infos_actual.baud_rate) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.slot_width, infos_actual.slot_width) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.signal, infos_actual.signal) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.nli, infos_actual.nli) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.ase, infos_actual.ase) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.channel_number, infos_actual.channel_number) | ||||||
|  |     assert_raises(AssertionError, assert_array_equal, infos_expected.number_of_channels, infos_actual.number_of_channels) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('equalization, target_value', [ | ||||||
|  |     ('target_out_mWperSlotWidth', power_dbm_to_psd_mw_ghz(-20, 50e9)), | ||||||
|  |     ('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 | ||||||
|  |     and it gives same result if computed target is the same | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_FILENAME) | ||||||
|  |     network = net_setup(equipment) | ||||||
|  |     req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'], | ||||||
|  |                              'mode 1', 50e9, power_dbm) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     infos_expected = propagate(path, req, equipment) | ||||||
|  |     # change default equalization to power spectral density | ||||||
|  |     delattr(equipment['Roadm']['default'], 'target_pch_out_db') | ||||||
|  |     setattr(equipment['Roadm']['default'], equalization, target_value) | ||||||
|  |     # create a second instance with this roadm settings, | ||||||
|  |     network2 = net_setup(equipment) | ||||||
|  |     path2 = compute_constrained_path(network2, req) | ||||||
|  |     infos_actual = propagate(path2, req, equipment) | ||||||
|  |     # since baudrate is the same, resulting propagation should be the same as for power equalization | ||||||
|  |     assert_array_equal(infos_expected.baud_rate, infos_actual.baud_rate) | ||||||
|  |     assert_array_equal(infos_expected.slot_width, infos_actual.slot_width) | ||||||
|  |     assert_array_equal(infos_expected.signal, infos_actual.signal) | ||||||
|  |     assert_array_equal(infos_expected.nli, infos_actual.nli) | ||||||
|  |     assert_array_equal(infos_expected.ase, infos_actual.ase) | ||||||
|  |     assert_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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def ref_network(): | ||||||
|  |     """ 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'], | ||||||
|  |                               'mode 1', 50e9, 0) | ||||||
|  |     path0 = compute_constrained_path(network, req0) | ||||||
|  |     _ = propagate(path0, req0, equipment) | ||||||
|  |     return network | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('deltap', [0, +1.2, -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 | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_FILENAME) | ||||||
|  |     network = net_setup(equipment) | ||||||
|  |     req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'], | ||||||
|  |                              'mode 1', 50e9, deltap) | ||||||
|  |     temp = [{ | ||||||
|  |         "f_min": 191.35e12,     # align f_min , f_max on Voyager f_min, f_mix and not SI ! | ||||||
|  |         "f_max": 196.05e12, | ||||||
|  |         "baud_rate": req.baud_rate, | ||||||
|  |         "slot_width": 50e9, | ||||||
|  |         "roll_off": 0.15, | ||||||
|  |         "tx_osnr": 40 | ||||||
|  |     }] | ||||||
|  |     req.initial_spectrum = _spectrum_from_json(temp) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     _ = propagate(path, req, equipment) | ||||||
|  |     # check that gain of booster is changed accordingly whereas gain of preamp and ila is not (no saturation case) | ||||||
|  |     boosters = ['east edfa in Brest_KLA to Quimper', 'east edfa in Lorient_KMA to Vannes_KBE'] | ||||||
|  |     ila_preamps = ['east edfa in Quimper to Lorient_KMA', 'west edfa in Lorient_KMA to Quimper', | ||||||
|  |                    'west edfa in Vannes_KBE to Lorient_KMA'] | ||||||
|  |     for amp in boosters + ila_preamps: | ||||||
|  |         expected_amp = next(n for n in ref_network() if n.uid == amp) | ||||||
|  |         actual_amp = next(n for n in network.nodes() if n.uid == amp) | ||||||
|  |         expected_gain = expected_amp.pout_db - expected_amp.pin_db | ||||||
|  |         actual_gain = actual_amp.pout_db - actual_amp.pin_db | ||||||
|  |         print(actual_amp) | ||||||
|  |         if amp in boosters: | ||||||
|  |             assert expected_gain + deltap == pytest.approx(actual_gain, rel=1e-3) | ||||||
|  |         if amp in ila_preamps: | ||||||
|  |             assert expected_gain == pytest.approx(actual_gain, rel=1e-3) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('equalization', ['target_psd_out_mWperGHz', 'target_out_mWperSlotWidth']) | ||||||
|  | @pytest.mark.parametrize('case', ['SI', 'nodes']) | ||||||
|  | @pytest.mark.parametrize('deltap', [0, +2, -0.5]) | ||||||
|  | @pytest.mark.parametrize('target', [-20, -21, -18]) | ||||||
|  | @pytest.mark.parametrize('mode, slot_width', (['mode 1', 50e9], ['mode 2', 75e9])) | ||||||
|  | def test_equalization(case, deltap, target, mode, slot_width, equalization): | ||||||
|  |     """check that power target on roadm is correct for these cases; check on booster | ||||||
|  |     - SI : target_pch_out_db / target_psd_out_mWperGHz | ||||||
|  |     - node : target_pch_out_db / target_psd_out_mWperGHz | ||||||
|  |     - per degree : target_pch_out_db / target_psd_out_mWperGHz | ||||||
|  |     for these cases with and without power from user | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_FILENAME) | ||||||
|  |     setattr(equipment['Roadm']['default'], 'target_pch_out_db', target) | ||||||
|  |     req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Rennes_STA', False, | ||||||
|  |                              ['east edfa in Brest_KLA to Quimper', 'roadm Lannion_CAS', 'trx Rennes_STA'], | ||||||
|  |                              ['STRICT', 'STRICT', 'STRICT'], | ||||||
|  |                              mode, slot_width, deltap) | ||||||
|  |     roadms = ['roadm Brest_KLA', 'roadm Lorient_KMA', 'roadm Lannion_CAS', 'roadm Rennes_STA'] | ||||||
|  |     # degree = {'roadm Brest_KLA': 'east edfa in Brest_KLA to Quimper', | ||||||
|  |     #           'roadm Lorient_KMA': 'east edfa in Lorient_KMA to Loudeac'} | ||||||
|  |     # 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) | ||||||
|  |         network = net_setup(equipment) | ||||||
|  |     elif case == 'nodes': | ||||||
|  |         json_data = load_json(NETWORK_FILENAME) | ||||||
|  |         for el in json_data['elements']: | ||||||
|  |             if el['uid'] in roadms: | ||||||
|  |                 el['params'] = {equalization: target_psd} | ||||||
|  |         network = network_from_json(json_data, 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) | ||||||
|  |         # check that nodes not in roadms have target_pch_out_db not None | ||||||
|  |         pw_roadms = [r for r in network.nodes() if r.uid not in roadms and isinstance(r, Roadm)] | ||||||
|  |         for roadm in pw_roadms: | ||||||
|  |             assert roadm.target_psd_out_mWperGHz is None | ||||||
|  |             assert roadm.target_pch_out_dbm == target | ||||||
|  |         for roadm in [r for r in network.nodes() if r.uid in roadms and isinstance(r, Roadm)]: | ||||||
|  |             assert roadm.target_pch_out_dbm is None | ||||||
|  |             assert getattr(roadm, equalization) == target_psd | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     si = create_input_spectral_information( | ||||||
|  |         f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate, power=req.power, | ||||||
|  |         spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref) | ||||||
|  |     for i, el in enumerate(path): | ||||||
|  |         if isinstance(el, Roadm): | ||||||
|  |             si = el(si, 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), | ||||||
|  |                                     target_psd, rtol=1e-3) | ||||||
|  |                 if equalization == 'target_out_mWperSlotWidth': | ||||||
|  |                     assert_allclose(power_dbm_to_psd_mw_ghz(watt2dbm(si.signal + si.ase + si.nli), si.slot_width), | ||||||
|  |                                     target_psd, rtol=1e-3) | ||||||
|  |         else: | ||||||
|  |             si = el(si) | ||||||
|  |         print(el.uid) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('req_power', [0, 2, -1.5]) | ||||||
|  | def test_power_option(req_power): | ||||||
|  |     """check that --po option adds correctly power with spectral information | ||||||
|  |     """ | ||||||
|  |     equipment = load_equipment(EQPT_FILENAME) | ||||||
|  |     setattr(equipment['Roadm']['default'], 'target_pch_out_db', None) | ||||||
|  |     setattr(equipment['Roadm']['default'], 'target_psd_out_mWperGHz', power_dbm_to_psd_mw_ghz(-20, 32e9)) | ||||||
|  |     network = net_setup(equipment) | ||||||
|  |     req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'], | ||||||
|  |                              'mode 1', 50e9, req_power) | ||||||
|  |     path = compute_constrained_path(network, req) | ||||||
|  |     infos_expected = propagate(path, req, equipment) | ||||||
|  |  | ||||||
|  |     temp = [{ | ||||||
|  |         "f_min": 191.4e12,     # align f_min , f_max on Voyager f_min, f_max and not SI ! | ||||||
|  |         "f_max": 196.1e12, | ||||||
|  |         "baud_rate": req.baud_rate, | ||||||
|  |         "slot_width": 50e9, | ||||||
|  |         "roll_off": 0.15, | ||||||
|  |         "tx_osnr": 40 | ||||||
|  |     }] | ||||||
|  |     req.initial_spectrum = _spectrum_from_json(temp) | ||||||
|  |     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_array_equal(infos_expected.slot_width, infos_actual.slot_width) | ||||||
|  |     assert_array_equal(infos_expected.signal, infos_actual.signal) | ||||||
|  |     assert_array_equal(infos_expected.nli, infos_actual.nli) | ||||||
|  |     assert_array_equal(infos_expected.ase, infos_actual.ase) | ||||||
|  |     assert_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,47 +4,56 @@ | |||||||
| import pytest | import pytest | ||||||
| from numpy import array, zeros, ones | from numpy import array, zeros, ones | ||||||
| from numpy.testing import assert_array_equal | 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 | from gnpy.core.exceptions import SpectrumError | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_create_arbitrary_spectral_information(): | def test_create_arbitrary_spectral_information(): | ||||||
|     si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], |     si = create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], | ||||||
|                                                baud_rate=32e9, signal=[1, 1, 1]) |                                                baud_rate=32e9, signal=[1, 1, 1], | ||||||
|  |                                                delta_pdb_per_channel=[1, 1, 1], | ||||||
|  |                                                tx_osnr=40.0, | ||||||
|  |                                                ref_power=Pref(1, 1, None)) | ||||||
|     assert_array_equal(si.baud_rate, array([32e9, 32e9, 32e9])) |     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.slot_width, array([37.5e9, 37.5e9, 37.5e9])) | ||||||
|     assert_array_equal(si.signal, ones(3)) |     assert_array_equal(si.signal, ones(3)) | ||||||
|     assert_array_equal(si.nli, zeros(3)) |     assert_array_equal(si.nli, zeros(3)) | ||||||
|     assert_array_equal(si.ase, zeros(3)) |     assert_array_equal(si.ase, zeros(3)) | ||||||
|  |     assert_array_equal(si.delta_pdb_per_channel, ones(3)) | ||||||
|     assert_array_equal(si.roll_off, zeros(3)) |     assert_array_equal(si.roll_off, zeros(3)) | ||||||
|     assert_array_equal(si.chromatic_dispersion, zeros(3)) |     assert_array_equal(si.chromatic_dispersion, zeros(3)) | ||||||
|     assert_array_equal(si.pmd, zeros(3)) |     assert_array_equal(si.pmd, zeros(3)) | ||||||
|     assert_array_equal(si.channel_number, array([1, 2, 3])) |     assert_array_equal(si.channel_number, array([1, 2, 3])) | ||||||
|     assert_array_equal(si.number_of_channels, 3) |     assert_array_equal(si.number_of_channels, 3) | ||||||
|     assert_array_equal(si.df, array([[0, 50e9, 100e9], [-50e9, 0, 50e9], [-100e9, -50e9, 0]])) |     assert_array_equal(si.df, array([[0, 50e9, 100e9], [-50e9, 0, 50e9], [-100e9, -50e9, 0]])) | ||||||
|  |     assert_array_equal(si.tx_osnr, array([40.0, 40.0, 40.0])) | ||||||
|  |  | ||||||
|     with pytest.raises(SpectrumError, match='Spectra cannot be summed: channels overlapping.'): |     with pytest.raises(SpectrumError, match='Spectra cannot be summed: channels overlapping.'): | ||||||
|         si += si |         si += si | ||||||
|  |  | ||||||
|     si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]), |     si = create_arbitrary_spectral_information(frequency=array([193.35e12, 193.3e12, 193.25e12]), | ||||||
|                                                slot_width=array([50e9, 50e9, 50e9]), |                                                slot_width=array([50e9, 50e9, 50e9]), | ||||||
|                                                baud_rate=32e9, signal=array([1, 2, 3])) |                                                baud_rate=32e9, signal=array([1, 2, 3]), | ||||||
|  |                                                tx_osnr=40.0, | ||||||
|  |                                                ref_power=Pref(1, 1, None)) | ||||||
|  |  | ||||||
|     assert_array_equal(si.signal, array([3, 2, 1])) |     assert_array_equal(si.signal, array([3, 2, 1])) | ||||||
|  |  | ||||||
|     with pytest.raises(SpectrumError, match='Spectrum baud rate, including the roll off, ' |     with pytest.raises(SpectrumError, match='Spectrum baud rate, including the roll off, ' | ||||||
|                                             r'larger than the slot width for channels: \[1, 3\].'): |                                             r'larger than the slot width for channels: \[1, 3\].'): | ||||||
|         create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, |         create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, | ||||||
|                                               baud_rate=[64e9, 32e9, 64e9], slot_width=50e9) |                                               baud_rate=[64e9, 32e9, 64e9], slot_width=50e9, | ||||||
|  |                                               tx_osnr=40.0, | ||||||
|  |                                               ref_power=Pref(1, 1, None)) | ||||||
|     with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral ' |     with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral ' | ||||||
|                                             r'distances between channels: \[\(1, 2\), \(3, 4\)\].'): |                                             r'distances between channels: \[\(1, 2\), \(3, 4\)\].'): | ||||||
|         create_arbitrary_spectral_information(frequency=[193.26e12, 193.3e12, 193.35e12, 193.39e12], signal=1, |         create_arbitrary_spectral_information(frequency=[193.26e12, 193.3e12, 193.35e12, 193.39e12], signal=1, | ||||||
|                                               baud_rate=32e9, slot_width=50e9) |                                               tx_osnr=40.0, baud_rate=32e9, slot_width=50e9, ref_power=Pref(1, 1, None)) | ||||||
|     with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral ' |     with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral ' | ||||||
|                                             r'distances between channels: \[\(1, 2\), \(2, 3\)\].'): |                                             r'distances between channels: \[\(1, 2\), \(2, 3\)\].'): | ||||||
|         create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9, |         create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=1, baud_rate=49e9, | ||||||
|                                               roll_off=0.1) |                                               tx_osnr=40.0, roll_off=0.1, ref_power=Pref(1, 1, None)) | ||||||
|  |  | ||||||
|     with pytest.raises(SpectrumError, |     with pytest.raises(SpectrumError, | ||||||
|                        match='Dimension mismatch in input fields.'): |                        match='Dimension mismatch in input fields.'): | ||||||
|         create_arbitrary_spectral_information(frequency=[193.25e12, 193.3e12, 193.35e12], signal=[1, 2], baud_rate=49e9) |         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)) | ||||||
|   | |||||||
| @@ -20,7 +20,15 @@ SRC_ROOT = Path(__file__).parent.parent | |||||||
|      ['-e', 'gnpy/example-data/eqpt_config_openroadm_ver4.json', 'gnpy/example-data/Sweden_OpenROADMv4_example_network.json', ]), |      ['-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', transmission_main_example, | ||||||
|      ['-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', 'gnpy/example-data/Sweden_OpenROADMv5_example_network.json', ]), |      ['-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', 'gnpy/example-data/Sweden_OpenROADMv5_example_network.json', ]), | ||||||
| )) |     ('transmission_main_example_long', transmission_main_example, | ||||||
|  |      ['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json']), | ||||||
|  |     ('spectrum1_transmission_main_example', transmission_main_example, | ||||||
|  |      ['--spectrum', 'gnpy/example-data/initial_spectrum1.json', 'gnpy/example-data/meshTopologyExampleV2.xls', ]), | ||||||
|  |     ('spectrum2_transmission_main_example', 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): | def test_example_invocation(capfd, output, handler, args): | ||||||
|     '''Make sure that our examples produce useful output''' |     '''Make sure that our examples produce useful output''' | ||||||
|     os.chdir(SRC_ROOT) |     os.chdir(SRC_ROOT) | ||||||
|   | |||||||
| @@ -506,3 +506,71 @@ def test_eqpt_creation(tmpdir): | |||||||
|     # check that all amp in the converted files corresponds to an eqpt line |     # check that all amp in the converted files corresponds to an eqpt line | ||||||
|     for ampuid in jsonconverted.keys(): |     for ampuid in jsonconverted.keys(): | ||||||
|         assert ampuid in possiblename |         assert ampuid in possiblename | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_service_json_constraint_order(): | ||||||
|  |     """test that the constraints are read in correct order""" | ||||||
|  |  | ||||||
|  |     unsorted_request = { | ||||||
|  |         "request-id": "unsorted", | ||||||
|  |         "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 1", | ||||||
|  |                 "spacing": 50000000000.0, | ||||||
|  |                 "output-power": 0.001, | ||||||
|  |                 "path_bandwidth": 10000000000.0 | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "explicit-route-objects": { | ||||||
|  |             "route-object-include-exclude": [ | ||||||
|  |                 { | ||||||
|  |                     "explicit-route-usage": "route-include-ero", | ||||||
|  |                     "index": 2, | ||||||
|  |                     "num-unnum-hop": { | ||||||
|  |                         "node-id": "roadm Lorient_KMA", | ||||||
|  |                         "link-tp-id": "link-tp-id is not used", | ||||||
|  |                         "hop-type": "STRICT" | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "explicit-route-usage": "route-include-ero", | ||||||
|  |                     "index": 3, | ||||||
|  |                     "num-unnum-hop": { | ||||||
|  |                         "node-id": "roadm Vannes_KBE", | ||||||
|  |                         "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": "roadm Lannion_CAS", | ||||||
|  |                         "link-tp-id": "link-tp-id is not used", | ||||||
|  |                         "hop-type": "LOOSE" | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     "explicit-route-usage": "route-include-ero", | ||||||
|  |                     "index": 0, | ||||||
|  |                     "num-unnum-hop": { | ||||||
|  |                         "node-id": "roadm Brest_KLA", | ||||||
|  |                         "link-tp-id": "link-tp-id is not used", | ||||||
|  |                         "hop-type": "STRICT" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     data = {'path-request': [unsorted_request]} | ||||||
|  |     rqs = requests_from_json(data, equipment) | ||||||
|  |     assert rqs[0].nodes_list == ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE'] | ||||||
|  |     assert rqs[0].loose_list == ['STRICT', 'LOOSE', 'STRICT', 'STRICT'] | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| import pytest | import pytest | ||||||
| from gnpy.core.elements import Transceiver, Fiber, Edfa, Roadm | from gnpy.core.elements import Transceiver, Fiber, Edfa, Roadm | ||||||
| from gnpy.core.utils import db2lin | from gnpy.core.utils import db2lin | ||||||
| from gnpy.core.info import create_input_spectral_information | from gnpy.core.info import create_input_spectral_information, ReferenceCarrier | ||||||
| from gnpy.core.network import build_network | from gnpy.core.network import build_network | ||||||
| from gnpy.tools.json_io import load_network, load_equipment | from gnpy.tools.json_io import load_network, load_equipment | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| @@ -45,7 +45,9 @@ def propagation(input_power, con_in, con_out, dest): | |||||||
|     p = input_power |     p = input_power | ||||||
|     p = db2lin(p) * 1e-3 |     p = db2lin(p) * 1e-3 | ||||||
|     spacing = 50e9  # THz |     spacing = 50e9  # THz | ||||||
|     si = create_input_spectral_information(191.3e12, 191.3e12 + 79 * spacing, 0.15, 32e9, p, spacing) |     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)) | ||||||
|     source = next(transceivers[uid] for uid in transceivers if uid == 'trx A') |     source = next(transceivers[uid] for uid in transceivers if uid == 'trx A') | ||||||
|     sink = next(transceivers[uid] for uid in transceivers if uid == dest) |     sink = next(transceivers[uid] for uid in transceivers if uid == dest) | ||||||
|     path = dijkstra_path(network, source, sink) |     path = dijkstra_path(network, source, sink) | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ from gnpy.core.elements import Fused, Roadm, Edfa | |||||||
| from gnpy.core.network import build_network | from gnpy.core.network import build_network | ||||||
| from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp | from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp | ||||||
| from gnpy.core.equipment import trx_mode_params | from gnpy.core.equipment import trx_mode_params | ||||||
| from gnpy.topology.request import PathRequest, compute_constrained_path | from gnpy.topology.request import PathRequest, compute_constrained_path, ref_carrier | ||||||
| from gnpy.core.info import create_input_spectral_information | from gnpy.core.info import create_input_spectral_information | ||||||
| from gnpy.core.utils import db2lin | from gnpy.core.utils import db2lin | ||||||
|  |  | ||||||
| @@ -228,9 +228,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm): | |||||||
|         prev_node['params'] = {'loss': 0} |         prev_node['params'] = {'loss': 0} | ||||||
|     json_network['elements'].append(prev_node) |     json_network['elements'].append(prev_node) | ||||||
|     network = network_from_json(json_network, equipment) |     network = network_from_json(json_network, equipment) | ||||||
|     p_total_db = power_dbm + lin2db(automatic_nch(equipment['SI']['default'].f_min, |     nb_channel = automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max, | ||||||
|                                                   equipment['SI']['default'].f_max, |                                equipment['SI']['default'].spacing) | ||||||
|                                                   equipment['SI']['default'].spacing)) |     p_total_db = power_dbm + lin2db(nb_channel) | ||||||
|  |  | ||||||
|     build_network(network, equipment, power_dbm, p_total_db) |     build_network(network, equipment, power_dbm, p_total_db) | ||||||
|  |  | ||||||
| @@ -245,6 +245,7 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm): | |||||||
|               'format': '', |               'format': '', | ||||||
|               'path_bandwidth': 100e9, |               'path_bandwidth': 100e9, | ||||||
|               'effective_freq_slot': None, |               'effective_freq_slot': None, | ||||||
|  |               'nb_channel': nb_channel | ||||||
|               } |               } | ||||||
|     trx_params = trx_mode_params(equipment) |     trx_params = trx_mode_params(equipment) | ||||||
|     params.update(trx_params) |     params.update(trx_params) | ||||||
| @@ -252,15 +253,14 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm): | |||||||
|     req.power = db2lin(power_dbm - 30) |     req.power = db2lin(power_dbm - 30) | ||||||
|     path = compute_constrained_path(network, req) |     path = compute_constrained_path(network, req) | ||||||
|     si = create_input_spectral_information( |     si = create_input_spectral_information( | ||||||
|         req.f_min, req.f_max, req.roll_off, req.baud_rate, |         f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate, | ||||||
|         req.power, req.spacing) |         power=req.power, spacing=req.spacing, tx_osnr=req.tx_osnr, ref_carrier=ref_carrier(equipment)) | ||||||
|     for i, el in enumerate(path): |     for i, el in enumerate(path): | ||||||
|         if isinstance(el, Roadm): |         if isinstance(el, Roadm): | ||||||
|             min_power_in_roadm = min(si.signal + si.ase + si.nli) |             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) | ||||||
|             power_out_roadm = si.signal + si.ase + si.nli |             power_out_roadm = si.signal + si.ase + si.nli | ||||||
|             if el.uid == 'roadm node B': |             if el.uid == 'roadm node B': | ||||||
|                 print('input', min_power_in_roadm) |  | ||||||
|                 # if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its |                 # if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its | ||||||
|                 # target power (as specified in equipment ie -20 dBm) |                 # target power (as specified in equipment ie -20 dBm) | ||||||
|                 # if it is a Fused, the input power to the ROADM is smaller than the target power, and the |                 # if it is a Fused, the input power to the ROADM is smaller than the target power, and the | ||||||
| @@ -271,15 +271,15 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm): | |||||||
|                 if prev_node_type == 'edfa': |                 if prev_node_type == 'edfa': | ||||||
|                     # edfa prev_node sets input power to roadm to a high enough value: |                     # edfa prev_node sets input power to roadm to a high enough value: | ||||||
|                     # check that target power is correctly set in the ROADM |                     # check that target power is correctly set in the ROADM | ||||||
|                     assert_allclose(el.pch_out_db, effective_pch_out_db, rtol=1e-3) |                     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 |                     # 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) |                     assert_allclose(power_out_roadm, db2lin(effective_pch_out_db - 30), rtol=1e-3) | ||||||
|                 elif prev_node_type == 'fused': |                 elif prev_node_type == 'fused': | ||||||
|                     # fused prev_node does reamplfy power after fiber propagation, so input power |                     # fused prev_node does reamplfy power after fiber propagation, so input power | ||||||
|                     # to roadm is low. |                     # to roadm is low. | ||||||
|                     # check that target power correctly reports power_dbm from previous propagation |                     # check that target power correctly reports power_dbm from previous propagation | ||||||
|                     assert_allclose(el.pch_out_db, effective_pch_out_db + power_dbm, rtol=1e-3) |                     assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm, rtol=1e-3) | ||||||
|                     # Check that egress power of roadm is equalized to the min carrier input power. |                     # Check that egress power of roadm is not equalized power out is the same as power in. | ||||||
|                     assert_allclose(power_out_roadm, min_power_in_roadm, rtol=1e-3) |                     assert_allclose(power_out_roadm, power_in_roadm, rtol=1e-3) | ||||||
|         else: |         else: | ||||||
|             si = el(si) |             si = el(si) | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ from numpy.testing import assert_allclose | |||||||
| from numpy import array, genfromtxt | from numpy import array, genfromtxt | ||||||
| import pytest | import pytest | ||||||
|  |  | ||||||
| from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information | from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, Pref, ReferenceCarrier | ||||||
| from gnpy.core.elements import Fiber, RamanFiber | from gnpy.core.elements import Fiber, RamanFiber | ||||||
| from gnpy.core.parameters import SimParams | from gnpy.core.parameters import SimParams | ||||||
| from gnpy.tools.json_io import load_json | from gnpy.tools.json_io import load_json | ||||||
| @@ -28,7 +28,8 @@ def test_fiber(): | |||||||
|  |  | ||||||
|     # fix grid spectral information generation |     # fix grid spectral information generation | ||||||
|     spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15, |     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) |                                                             baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0, | ||||||
|  |                                                             ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9)) | ||||||
|     # propagation |     # propagation | ||||||
|     spectral_info_out = fiber(spectral_info_input) |     spectral_info_out = fiber(spectral_info_input) | ||||||
|  |  | ||||||
| @@ -44,8 +45,12 @@ def test_fiber(): | |||||||
|     slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9]) |     slot_width = array([37.5e9, 50e9, 75e9, 50e9, 37.5e9]) | ||||||
|     baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9]) |     baud_rate = array([32e9, 42e9, 64e9, 42e9, 32e9]) | ||||||
|     signal = 1e-3 + array([0, -1e-4, 3e-4, -2e-4, +2e-4]) |     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, |     spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width, | ||||||
|                                                                 signal=signal, baud_rate=baud_rate, roll_off=0.15) |                                                                 signal=signal, baud_rate=baud_rate, roll_off=0.15, | ||||||
|  |                                                                 delta_pdb_per_channel=delta_pdb_per_channel, | ||||||
|  |                                                                 tx_osnr=40.0, ref_power=pref) | ||||||
|  |  | ||||||
|     # propagation |     # propagation | ||||||
|     spectral_info_out = fiber(spectral_info_input) |     spectral_info_out = fiber(spectral_info_input) | ||||||
| @@ -63,7 +68,8 @@ def test_raman_fiber(): | |||||||
|     """ Test the accuracy of propagating the RamanFiber.""" |     """ Test the accuracy of propagating the RamanFiber.""" | ||||||
|     # spectral information generation |     # spectral information generation | ||||||
|     spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15, |     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) |                                                             baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0, | ||||||
|  |                                                             ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9)) | ||||||
|     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) |     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 = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json')) | ||||||
|  |  | ||||||
| @@ -100,7 +106,8 @@ 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 information generation | ||||||
|     spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15, |     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) |                                                             baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0, | ||||||
|  |                                                             ref_carrier=ReferenceCarrier(baud_rate=32e9, slot_width=50e9)) | ||||||
|  |  | ||||||
|     SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json')) |     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')) |     fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json')) | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								tox.ini
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tox.ini
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ skipsdist = True | |||||||
| [testenv] | [testenv] | ||||||
| deps = | deps = | ||||||
| 	-r{toxinidir}/requirements.txt | 	-r{toxinidir}/requirements.txt | ||||||
| 	pytest>=6.2.5,<7 | 	-r{toxinidir}/tests/requirements.txt | ||||||
| 	cover: pytest-cov | 	cover: pytest-cov | ||||||
| 	linters: flake8 | 	linters: flake8 | ||||||
| 	linters: pep8-naming | 	linters: pep8-naming | ||||||
| @@ -19,7 +19,7 @@ commands = | |||||||
| 	pytest {env:CI_COVERAGE_OPTS:} -vv {posargs} | 	pytest {env:CI_COVERAGE_OPTS:} -vv {posargs} | ||||||
| 	cover: coverage html -d cover | 	cover: coverage html -d cover | ||||||
| 	cover: coverage xml -o cover/coverage.xml | 	cover: coverage xml -o cover/coverage.xml | ||||||
| 	python setup.py bdist_wheel | 	python -m build | ||||||
|  |  | ||||||
| [testenv:docs] | [testenv:docs] | ||||||
| deps = | deps = | ||||||
| @@ -43,4 +43,4 @@ commands = | |||||||
| [flake8] | [flake8] | ||||||
| max-line-length = 120 | max-line-length = 120 | ||||||
| max-complexity = 15 | max-complexity = 15 | ||||||
| ignore = N806 | ignore = N806 W503 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user