mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-11-04 03:57:47 +00:00 
			
		
		
		
	Compare commits
	
		
			186 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					5b6f8c60cf | ||
| 
						 | 
					3a733b1fd5 | ||
| 
						 | 
					2d68b94a46 | ||
| 
						 | 
					bc71823bd0 | ||
| 
						 | 
					5481b93728 | ||
| 
						 | 
					05e301182d | ||
| 
						 | 
					47c89626e3 | ||
| 
						 | 
					7a032a63b5 | ||
| 
						 | 
					f195d5f496 | ||
| 
						 | 
					56569f866f | ||
| 
						 | 
					bf1f293043 | ||
| 
						 | 
					28871c6f2d | ||
| 
						 | 
					d7c1a6b75e | ||
| 
						 | 
					c69c2a3af2 | ||
| 
						 | 
					fb29d72906 | ||
| 
						 | 
					30a06da6b1 | ||
| 
						 | 
					139c8cc1e7 | ||
| 
						 | 
					7034d4c686 | ||
| 
						 | 
					10164495b9 | ||
| 
						 | 
					87211b35e9 | ||
| 
						 | 
					e9f9ddb4d6 | ||
| 
						 | 
					8ea13bb4d6 | ||
| 
						 | 
					b45829d2df | ||
| 
						 | 
					6ac3a517cf | ||
| 
						 | 
					2f2920a716 | ||
| 
						 | 
					07fd89351b | ||
| 
						 | 
					7c60b000b5 | ||
| 
						 | 
					537eb017b5 | ||
| 
						 | 
					9c514e8086 | ||
| 
						 | 
					78efb6c650 | ||
| 
						 | 
					3510d59250 | ||
| 
						 | 
					41d9d156a6 | ||
| 
						 | 
					e9d5e748e4 | ||
| 
						 | 
					5a5bed56c2 | ||
| 
						 | 
					22de1b1281 | ||
| 
						 | 
					73e1485b47 | ||
| 
						 | 
					22ee05ea6f | ||
| 
						 | 
					31824f318d | ||
| 
						 | 
					b0cb604e91 | ||
| 
						 | 
					79102e283a | ||
| 
						 | 
					db5e63d51b | ||
| 
						 | 
					af42699133 | ||
| 
						 | 
					4ba77d0a0a | ||
| 
						 | 
					064d3af8e0 | ||
| 
						 | 
					4ab5bac45f | ||
| 
						 | 
					bbe5fb7821 | ||
| 
						 | 
					edf1eec072 | ||
| 
						 | 
					88ac41f721 | ||
| 
						 | 
					c20e6fb320 | ||
| 
						 | 
					05500c7047 | ||
| 
						 | 
					86a39f4b5e | ||
| 
						 | 
					2b25609255 | ||
| 
						 | 
					7e0b95bcfd | ||
| 
						 | 
					f0a52dcc8a | ||
| 
						 | 
					3bea4b3c9f | ||
| 
						 | 
					f2cc9f7225 | ||
| 
						 | 
					e79f9f51b6 | ||
| 
						 | 
					7fd7f94efe | ||
| 
						 | 
					0acdf9d9f6 | ||
| 
						 | 
					a3edb20142 | ||
| 
						 | 
					33cc11b85c | ||
| 
						 | 
					5d079ab261 | ||
| 
						 | 
					a3b1157e38 | ||
| 
						 | 
					70731b64d6 | ||
| 
						 | 
					4ea0180caf | ||
| 
						 | 
					eb2363a3d4 | ||
| 
						 | 
					41b94cc888 | ||
| 
						 | 
					1eeb6a0583 | ||
| 
						 | 
					215c20e245 | ||
| 
						 | 
					76e9146043 | ||
| 
						 | 
					2a07eec966 | ||
| 
						 | 
					cc994bf118 | ||
| 
						 | 
					37e70e622c | ||
| 
						 | 
					7d9a508955 | ||
| 
						 | 
					185adabd77 | ||
| 
						 | 
					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 | ||
| 
						 | 
					5b104af296 | ||
| 
						 | 
					f170574abf | ||
| 
						 | 
					a68e8ff8d2 | ||
| 
						 | 
					d5a52d1b2b | ||
| 
						 | 
					7ac6e058ec | ||
| 
						 | 
					74ab3c1bcd | ||
| 
						 | 
					1a2ff2d215 | ||
| 
						 | 
					aaf0480e9c | ||
| 
						 | 
					5e50ffbbf6 | ||
| 
						 | 
					243b701391 | ||
| 
						 | 
					bdbfe76aed | ||
| 
						 | 
					541ec04444 | ||
| 
						 | 
					bf1522b047 | ||
| 
						 | 
					3f4188a0fd | ||
| 
						 | 
					8b387ef722 | ||
| 
						 | 
					cad9a0f18e | ||
| 
						 | 
					ab84c77363 | ||
| 
						 | 
					62fa9ab0b0 | ||
| 
						 | 
					14591c7a11 | ||
| 
						 | 
					587932290d | ||
| 
						 | 
					82b148eb87 | ||
| 
						 | 
					8393daf67d | ||
| 
						 | 
					be61dfd094 | ||
| 
						 | 
					77925b218e | ||
| 
						 | 
					4621ac12bf | ||
| 
						 | 
					09920c0af2 | ||
| 
						 | 
					e6a3d9ce5b | ||
| 
						 | 
					b9645702c8 | ||
| 
						 | 
					9c2095b138 | ||
| 
						 | 
					cb42115230 | ||
| 
						 | 
					5909da4bbf | ||
| 
						 | 
					2ba1e86b28 | ||
| 
						 | 
					3358c5eeb5 | ||
| 
						 | 
					13e4c29bc1 | ||
| 
						 | 
					4becc9060c | ||
| 
						 | 
					32d8b2a4d8 | ||
| 
						 | 
					399eb9700f | ||
| 
						 | 
					82f83e1462 | ||
| 
						 | 
					171450fa54 | ||
| 
						 | 
					9f9f4c78fc | ||
| 
						 | 
					c469a8d9ba | ||
| 
						 | 
					99b2a554dc | ||
| 
						 | 
					57e98d7173 | ||
| 
						 | 
					78b45a3958 | ||
| 
						 | 
					64b6b486a9 | ||
| 
						 | 
					65cb46f479 | ||
| 
						 | 
					f94d06f124 | ||
| 
						 | 
					e1f2c55942 | 
@@ -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
 | 
					 | 
				
			||||||
							
								
								
									
										68
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,22 +11,26 @@ 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@v37.0
 | 
				
			||||||
        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-cover
 | 
					          - py39
 | 
				
			||||||
 | 
					          - py310
 | 
				
			||||||
 | 
					          - py311
 | 
				
			||||||
 | 
					          - py312-cover
 | 
				
			||||||
        include:
 | 
					        include:
 | 
				
			||||||
          - tox_env: docs
 | 
					          - tox_env: docs
 | 
				
			||||||
            dnf_install: graphviz
 | 
					            dnf_install: graphviz
 | 
				
			||||||
@@ -37,13 +41,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.9'
 | 
					          python-version: '3.12'
 | 
				
			||||||
      - uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95
 | 
					      - uses: casperdcl/deploy-pypi@bb869aafd89f657ceaafe9561d3b5584766c0f95
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          password: ${{ secrets.PYPI_API_TOKEN }}
 | 
					          password: ${{ secrets.PYPI_API_TOKEN }}
 | 
				
			||||||
@@ -61,7 +65,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
 | 
				
			||||||
@@ -91,21 +95,51 @@ 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 --editable .
 | 
					          pip install --editable .[tests]
 | 
				
			||||||
          pip install 'pytest>=5.0.0,<6'
 | 
					 | 
				
			||||||
          pytest -vv
 | 
					          pytest -vv
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        python_version:
 | 
					        include:
 | 
				
			||||||
          - "3.9"
 | 
					          - os: windows-2019
 | 
				
			||||||
 | 
					            python_version: "3.10"
 | 
				
			||||||
 | 
					          - os: windows-2022
 | 
				
			||||||
 | 
					            python_version: "3.11"
 | 
				
			||||||
 | 
					          - os: windows-2022
 | 
				
			||||||
 | 
					            python_version: "3.12"
 | 
				
			||||||
 | 
					          - os: macos-12
 | 
				
			||||||
 | 
					            python_version: "3.11"
 | 
				
			||||||
 | 
					          - os: macos-13
 | 
				
			||||||
 | 
					            python_version: "3.12"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  paywalled-platforms:
 | 
				
			||||||
 | 
					    name: Tests on paywalled platforms
 | 
				
			||||||
 | 
					    if: github.repository_owner == 'Telecominfraproject'
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					      - uses: actions/setup-python@v4
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          python-version: ${{ matrix.python_version }}
 | 
				
			||||||
 | 
					      - run: |
 | 
				
			||||||
 | 
					          pip install --editable .[tests]
 | 
				
			||||||
 | 
					          pytest -vv
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        include:
 | 
				
			||||||
 | 
					          - os: macos-13-xlarge # Apple M1 CPU
 | 
				
			||||||
 | 
					            python_version: "3.12"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.lgtm.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.lgtm.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					queries:
 | 
				
			||||||
 | 
					- exclude: py/clear-text-logging-sensitive-data
 | 
				
			||||||
 | 
					- exclude: py/clear-text-storage-sensitive-data
 | 
				
			||||||
@@ -1,5 +1,15 @@
 | 
				
			|||||||
 | 
					version: 2
 | 
				
			||||||
build:
 | 
					build:
 | 
				
			||||||
    image: latest
 | 
					  os: ubuntu-22.04
 | 
				
			||||||
 | 
					  tools:
 | 
				
			||||||
 | 
					    python: "3.12"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
python:
 | 
					python:
 | 
				
			||||||
    version: 3.8
 | 
					  install:
 | 
				
			||||||
requirements_file: docs/requirements.txt
 | 
					    - method: pip
 | 
				
			||||||
 | 
					      path: .
 | 
				
			||||||
 | 
					      extra_requirements:
 | 
				
			||||||
 | 
					        - docs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sphinx:
 | 
				
			||||||
 | 
					  configuration: docs/conf.py
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
					 | 
				
			||||||
							
								
								
									
										34
									
								
								.zuul.yaml
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								.zuul.yaml
									
									
									
									
									
								
							@@ -2,25 +2,33 @@
 | 
				
			|||||||
- project:
 | 
					- project:
 | 
				
			||||||
    check:
 | 
					    check:
 | 
				
			||||||
      jobs:
 | 
					      jobs:
 | 
				
			||||||
        - tox-py38-f34
 | 
					        - tox-py38:
 | 
				
			||||||
        - tox-py39-cover
 | 
					            vars:
 | 
				
			||||||
        - tox-docs-f34
 | 
					              ensure_tox_version: '<4'
 | 
				
			||||||
 | 
					        - 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:
 | 
				
			||||||
              - tox-py39-cover-previous
 | 
					              - tox-py310-cover-previous
 | 
				
			||||||
              - tox-py39-cover
 | 
					              - tox-py310-cover
 | 
				
			||||||
            vars:
 | 
					            vars:
 | 
				
			||||||
              coverage_job_name_previous: tox-py39-cover-previous
 | 
					              coverage_job_name_previous: tox-py310-cover-previous
 | 
				
			||||||
              coverage_job_name_current: tox-py39-cover
 | 
					              coverage_job_name_current: tox-py310-cover
 | 
				
			||||||
        - tox-linters-diff-n-report:
 | 
					        - tox-linters-diff-n-report:
 | 
				
			||||||
            voting: false
 | 
					            voting: false
 | 
				
			||||||
        - tox-py39-cover-previous
 | 
					            vars:
 | 
				
			||||||
    gate:
 | 
					              ensure_tox_version: '<4'
 | 
				
			||||||
      jobs:
 | 
					        - tox-py310-cover-previous:
 | 
				
			||||||
        - tox-py38-f34
 | 
					            vars:
 | 
				
			||||||
        - tox-py39-f34
 | 
					              ensure_tox_version: '<4'
 | 
				
			||||||
        - tox-docs-f34
 | 
					 | 
				
			||||||
    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%3Amatrix.org?via=matrix.org)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks.
 | 
					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/)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,12 @@ There are weekly calls about our progress.
 | 
				
			|||||||
Newcomers, users and telecom operators are especially welcome there.
 | 
					Newcomers, users and telecom operators are especially welcome there.
 | 
				
			||||||
We encourage all interested people outside the TIP to [join the project](https://telecominfraproject.com/apply-for-membership/) and especially to [get in touch with us](https://github.com/Telecominfraproject/oopt-gnpy/discussions).
 | 
					We encourage all interested people outside the TIP to [join the project](https://telecominfraproject.com/apply-for-membership/) and especially to [get in touch with us](https://github.com/Telecominfraproject/oopt-gnpy/discussions).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(contributing)=
 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1848,3 +1848,15 @@ month={Sept},}
 | 
				
			|||||||
  title = {Telecom Infra Project},
 | 
					  title = {Telecom Infra Project},
 | 
				
			||||||
  url = {https://www.telecominfraproject.com},
 | 
					  url = {https://www.telecominfraproject.com},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@ARTICLE{DAmicoJLT2022,
 | 
				
			||||||
 | 
					  author={D’Amico, Andrea and Correia, Bruno and London, Elliot and Virgillito,
 | 
				
			||||||
 | 
					  Emanuele and Borraccini, Giacomo and Napoli, Antonio and Curri, Vittorio},
 | 
				
			||||||
 | 
					  journal={Journal of Lightwave Technology},
 | 
				
			||||||
 | 
					  title={Scalable and Disaggregated GGN Approximation Applied to a C+L+S Optical Network},
 | 
				
			||||||
 | 
					  year={2022},
 | 
				
			||||||
 | 
					  volume={40},
 | 
				
			||||||
 | 
					  number={11},
 | 
				
			||||||
 | 
					  pages={3499-3511},
 | 
				
			||||||
 | 
					  doi={10.1109/JLT.2022.3162134}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								docs/conf.py
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								docs/conf.py
									
									
									
									
									
								
							@@ -65,7 +65,7 @@ author = 'Telecom Infra Project - OOPT PSE Group'
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# This is also used if you do content translation via gettext catalogs.
 | 
					# This is also used if you do content translation via gettext catalogs.
 | 
				
			||||||
# Usually you set "language" from the command line for these cases.
 | 
					# Usually you set "language" from the command line for these cases.
 | 
				
			||||||
language = None
 | 
					language = 'en'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List of patterns, relative to source directory, that match files and
 | 
					# List of patterns, relative to source directory, that match files and
 | 
				
			||||||
# directories to ignore when looking for source files.
 | 
					# directories to ignore when looking for source files.
 | 
				
			||||||
@@ -84,13 +84,6 @@ todo_include_todos = False
 | 
				
			|||||||
# The theme to use for HTML and HTML Help pages.  See the documentation for
 | 
					# The theme to use for HTML and HTML Help pages.  See the documentation for
 | 
				
			||||||
# a list of builtin themes.
 | 
					# a list of builtin themes.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
on_rtd = os.environ.get('READTHEDOCS') == 'True'
 | 
					 | 
				
			||||||
if on_rtd:
 | 
					 | 
				
			||||||
    html_theme = 'default'
 | 
					 | 
				
			||||||
    html_theme_options = {
 | 
					 | 
				
			||||||
        'logo_only': True,
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
else:
 | 
					 | 
				
			||||||
html_theme = 'alabaster'
 | 
					html_theme = 'alabaster'
 | 
				
			||||||
html_theme_options = {
 | 
					html_theme_options = {
 | 
				
			||||||
    'logo': 'images/GNPy-logo.png',
 | 
					    'logo': 'images/GNPy-logo.png',
 | 
				
			||||||
@@ -190,3 +183,5 @@ autodoc_default_options = {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
graphviz_output_format = 'svg'
 | 
					graphviz_output_format = 'svg'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bibtex_bibfiles = ['biblio.bib']
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ Extending GNPy with vendor-specific data
 | 
				
			|||||||
========================================
 | 
					========================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GNPy ships with an :ref:`equipment library<concepts-equipment>` containing machine-readable datasheets of networking equipment.
 | 
					GNPy ships with an :ref:`equipment library<concepts-equipment>` containing machine-readable datasheets of networking equipment.
 | 
				
			||||||
Vendors who are willing to contribute descriptions of their supported products are encouraged to `submit a patch <https://review.gerrithub.io/Documentation/intro-gerrit-walkthrough-github.html>`__.
 | 
					Vendors who are willing to contribute descriptions of their supported products are encouraged to `submit a patch <https://review.gerrithub.io/Documentation/intro-gerrit-walkthrough-github.html>`__ -- or just :ref:`get in touch with us directly<contributing>`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This chapter discusses option for modeling performance of :ref:`EDFA amplifiers<extending-edfa>`, :ref:`Raman amplifiers<extending-raman>`, :ref:`transponders<extending-transponder>` and :ref:`ROADMs<extending-roadm>`.
 | 
					This chapter discusses option for modeling performance of :ref:`EDFA amplifiers<extending-edfa>`, :ref:`Raman amplifiers<extending-raman>`, :ref:`transponders<extending-transponder>` and :ref:`ROADMs<extending-roadm>`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +29,7 @@ The NF is expressed as a third-degree polynomial:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
       f(x) &= \text{a}x^3 + \text{b}x^2 + \text{c}x + \text{d}
 | 
					       f(x) &= \text{a}x^3 + \text{b}x^2 + \text{c}x + \text{d}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  \text{NF} &= f(G_\text{max} - G)
 | 
					  \text{NF} &= f(G - G_\text{max})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This model can be also used for fixed-gain fixed-NF amplifiers.
 | 
					This model can be also used for fixed-gain fixed-NF amplifiers.
 | 
				
			||||||
In that case, use:
 | 
					In that case, use:
 | 
				
			||||||
@@ -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  | 
@@ -17,6 +17,7 @@ in real-world mesh optical networks. It is based on the Gaussian Noise Model.
 | 
				
			|||||||
   about-project
 | 
					   about-project
 | 
				
			||||||
   model
 | 
					   model
 | 
				
			||||||
   gnpy-api
 | 
					   gnpy-api
 | 
				
			||||||
 | 
					   release-notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Indices and tables
 | 
					Indices and tables
 | 
				
			||||||
==================
 | 
					==================
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										471
									
								
								docs/json.rst
									
									
									
									
									
								
							
							
						
						
									
										471
									
								
								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   |
 | 
				
			||||||
@@ -61,25 +61,98 @@ Fiber
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The fiber library currently describes SSMF and NZDF but additional fiber types can be entered by the user following the same model:
 | 
					The fiber library currently describes SSMF and NZDF but additional fiber types can be entered by the user following the same model:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
| field                        | type            | description                                    |
 | 
					| field                        | type            | description                                    |
 | 
				
			||||||
+======================+===========+==========================================+
 | 
					+==============================+=================+================================================+
 | 
				
			||||||
| ``type_variety``             | (string)        | a unique name to ID the fiber in the           |
 | 
					| ``type_variety``             | (string)        | a unique name to ID the fiber in the           |
 | 
				
			||||||
|                              |                 | JSON or Excel template topology input          |
 | 
					|                              |                 | JSON or Excel template topology input          |
 | 
				
			||||||
|                              |                 | file                                           |
 | 
					|                              |                 | file                                           |
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
| ``dispersion``               | (number)        | In :math:`s \times m^{-1} \times m^{-1}`.      |
 | 
					| ``dispersion``               | (number)        | In :math:`s \times m^{-1} \times m^{-1}`.      |
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
| ``dispersion_slope``         | (number)        | In :math:`s \times m^{-1} \times m^{-1}        |
 | 
					| ``dispersion_slope``         | (number)        | In :math:`s \times m^{-1} \times m^{-1}        |
 | 
				
			||||||
|                              |                 | \times m^{-1}`                                 |
 | 
					|                              |                 | \times m^{-1}`                                 |
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
| ``gamma``            | (number)  | :math:`2\pi\times n^2/(\lambda*A_{eff})`,|
 | 
					| ``dispersion_per_frequency`` | (dict)          | Dictionary of dispersion values evaluated at   |
 | 
				
			||||||
|                      |           | in :math:`w^{-1} \times m^{-1}`.         |
 | 
					|                              |                 | various frequencies, as follows:               |
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					|                              |                 | ``{"value": [], "frequency": []}``.            |
 | 
				
			||||||
 | 
					|                              |                 | ``value`` in                                   |
 | 
				
			||||||
 | 
					|                              |                 | :math:`s \times m^{-1} \times m^{-1}` and      |
 | 
				
			||||||
 | 
					|                              |                 | ``frequency`` in Hz.                           |
 | 
				
			||||||
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
 | 
					| ``effective_area``           | (number)        | Effective area of the fiber (not just          |
 | 
				
			||||||
 | 
					|                              |                 | the MFD circle). This is the                   |
 | 
				
			||||||
 | 
					|                              |                 | :math:`A_{eff}`, see e.g., the                 |
 | 
				
			||||||
 | 
					|                              |                 | `Corning whitepaper on MFD/EA`_.               |
 | 
				
			||||||
 | 
					|                              |                 | Specified in :math:`m^{2}`.                    |
 | 
				
			||||||
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
 | 
					| ``gamma``                    | (number)        | Coefficient :math:`\gamma = 2\pi\times         |
 | 
				
			||||||
 | 
					|                              |                 | n^2/(\lambda*A_{eff})`.                        |
 | 
				
			||||||
 | 
					|                              |                 | If not provided, this will be derived          |
 | 
				
			||||||
 | 
					|                              |                 | from the ``effective_area``                    |
 | 
				
			||||||
 | 
					|                              |                 | :math:`A_{eff}`.                               |
 | 
				
			||||||
 | 
					|                              |                 | In :math:`w^{-1} \times m^{-1}`.               |
 | 
				
			||||||
 | 
					|                              |                 | This quantity is evaluated at the              |
 | 
				
			||||||
 | 
					|                              |                 | reference frequency and it is scaled           |
 | 
				
			||||||
 | 
					|                              |                 | along frequency accordingly to the             |
 | 
				
			||||||
 | 
					|                              |                 | effective area scaling.                        |
 | 
				
			||||||
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
| ``pmd_coef``                 | (number)        | Polarization mode dispersion (PMD)             |
 | 
					| ``pmd_coef``                 | (number)        | Polarization mode dispersion (PMD)             |
 | 
				
			||||||
|                              |                 | coefficient. In                                |
 | 
					|                              |                 | coefficient. In                                |
 | 
				
			||||||
|                              |                 | :math:`s\times\sqrt{m}^{-1}`.                  |
 | 
					|                              |                 | :math:`s\times\sqrt{m}^{-1}`.                  |
 | 
				
			||||||
+----------------------+-----------+------------------------------------------+
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
 | 
					| ``lumped_losses``            | (array)         | Places along the fiber length with extra       |
 | 
				
			||||||
 | 
					|                              |                 | losses. Specified as a loss in dB at           |
 | 
				
			||||||
 | 
					|                              |                 | each relevant position (in km):                |
 | 
				
			||||||
 | 
					|                              |                 | ``{"position": 10, "loss": 1.5}``)             |
 | 
				
			||||||
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
 | 
					| ``raman_coefficient``        | (dict)          | The fundamental parameter that describes       |
 | 
				
			||||||
 | 
					|                              |                 | the regulation of the power transfer           |
 | 
				
			||||||
 | 
					|                              |                 | between channels during fiber propagation      |
 | 
				
			||||||
 | 
					|                              |                 | is the Raman gain coefficient (see             |
 | 
				
			||||||
 | 
					|                              |                 | :cite:`DAmicoJLT2022` for further              |
 | 
				
			||||||
 | 
					|                              |                 | details); :math:`f_{ref}` represents the       |
 | 
				
			||||||
 | 
					|                              |                 | pump reference frequency used for the          |
 | 
				
			||||||
 | 
					|                              |                 | Raman gain coefficient profile                 |
 | 
				
			||||||
 | 
					|                              |                 | measurement ("reference_frequency"),           |
 | 
				
			||||||
 | 
					|                              |                 | :math:`\Delta f` is the frequency shift        |
 | 
				
			||||||
 | 
					|                              |                 | between the pump and the specific Stokes       |
 | 
				
			||||||
 | 
					|                              |                 | wave, the Raman gain coefficient               |
 | 
				
			||||||
 | 
					|                              |                 | in terms of optical power                      |
 | 
				
			||||||
 | 
					|                              |                 | :math:`g_0`, expressed in                      |
 | 
				
			||||||
 | 
					|                              |                 | :math:`1/(m\;W)`.                              |
 | 
				
			||||||
 | 
					|                              |                 | Default values measured for a SSMF are         |
 | 
				
			||||||
 | 
					|                              |                 | considered when not specified.                 |
 | 
				
			||||||
 | 
					+------------------------------+-----------------+------------------------------------------------+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. _Corning whitepaper on MFD/EA: https://www.corning.com/microsites/coc/oem/documents/specialty-fiber/WP7071-Mode-Field-Diam-and-Eff-Area.pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RamanFiber
 | 
				
			||||||
 | 
					~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The RamanFiber can be used to simulate Raman amplification through dedicated Raman pumps. The Raman pumps must be listed
 | 
				
			||||||
 | 
					in the key ``raman_pumps`` within the RamanFiber ``operational`` dictionary. The description of each Raman pump must
 | 
				
			||||||
 | 
					contain the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+---------------------------+-----------+------------------------------------------------------------+
 | 
				
			||||||
 | 
					| field                     | type      | description                                                |
 | 
				
			||||||
 | 
					+===========================+===========+============================================================+
 | 
				
			||||||
 | 
					| ``power``                 | (number)  | Total pump power in :math:`W`                              |
 | 
				
			||||||
 | 
					|                           |           | considering a depolarized pump                             |
 | 
				
			||||||
 | 
					+---------------------------+-----------+------------------------------------------------------------+
 | 
				
			||||||
 | 
					| ``frequency``             | (number)  | Pump central frequency in :math:`Hz`                       |
 | 
				
			||||||
 | 
					+---------------------------+-----------+------------------------------------------------------------+
 | 
				
			||||||
 | 
					| ``propagation_direction`` | (number)  | The pumps can propagate in the same or opposite direction  |
 | 
				
			||||||
 | 
					|                           |           | with respect the signal. Valid choices are ``coprop`` and  |
 | 
				
			||||||
 | 
					|                           |           | ``counterprop``, respectively                              |
 | 
				
			||||||
 | 
					+---------------------------+-----------+------------------------------------------------------------+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Beside the list of Raman pumps, the RamanFiber ``operational`` dictionary must include the ``temperature`` that affects
 | 
				
			||||||
 | 
					the amplified spontaneous emission noise generated by the Raman amplification.
 | 
				
			||||||
 | 
					As the loss coefficient significantly varies outside the C-band, where the Raman pumps are usually placed,
 | 
				
			||||||
 | 
					it is suggested to include an estimation of the loss coefficient for the Raman pump central frequencies within
 | 
				
			||||||
 | 
					a dictionary-like definition of the ``RamanFiber.params.loss_coef``
 | 
				
			||||||
 | 
					(e.g. ``loss_coef = {"value": [0.18, 0.18, 0.20, 0.20], "frequency": [191e12, 196e12, 200e12, 210e12]}``).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Transceiver
 | 
					Transceiver
 | 
				
			||||||
~~~~~~~~~~~
 | 
					~~~~~~~~~~~
 | 
				
			||||||
@@ -107,51 +180,86 @@ used to determine the service list path feasibility when running the
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The modes are defined as follows:
 | 
					The modes are defined as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| field                      | type      | description                             |
 | 
					| field                      | type      | description                             |
 | 
				
			||||||
+======================+===========+=========================================+
 | 
					+============================+===========+=========================================+
 | 
				
			||||||
| ``format``                 | (string)  | a unique name to ID the mode            |
 | 
					| ``format``                 | (string)  | a unique name to ID the mode            |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``baud_rate``              | (number)  | in Hz                                   |
 | 
					| ``baud_rate``              | (number)  | in Hz                                   |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``OSNR``                   | (number)  | min required OSNR in 0.1nm (dB)         |
 | 
					| ``OSNR``                   | (number)  | min required OSNR in 0.1nm (dB)         |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``bit_rate``               | (number)  | in bit/s                                |
 | 
					| ``bit_rate``               | (number)  | in bit/s                                |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``roll_off``               | (number)  | Pure number between 0 and 1. TX signal  |
 | 
					| ``roll_off``               | (number)  | Pure number between 0 and 1. TX signal  |
 | 
				
			||||||
|                            |           | roll-off shape. Used by Raman-aware     |
 | 
					|                            |           | roll-off shape. Used by Raman-aware     |
 | 
				
			||||||
|                            |           | simulation code.                        |
 | 
					|                            |           | simulation code.                        |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``tx_osnr``                | (number)  | In dB. OSNR out from transponder.       |
 | 
					| ``tx_osnr``                | (number)  | In dB. OSNR out from transponder.       |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
 | 
					| ``equalization_offset_db`` | (number)  | In dB. Deviation from the per channel   |
 | 
				
			||||||
 | 
					|                            |           | equalization target in ROADM for this   |
 | 
				
			||||||
 | 
					|                            |           | type of transceiver.                    |
 | 
				
			||||||
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
 | 
					| ``penalties``              | (list)    | list of impairments as described in     |
 | 
				
			||||||
 | 
					|                            |           | impairment table.                       |
 | 
				
			||||||
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
| ``cost``                   | (number)  | Arbitrary unit                          |
 | 
					| ``cost``                   | (number)  | Arbitrary unit                          |
 | 
				
			||||||
+----------------------+-----------+-----------------------------------------+
 | 
					+----------------------------+-----------+-----------------------------------------+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Penalties are linearly interpolated between given points and set to 'inf' outside interval.
 | 
				
			||||||
 | 
					The accumulated penalties are substracted to the path GSNR before comparing with the min required OSNR.
 | 
				
			||||||
 | 
					The penalties per impairment type are defined as a list of dict (impairment type - penalty values) as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+-----------------------------+-----------+-----------------------------------------------+
 | 
				
			||||||
 | 
					| field                       | type      | description                                   |
 | 
				
			||||||
 | 
					+=============================+===========+===============================================+
 | 
				
			||||||
 | 
					| ``chromatic_dispersion`` or | (number)  | In ps/nm/. Value of chromatic dispersion.     |
 | 
				
			||||||
 | 
					| ``pdl`` or                  |           | In dB. Value of polarization dependant loss.  |
 | 
				
			||||||
 | 
					| ``pmd``                     | (string)  | In ps. Value of polarization mode dispersion. |
 | 
				
			||||||
 | 
					+-----------------------------+-----------+-----------------------------------------------+
 | 
				
			||||||
 | 
					| ``penalty_value``           | (number)  | in dB. Penalty on the transceiver min OSNR    |
 | 
				
			||||||
 | 
					|                             |           | corresponding to the impairment level         |
 | 
				
			||||||
 | 
					+-----------------------------+-----------+-----------------------------------------------+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. code-block:: json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "penalties": [{
 | 
				
			||||||
 | 
					            "chromatic_dispersion": 360000,
 | 
				
			||||||
 | 
					            "penalty_value": 0.5
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "pmd": 110,
 | 
				
			||||||
 | 
					            "penalty_value": 0.5
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ROADM
 | 
					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          |
 | 
				
			||||||
@@ -161,7 +269,7 @@ The user can only modify the value of existing parameters:
 | 
				
			|||||||
|                               |           | 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
 | 
				
			||||||
-----------------
 | 
					-----------------
 | 
				
			||||||
@@ -176,6 +284,64 @@ Only the EDFA that are marked ``'allowed_for_design': true`` are considered.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
For amplifiers defined in the topology JSON input but whose ``gain = 0`` (placeholder), auto-design will set its gain automatically: see ``power_mode`` in the ``Spans`` library to find out how the gain is calculated.
 | 
					For amplifiers defined in the topology JSON input but whose ``gain = 0`` (placeholder), auto-design will set its gain automatically: see ``power_mode`` in the ``Spans`` library to find out how the gain is calculated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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                                 |
 | 
				
			||||||
 | 
					+=============================================+===========+=============================================+
 | 
				
			||||||
 | 
					| ``raman_params.flag``                       | (boolean) | Enable/Disable the Raman effect that        |
 | 
				
			||||||
 | 
					|                                             |           | produces a power transfer from higher to    |
 | 
				
			||||||
 | 
					|                                             |           | lower frequencies.                          |
 | 
				
			||||||
 | 
					|                                             |           | In general, considering the Raman effect    |
 | 
				
			||||||
 | 
					|                                             |           | provides more accurate results. It is       |
 | 
				
			||||||
 | 
					|                                             |           | mandatory when Raman amplification is       |
 | 
				
			||||||
 | 
					|                                             |           | included in the simulation                  |
 | 
				
			||||||
 | 
					+---------------------------------------------+-----------+---------------------------------------------+
 | 
				
			||||||
 | 
					| ``raman_params.result_spatial_resolution``  | (number)  | Spatial resolution of the output            |
 | 
				
			||||||
 | 
					|                                             |           | Raman profile along the entire fiber span.  |
 | 
				
			||||||
 | 
					|                                             |           | This affects the accuracy and the           |
 | 
				
			||||||
 | 
					|                                             |           | computational time of the NLI               |
 | 
				
			||||||
 | 
					|                                             |           | calculation when the GGN method is used:    |
 | 
				
			||||||
 | 
					|                                             |           | smaller the spatial resolution higher both  |
 | 
				
			||||||
 | 
					|                                             |           | the accuracy and the computational time.    |
 | 
				
			||||||
 | 
					|                                             |           | In C-band simulations, with input power per |
 | 
				
			||||||
 | 
					|                                             |           | channel around 0 dBm, a suggested value of  |
 | 
				
			||||||
 | 
					|                                             |           | spatial resolution is 10e3 m                |
 | 
				
			||||||
 | 
					+---------------------------------------------+-----------+---------------------------------------------+
 | 
				
			||||||
 | 
					| ``raman_params.solver_spatial_resolution``  | (number)  | Spatial step for the iterative solution     |
 | 
				
			||||||
 | 
					|                                             |           | of the first order differential equation    |
 | 
				
			||||||
 | 
					|                                             |           | used to calculate the Raman profile         |
 | 
				
			||||||
 | 
					|                                             |           | along the entire fiber span.                |
 | 
				
			||||||
 | 
					|                                             |           | This affects the accuracy and the           |
 | 
				
			||||||
 | 
					|                                             |           | computational time of the evaluated         |
 | 
				
			||||||
 | 
					|                                             |           | Raman profile:                              |
 | 
				
			||||||
 | 
					|                                             |           | smaller the spatial resolution higher both  |
 | 
				
			||||||
 | 
					|                                             |           | the accuracy and the computational time.    |
 | 
				
			||||||
 | 
					|                                             |           | In C-band simulations, with input power per |
 | 
				
			||||||
 | 
					|                                             |           | channel around 0 dBm, a suggested value of  |
 | 
				
			||||||
 | 
					|                                             |           | spatial resolution is 100 m                 |
 | 
				
			||||||
 | 
					+---------------------------------------------+-----------+---------------------------------------------+
 | 
				
			||||||
 | 
					| ``nli_params.method``                       | (string)  | Model used for the NLI evaluation. Valid    |
 | 
				
			||||||
 | 
					|                                             |           | choices are ``gn_model_analytic`` (see      |
 | 
				
			||||||
 | 
					|                                             |           | eq. 120 from `arXiv:1209.0394               |
 | 
				
			||||||
 | 
					|                                             |           | <https://arxiv.org/abs/1209.0394>`_) and    |
 | 
				
			||||||
 | 
					|                                             |           | ``ggn_spectrally_separated`` (see eq. 21    |
 | 
				
			||||||
 | 
					|                                             |           | from `arXiv:1710.02225                      |
 | 
				
			||||||
 | 
					|                                             |           | <https://arxiv.org/abs/1710.02225>`_).      |
 | 
				
			||||||
 | 
					+---------------------------------------------+-----------+---------------------------------------------+
 | 
				
			||||||
 | 
					| ``nli_params.computed_channels``            | (number)  | The channels on which the NLI is            |
 | 
				
			||||||
 | 
					|                                             |           | explicitly evaluated.                       |
 | 
				
			||||||
 | 
					|                                             |           | The NLI of the other channels is            |
 | 
				
			||||||
 | 
					|                                             |           | interpolated using ``numpy.interp``.        |
 | 
				
			||||||
 | 
					|                                             |           | In a C-band simulation with 96 channels in  |
 | 
				
			||||||
 | 
					|                                             |           | a 50 GHz spacing fix-grid we recommend at   |
 | 
				
			||||||
 | 
					|                                             |           | one computed channel every 20 channels.     |
 | 
				
			||||||
 | 
					+---------------------------------------------+-----------+---------------------------------------------+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Span
 | 
					Span
 | 
				
			||||||
~~~~
 | 
					~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -184,23 +350,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]        |
 | 
				
			||||||
@@ -305,9 +475,14 @@ 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.
 | 
					
 | 
				
			||||||
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.
 | 
					This block defines a reference channel (target input power in spans, nb of channels) which is used to design the network or correct the settings.
 | 
				
			||||||
 | 
					It may be updated with different options --power.
 | 
				
			||||||
 | 
					It also defines the channels to be propagated for the gnpy-transmission-example script unless a different definition is provided with ``--spectrum`` option.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Flexgrid channel partitioning is available since the 2.7 release via the extra ``--spectrum`` option.
 | 
				
			||||||
 | 
					In the simplest case, homogeneous channel allocation can be defined via the ``SpectralInformation`` construct which defines a spectrum of N identical carriers:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
+----------------------+-----------+-------------------------------------------+
 | 
					+----------------------+-----------+-------------------------------------------+
 | 
				
			||||||
| field                |   type    | description                               |
 | 
					| field                |   type    | description                               |
 | 
				
			||||||
@@ -328,11 +503,21 @@ 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)  | In dBm. Target input power in spans to    |
 | 
				
			||||||
|                      |           | (see spans/power_mode = false), all gain  |
 | 
					|                      |           | be considered for the design              |
 | 
				
			||||||
|                      |           | settings are offset w/r/t this reference  |
 | 
					|                      |           | In gain mode                              |
 | 
				
			||||||
|                      |           | power. In power mode, it is the           |
 | 
					|                      |           | (see spans/power_mode = false), if no     |
 | 
				
			||||||
|                      |           | reference power for                       |
 | 
					|                      |           | gain is set in an amplifier, auto-design  |
 | 
				
			||||||
 | 
					|                      |           | 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 |
 | 
				
			||||||
@@ -340,12 +525,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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -126,9 +126,9 @@ that can be easily evaluated extending the FWM theory from a set of discrete
 | 
				
			|||||||
tones - the standard FWM theory introduced back in the 90s by Inoue
 | 
					tones - the standard FWM theory introduced back in the 90s by Inoue
 | 
				
			||||||
:cite:`Innoue-FWM`- to a continuity of tones, possibly spectrally shaped.
 | 
					:cite:`Innoue-FWM`- to a continuity of tones, possibly spectrally shaped.
 | 
				
			||||||
Signals propagating in the fiber are not equivalent to Gaussian noise, but
 | 
					Signals propagating in the fiber are not equivalent to Gaussian noise, but
 | 
				
			||||||
thanks to the absence of in-line compensation for choromatic dispersion, the
 | 
					thanks to the absence of in-line compensation for chromatic dispersion, the
 | 
				
			||||||
become so, over short distances.  So, the Gaussian noise model with incoherent
 | 
					become so, over short distances.  So, the Gaussian noise model with incoherent
 | 
				
			||||||
accumulation of NLI has estensively proved to be a quick yet accurate and
 | 
					accumulation of NLI has extensively proved to be a quick yet accurate and
 | 
				
			||||||
conservative tool to estimate propagation impairments of fiber propagation.
 | 
					conservative tool to estimate propagation impairments of fiber propagation.
 | 
				
			||||||
Note that the GN-model has not been derived with the aim of an *exact*
 | 
					Note that the GN-model has not been derived with the aim of an *exact*
 | 
				
			||||||
performance estimation, but to pursue a conservative performance prediction.
 | 
					performance estimation, but to pursue a conservative performance prediction.
 | 
				
			||||||
@@ -145,4 +145,4 @@ Raman Scattering in order to give a proper estimation for all channels
 | 
				
			|||||||
:cite:`cantono2018modeling`.  This will be the main upgrade required within the
 | 
					:cite:`cantono2018modeling`.  This will be the main upgrade required within the
 | 
				
			||||||
PSE framework.
 | 
					PSE framework.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. bibliography:: biblio.bib  
 | 
					.. bibliography::
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										96
									
								
								docs/release-notes.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								docs/release-notes.rst
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					.. _release-notes:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Release change log
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each release introduces some changes and new features.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					v2.8
 | 
				
			||||||
 | 
					----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Spectrum assignment**: requests can now support multiple slots.
 | 
				
			||||||
 | 
					The definition in service file supports multiple assignments (unchanged syntax):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. code-block:: json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          "effective-freq-slot": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "N": 0,
 | 
				
			||||||
 | 
					              "M": 4
 | 
				
			||||||
 | 
					            }, {
 | 
				
			||||||
 | 
					              "N": 50,
 | 
				
			||||||
 | 
					              "M": 4
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But in results, label-hop is now a list of slots and center frequency index:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. code-block:: json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "path-route-object": {
 | 
				
			||||||
 | 
					              "index": 4,
 | 
				
			||||||
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                  "N": 0,
 | 
				
			||||||
 | 
					                  "M": 4
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                  "N": 50,
 | 
				
			||||||
 | 
					                  "M": 4
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					instead of 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. code-block:: json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "path-route-object": {
 | 
				
			||||||
 | 
					              "index": 4,
 | 
				
			||||||
 | 
					              "label-hop": {
 | 
				
			||||||
 | 
					                "N": 0,
 | 
				
			||||||
 | 
					                "M": 4
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**change in display**: only warnings are displayed ; information are disabled and needs the -v (verbose)
 | 
				
			||||||
 | 
					option to be displayed on standard output.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**frequency scaling**: Chromatic dispersion, effective area, Raman Gain coefficient,
 | 
				
			||||||
 | 
					and nonlinear coefficient can now be defined with a scaling along frequency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**power offset**: Power equalization now enables defining a power offset in transceiver library to represent
 | 
				
			||||||
 | 
					the deviation from the general equalisation strategy defined in ROADMs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .. code-block:: json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "100G",
 | 
				
			||||||
 | 
					                    "baud_rate": 32.0e9,
 | 
				
			||||||
 | 
					                    "tx_osnr": 35.0,
 | 
				
			||||||
 | 
					                    "min_spacing": 50.0e9,
 | 
				
			||||||
 | 
					                    "cost": 1,
 | 
				
			||||||
 | 
					                    "OSNR": 10.0,
 | 
				
			||||||
 | 
					                    "bit_rate": 100.0e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.2,
 | 
				
			||||||
 | 
					                    "equalization_offset_db": 0.0
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "200G",
 | 
				
			||||||
 | 
					                    "baud_rate": 64.0e9,
 | 
				
			||||||
 | 
					                    "tx_osnr": 35.0,
 | 
				
			||||||
 | 
					                    "min_spacing": 75.0e9,
 | 
				
			||||||
 | 
					                    "cost": 1,
 | 
				
			||||||
 | 
					                    "OSNR": 13.0,
 | 
				
			||||||
 | 
					                    "bit_rate": 200.0e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.2,
 | 
				
			||||||
 | 
					                    "equalization_offset_db": 1.76
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					v2.7
 | 
				
			||||||
 | 
					----
 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
alabaster>=0.7.12,<1
 | 
					 | 
				
			||||||
docutils>=0.15.2,<1
 | 
					 | 
				
			||||||
myst-parser>=0.14.0,<1
 | 
					 | 
				
			||||||
Pygments>=2.7.4,<3
 | 
					 | 
				
			||||||
rstcheck
 | 
					 | 
				
			||||||
Sphinx>=3.5.0,<4
 | 
					 | 
				
			||||||
sphinxcontrib-bibtex>=0.4.2,<1
 | 
					 | 
				
			||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
'''
 | 
					"""
 | 
				
			||||||
GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks. It is based on the Gaussian Noise Model.
 | 
					GNPy is an open-source, community-developed library for building route planning and optimization tools in real-world mesh optical networks. It is based on the Gaussian Noise Model.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Signal propagation is implemented in :py:mod:`.core`.
 | 
					Signal propagation is implemented in :py:mod:`.core`.
 | 
				
			||||||
Path finding and spectrum assignment is in :py:mod:`.topology`.
 | 
					Path finding and spectrum assignment is in :py:mod:`.topology`.
 | 
				
			||||||
Various tools and auxiliary code, including the JSON I/O handling, is in
 | 
					Various tools and auxiliary code, including the JSON I/O handling, is in
 | 
				
			||||||
:py:mod:`.tools`.
 | 
					:py:mod:`.tools`.
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
'''
 | 
					"""
 | 
				
			||||||
Simulation of signal propagation in the DWDM network
 | 
					Simulation of signal propagation in the DWDM network
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Optical signals, as defined via :class:`.info.SpectralInformation`, enter
 | 
					Optical signals, as defined via :class:`.info.SpectralInformation`, enter
 | 
				
			||||||
@@ -6,4 +6,4 @@ Optical signals, as defined via :class:`.info.SpectralInformation`, enter
 | 
				
			|||||||
through the :py:mod:`.network`.
 | 
					through the :py:mod:`.network`.
 | 
				
			||||||
The simulation is controlled via :py:mod:`.parameters` and implemented mainly
 | 
					The simulation is controlled via :py:mod:`.parameters` and implemented mainly
 | 
				
			||||||
via :py:mod:`.science_utils`.
 | 
					via :py:mod:`.science_utils`.
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,12 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.core.ansi_escapes
 | 
					gnpy.core.ansi_escapes
 | 
				
			||||||
======================
 | 
					======================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A random subset of ANSI terminal escape codes for colored messages
 | 
					A random subset of ANSI terminal escape codes for colored messages
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
red = '\x1b[1;31;40m'
 | 
					red = '\x1b[1;31;40m'
 | 
				
			||||||
blue = '\x1b[1;34;40m'
 | 
					blue = '\x1b[1;34;40m'
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.core.equipment
 | 
					gnpy.core.equipment
 | 
				
			||||||
===================
 | 
					===================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This module contains functionality for specifying equipment.
 | 
					This module contains functionality for specifying equipment.
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from gnpy.core.utils import automatic_nch, db2lin
 | 
					from gnpy.core.utils import automatic_nch, db2lin
 | 
				
			||||||
from gnpy.core.exceptions import EquipmentConfigError
 | 
					from gnpy.core.exceptions import EquipmentConfigError
 | 
				
			||||||
@@ -29,17 +29,22 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
 | 
				
			|||||||
            trx_params = {**mode_params}
 | 
					            trx_params = {**mode_params}
 | 
				
			||||||
            # sanity check: spacing baudrate must be smaller than min spacing
 | 
					            # sanity check: spacing baudrate must be smaller than min spacing
 | 
				
			||||||
            if trx_params['baud_rate'] > trx_params['min_spacing']:
 | 
					            if trx_params['baud_rate'] > trx_params['min_spacing']:
 | 
				
			||||||
                raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transpoder "{trx_type_variety}" mode "{trx_params["format"]}" ' +
 | 
					                raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}"'
 | 
				
			||||||
                                           f'has baud rate {trx_params["baud_rate"]*1e-9} GHz greater than min_spacing {trx_params["min_spacing"]*1e-9}.')
 | 
					                                           + f' mode "{trx_params["format"]}" has baud rate'
 | 
				
			||||||
 | 
					                                           + f' {trx_params["baud_rate"] * 1e-9:.3f} GHz greater than min_spacing'
 | 
				
			||||||
 | 
					                                           + f' {trx_params["min_spacing"] * 1e-9:.3f}.')
 | 
				
			||||||
 | 
					            trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            mode_params = {"format": "undetermined",
 | 
					            mode_params = {"format": "undetermined",
 | 
				
			||||||
                           "baud_rate": None,
 | 
					                           "baud_rate": None,
 | 
				
			||||||
                           "OSNR": None,
 | 
					                           "OSNR": None,
 | 
				
			||||||
 | 
					                           "penalties": None,
 | 
				
			||||||
                           "bit_rate": None,
 | 
					                           "bit_rate": None,
 | 
				
			||||||
                           "roll_off": None,
 | 
					                           "roll_off": None,
 | 
				
			||||||
                           "tx_osnr": None,
 | 
					                           "tx_osnr": None,
 | 
				
			||||||
                           "min_spacing": None,
 | 
					                           "min_spacing": None,
 | 
				
			||||||
                           "cost": None}
 | 
					                           "cost": None,
 | 
				
			||||||
 | 
					                           "equalization_offset_db": 0}
 | 
				
			||||||
            trx_params = {**mode_params}
 | 
					            trx_params = {**mode_params}
 | 
				
			||||||
        trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
 | 
					        trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
 | 
				
			||||||
        trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
 | 
					        trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
 | 
				
			||||||
@@ -59,14 +64,13 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
 | 
				
			|||||||
            trx_params['baud_rate'] = default_si_data.baud_rate
 | 
					            trx_params['baud_rate'] = default_si_data.baud_rate
 | 
				
			||||||
            trx_params['spacing'] = default_si_data.spacing
 | 
					            trx_params['spacing'] = default_si_data.spacing
 | 
				
			||||||
            trx_params['OSNR'] = None
 | 
					            trx_params['OSNR'] = None
 | 
				
			||||||
 | 
					            trx_params['penalties'] = {}
 | 
				
			||||||
            trx_params['bit_rate'] = None
 | 
					            trx_params['bit_rate'] = None
 | 
				
			||||||
            trx_params['cost'] = None
 | 
					            trx_params['cost'] = None
 | 
				
			||||||
            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['equalization_offset_db'] = 0
 | 
				
			||||||
            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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,49 +8,357 @@ gnpy.core.info
 | 
				
			|||||||
This module contains classes for modelling :class:`SpectralInformation`.
 | 
					This module contains classes for modelling :class:`SpectralInformation`.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from __future__ import annotations
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
from gnpy.core.utils import automatic_nch, lin2db
 | 
					from collections.abc import Iterable
 | 
				
			||||||
 | 
					from typing import Union
 | 
				
			||||||
 | 
					from dataclasses import dataclass
 | 
				
			||||||
 | 
					from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from gnpy.core.utils import automatic_nch, db2lin, watt2dbm
 | 
				
			||||||
 | 
					from gnpy.core.exceptions import SpectrumError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFAULT_SLOT_WIDTH_STEP = 12.5e9  # Hz
 | 
				
			||||||
 | 
					"""Channels with unspecified slot width will have their slot width evaluated as the baud rate rounded up to the minimum
 | 
				
			||||||
 | 
					multiple of the DEFAULT_SLOT_WIDTH_STEP (the baud rate is extended including the roll off in this evaluation)"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Power(namedtuple('Power', 'signal nli ase')):
 | 
					class Power(namedtuple('Power', 'signal nli ase')):
 | 
				
			||||||
    """carriers power in W"""
 | 
					    """carriers power in W"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Channel(namedtuple('Channel', 'channel_number frequency baud_rate roll_off power chromatic_dispersion pmd')):
 | 
					class Channel(
 | 
				
			||||||
 | 
					    namedtuple('Channel',
 | 
				
			||||||
 | 
					               'channel_number frequency baud_rate slot_width roll_off power chromatic_dispersion pmd pdl latency')):
 | 
				
			||||||
    """Class containing the parameters of a WDM signal.
 | 
					    """Class containing the parameters of a WDM signal.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param channel_number: channel number in the WDM grid
 | 
					    :param channel_number: channel number in the WDM grid
 | 
				
			||||||
    :param frequency: central frequency of the signal (Hz)
 | 
					    :param frequency: central frequency of the signal (Hz)
 | 
				
			||||||
    :param baud_rate: the symbol rate of the signal (Baud)
 | 
					    :param baud_rate: the symbol rate of the signal (Baud)
 | 
				
			||||||
 | 
					    :param slot_width: the slot width (Hz)
 | 
				
			||||||
    :param roll_off: the roll off of the signal. It is a pure number between 0 and 1
 | 
					    :param roll_off: the roll off of the signal. It is a pure number between 0 and 1
 | 
				
			||||||
    :param power (gnpy.core.info.Power): power of signal, ASE noise and NLI (W)
 | 
					    :param power (gnpy.core.info.Power): power of signal, ASE noise and NLI (W)
 | 
				
			||||||
    :param chromatic_dispersion: chromatic dispersion (s/m)
 | 
					    :param chromatic_dispersion: chromatic dispersion (s/m)
 | 
				
			||||||
    :param pmd: polarization mode dispersion (s)
 | 
					    :param pmd: polarization mode dispersion (s)
 | 
				
			||||||
 | 
					    :param pdl: polarization dependent loss (dB)
 | 
				
			||||||
 | 
					    :param latency: propagation latency (s)
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Pref(namedtuple('Pref', 'p_span0, p_spani, neq_ch ')):
 | 
					class SpectralInformation(object):
 | 
				
			||||||
    """noiseless reference power in dBm:
 | 
					    """Class containing the parameters of the entire WDM comb.
 | 
				
			||||||
    p_span0: inital target carrier power
 | 
					
 | 
				
			||||||
    p_spani: carrier power after element i
 | 
					    delta_pdb_per_channel: (per frequency) per channel delta power in dbm for the actual mix of channels"""
 | 
				
			||||||
    neq_ch: equivalent channel count in dB"""
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, frequency: array, baud_rate: array, slot_width: array, signal: array, nli: array, ase: array,
 | 
				
			||||||
 | 
					                 roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
 | 
				
			||||||
 | 
					                 delta_pdb_per_channel: array, tx_osnr: array, label: array):
 | 
				
			||||||
 | 
					        indices = argsort(frequency)
 | 
				
			||||||
 | 
					        self._frequency = frequency[indices]
 | 
				
			||||||
 | 
					        self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
 | 
				
			||||||
 | 
					        self._number_of_channels = len(self._frequency)
 | 
				
			||||||
 | 
					        self._channel_number = [*range(1, self._number_of_channels + 1)]
 | 
				
			||||||
 | 
					        self._slot_width = slot_width[indices]
 | 
				
			||||||
 | 
					        self._baud_rate = baud_rate[indices]
 | 
				
			||||||
 | 
					        overlap = self._frequency[:-1] + self._slot_width[:-1] / 2 > self._frequency[1:] - self._slot_width[1:] / 2
 | 
				
			||||||
 | 
					        if any(overlap):
 | 
				
			||||||
 | 
					            overlap = [pair for pair in zip(overlap * self._channel_number[:-1], overlap * self._channel_number[1:])
 | 
				
			||||||
 | 
					                       if pair != (0, 0)]
 | 
				
			||||||
 | 
					            raise SpectrumError(f'Spectrum required slot widths larger than the frequency spectral distances '
 | 
				
			||||||
 | 
					                                f'between channels: {overlap}.')
 | 
				
			||||||
 | 
					        exceed = self._baud_rate > self._slot_width
 | 
				
			||||||
 | 
					        if any(exceed):
 | 
				
			||||||
 | 
					            raise SpectrumError(f'Spectrum baud rate, including the roll off, larger than the slot width for channels: '
 | 
				
			||||||
 | 
					                                f'{[ch for ch in exceed * self._channel_number if ch]}.')
 | 
				
			||||||
 | 
					        self._signal = signal[indices]
 | 
				
			||||||
 | 
					        self._nli = nli[indices]
 | 
				
			||||||
 | 
					        self._ase = ase[indices]
 | 
				
			||||||
 | 
					        self._roll_off = roll_off[indices]
 | 
				
			||||||
 | 
					        self._chromatic_dispersion = chromatic_dispersion[indices]
 | 
				
			||||||
 | 
					        self._pmd = pmd[indices]
 | 
				
			||||||
 | 
					        self._pdl = pdl[indices]
 | 
				
			||||||
 | 
					        self._latency = latency[indices]
 | 
				
			||||||
 | 
					        self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
 | 
				
			||||||
 | 
					        self._tx_osnr = tx_osnr[indices]
 | 
				
			||||||
 | 
					        self._label = label[indices]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def frequency(self):
 | 
				
			||||||
 | 
					        return self._frequency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def df(self):
 | 
				
			||||||
 | 
					        """Matrix of relative frequency distances between all channels. Positive elements in the upper right side."""
 | 
				
			||||||
 | 
					        return self._df
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def slot_width(self):
 | 
				
			||||||
 | 
					        return self._slot_width
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def baud_rate(self):
 | 
				
			||||||
 | 
					        return self._baud_rate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def number_of_channels(self):
 | 
				
			||||||
 | 
					        return self._number_of_channels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def powers(self):
 | 
				
			||||||
 | 
					        powers = zip(self.signal, self.nli, self.ase)
 | 
				
			||||||
 | 
					        return [Power(*p) for p in powers]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def signal(self):
 | 
				
			||||||
 | 
					        return self._signal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @signal.setter
 | 
				
			||||||
 | 
					    def signal(self, signal):
 | 
				
			||||||
 | 
					        self._signal = signal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def nli(self):
 | 
				
			||||||
 | 
					        return self._nli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @nli.setter
 | 
				
			||||||
 | 
					    def nli(self, nli):
 | 
				
			||||||
 | 
					        self._nli = nli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def ase(self):
 | 
				
			||||||
 | 
					        return self._ase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @ase.setter
 | 
				
			||||||
 | 
					    def ase(self, ase):
 | 
				
			||||||
 | 
					        self._ase = ase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def roll_off(self):
 | 
				
			||||||
 | 
					        return self._roll_off
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def chromatic_dispersion(self):
 | 
				
			||||||
 | 
					        return self._chromatic_dispersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @chromatic_dispersion.setter
 | 
				
			||||||
 | 
					    def chromatic_dispersion(self, chromatic_dispersion):
 | 
				
			||||||
 | 
					        self._chromatic_dispersion = chromatic_dispersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def pmd(self):
 | 
				
			||||||
 | 
					        return self._pmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def label(self):
 | 
				
			||||||
 | 
					        return self._label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @pmd.setter
 | 
				
			||||||
 | 
					    def pmd(self, pmd):
 | 
				
			||||||
 | 
					        self._pmd = pmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def pdl(self):
 | 
				
			||||||
 | 
					        return self._pdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @pdl.setter
 | 
				
			||||||
 | 
					    def pdl(self, pdl):
 | 
				
			||||||
 | 
					        self._pdl = pdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def latency(self):
 | 
				
			||||||
 | 
					        return self._latency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @latency.setter
 | 
				
			||||||
 | 
					    def latency(self, latency):
 | 
				
			||||||
 | 
					        self._latency = latency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delta_pdb_per_channel(self):
 | 
				
			||||||
 | 
					        return self._delta_pdb_per_channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @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
 | 
				
			||||||
 | 
					    def channel_number(self):
 | 
				
			||||||
 | 
					        return self._channel_number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def carriers(self):
 | 
				
			||||||
 | 
					        entries = zip(self.channel_number, self.frequency, self.baud_rate, self.slot_width,
 | 
				
			||||||
 | 
					                      self.roll_off, self.powers, self.chromatic_dispersion, self.pmd, self.pdl, self.latency)
 | 
				
			||||||
 | 
					        return [Channel(*entry) for entry in entries]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def apply_attenuation_lin(self, attenuation_lin):
 | 
				
			||||||
 | 
					        self.signal *= attenuation_lin
 | 
				
			||||||
 | 
					        self.nli *= attenuation_lin
 | 
				
			||||||
 | 
					        self.ase *= attenuation_lin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def apply_attenuation_db(self, attenuation_db):
 | 
				
			||||||
 | 
					        attenuation_lin = 1 / db2lin(attenuation_db)
 | 
				
			||||||
 | 
					        self.apply_attenuation_lin(attenuation_lin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def apply_gain_lin(self, gain_lin):
 | 
				
			||||||
 | 
					        self.signal *= gain_lin
 | 
				
			||||||
 | 
					        self.nli *= gain_lin
 | 
				
			||||||
 | 
					        self.ase *= gain_lin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def apply_gain_db(self, gain_db):
 | 
				
			||||||
 | 
					        gain_lin = db2lin(gain_db)
 | 
				
			||||||
 | 
					        self.apply_gain_lin(gain_lin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __add__(self, other: SpectralInformation):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            return SpectralInformation(frequency=append(self.frequency, other.frequency),
 | 
				
			||||||
 | 
					                                       slot_width=append(self.slot_width, other.slot_width),
 | 
				
			||||||
 | 
					                                       signal=append(self.signal, other.signal), nli=append(self.nli, other.nli),
 | 
				
			||||||
 | 
					                                       ase=append(self.ase, other.ase),
 | 
				
			||||||
 | 
					                                       baud_rate=append(self.baud_rate, other.baud_rate),
 | 
				
			||||||
 | 
					                                       roll_off=append(self.roll_off, other.roll_off),
 | 
				
			||||||
 | 
					                                       chromatic_dispersion=append(self.chromatic_dispersion,
 | 
				
			||||||
 | 
					                                                                   other.chromatic_dispersion),
 | 
				
			||||||
 | 
					                                       pmd=append(self.pmd, other.pmd),
 | 
				
			||||||
 | 
					                                       pdl=append(self.pdl, other.pdl),
 | 
				
			||||||
 | 
					                                       latency=append(self.latency, other.latency),
 | 
				
			||||||
 | 
					                                       delta_pdb_per_channel=append(self.delta_pdb_per_channel,
 | 
				
			||||||
 | 
					                                                                    other.delta_pdb_per_channel),
 | 
				
			||||||
 | 
					                                       tx_osnr=append(self.tx_osnr, other.tx_osnr),
 | 
				
			||||||
 | 
					                                       label=append(self.label, other.label))
 | 
				
			||||||
 | 
					        except SpectrumError:
 | 
				
			||||||
 | 
					            raise SpectrumError('Spectra cannot be summed: channels overlapping.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _replace(self, carriers):
 | 
				
			||||||
 | 
					        self.chromatic_dispersion = array([c.chromatic_dispersion for c in carriers])
 | 
				
			||||||
 | 
					        self.pmd = array([c.pmd for c in carriers])
 | 
				
			||||||
 | 
					        self.pdl = array([c.pdl for c in carriers])
 | 
				
			||||||
 | 
					        self.latency = array([c.latency for c in carriers])
 | 
				
			||||||
 | 
					        self.signal = array([c.power.signal for c in carriers])
 | 
				
			||||||
 | 
					        self.nli = array([c.power.nli for c in carriers])
 | 
				
			||||||
 | 
					        self.ase = array([c.power.ase for c in carriers])
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SpectralInformation(namedtuple('SpectralInformation', 'pref carriers')):
 | 
					def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, float],
 | 
				
			||||||
 | 
					                                          signal: Union[float, ndarray, Iterable],
 | 
				
			||||||
    def __new__(cls, pref, carriers):
 | 
					                                          baud_rate: Union[float, ndarray, Iterable],
 | 
				
			||||||
        return super().__new__(cls, pref, carriers)
 | 
					                                          tx_osnr: Union[float, ndarray, Iterable],
 | 
				
			||||||
 | 
					                                          delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          slot_width: Union[float, ndarray, Iterable] = None,
 | 
				
			||||||
 | 
					                                          roll_off: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          chromatic_dispersion: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          pmd: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          pdl: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          latency: Union[float, ndarray, Iterable] = 0.,
 | 
				
			||||||
 | 
					                                          label: Union[str, ndarray, Iterable] = None):
 | 
				
			||||||
 | 
					    """This is just a wrapper around the SpectralInformation.__init__() that simplifies the creation of
 | 
				
			||||||
 | 
					    a non-uniform spectral information with NLI and ASE powers set to zero."""
 | 
				
			||||||
 | 
					    frequency = asarray(frequency)
 | 
				
			||||||
 | 
					    number_of_channels = frequency.size
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        signal = full(number_of_channels, signal)
 | 
				
			||||||
 | 
					        baud_rate = full(number_of_channels, baud_rate)
 | 
				
			||||||
 | 
					        roll_off = full(number_of_channels, roll_off)
 | 
				
			||||||
 | 
					        slot_width = full(number_of_channels, slot_width) if slot_width is not None else \
 | 
				
			||||||
 | 
					            ceil((1 + roll_off) * baud_rate / DEFAULT_SLOT_WIDTH_STEP) * DEFAULT_SLOT_WIDTH_STEP
 | 
				
			||||||
 | 
					        chromatic_dispersion = full(number_of_channels, chromatic_dispersion)
 | 
				
			||||||
 | 
					        pmd = full(number_of_channels, pmd)
 | 
				
			||||||
 | 
					        pdl = full(number_of_channels, pdl)
 | 
				
			||||||
 | 
					        latency = full(number_of_channels, latency)
 | 
				
			||||||
 | 
					        nli = zeros(number_of_channels)
 | 
				
			||||||
 | 
					        ase = zeros(number_of_channels)
 | 
				
			||||||
 | 
					        delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
 | 
				
			||||||
 | 
					        tx_osnr = full(number_of_channels, tx_osnr)
 | 
				
			||||||
 | 
					        label = full(number_of_channels, label)
 | 
				
			||||||
 | 
					        return SpectralInformation(frequency=frequency, slot_width=slot_width,
 | 
				
			||||||
 | 
					                                   signal=signal, nli=nli, ase=ase,
 | 
				
			||||||
 | 
					                                   baud_rate=baud_rate, roll_off=roll_off,
 | 
				
			||||||
 | 
					                                   chromatic_dispersion=chromatic_dispersion,
 | 
				
			||||||
 | 
					                                   pmd=pmd, pdl=pdl, latency=latency,
 | 
				
			||||||
 | 
					                                   delta_pdb_per_channel=delta_pdb_per_channel,
 | 
				
			||||||
 | 
					                                   tx_osnr=tx_osnr, label=label)
 | 
				
			||||||
 | 
					    except ValueError as e:
 | 
				
			||||||
 | 
					        if 'could not broadcast' in str(e):
 | 
				
			||||||
 | 
					            raise SpectrumError('Dimension mismatch in input fields.')
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            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, delta_pdb=0):
 | 
				
			||||||
    # pref in dB : convert power lin into power in dB
 | 
					    """Creates a fixed slot width spectral information with flat power.
 | 
				
			||||||
    pref = lin2db(power * 1e3)
 | 
					    all arguments are scalar values"""
 | 
				
			||||||
    nb_channel = automatic_nch(f_min, f_max, spacing)
 | 
					    number_of_channels = automatic_nch(f_min, f_max, spacing)
 | 
				
			||||||
    si = SpectralInformation(
 | 
					    frequency = [(f_min + spacing * i) for i in range(1, number_of_channels + 1)]
 | 
				
			||||||
        pref=Pref(pref, pref, lin2db(nb_channel)),
 | 
					    delta_pdb_per_channel = delta_pdb * ones(number_of_channels)
 | 
				
			||||||
        carriers=[
 | 
					    label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)]
 | 
				
			||||||
            Channel(f, (f_min + spacing * f),
 | 
					    return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate,
 | 
				
			||||||
                    baud_rate, roll_off, Power(power, 0, 0), 0, 0) for f in range(1, nb_channel + 1)
 | 
					                                                 roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
 | 
				
			||||||
        ]
 | 
					                                                 tx_osnr=tx_osnr, label=label)
 | 
				
			||||||
    )
 | 
					
 | 
				
			||||||
    return si
 | 
					
 | 
				
			||||||
 | 
					def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier],
 | 
				
			||||||
 | 
					                                     power: float) -> SpectralInformation:
 | 
				
			||||||
 | 
					    """Initial spectrum is a dict with key = carrier frequency, and value a Carrier object.
 | 
				
			||||||
 | 
					    :param initial_spectrum: indexed by frequency in Hz, with power offset (delta_pdb), baudrate, slot width,
 | 
				
			||||||
 | 
					    tx_osnr and roll off.
 | 
				
			||||||
 | 
					    :param power: power of the request
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    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)
 | 
				
			||||||
 | 
					    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,
 | 
				
			||||||
 | 
					                                                 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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,27 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.core.network
 | 
					gnpy.core.network
 | 
				
			||||||
=================
 | 
					=================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Working with networks which consist of network elements
 | 
					Working with networks which consist of network elements
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from copy import deepcopy
 | 
				
			||||||
from operator import attrgetter
 | 
					from operator import attrgetter
 | 
				
			||||||
from gnpy.core import ansi_escapes, elements
 | 
					 | 
				
			||||||
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
 | 
					 | 
				
			||||||
from gnpy.core.utils import round2float, convert_length
 | 
					 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					from logging import getLogger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from gnpy.core import elements
 | 
				
			||||||
 | 
					from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
 | 
				
			||||||
 | 
					from gnpy.core.utils import round2float, convert_length, psd2powerdbm, lin2db, watt2dbm, dbm2watt
 | 
				
			||||||
 | 
					from gnpy.core.info import ReferenceCarrier, create_input_spectral_information
 | 
				
			||||||
 | 
					from gnpy.tools import json_io
 | 
				
			||||||
 | 
					from gnpy.core.parameters import SimParams
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					logger = getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def edfa_nf(gain_target, variety_type, equipment):
 | 
					def edfa_nf(gain_target, variety_type, equipment):
 | 
				
			||||||
@@ -27,10 +36,11 @@ def edfa_nf(gain_target, variety_type, equipment):
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
    amp.pin_db = 0
 | 
					    amp.pin_db = 0
 | 
				
			||||||
    amp.nch = 88
 | 
					    amp.nch = 88
 | 
				
			||||||
 | 
					    amp.slot_width = 50e9
 | 
				
			||||||
    return amp._calc_nf(True)
 | 
					    return amp._calc_nf(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restrictions=None):
 | 
					def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restrictions=None, verbose=True):
 | 
				
			||||||
    """amplifer selection algorithm
 | 
					    """amplifer selection algorithm
 | 
				
			||||||
    @Orange Jean-Luc Augé
 | 
					    @Orange Jean-Luc Augé
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
@@ -53,15 +63,8 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
 | 
				
			|||||||
    # power attribut include power AND gain limitations
 | 
					    # power attribut include power AND gain limitations
 | 
				
			||||||
    edfa_list = [Edfa_list(
 | 
					    edfa_list = [Edfa_list(
 | 
				
			||||||
        variety=edfa_variety,
 | 
					        variety=edfa_variety,
 | 
				
			||||||
        power=min(
 | 
					        power=min(pin + edfa.gain_flatmax + TARGET_EXTENDED_GAIN, edfa.p_max) - power_target,
 | 
				
			||||||
            pin
 | 
					        gain_min=gain_target + 3 - edfa.gain_min,
 | 
				
			||||||
            + edfa.gain_flatmax
 | 
					 | 
				
			||||||
            + TARGET_EXTENDED_GAIN,
 | 
					 | 
				
			||||||
            edfa.p_max
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        - power_target,
 | 
					 | 
				
			||||||
        gain_min=gain_target + 3
 | 
					 | 
				
			||||||
        - edfa.gain_min,
 | 
					 | 
				
			||||||
        nf=edfa_nf(gain_target, edfa_variety, equipment))
 | 
					        nf=edfa_nf(gain_target, edfa_variety, equipment))
 | 
				
			||||||
        for edfa_variety, edfa in edfa_dict.items()
 | 
					        for edfa_variety, edfa in edfa_dict.items()
 | 
				
			||||||
        if ((edfa.allowed_for_design or restrictions is not None) and not edfa.raman)]
 | 
					        if ((edfa.allowed_for_design or restrictions is not None) and not edfa.raman)]
 | 
				
			||||||
@@ -70,15 +73,8 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
 | 
				
			|||||||
    # do not allow extended gain min for Raman
 | 
					    # do not allow extended gain min for Raman
 | 
				
			||||||
    raman_list = [Edfa_list(
 | 
					    raman_list = [Edfa_list(
 | 
				
			||||||
        variety=edfa_variety,
 | 
					        variety=edfa_variety,
 | 
				
			||||||
        power=min(
 | 
					        power=min(pin + edfa.gain_flatmax + TARGET_EXTENDED_GAIN, edfa.p_max) - power_target,
 | 
				
			||||||
            pin
 | 
					        gain_min=gain_target - edfa.gain_min,
 | 
				
			||||||
            + edfa.gain_flatmax
 | 
					 | 
				
			||||||
            + TARGET_EXTENDED_GAIN,
 | 
					 | 
				
			||||||
            edfa.p_max
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        - power_target,
 | 
					 | 
				
			||||||
        gain_min=gain_target
 | 
					 | 
				
			||||||
        - edfa.gain_min,
 | 
					 | 
				
			||||||
        nf=edfa_nf(gain_target, edfa_variety, equipment))
 | 
					        nf=edfa_nf(gain_target, edfa_variety, equipment))
 | 
				
			||||||
        for edfa_variety, edfa in edfa_dict.items()
 | 
					        for edfa_variety, edfa in edfa_dict.items()
 | 
				
			||||||
        if (edfa.allowed_for_design and edfa.raman)] \
 | 
					        if (edfa.allowed_for_design and edfa.raman)] \
 | 
				
			||||||
@@ -102,10 +98,10 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
 | 
				
			|||||||
                    please increase span fiber padding')
 | 
					                    please increase span fiber padding')
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            # TODO: convert to logging
 | 
					            # TODO: convert to logging
 | 
				
			||||||
            print(
 | 
					            if verbose:
 | 
				
			||||||
                f'{ansi_escapes.red}WARNING:{ansi_escapes.reset} target gain in node {uid} is below all available amplifiers min gain: \
 | 
					                logger.warning(f'\n\tWARNING: target gain in node {uid} is below all available amplifiers min gain: '
 | 
				
			||||||
                  amplifier input padding will be assumed, consider increase span fiber padding instead'
 | 
					                               + '\n\tamplifier input padding will be assumed, consider increase span fiber padding '
 | 
				
			||||||
            )
 | 
					                               + 'instead.\n')
 | 
				
			||||||
            acceptable_gain_min_list = edfa_list
 | 
					            acceptable_gain_min_list = edfa_list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # filter on gain+power limitation:
 | 
					    # filter on gain+power limitation:
 | 
				
			||||||
@@ -125,33 +121,34 @@ def select_edfa(raman_allowed, gain_target, power_target, equipment, uid, restri
 | 
				
			|||||||
    #       =>chose the amp with the best NF among the acceptable ones:
 | 
					    #       =>chose the amp with the best NF among the acceptable ones:
 | 
				
			||||||
    selected_edfa = min(acceptable_power_list, key=attrgetter('nf'))  # filter on NF
 | 
					    selected_edfa = min(acceptable_power_list, key=attrgetter('nf'))  # filter on NF
 | 
				
			||||||
    # check what are the gain and power limitations of this amp
 | 
					    # check what are the gain and power limitations of this amp
 | 
				
			||||||
    power_reduction = round(min(selected_edfa.power, 0), 2)
 | 
					    power_reduction = min(selected_edfa.power, 0)
 | 
				
			||||||
    if power_reduction < -0.5:
 | 
					    if power_reduction < -0.5 and verbose:
 | 
				
			||||||
        print(
 | 
					        logger.warning(f'\n\tWARNING: target gain and power in node {uid}\n'
 | 
				
			||||||
            f'{ansi_escapes.red}WARNING:{ansi_escapes.reset} target gain and power in node {uid}\n \
 | 
					                       + '\tis beyond all available amplifiers capabilities and/or extended_gain_range:\n'
 | 
				
			||||||
    is beyond all available amplifiers capabilities and/or extended_gain_range:\n\
 | 
					                       + f'\ta power reduction of {round(power_reduction, 2)} is applied\n')
 | 
				
			||||||
    a power reduction of {power_reduction} is applied\n'
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return selected_edfa.variety, power_reduction
 | 
					    return selected_edfa.variety, power_reduction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def target_power(network, node, equipment):  # get_fiber_dp
 | 
					def target_power(network, node, equipment):  # get_fiber_dp
 | 
				
			||||||
 | 
					    """Computes target power using J. -L. Auge, V. Curri and E. Le Rouzic,
 | 
				
			||||||
 | 
					    Open Design for Multi-Vendor Optical Networks, OFC 2019.
 | 
				
			||||||
 | 
					    equation 4
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    if isinstance(node, elements.Roadm):
 | 
					    if isinstance(node, elements.Roadm):
 | 
				
			||||||
        return 0
 | 
					        return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SPAN_LOSS_REF = 20
 | 
					    SPAN_LOSS_REF = 20
 | 
				
			||||||
    POWER_SLOPE = 0.3
 | 
					    POWER_SLOPE = 0.3
 | 
				
			||||||
    dp_range = list(equipment['Span']['default'].delta_power_range_db)
 | 
					    dp_range = list(equipment['Span']['default'].delta_power_range_db)
 | 
				
			||||||
    node_loss = span_loss(network, node)
 | 
					    node_loss = span_loss(network, node, equipment)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        dp = round2float((node_loss - SPAN_LOSS_REF) * POWER_SLOPE, dp_range[2])
 | 
					        dp = round2float((node_loss - SPAN_LOSS_REF) * POWER_SLOPE, dp_range[2])
 | 
				
			||||||
        dp = max(dp_range[0], dp)
 | 
					        dp = max(dp_range[0], dp)
 | 
				
			||||||
        dp = min(dp_range[1], dp)
 | 
					        dp = min(dp_range[1], dp)
 | 
				
			||||||
    except IndexError:
 | 
					    except IndexError:
 | 
				
			||||||
        raise ConfigurationError(f'invalid delta_power_range_db definition in eqpt_config[Span]'
 | 
					        raise ConfigurationError('invalid delta_power_range_db definition in eqpt_config[Span]'
 | 
				
			||||||
                                 f'delta_power_range_db: [lower_bound, upper_bound, step]')
 | 
					                                 'delta_power_range_db: [lower_bound, upper_bound, step]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return dp
 | 
					    return dp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,12 +187,64 @@ def next_node_generator(network, node):
 | 
				
			|||||||
        yield from next_node_generator(network, next_node)
 | 
					        yield from next_node_generator(network, next_node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def span_loss(network, node):
 | 
					def estimate_raman_gain(node, equipment):
 | 
				
			||||||
 | 
					    """If node is RamanFiber, then estimate the possible Raman gain if any
 | 
				
			||||||
 | 
					    for this purpose propagate a fake signal in a copy.
 | 
				
			||||||
 | 
					    to be accurate the nb of channel should be the same as in SI, but this increases computation time
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    f_min = equipment['SI']['default'].f_min
 | 
				
			||||||
 | 
					    f_max = equipment['SI']['default'].f_max
 | 
				
			||||||
 | 
					    roll_off = equipment['SI']['default'].roll_off
 | 
				
			||||||
 | 
					    baud_rate = equipment['SI']['default'].baud_rate
 | 
				
			||||||
 | 
					    power_dbm = equipment['SI']['default'].power_dbm
 | 
				
			||||||
 | 
					    power = dbm2watt(equipment['SI']['default'].power_dbm)
 | 
				
			||||||
 | 
					    spacing = equipment['SI']['default'].spacing
 | 
				
			||||||
 | 
					    tx_osnr = equipment['SI']['default'].tx_osnr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sim_params = {
 | 
				
			||||||
 | 
					        "raman_params": {
 | 
				
			||||||
 | 
					            "flag": True,
 | 
				
			||||||
 | 
					            "result_spatial_resolution": 10e3,
 | 
				
			||||||
 | 
					            "solver_spatial_resolution": 50
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "nli_params": {
 | 
				
			||||||
 | 
					            "method": "ggn_spectrally_separated",
 | 
				
			||||||
 | 
					            "dispersion_tolerance": 1,
 | 
				
			||||||
 | 
					            "phase_shift_tolerance": 0.1,
 | 
				
			||||||
 | 
					            "computed_channels": [1, 18, 37, 56, 75]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if isinstance(node, elements.RamanFiber):
 | 
				
			||||||
 | 
					        # in order to take into account gain generated in RamanFiber, propagate in the RamanFiber with
 | 
				
			||||||
 | 
					        # SI reference channel.
 | 
				
			||||||
 | 
					        spectral_info_input = create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=roll_off,
 | 
				
			||||||
 | 
					                                                                baud_rate=baud_rate, power=power, spacing=spacing,
 | 
				
			||||||
 | 
					                                                                tx_osnr=tx_osnr)
 | 
				
			||||||
 | 
					        n_copy = deepcopy(node)
 | 
				
			||||||
 | 
					        # need to set ref_pch_in_dbm in order to correctly run propagate of the element, because this
 | 
				
			||||||
 | 
					        # setting has not yet been done by autodesign
 | 
				
			||||||
 | 
					        n_copy.ref_pch_in_dbm = power_dbm
 | 
				
			||||||
 | 
					        SimParams.set_params(sim_params)
 | 
				
			||||||
 | 
					        pin = watt2dbm(sum(spectral_info_input.signal))
 | 
				
			||||||
 | 
					        spectral_info_out = n_copy(spectral_info_input)
 | 
				
			||||||
 | 
					        pout = watt2dbm(sum(spectral_info_out.signal))
 | 
				
			||||||
 | 
					        estimated_gain = pout - pin + node.loss
 | 
				
			||||||
 | 
					        return round(estimated_gain, 2)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return 0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def span_loss(network, node, equipment):
 | 
				
			||||||
    """Total loss of a span (Fiber and Fused nodes) which contains the given node"""
 | 
					    """Total loss of a span (Fiber and Fused nodes) which contains the given node"""
 | 
				
			||||||
    loss = node.loss if node.passive else 0
 | 
					    loss = node.loss if node.passive else 0
 | 
				
			||||||
    loss += sum(n.loss for n in prev_node_generator(network, node))
 | 
					    loss += sum(n.loss for n in prev_node_generator(network, node))
 | 
				
			||||||
    loss += sum(n.loss for n in next_node_generator(network, node))
 | 
					    loss += sum(n.loss for n in next_node_generator(network, node))
 | 
				
			||||||
    return loss
 | 
					    # add the possible Raman gain
 | 
				
			||||||
 | 
					    gain = estimate_raman_gain(node, equipment)
 | 
				
			||||||
 | 
					    gain += sum(estimate_raman_gain(n, equipment) for n in prev_node_generator(network, node))
 | 
				
			||||||
 | 
					    gain += sum(estimate_raman_gain(n, equipment) for n in next_node_generator(network, node))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return loss - gain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def find_first_node(network, node):
 | 
					def find_first_node(network, node):
 | 
				
			||||||
@@ -232,46 +281,46 @@ def set_amplifier_voa(amp, power_target, power_mode):
 | 
				
			|||||||
        amp.out_voa = voa
 | 
					        amp.out_voa = voa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_db):
 | 
					def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_db, verbose):
 | 
				
			||||||
    """ this node can be a transceiver or a ROADM (same function called in both cases)
 | 
					    """This node can be a transceiver or a ROADM (same function called in both cases).
 | 
				
			||||||
 | 
					    go through each link staring from this_node until next Roadm or Transceiver and
 | 
				
			||||||
 | 
					    set gain and delta_p according to configurations set by user.
 | 
				
			||||||
 | 
					    power_mode = True, set amplifiers delta_p and effective_gain
 | 
				
			||||||
 | 
					    power_mode = False, set amplifiers effective_gain and ignore delta_p config: set it to None
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    power_mode = equipment['Span']['default'].power_mode
 | 
					    power_mode = equipment['Span']['default'].power_mode
 | 
				
			||||||
    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)
 | 
					            # for the time being use the same power for the target of roadms and for transceivers
 | 
				
			||||||
        #     next_node = next(n for n in network.successors(node))
 | 
					            # TODO: This should be changed when introducing a power parameter dedicated to transceivers
 | 
				
			||||||
        #     next_node = find_last_node(next_node)
 | 
					            this_node_out_power = pref_ch_db
 | 
				
			||||||
        if node.uid not in this_node_degree:
 | 
					        if isinstance(this_node, elements.Roadm):
 | 
				
			||||||
            # if no target power is defined on this degree or no per degree target power is given use the global one
 | 
					            # get target power out from ROADM for the reference carrier based on equalization settings
 | 
				
			||||||
            # if target_pch_out_db  is not an attribute, then the element must be a transceiver
 | 
					            this_node_out_power = this_node.get_per_degree_ref_power(degree=node.uid)
 | 
				
			||||||
            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
 | 
				
			||||||
        visited_nodes = []
 | 
					        visited_nodes = []
 | 
				
			||||||
        while not (isinstance(node, elements.Roadm) or isinstance(node, elements.Transceiver)):
 | 
					        while not (isinstance(node, elements.Roadm) or isinstance(node, elements.Transceiver)):
 | 
				
			||||||
            # go through all nodes in the OMS (loop until next Roadm instance)
 | 
					            # go through all nodes in the OMS (loop until next Roadm instance)
 | 
				
			||||||
            try:
 | 
					            next_node = get_next_node(node, network)
 | 
				
			||||||
                next_node = next(network.successors(node))
 | 
					 | 
				
			||||||
            except StopIteration:
 | 
					 | 
				
			||||||
                raise NetworkTopologyError(f'{type(node).__name__} {node.uid} is not properly connected, please check network topology')
 | 
					 | 
				
			||||||
            visited_nodes.append(node)
 | 
					            visited_nodes.append(node)
 | 
				
			||||||
            if next_node in visited_nodes:
 | 
					            if next_node in visited_nodes:
 | 
				
			||||||
                raise NetworkTopologyError(f'Loop detected for {type(node).__name__} {node.uid}, please check network topology')
 | 
					                raise NetworkTopologyError(f'Loop detected for {type(node).__name__} {node.uid}, '
 | 
				
			||||||
 | 
					                                           + 'please check network topology')
 | 
				
			||||||
            if isinstance(node, elements.Edfa):
 | 
					            if isinstance(node, elements.Edfa):
 | 
				
			||||||
                node_loss = span_loss(network, prev_node)
 | 
					                node_loss = span_loss(network, prev_node, equipment)
 | 
				
			||||||
                voa = node.out_voa if node.out_voa else 0
 | 
					                voa = node.out_voa if node.out_voa else 0
 | 
				
			||||||
                if node.delta_p is None:
 | 
					                if node.operational.delta_p is None:
 | 
				
			||||||
                    dp = target_power(network, next_node, equipment) + voa
 | 
					                    dp = target_power(network, next_node, equipment) + voa
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    dp = node.delta_p
 | 
					                    dp = node.operational.delta_p
 | 
				
			||||||
                if node.effective_gain is None or power_mode:
 | 
					                if node.effective_gain is None or power_mode:
 | 
				
			||||||
                    gain_target = node_loss + dp - prev_dp + prev_voa
 | 
					                    gain_target = node_loss + dp - prev_dp + prev_voa
 | 
				
			||||||
                else:  # gain mode with effective_gain
 | 
					                else:  # gain mode with effective_gain
 | 
				
			||||||
@@ -282,8 +331,8 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                if isinstance(prev_node, elements.Fiber):
 | 
					                if isinstance(prev_node, elements.Fiber):
 | 
				
			||||||
                    max_fiber_lineic_loss_for_raman = \
 | 
					                    max_fiber_lineic_loss_for_raman = \
 | 
				
			||||||
                        equipment['Span']['default'].max_fiber_lineic_loss_for_raman
 | 
					                        equipment['Span']['default'].max_fiber_lineic_loss_for_raman * 1e-3  # dB/m
 | 
				
			||||||
                    raman_allowed = prev_node.params.loss_coef < max_fiber_lineic_loss_for_raman
 | 
					                    raman_allowed = (prev_node.params.loss_coef < max_fiber_lineic_loss_for_raman).all()
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    raman_allowed = False
 | 
					                    raman_allowed = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -298,48 +347,189 @@ def set_egress_amplifier(network, this_node, equipment, pref_ch_db, pref_total_d
 | 
				
			|||||||
                        restrictions = next_node.restrictions['preamp_variety_list']
 | 
					                        restrictions = next_node.restrictions['preamp_variety_list']
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        restrictions = None
 | 
					                        restrictions = None
 | 
				
			||||||
                    edfa_variety, power_reduction = select_edfa(raman_allowed, gain_target, power_target, equipment, node.uid, restrictions)
 | 
					                    edfa_variety, power_reduction = select_edfa(raman_allowed, gain_target, power_target, equipment,
 | 
				
			||||||
 | 
					                                                                node.uid, restrictions, verbose)
 | 
				
			||||||
                    extra_params = equipment['Edfa'][edfa_variety]
 | 
					                    extra_params = equipment['Edfa'][edfa_variety]
 | 
				
			||||||
                    node.params.update_params(extra_params.__dict__)
 | 
					                    node.params.update_params(extra_params.__dict__)
 | 
				
			||||||
                    dp += power_reduction
 | 
					                    dp += power_reduction
 | 
				
			||||||
                    gain_target += power_reduction
 | 
					                    gain_target += power_reduction
 | 
				
			||||||
                elif node.params.raman and not raman_allowed:
 | 
					 | 
				
			||||||
                    print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: raman is used in node {node.uid}\n but fiber lineic loss is above threshold\n')
 | 
					 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
 | 
					                    # Check power saturation also in this case
 | 
				
			||||||
 | 
					                    p_max = equipment['Edfa'][node.params.type_variety].p_max
 | 
				
			||||||
 | 
					                    if power_mode:
 | 
				
			||||||
 | 
					                        power_reduction = min(0, p_max - (pref_total_db + dp))
 | 
				
			||||||
 | 
					                    else:
 | 
				
			||||||
 | 
					                        pout = pref_total_db + prev_dp - node_loss - prev_voa + gain_target
 | 
				
			||||||
 | 
					                        power_reduction = min(0, p_max - pout)
 | 
				
			||||||
 | 
					                    dp += power_reduction
 | 
				
			||||||
 | 
					                    gain_target += power_reduction
 | 
				
			||||||
 | 
					                    if node.params.raman and not raman_allowed:
 | 
				
			||||||
 | 
					                        if isinstance(prev_node, elements.Fiber):
 | 
				
			||||||
 | 
					                            logger.warning(f'\n\tWARNING: raman is used in node {node.uid}\n '
 | 
				
			||||||
 | 
					                                           + '\tbut fiber lineic loss is above threshold\n')
 | 
				
			||||||
 | 
					                        else:
 | 
				
			||||||
 | 
					                            logger.critical(f'\n\tWARNING: raman is used in node {node.uid}\n '
 | 
				
			||||||
 | 
					                                            + '\tbut previous node is not a fiber\n')
 | 
				
			||||||
                    # if variety is imposed by user, and if the gain_target (computed or imposed) is also above
 | 
					                    # if variety is imposed by user, and if the gain_target (computed or imposed) is also above
 | 
				
			||||||
                    # variety max gain + extended range, then warn that gain > max_gain + extended range
 | 
					                    # variety max gain + extended range, then warn that gain > max_gain + extended range
 | 
				
			||||||
                    if gain_target - equipment['Edfa'][node.params.type_variety].gain_flatmax - \
 | 
					                    if gain_target - equipment['Edfa'][node.params.type_variety].gain_flatmax - \
 | 
				
			||||||
                            equipment['Span']['default'].target_extended_gain > 1e-2:
 | 
					                            equipment['Span']['default'].target_extended_gain > 1e-2 and verbose:
 | 
				
			||||||
                        # 1e-2 to allow a small margin according to round2float min step
 | 
					                        # 1e-2 to allow a small margin according to round2float min step
 | 
				
			||||||
                        print(f'{ansi_escapes.red}WARNING{ansi_escapes.reset}: '
 | 
					                        logger.warning(f'\n\tWARNING: effective gain in Node {node.uid}\n'
 | 
				
			||||||
                              f'WARNING: effective gain in Node {node.uid} is above user '
 | 
					                                       + f'\tis above user specified amplifier {node.params.type_variety}\n'
 | 
				
			||||||
                              f'specified amplifier {node.params.type_variety}\n'
 | 
					                                       + '\tmax flat gain: '
 | 
				
			||||||
                              f'max flat gain: {equipment["Edfa"][node.params.type_variety].gain_flatmax}dB ; '
 | 
					                                       + f'{equipment["Edfa"][node.params.type_variety].gain_flatmax}dB ; '
 | 
				
			||||||
                              f'required gain: {gain_target}dB. Please check amplifier type.')
 | 
					                                       + f'required gain: {round(gain_target, 2)}dB. Please check amplifier type.\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                node.delta_p = dp if power_mode else None
 | 
					                node.delta_p = dp if power_mode else None
 | 
				
			||||||
                node.effective_gain = gain_target
 | 
					                node.effective_gain = gain_target
 | 
				
			||||||
 | 
					                # if voa is not set, then set it and possibly optimize it with gain and update delta_p and
 | 
				
			||||||
 | 
					                # effective_gain values
 | 
				
			||||||
                set_amplifier_voa(node, power_target, power_mode)
 | 
					                set_amplifier_voa(node, power_target, power_mode)
 | 
				
			||||||
 | 
					                # set_amplifier_voa may change delta_p in power_mode
 | 
				
			||||||
 | 
					                node._delta_p = node.delta_p if power_mode else dp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # target_pch_out_dbm records target power for design: If user defines one, then this is displayed,
 | 
				
			||||||
 | 
					                # else display the one computed during design
 | 
				
			||||||
 | 
					                if node.delta_p is not None and node.operational.delta_p is not None:
 | 
				
			||||||
 | 
					                    # use the user defined target
 | 
				
			||||||
 | 
					                    node.target_pch_out_dbm = round(node.operational.delta_p + pref_ch_db, 2)
 | 
				
			||||||
 | 
					                elif node.delta_p is not None:
 | 
				
			||||||
 | 
					                    # use the design target if no target were set
 | 
				
			||||||
 | 
					                    node.target_pch_out_dbm = round(node.delta_p + pref_ch_db, 2)
 | 
				
			||||||
 | 
					                elif node.delta_p is None:
 | 
				
			||||||
 | 
					                    node.target_pch_out_dbm = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            prev_dp = dp
 | 
					            prev_dp = dp
 | 
				
			||||||
            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_ref_carrier(roadm, equipment):
 | 
				
			||||||
 | 
					    """ref_carrier records carrier information used for design and usefull for equalization
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    roadm.ref_carrier = ReferenceCarrier(baud_rate=equipment['SI']['default'].baud_rate,
 | 
				
			||||||
 | 
					                                         slot_width=equipment['SI']['default'].spacing)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def set_roadm_per_degree_targets(roadm, network):
 | 
				
			||||||
 | 
					    """Set target powers/PSD on all degrees
 | 
				
			||||||
 | 
					    This is needed to populate per_degree_pch_out_dbm or per_degree_pch_psd or per_degree_pch_psw dicts when
 | 
				
			||||||
 | 
					    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 set_roadm_input_powers(network, roadm, equipment, pref_ch_db):
 | 
				
			||||||
 | 
					    """Set reference powers at ROADM input for a reference channel and based on the adjacent OMS.
 | 
				
			||||||
 | 
					    This supposes that there is no dependency on path. For example, the succession:
 | 
				
			||||||
 | 
					    node                             power out of element
 | 
				
			||||||
 | 
					    roadm A (target power -10dBm)   -10dBm
 | 
				
			||||||
 | 
					    fiber A (16 dB loss)            -26dBm
 | 
				
			||||||
 | 
					    roadm B (target power -12dBm)   -26dBm
 | 
				
			||||||
 | 
					    fiber B (10 dB loss)            -36dBm
 | 
				
			||||||
 | 
					    roadm C (target power -14dBm)   -36dBm
 | 
				
			||||||
 | 
					    is not consistent because target powers in roadm B and roadm C can not be met.
 | 
				
			||||||
 | 
					    input power for the reference channel will be set -26 dBm in roadm B and -22dBm in roadm C,
 | 
				
			||||||
 | 
					    because at design time we can not know about path.
 | 
				
			||||||
 | 
					    The function raises a warning if target powers can not be met with the design.
 | 
				
			||||||
 | 
					    User should be aware that design was not successfull and that power reduction was applied.
 | 
				
			||||||
 | 
					    Note that this value is only used for visualisation purpose (to compute ROADM loss in elements).
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    previous_elements = [n for n in network.predecessors(roadm)]
 | 
				
			||||||
 | 
					    roadm.ref_pch_in_dbm = {}
 | 
				
			||||||
 | 
					    for element in previous_elements:
 | 
				
			||||||
 | 
					        node = element
 | 
				
			||||||
 | 
					        loss = 0.0
 | 
				
			||||||
 | 
					        while isinstance(node, (elements.Fiber, elements.Fused, elements.RamanFiber)):
 | 
				
			||||||
 | 
					            # go through all predecessors until a power target is found either in an amplifier, a ROADM or a transceiver
 | 
				
			||||||
 | 
					            # then deduce power at ROADM input from this degree based on this target and crossed losses
 | 
				
			||||||
 | 
					            loss += node.loss
 | 
				
			||||||
 | 
					            previous_node = node
 | 
				
			||||||
 | 
					            node = next(network.predecessors(node))
 | 
				
			||||||
 | 
					        if isinstance(node, elements.Edfa):
 | 
				
			||||||
 | 
					            roadm.ref_pch_in_dbm[element.uid] = pref_ch_db + node._delta_p - node.out_voa - loss
 | 
				
			||||||
 | 
					        elif isinstance(node, elements.Roadm):
 | 
				
			||||||
 | 
					            roadm.ref_pch_in_dbm[element.uid] = \
 | 
				
			||||||
 | 
					                node.get_per_degree_ref_power(degree=previous_node.uid) - loss
 | 
				
			||||||
 | 
					        elif isinstance(node, elements.Transceiver):
 | 
				
			||||||
 | 
					            roadm.ref_pch_in_dbm[element.uid] = pref_ch_db - loss
 | 
				
			||||||
 | 
					    # check if target power can be met
 | 
				
			||||||
 | 
					    temp = []
 | 
				
			||||||
 | 
					    if roadm.per_degree_pch_out_dbm:
 | 
				
			||||||
 | 
					        temp.append(max([p for p in roadm.per_degree_pch_out_dbm.values()]))
 | 
				
			||||||
 | 
					    if roadm.per_degree_pch_psd:
 | 
				
			||||||
 | 
					        temp.append(max([psd2powerdbm(p, roadm.ref_carrier.baud_rate) for p in roadm.per_degree_pch_psd.values()]))
 | 
				
			||||||
 | 
					    if roadm.per_degree_pch_psw:
 | 
				
			||||||
 | 
					        temp.append(max([psd2powerdbm(p, roadm.ref_carrier.slot_width) for p in roadm.per_degree_pch_psw.values()]))
 | 
				
			||||||
 | 
					    if roadm.params.target_pch_out_db:
 | 
				
			||||||
 | 
					        temp.append(roadm.params.target_pch_out_db)
 | 
				
			||||||
 | 
					    if roadm.params.target_psd_out_mWperGHz:
 | 
				
			||||||
 | 
					        temp.append(psd2powerdbm(roadm.params.target_psd_out_mWperGHz, roadm.ref_carrier.baud_rate))
 | 
				
			||||||
 | 
					    if roadm.params.target_out_mWperSlotWidth:
 | 
				
			||||||
 | 
					        temp.append(psd2powerdbm(roadm.params.target_out_mWperSlotWidth, roadm.ref_carrier.slot_width))
 | 
				
			||||||
 | 
					    if not temp:
 | 
				
			||||||
 | 
					        raise ConfigurationError(f'Could not find target power/PSD/PSW in ROADM "{roadm.uid}"')
 | 
				
			||||||
 | 
					    target_to_be_supported = max(temp)
 | 
				
			||||||
 | 
					    for from_degree, in_power in roadm.ref_pch_in_dbm.items():
 | 
				
			||||||
 | 
					        if in_power < target_to_be_supported:
 | 
				
			||||||
 | 
					            logger.warning(
 | 
				
			||||||
 | 
					                f'WARNING: maximum target power {target_to_be_supported}dBm '
 | 
				
			||||||
 | 
					                + f'in ROADM "{roadm.uid}" can not be met for at least one crossing path. Min input power '
 | 
				
			||||||
 | 
					                + f'from "{from_degree}" direction is {round(in_power, 2)}dBm. Please correct input topology.'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def set_fiber_input_power(network, fiber, equipment, pref_ch_db):
 | 
				
			||||||
 | 
					    """Set reference powers at fiber input for a reference channel.
 | 
				
			||||||
 | 
					    Supposes that target power out of ROADMs and amplifiers are consistent.
 | 
				
			||||||
 | 
					    This is only for visualisation purpose
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    loss = 0.0
 | 
				
			||||||
 | 
					    node = next(network.predecessors(fiber))
 | 
				
			||||||
 | 
					    while isinstance(node, elements.Fused):
 | 
				
			||||||
 | 
					        loss += node.loss
 | 
				
			||||||
 | 
					        previous_node = node
 | 
				
			||||||
 | 
					        node = next(network.predecessors(node))
 | 
				
			||||||
 | 
					    if isinstance(node, (elements.Fiber, elements.RamanFiber)) and node.ref_pch_in_dbm is not None:
 | 
				
			||||||
 | 
					        fiber.ref_pch_in_dbm = node.ref_pch_in_dbm - loss - node.loss
 | 
				
			||||||
 | 
					    if isinstance(node, (elements.Fiber, elements.RamanFiber)) and node.ref_pch_in_dbm is None:
 | 
				
			||||||
 | 
					        set_fiber_input_power(network, node, equipment, pref_ch_db)
 | 
				
			||||||
 | 
					        fiber.ref_pch_in_dbm = node.ref_pch_in_dbm - loss - node.loss
 | 
				
			||||||
 | 
					    elif isinstance(node, elements.Roadm):
 | 
				
			||||||
 | 
					        fiber.ref_pch_in_dbm = \
 | 
				
			||||||
 | 
					            node.get_per_degree_ref_power(degree=previous_node.uid) - loss
 | 
				
			||||||
 | 
					    elif isinstance(node, elements.Edfa):
 | 
				
			||||||
 | 
					        fiber.ref_pch_in_dbm = pref_ch_db + node._delta_p - node.out_voa - loss
 | 
				
			||||||
 | 
					    elif isinstance(node, elements.Transceiver):
 | 
				
			||||||
 | 
					        fiber.ref_pch_in_dbm = pref_ch_db - loss
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def add_roadm_booster(network, roadm):
 | 
					def add_roadm_booster(network, roadm):
 | 
				
			||||||
    next_nodes = [n for n in network.successors(roadm)
 | 
					    next_nodes = [n for n in network.successors(roadm)
 | 
				
			||||||
                  if not (isinstance(n, elements.Transceiver) or isinstance(n, elements.Fused) or isinstance(n, elements.Edfa))]
 | 
					                  if not (isinstance(n, elements.Transceiver) or isinstance(n, elements.Fused)
 | 
				
			||||||
 | 
					                  or isinstance(n, elements.Edfa))]
 | 
				
			||||||
    # no amplification for fused spans or TRX
 | 
					    # no amplification for fused spans or TRX
 | 
				
			||||||
    for next_node in next_nodes:
 | 
					    for next_node in next_nodes:
 | 
				
			||||||
        network.remove_edge(roadm, next_node)
 | 
					        network.remove_edge(roadm, next_node)
 | 
				
			||||||
        amp = elements.Edfa(
 | 
					        amp = elements.Edfa(
 | 
				
			||||||
            uid=f'Edfa_booster_{roadm.uid}_to_{next_node.uid}',
 | 
					            uid=f'Edfa_booster_{roadm.uid}_to_{next_node.uid}',
 | 
				
			||||||
            params={},
 | 
					            params=json_io.Amp.default_values,
 | 
				
			||||||
            metadata={
 | 
					            metadata={
 | 
				
			||||||
                'location': {
 | 
					                'location': {
 | 
				
			||||||
                    'latitude': roadm.lat,
 | 
					                    'latitude': roadm.lat,
 | 
				
			||||||
@@ -365,7 +555,7 @@ def add_roadm_preamp(network, roadm):
 | 
				
			|||||||
        network.remove_edge(prev_node, roadm)
 | 
					        network.remove_edge(prev_node, roadm)
 | 
				
			||||||
        amp = elements.Edfa(
 | 
					        amp = elements.Edfa(
 | 
				
			||||||
            uid=f'Edfa_preamp_{roadm.uid}_from_{prev_node.uid}',
 | 
					            uid=f'Edfa_preamp_{roadm.uid}_from_{prev_node.uid}',
 | 
				
			||||||
            params={},
 | 
					            params=json_io.Amp.default_values,
 | 
				
			||||||
            metadata={
 | 
					            metadata={
 | 
				
			||||||
                'location': {
 | 
					                'location': {
 | 
				
			||||||
                    'latitude': roadm.lat,
 | 
					                    'latitude': roadm.lat,
 | 
				
			||||||
@@ -388,13 +578,13 @@ def add_roadm_preamp(network, roadm):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def add_inline_amplifier(network, fiber):
 | 
					def add_inline_amplifier(network, fiber):
 | 
				
			||||||
    next_node = next(network.successors(fiber))
 | 
					    next_node = get_next_node(fiber, network)
 | 
				
			||||||
    if isinstance(next_node, elements.Fiber) or isinstance(next_node, elements.RamanFiber):
 | 
					    if isinstance(next_node, elements.Fiber) or isinstance(next_node, elements.RamanFiber):
 | 
				
			||||||
        # no amplification for fused spans or TRX
 | 
					        # no amplification for fused spans or TRX
 | 
				
			||||||
        network.remove_edge(fiber, next_node)
 | 
					        network.remove_edge(fiber, next_node)
 | 
				
			||||||
        amp = elements.Edfa(
 | 
					        amp = elements.Edfa(
 | 
				
			||||||
            uid=f'Edfa_{fiber.uid}',
 | 
					            uid=f'Edfa_{fiber.uid}',
 | 
				
			||||||
            params={},
 | 
					            params=json_io.Amp.default_values,
 | 
				
			||||||
            metadata={
 | 
					            metadata={
 | 
				
			||||||
                'location': {
 | 
					                'location': {
 | 
				
			||||||
                    'latitude': (fiber.lat + next_node.lat) / 2,
 | 
					                    'latitude': (fiber.lat + next_node.lat) / 2,
 | 
				
			||||||
@@ -413,6 +603,9 @@ def add_inline_amplifier(network, fiber):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def calculate_new_length(fiber_length, bounds, target_length):
 | 
					def calculate_new_length(fiber_length, bounds, target_length):
 | 
				
			||||||
 | 
					    """If fiber is over boundary, then assume this is a link "intent" and computes the set of
 | 
				
			||||||
 | 
					    identical fiber spans this link should be composed of.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    if fiber_length < bounds.stop:
 | 
					    if fiber_length < bounds.stop:
 | 
				
			||||||
        return fiber_length, 1
 | 
					        return fiber_length, 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -426,13 +619,27 @@ 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 get_next_node(node, network):
 | 
				
			||||||
 | 
					    """get_next node else raise tha appropriate error
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        next_node = next(network.successors(node))
 | 
				
			||||||
 | 
					        return next_node
 | 
				
			||||||
 | 
					    except StopIteration:
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(
 | 
				
			||||||
 | 
					            f'{type(node).__name__} {node.uid} is not properly connected, please check network topology')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def split_fiber(network, fiber, bounds, target_length):
 | 
				
			||||||
 | 
					    """If fiber length exceeds boundary then assume this is a link "intent", and replace this one-span link
 | 
				
			||||||
 | 
					    with an n_spans link, with identical fiber types.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    new_length, n_spans = calculate_new_length(fiber.params.length, bounds, target_length)
 | 
					    new_length, n_spans = calculate_new_length(fiber.params.length, bounds, target_length)
 | 
				
			||||||
    if n_spans == 1:
 | 
					    if n_spans == 1:
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
@@ -475,11 +682,10 @@ def split_fiber(network, fiber, bounds, target_length, equipment):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def add_connector_loss(network, fibers, default_con_in, default_con_out, EOL):
 | 
					def add_connector_loss(network, fibers, default_con_in, default_con_out, EOL):
 | 
				
			||||||
 | 
					    """Add default connector loss if no loss are defined. EOL repair margin is added as a connector loss
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    for fiber in fibers:
 | 
					    for fiber in fibers:
 | 
				
			||||||
        try:
 | 
					        next_node = get_next_node(fiber, network)
 | 
				
			||||||
            next_node = next(network.successors(fiber))
 | 
					 | 
				
			||||||
        except StopIteration:
 | 
					 | 
				
			||||||
            raise NetworkTopologyError(f'Fiber {fiber.uid} is not properly connected, please check network topology')
 | 
					 | 
				
			||||||
        if fiber.params.con_in is None:
 | 
					        if fiber.params.con_in is None:
 | 
				
			||||||
            fiber.params.con_in = default_con_in
 | 
					            fiber.params.con_in = default_con_in
 | 
				
			||||||
        if fiber.params.con_out is None:
 | 
					        if fiber.params.con_out is None:
 | 
				
			||||||
@@ -488,19 +694,14 @@ def add_connector_loss(network, fibers, default_con_in, default_con_out, EOL):
 | 
				
			|||||||
            fiber.params.con_out += EOL
 | 
					            fiber.params.con_out += EOL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def add_fiber_padding(network, fibers, padding):
 | 
					def add_fiber_padding(network, fibers, padding, equipment):
 | 
				
			||||||
    """last_fibers = (fiber for n in network.nodes()
 | 
					    """Add a padding att_in at the input of the 1st fiber of a succession of fibers and fused
 | 
				
			||||||
                         if not (isinstance(n, elements.Fiber) or isinstance(n, elements.Fused))
 | 
					    """
 | 
				
			||||||
                         for fiber in network.predecessors(n)
 | 
					 | 
				
			||||||
                         if isinstance(fiber, elements.Fiber))"""
 | 
					 | 
				
			||||||
    for fiber in fibers:
 | 
					    for fiber in fibers:
 | 
				
			||||||
        try:
 | 
					        next_node = get_next_node(fiber, network)
 | 
				
			||||||
            next_node = next(network.successors(fiber))
 | 
					 | 
				
			||||||
        except StopIteration:
 | 
					 | 
				
			||||||
            raise NetworkTopologyError(f'Fiber {fiber.uid} is not properly connected, please check network topology')
 | 
					 | 
				
			||||||
        if isinstance(next_node, elements.Fused):
 | 
					        if isinstance(next_node, elements.Fused):
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
        this_span_loss = span_loss(network, fiber)
 | 
					        this_span_loss = span_loss(network, fiber, equipment)
 | 
				
			||||||
        if this_span_loss < padding:
 | 
					        if this_span_loss < padding:
 | 
				
			||||||
            # add a padding att_in at the input of the 1st fiber:
 | 
					            # add a padding att_in at the input of the 1st fiber:
 | 
				
			||||||
            # address the case when several fibers are spliced together
 | 
					            # address the case when several fibers are spliced together
 | 
				
			||||||
@@ -511,39 +712,65 @@ def add_fiber_padding(network, fibers, padding):
 | 
				
			|||||||
                first_fiber.params.att_in = first_fiber.params.att_in + padding - this_span_loss
 | 
					                first_fiber.params.att_in = first_fiber.params.att_in + padding - this_span_loss
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def build_network(network, equipment, pref_ch_db, pref_total_db, no_insert_edfas=False):
 | 
					def add_missing_elements_in_network(network, equipment):
 | 
				
			||||||
 | 
					    """Autodesign network: add missing elements. split fibers if their length is too big
 | 
				
			||||||
 | 
					    add ROADM preamp or booster and inline amplifiers between fibers
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    default_span_data = equipment['Span']['default']
 | 
					    default_span_data = equipment['Span']['default']
 | 
				
			||||||
    max_length = int(convert_length(default_span_data.max_length, default_span_data.length_units))
 | 
					    max_length = int(convert_length(default_span_data.max_length, default_span_data.length_units))
 | 
				
			||||||
    min_length = max(int(default_span_data.padding / 0.2 * 1e3), 50_000)
 | 
					    min_length = max(int(default_span_data.padding / 0.2 * 1e3), 50_000)
 | 
				
			||||||
    bounds = range(min_length, max_length)
 | 
					    bounds = range(min_length, max_length)
 | 
				
			||||||
    target_length = max(min_length, min(max_length, 90_000))
 | 
					    target_length = max(min_length, min(max_length, 90_000))
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # set roadm loss for gain_mode before to build network
 | 
					 | 
				
			||||||
    fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
 | 
					    fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
 | 
				
			||||||
    add_connector_loss(network, fibers, default_span_data.con_in, default_span_data.con_out, default_span_data.EOL)
 | 
					 | 
				
			||||||
    add_fiber_padding(network, fibers, default_span_data.padding)
 | 
					 | 
				
			||||||
    # don't group split fiber and add amp in the same loop
 | 
					 | 
				
			||||||
    # =>for code clarity (at the expense of speed):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    roadms = [r for r in network.nodes() if isinstance(r, elements.Roadm)]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if not no_insert_edfas:
 | 
					 | 
				
			||||||
    for fiber in fibers:
 | 
					    for fiber in fibers:
 | 
				
			||||||
            split_fiber(network, fiber, bounds, target_length, equipment)
 | 
					        split_fiber(network, fiber, bounds, target_length)
 | 
				
			||||||
 | 
					    roadms = [r for r in network.nodes() if isinstance(r, elements.Roadm)]
 | 
				
			||||||
    for roadm in roadms:
 | 
					    for roadm in roadms:
 | 
				
			||||||
        add_roadm_preamp(network, roadm)
 | 
					        add_roadm_preamp(network, roadm)
 | 
				
			||||||
        add_roadm_booster(network, roadm)
 | 
					        add_roadm_booster(network, roadm)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
 | 
					    fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
 | 
				
			||||||
    for fiber in fibers:
 | 
					    for fiber in fibers:
 | 
				
			||||||
        add_inline_amplifier(network, fiber)
 | 
					        add_inline_amplifier(network, fiber)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for roadm in roadms:
 | 
					 | 
				
			||||||
        set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trx = [t for t in network.nodes() if isinstance(t, elements.Transceiver)]
 | 
					def add_missing_fiber_attributes(network, equipment):
 | 
				
			||||||
    for t in trx:
 | 
					    """Fill in connector loss with default values. Add the padding loss is required.
 | 
				
			||||||
        next_node = next(network.successors(t), None)
 | 
					    EOL is added as a connector loss
 | 
				
			||||||
        if next_node and not isinstance(next_node, elements.Roadm):
 | 
					    """
 | 
				
			||||||
            set_egress_amplifier(network, t, equipment, 0, pref_total_db)
 | 
					    default_span_data = equipment['Span']['default']
 | 
				
			||||||
 | 
					    fibers = [f for f in network.nodes() if isinstance(f, elements.Fiber)]
 | 
				
			||||||
 | 
					    add_connector_loss(network, fibers, default_span_data.con_in, default_span_data.con_out, default_span_data.EOL)
 | 
				
			||||||
 | 
					    # don't group split fiber and add amp in the same loop
 | 
				
			||||||
 | 
					    # =>for code clarity (at the expense of speed):
 | 
				
			||||||
 | 
					    add_fiber_padding(network, fibers, default_span_data.padding, equipment)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def build_network(network, equipment, pref_ch_db, pref_total_db, set_connector_losses=True, verbose=True):
 | 
				
			||||||
 | 
					    """Set roadm equalization target and amplifier gain and power
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    roadms = [r for r in network.nodes() if isinstance(r, elements.Roadm)]
 | 
				
			||||||
 | 
					    transceivers = [t for t in network.nodes() if isinstance(t, elements.Transceiver)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if set_connector_losses:
 | 
				
			||||||
 | 
					        add_missing_fiber_attributes(network, equipment)
 | 
				
			||||||
 | 
					    # set roadm equalization targets first
 | 
				
			||||||
 | 
					    for roadm in roadms:
 | 
				
			||||||
 | 
					        set_roadm_ref_carrier(roadm, equipment)
 | 
				
			||||||
 | 
					        set_roadm_per_degree_targets(roadm, network)
 | 
				
			||||||
 | 
					    # then set amplifiers gain, delta_p and out_voa on each OMS
 | 
				
			||||||
 | 
					    for roadm in roadms + transceivers:
 | 
				
			||||||
 | 
					        set_egress_amplifier(network, roadm, equipment, pref_ch_db, pref_total_db, verbose)
 | 
				
			||||||
 | 
					    for roadm in roadms:
 | 
				
			||||||
 | 
					        set_roadm_input_powers(network, roadm, equipment, pref_ch_db)
 | 
				
			||||||
 | 
					    for fiber in [f for f in network.nodes() if isinstance(f, (elements.Fiber, elements.RamanFiber))]:
 | 
				
			||||||
 | 
					        set_fiber_input_power(network, fiber, equipment, pref_ch_db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def design_network(reference_channel, network, equipment, set_connector_losses=True, verbose=True):
 | 
				
			||||||
 | 
					    """Network is designed according to reference channel. Verbose indicate if the function should
 | 
				
			||||||
 | 
					    print all warnings or not
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    pref_ch_db = watt2dbm(reference_channel.power)  # reference channel power
 | 
				
			||||||
 | 
					    pref_total_db = pref_ch_db + lin2db(reference_channel.nb_channel)  # reference total power
 | 
				
			||||||
 | 
					    build_network(network, equipment, pref_ch_db, pref_total_db, set_connector_losses=set_connector_losses,
 | 
				
			||||||
 | 
					                  verbose=verbose)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,12 @@ gnpy.core.parameters
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This module contains all parameters to configure standard network elements.
 | 
					This module contains all parameters to configure standard network elements.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from scipy.constants import c, pi
 | 
					from scipy.constants import c, pi
 | 
				
			||||||
from numpy import squeeze, log10, exp
 | 
					from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from gnpy.core.utils import db2lin, convert_length
 | 
					from gnpy.core.utils import convert_length
 | 
				
			||||||
from gnpy.core.exceptions import ParametersError
 | 
					from gnpy.core.exceptions import ParametersError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,110 +29,128 @@ class Parameters:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class PumpParams(Parameters):
 | 
					class PumpParams(Parameters):
 | 
				
			||||||
    def __init__(self, power, frequency, propagation_direction):
 | 
					    def __init__(self, power, frequency, propagation_direction):
 | 
				
			||||||
        self._power = power
 | 
					        self.power = power
 | 
				
			||||||
        self._frequency = frequency
 | 
					        self.frequency = frequency
 | 
				
			||||||
        self._propagation_direction = propagation_direction
 | 
					        self.propagation_direction = propagation_direction.lower()
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def power(self):
 | 
					 | 
				
			||||||
        return self._power
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def frequency(self):
 | 
					 | 
				
			||||||
        return self._frequency
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def propagation_direction(self):
 | 
					 | 
				
			||||||
        return self._propagation_direction
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RamanParams(Parameters):
 | 
					class RamanParams(Parameters):
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50):
 | 
				
			||||||
        self._flag_raman = kwargs['flag_raman']
 | 
					        """Simulation parameters used within the Raman Solver
 | 
				
			||||||
        self._space_resolution = kwargs['space_resolution'] if 'space_resolution' in kwargs else None
 | 
					 | 
				
			||||||
        self._tolerance = kwargs['tolerance'] if 'tolerance' in kwargs else None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					        :params flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position
 | 
				
			||||||
    def flag_raman(self):
 | 
					        :params result_spatial_resolution: spatial resolution of the evaluated Raman power profile
 | 
				
			||||||
        return self._flag_raman
 | 
					        :params solver_spatial_resolution: spatial step for the iterative solution of the first order ode
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
    @property
 | 
					        self.flag = flag
 | 
				
			||||||
    def space_resolution(self):
 | 
					        self.result_spatial_resolution = result_spatial_resolution  # [m]
 | 
				
			||||||
        return self._space_resolution
 | 
					        self.solver_spatial_resolution = solver_spatial_resolution  # [m]
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def tolerance(self):
 | 
					 | 
				
			||||||
        return self._tolerance
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class NLIParams(Parameters):
 | 
					class NLIParams(Parameters):
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1,
 | 
				
			||||||
        self._nli_method_name = kwargs['nli_method_name']
 | 
					                 computed_channels=None):
 | 
				
			||||||
        self._wdm_grid_size = kwargs['wdm_grid_size']
 | 
					        """Simulation parameters used within the Nli Solver
 | 
				
			||||||
        self._dispersion_tolerance = kwargs['dispersion_tolerance']
 | 
					 | 
				
			||||||
        self._phase_shift_tolerance = kwargs['phase_shift_tolerance']
 | 
					 | 
				
			||||||
        self._f_cut_resolution = None
 | 
					 | 
				
			||||||
        self._f_pump_resolution = None
 | 
					 | 
				
			||||||
        self._computed_channels = kwargs['computed_channels'] if 'computed_channels' in kwargs else None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					        :params method: formula for NLI calculation
 | 
				
			||||||
    def nli_method_name(self):
 | 
					        :params dispersion_tolerance: tuning parameter for ggn model solution
 | 
				
			||||||
        return self._nli_method_name
 | 
					        :params phase_shift_tolerance: tuning parameter for ggn model solution
 | 
				
			||||||
 | 
					        :params computed_channels: the NLI is evaluated for these channels and extrapolated for the others
 | 
				
			||||||
    @property
 | 
					        """
 | 
				
			||||||
    def wdm_grid_size(self):
 | 
					        self.method = method.lower()
 | 
				
			||||||
        return self._wdm_grid_size
 | 
					        self.dispersion_tolerance = dispersion_tolerance
 | 
				
			||||||
 | 
					        self.phase_shift_tolerance = phase_shift_tolerance
 | 
				
			||||||
    @property
 | 
					        self.computed_channels = computed_channels
 | 
				
			||||||
    def dispersion_tolerance(self):
 | 
					 | 
				
			||||||
        return self._dispersion_tolerance
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def phase_shift_tolerance(self):
 | 
					 | 
				
			||||||
        return self._phase_shift_tolerance
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def f_cut_resolution(self):
 | 
					 | 
				
			||||||
        return self._f_cut_resolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @f_cut_resolution.setter
 | 
					 | 
				
			||||||
    def f_cut_resolution(self, f_cut_resolution):
 | 
					 | 
				
			||||||
        self._f_cut_resolution = f_cut_resolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def f_pump_resolution(self):
 | 
					 | 
				
			||||||
        return self._f_pump_resolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @f_pump_resolution.setter
 | 
					 | 
				
			||||||
    def f_pump_resolution(self, f_pump_resolution):
 | 
					 | 
				
			||||||
        self._f_pump_resolution = f_pump_resolution
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def computed_channels(self):
 | 
					 | 
				
			||||||
        return self._computed_channels
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SimParams(Parameters):
 | 
					class SimParams(Parameters):
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    _shared_dict = {'nli_params': NLIParams(), 'raman_params': RamanParams()}
 | 
				
			||||||
        try:
 | 
					
 | 
				
			||||||
            if 'nli_parameters' in kwargs:
 | 
					    @classmethod
 | 
				
			||||||
                self._nli_params = NLIParams(**kwargs['nli_parameters'])
 | 
					    def set_params(cls, sim_params):
 | 
				
			||||||
            else:
 | 
					        cls._shared_dict['nli_params'] = NLIParams(**sim_params.get('nli_params', {}))
 | 
				
			||||||
                self._nli_params = None
 | 
					        cls._shared_dict['raman_params'] = RamanParams(**sim_params.get('raman_params', {}))
 | 
				
			||||||
            if 'raman_parameters' in kwargs:
 | 
					 | 
				
			||||||
                self._raman_params = RamanParams(**kwargs['raman_parameters'])
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                self._raman_params = None
 | 
					 | 
				
			||||||
        except KeyError as e:
 | 
					 | 
				
			||||||
            raise ParametersError(f'Simulation parameters must include {e}. Configuration: {kwargs}')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def nli_params(self):
 | 
					    def nli_params(self):
 | 
				
			||||||
        return self._nli_params
 | 
					        return self._shared_dict['nli_params']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def raman_params(self):
 | 
					    def raman_params(self):
 | 
				
			||||||
        return self._raman_params
 | 
					        return self._shared_dict['raman_params']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RoadmParams(Parameters):
 | 
				
			||||||
 | 
					    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:
 | 
				
			||||||
 | 
					            self.add_drop_osnr = kwargs['add_drop_osnr']
 | 
				
			||||||
 | 
					            self.pmd = kwargs['pmd']
 | 
				
			||||||
 | 
					            self.pdl = kwargs['pdl']
 | 
				
			||||||
 | 
					            self.restrictions = kwargs['restrictions']
 | 
				
			||||||
 | 
					        except KeyError as e:
 | 
				
			||||||
 | 
					            raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FusedParams(Parameters):
 | 
				
			||||||
 | 
					    def __init__(self, **kwargs):
 | 
				
			||||||
 | 
					        self.loss = kwargs['loss'] if 'loss' in kwargs else 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFAULT_RAMAN_COEFFICIENT = {
 | 
				
			||||||
 | 
					    # SSMF Raman coefficient profile normalized with respect to the effective area overlap (g0 * A_eff(f_probe, f_pump))
 | 
				
			||||||
 | 
					    'g0': array(
 | 
				
			||||||
 | 
					        [0.00000000e+00, 1.12351610e-05, 3.47838074e-05, 5.79356636e-05, 8.06921680e-05, 9.79845709e-05, 1.10454361e-04,
 | 
				
			||||||
 | 
					         1.18735302e-04, 1.24736889e-04, 1.30110053e-04, 1.41001273e-04, 1.46383247e-04, 1.57011792e-04, 1.70765865e-04,
 | 
				
			||||||
 | 
					         1.88408911e-04, 2.05914127e-04, 2.24074028e-04, 2.47508283e-04, 2.77729174e-04, 3.08044243e-04, 3.34764439e-04,
 | 
				
			||||||
 | 
					         3.56481704e-04, 3.77127256e-04, 3.96269124e-04, 4.10955175e-04, 4.18718761e-04, 4.19511263e-04, 4.17025384e-04,
 | 
				
			||||||
 | 
					         4.13565369e-04, 4.07726048e-04, 3.83671291e-04, 4.08564283e-04, 3.69571936e-04, 3.14442090e-04, 2.16074535e-04,
 | 
				
			||||||
 | 
					         1.23097823e-04, 8.95457457e-05, 7.52470400e-05, 7.19806145e-05, 8.87961158e-05, 9.30812065e-05, 9.37058268e-05,
 | 
				
			||||||
 | 
					         8.45719619e-05, 6.90585286e-05, 4.50407159e-05, 3.36521245e-05, 3.02292475e-05, 2.69376939e-05, 2.60020897e-05,
 | 
				
			||||||
 | 
					         2.82958958e-05, 3.08667558e-05, 3.66024657e-05, 5.80610307e-05, 6.54797937e-05, 6.25022715e-05, 5.37806442e-05,
 | 
				
			||||||
 | 
					         3.94996621e-05, 2.68120644e-05, 2.33038554e-05, 1.79140757e-05, 1.52472424e-05, 1.32707565e-05, 1.06541760e-05,
 | 
				
			||||||
 | 
					         9.84649374e-06, 9.13999627e-06, 9.08971012e-06, 1.04227525e-05, 1.50419271e-05, 1.77838232e-05, 2.15810815e-05,
 | 
				
			||||||
 | 
					         2.03744008e-05, 1.81939341e-05, 1.31862121e-05, 9.65352116e-06, 8.62698322e-06, 9.18688016e-06, 1.01737784e-05,
 | 
				
			||||||
 | 
					         1.08017817e-05, 1.03903588e-05, 9.30040333e-06, 8.30809173e-06, 6.90650401e-06, 5.52238029e-06, 3.90648708e-06,
 | 
				
			||||||
 | 
					         2.22908227e-06, 1.55796177e-06, 9.77218716e-07, 3.23477236e-07, 1.60602454e-07, 7.97306386e-08]
 | 
				
			||||||
 | 
					    ),  # [m/W]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
 | 
				
			||||||
 | 
					    'frequency_offset': array([
 | 
				
			||||||
 | 
					        0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5,
 | 
				
			||||||
 | 
					        12.,
 | 
				
			||||||
 | 
					        12.5, 12.75, 13., 13.25, 13.5, 14., 14.5, 14.75, 15., 15.5, 16., 16.5, 17., 17.5, 18., 18.25, 18.5, 18.75, 19.,
 | 
				
			||||||
 | 
					        19.5, 20., 20.5, 21., 21.5, 22., 22.5, 23., 23.5, 24., 24.5, 25., 25.5, 26., 26.5, 27., 27.5, 28., 28.5, 29.,
 | 
				
			||||||
 | 
					        29.5,
 | 
				
			||||||
 | 
					        30., 30.5, 31., 31.5, 32., 32.5, 33., 33.5, 34., 34.5, 35., 35.5, 36., 36.5, 37., 37.5, 38., 38.5, 39., 39.5,
 | 
				
			||||||
 | 
					        40.,
 | 
				
			||||||
 | 
					        40.5, 41., 41.5, 42.]
 | 
				
			||||||
 | 
					    ) * 1e12,  # [Hz]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Raman profile reference frequency
 | 
				
			||||||
 | 
					    'reference_frequency': 206184634112792  # [Hz] (1454 nm)}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RamanGainCoefficient(namedtuple('RamanGainCoefficient', 'normalized_gamma_raman frequency_offset')):
 | 
				
			||||||
 | 
					    """ Raman Gain Coefficient Parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Based on:
 | 
				
			||||||
 | 
					            Andrea D’Amico, Bruno Correia, Elliot London, Emanuele Virgillito, Giacomo Borraccini, Antonio Napoli,
 | 
				
			||||||
 | 
					            and Vittorio Curri, "Scalable and Disaggregated GGN Approximation Applied to a C+L+S Optical Network,"
 | 
				
			||||||
 | 
					            J. Lightwave Technol. 40, 3499-3511 (2022)
 | 
				
			||||||
 | 
					            Section III.D
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FiberParams(Parameters):
 | 
					class FiberParams(Parameters):
 | 
				
			||||||
@@ -139,45 +158,87 @@ class FiberParams(Parameters):
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            self._length = convert_length(kwargs['length'], kwargs['length_units'])
 | 
					            self._length = convert_length(kwargs['length'], kwargs['length_units'])
 | 
				
			||||||
            # fixed attenuator for padding
 | 
					            # fixed attenuator for padding
 | 
				
			||||||
            self._att_in = kwargs['att_in'] if 'att_in' in kwargs else 0
 | 
					            self._att_in = kwargs.get('att_in', 0)
 | 
				
			||||||
            # if not defined in the network json connector loss in/out
 | 
					            # if not defined in the network json connector loss in/out
 | 
				
			||||||
            # the None value will be updated in network.py[build_network]
 | 
					            # the None value will be updated in network.py[build_network]
 | 
				
			||||||
            # with default values from eqpt_config.json[Spans]
 | 
					            # with default values from eqpt_config.json[Spans]
 | 
				
			||||||
            self._con_in = kwargs['con_in'] if 'con_in' in kwargs else None
 | 
					            self._con_in = kwargs.get('con_in')
 | 
				
			||||||
            self._con_out = kwargs['con_out'] if 'con_out' in kwargs else None
 | 
					            self._con_out = kwargs.get('con_out')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Reference frequency (unique for all parameters: beta2, beta3, gamma, effective_area)
 | 
				
			||||||
            if 'ref_wavelength' in kwargs:
 | 
					            if 'ref_wavelength' in kwargs:
 | 
				
			||||||
                self._ref_wavelength = kwargs['ref_wavelength']
 | 
					                self._ref_wavelength = kwargs['ref_wavelength']
 | 
				
			||||||
                self._ref_frequency = c / self.ref_wavelength
 | 
					                self._ref_frequency = c / self._ref_wavelength
 | 
				
			||||||
            elif 'ref_frequency' in kwargs:
 | 
					            elif 'ref_frequency' in kwargs:
 | 
				
			||||||
                self._ref_frequency = kwargs['ref_frequency']
 | 
					                self._ref_frequency = kwargs['ref_frequency']
 | 
				
			||||||
                self._ref_wavelength = c / self.ref_frequency
 | 
					                self._ref_wavelength = c / self._ref_frequency
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self._ref_wavelength = 1550e-9
 | 
					                self._ref_wavelength = 1550e-9  # conventional central C band wavelength [m]
 | 
				
			||||||
                self._ref_frequency = c / self.ref_wavelength
 | 
					                self._ref_frequency = c / self._ref_wavelength
 | 
				
			||||||
            self._dispersion = kwargs['dispersion']  # s/m/m
 | 
					
 | 
				
			||||||
            self._dispersion_slope = kwargs['dispersion_slope'] if 'dispersion_slope' in kwargs else \
 | 
					            # Chromatic Dispersion
 | 
				
			||||||
                -2 * self._dispersion/self.ref_wavelength  # s/m/m/m
 | 
					            if 'dispersion_per_frequency' in kwargs:
 | 
				
			||||||
            self._beta2 = -(self.ref_wavelength ** 2) * self.dispersion / (2 * pi * c)  # 1/(m * Hz^2)
 | 
					                # Frequency-dependent dispersion
 | 
				
			||||||
            # Eq. (3.23) in  Abramczyk, Halina. "Dispersion phenomena in optical fibers." Virtual European University
 | 
					                self._dispersion = asarray(kwargs['dispersion_per_frequency']['value'])  # s/m/m
 | 
				
			||||||
            # on Lasers. Available online: http://mitr.p.lodz.pl/evu/lectures/Abramczyk3.pdf
 | 
					                self._f_dispersion_ref = asarray(kwargs['dispersion_per_frequency']['frequency'])  # Hz
 | 
				
			||||||
            # (accessed on 25 March 2018) (2005).
 | 
					                self._dispersion_slope = None
 | 
				
			||||||
            self._beta3 = ((self.dispersion_slope - (4*pi*c/self.ref_wavelength**3) * self.beta2) /
 | 
					            elif 'dispersion' in kwargs:
 | 
				
			||||||
                           (2*pi*c/self.ref_wavelength**2)**2)
 | 
					                # Single value dispersion
 | 
				
			||||||
 | 
					                self._dispersion = asarray(kwargs['dispersion'])  # s/m/m
 | 
				
			||||||
 | 
					                self._dispersion_slope = kwargs.get('dispersion_slope')  # s/m/m/m
 | 
				
			||||||
 | 
					                self._f_dispersion_ref = asarray(self._ref_frequency)  # Hz
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # Default single value dispersion
 | 
				
			||||||
 | 
					                self._dispersion = asarray(1.67e-05)  # s/m/m
 | 
				
			||||||
 | 
					                self._dispersion_slope = None
 | 
				
			||||||
 | 
					                self._f_dispersion_ref = asarray(self.ref_frequency)  # Hz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Effective Area and Nonlinear Coefficient
 | 
				
			||||||
 | 
					            self._effective_area = kwargs.get('effective_area')  # m^2
 | 
				
			||||||
 | 
					            self._n1 = 1.468
 | 
				
			||||||
 | 
					            self._core_radius = 4.2e-6  # m
 | 
				
			||||||
 | 
					            self._n2 = 2.6e-20  # m^2/W
 | 
				
			||||||
 | 
					            if self._effective_area is not None:
 | 
				
			||||||
 | 
					                default_gamma = 2 * pi * self._n2 / (self._ref_wavelength * self._effective_area)
 | 
				
			||||||
 | 
					                self._gamma = kwargs.get('gamma', default_gamma)  # 1/W/m
 | 
				
			||||||
 | 
					            elif 'gamma' in kwargs:
 | 
				
			||||||
                self._gamma = kwargs['gamma']  # 1/W/m
 | 
					                self._gamma = kwargs['gamma']  # 1/W/m
 | 
				
			||||||
            self._pmd_coef = kwargs['pmd_coef']  # s/sqrt(m)
 | 
					                self._effective_area = 2 * pi * self._n2 / (self._ref_wavelength * self._gamma)  # m^2
 | 
				
			||||||
            if type(kwargs['loss_coef']) == dict:
 | 
					 | 
				
			||||||
                self._loss_coef = squeeze(kwargs['loss_coef']['loss_coef_power']) * 1e-3  # lineic loss dB/m
 | 
					 | 
				
			||||||
                self._f_loss_ref = squeeze(kwargs['loss_coef']['frequency'])  # Hz
 | 
					 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                self._loss_coef = kwargs['loss_coef'] * 1e-3  # lineic loss dB/m
 | 
					                self._effective_area = 83e-12  # m^2
 | 
				
			||||||
                self._f_loss_ref = 193.5e12  # Hz
 | 
					                self._gamma = 2 * pi * self._n2 / (self._ref_wavelength * self._effective_area)  # 1/W/m
 | 
				
			||||||
            self._lin_attenuation = db2lin(self.length * self.loss_coef)
 | 
					            self._contrast = 0.5 * (c / (2 * pi * self._ref_frequency * self._core_radius * self._n1) * exp(
 | 
				
			||||||
            self._lin_loss_exp = self.loss_coef / (10 * log10(exp(1)))  # linear power exponent loss Neper/m
 | 
					                pi * self._core_radius ** 2 / self._effective_area)) ** 2
 | 
				
			||||||
            self._effective_length = (1 - exp(- self.lin_loss_exp * self.length)) / self.lin_loss_exp
 | 
					
 | 
				
			||||||
            self._asymptotic_length = 1 / self.lin_loss_exp
 | 
					            # Raman Gain Coefficient
 | 
				
			||||||
            # raman parameters (not compulsory)
 | 
					            raman_coefficient = kwargs.get('raman_coefficient', DEFAULT_RAMAN_COEFFICIENT)
 | 
				
			||||||
            self._raman_efficiency = kwargs['raman_efficiency'] if 'raman_efficiency' in kwargs else None
 | 
					            self._g0 = asarray(raman_coefficient['g0'])
 | 
				
			||||||
            self._pumps_loss_coef = kwargs['pumps_loss_coef'] if 'pumps_loss_coef' in kwargs else None
 | 
					            raman_reference_frequency = raman_coefficient['reference_frequency']
 | 
				
			||||||
 | 
					            frequency_offset = asarray(raman_coefficient['frequency_offset'])
 | 
				
			||||||
 | 
					            stokes_wave = raman_reference_frequency - frequency_offset
 | 
				
			||||||
 | 
					            gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, raman_reference_frequency)
 | 
				
			||||||
 | 
					            normalized_gamma_raman = gamma_raman / raman_reference_frequency  # 1 / m / W / Hz
 | 
				
			||||||
 | 
					            self._raman_reference_frequency = raman_reference_frequency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Raman gain coefficient array of the frequency offset constructed such that positive frequency values
 | 
				
			||||||
 | 
					            # represent a positive power transfer from higher frequency and vice versa
 | 
				
			||||||
 | 
					            frequency_offset = append(-flip(frequency_offset[1:]), frequency_offset)
 | 
				
			||||||
 | 
					            normalized_gamma_raman = append(- flip(normalized_gamma_raman[1:]), normalized_gamma_raman)
 | 
				
			||||||
 | 
					            self._raman_coefficient = RamanGainCoefficient(normalized_gamma_raman, frequency_offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Polarization Mode Dispersion
 | 
				
			||||||
 | 
					            self._pmd_coef = kwargs['pmd_coef']  # s/sqrt(m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Loss Coefficient
 | 
				
			||||||
 | 
					            if isinstance(kwargs['loss_coef'], dict):
 | 
				
			||||||
 | 
					                self._loss_coef = asarray(kwargs['loss_coef']['value']) * 1e-3  # lineic loss dB/m
 | 
				
			||||||
 | 
					                self._f_loss_ref = asarray(kwargs['loss_coef']['frequency'])  # Hz
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self._loss_coef = asarray(kwargs['loss_coef']) * 1e-3  # lineic loss dB/m
 | 
				
			||||||
 | 
					                self._f_loss_ref = asarray(self._ref_frequency)  # Hz
 | 
				
			||||||
 | 
					            # Lumped Losses
 | 
				
			||||||
 | 
					            self._lumped_losses = kwargs['lumped_losses'] if 'lumped_losses' in kwargs else array([])
 | 
				
			||||||
 | 
					            self._latency = self._length / (c / self._n1)  # s
 | 
				
			||||||
        except KeyError as e:
 | 
					        except KeyError as e:
 | 
				
			||||||
            raise ParametersError(f'Fiber configurations json must include {e}. Configuration: {kwargs}')
 | 
					            raise ParametersError(f'Fiber configurations json must include {e}. Configuration: {kwargs}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -210,6 +271,10 @@ class FiberParams(Parameters):
 | 
				
			|||||||
    def con_out(self):
 | 
					    def con_out(self):
 | 
				
			||||||
        return self._con_out
 | 
					        return self._con_out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def lumped_losses(self):
 | 
				
			||||||
 | 
					        return self._lumped_losses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @con_out.setter
 | 
					    @con_out.setter
 | 
				
			||||||
    def con_out(self, con_out):
 | 
					    def con_out(self, con_out):
 | 
				
			||||||
        self._con_out = con_out
 | 
					        self._con_out = con_out
 | 
				
			||||||
@@ -218,6 +283,10 @@ class FiberParams(Parameters):
 | 
				
			|||||||
    def dispersion(self):
 | 
					    def dispersion(self):
 | 
				
			||||||
        return self._dispersion
 | 
					        return self._dispersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def f_dispersion_ref(self):
 | 
				
			||||||
 | 
					        return self._f_dispersion_ref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def dispersion_slope(self):
 | 
					    def dispersion_slope(self):
 | 
				
			||||||
        return self._dispersion_slope
 | 
					        return self._dispersion_slope
 | 
				
			||||||
@@ -226,6 +295,20 @@ class FiberParams(Parameters):
 | 
				
			|||||||
    def gamma(self):
 | 
					    def gamma(self):
 | 
				
			||||||
        return self._gamma
 | 
					        return self._gamma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def effective_area_scaling(self, frequency):
 | 
				
			||||||
 | 
					        V = 2 * pi * frequency / c * self._core_radius * self._n1 * sqrt(2 * self._contrast)
 | 
				
			||||||
 | 
					        w = self._core_radius / sqrt(log(V))
 | 
				
			||||||
 | 
					        return asarray(pi * w ** 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def effective_area_overlap(self, frequency_stokes_wave, frequency_pump):
 | 
				
			||||||
 | 
					        effective_area_stokes_wave = self.effective_area_scaling(frequency_stokes_wave)
 | 
				
			||||||
 | 
					        effective_area_pump = self.effective_area_scaling(frequency_pump)
 | 
				
			||||||
 | 
					        return squeeze(outer(effective_area_stokes_wave, ones(effective_area_pump.size)) + outer(
 | 
				
			||||||
 | 
					            ones(effective_area_stokes_wave.size), effective_area_pump)) / 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def gamma_scaling(self, frequency):
 | 
				
			||||||
 | 
					        return asarray(2 * pi * self._n2 * frequency / (c * self.effective_area_scaling(frequency)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def pmd_coef(self):
 | 
					    def pmd_coef(self):
 | 
				
			||||||
        return self._pmd_coef
 | 
					        return self._pmd_coef
 | 
				
			||||||
@@ -238,14 +321,6 @@ class FiberParams(Parameters):
 | 
				
			|||||||
    def ref_frequency(self):
 | 
					    def ref_frequency(self):
 | 
				
			||||||
        return self._ref_frequency
 | 
					        return self._ref_frequency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def beta2(self):
 | 
					 | 
				
			||||||
        return self._beta2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def beta3(self):
 | 
					 | 
				
			||||||
        return self._beta3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def loss_coef(self):
 | 
					    def loss_coef(self):
 | 
				
			||||||
        return self._loss_coef
 | 
					        return self._loss_coef
 | 
				
			||||||
@@ -255,31 +330,148 @@ class FiberParams(Parameters):
 | 
				
			|||||||
        return self._f_loss_ref
 | 
					        return self._f_loss_ref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def lin_loss_exp(self):
 | 
					    def raman_coefficient(self):
 | 
				
			||||||
        return self._lin_loss_exp
 | 
					        return self._raman_coefficient
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def lin_attenuation(self):
 | 
					    def latency(self):
 | 
				
			||||||
        return self._lin_attenuation
 | 
					        return self._latency
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def effective_length(self):
 | 
					 | 
				
			||||||
        return self._effective_length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def asymptotic_length(self):
 | 
					 | 
				
			||||||
        return self._asymptotic_length
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def raman_efficiency(self):
 | 
					 | 
				
			||||||
        return self._raman_efficiency
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def pumps_loss_coef(self):
 | 
					 | 
				
			||||||
        return self._pumps_loss_coef
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def asdict(self):
 | 
					    def asdict(self):
 | 
				
			||||||
        dictionary = super().asdict()
 | 
					        dictionary = super().asdict()
 | 
				
			||||||
        dictionary['loss_coef'] = self.loss_coef * 1e3
 | 
					        dictionary['loss_coef'] = self.loss_coef * 1e3
 | 
				
			||||||
        dictionary['length_units'] = 'm'
 | 
					        dictionary['length_units'] = 'm'
 | 
				
			||||||
 | 
					        if len(self.lumped_losses) == 0:
 | 
				
			||||||
 | 
					            dictionary.pop('lumped_losses')
 | 
				
			||||||
 | 
					        if not self.raman_coefficient:
 | 
				
			||||||
 | 
					            dictionary.pop('raman_coefficient')
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            raman_frequency_offset = \
 | 
				
			||||||
 | 
					                self.raman_coefficient.frequency_offset[self.raman_coefficient.frequency_offset >= 0]
 | 
				
			||||||
 | 
					            dictionary['raman_coefficient'] = {'g0': self._g0.tolist(),
 | 
				
			||||||
 | 
					                                               'frequency_offset': raman_frequency_offset.tolist(),
 | 
				
			||||||
 | 
					                                               'reference_frequency': self._raman_reference_frequency}
 | 
				
			||||||
        return dictionary
 | 
					        return dictionary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EdfaParams:
 | 
				
			||||||
 | 
					    def __init__(self, **params):
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self.type_variety = params['type_variety']
 | 
				
			||||||
 | 
					            self.type_def = params['type_def']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Bandwidth
 | 
				
			||||||
 | 
					            self.f_min = params['f_min']
 | 
				
			||||||
 | 
					            self.f_max = params['f_max']
 | 
				
			||||||
 | 
					            self.bandwidth = self.f_max - self.f_min
 | 
				
			||||||
 | 
					            self.f_cent = (self.f_max + self.f_min) / 2
 | 
				
			||||||
 | 
					            self.f_ripple_ref = params['f_ripple_ref']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Gain
 | 
				
			||||||
 | 
					            self.gain_flatmax = params['gain_flatmax']
 | 
				
			||||||
 | 
					            self.gain_min = params['gain_min']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            gain_ripple = params['gain_ripple']
 | 
				
			||||||
 | 
					            if gain_ripple == 0:
 | 
				
			||||||
 | 
					                self.gain_ripple = asarray([0, 0])
 | 
				
			||||||
 | 
					                self.f_ripple_ref = asarray([self.f_min, self.f_max])
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self.gain_ripple = asarray(gain_ripple)
 | 
				
			||||||
 | 
					                if self.f_ripple_ref is not None:
 | 
				
			||||||
 | 
					                    if (self.f_ripple_ref[0] != self.f_min) or (self.f_ripple_ref[-1] != self.f_max):
 | 
				
			||||||
 | 
					                        raise ParametersError("The reference ripple frequency maximum and minimum have to coincide "
 | 
				
			||||||
 | 
					                                              "with the EDFA frequency maximum and minimum.")
 | 
				
			||||||
 | 
					                    elif self.gain_ripple.size != self.f_ripple_ref.size:
 | 
				
			||||||
 | 
					                        raise ParametersError("The reference ripple frequency and the gain ripple must have the same "
 | 
				
			||||||
 | 
					                                              "size.")
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    self.f_ripple_ref = linspace(self.f_min, self.f_max, self.gain_ripple.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            tilt_ripple = params['tilt_ripple']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if tilt_ripple == 0:
 | 
				
			||||||
 | 
					                self.tilt_ripple = full(self.gain_ripple.size, 0)
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self.tilt_ripple = asarray(tilt_ripple)
 | 
				
			||||||
 | 
					                if self.tilt_ripple.size != self.gain_ripple.size:
 | 
				
			||||||
 | 
					                    raise ParametersError("The tilt ripple and the gain ripple must have the same size.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Power
 | 
				
			||||||
 | 
					            self.p_max = params['p_max']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Noise Figure
 | 
				
			||||||
 | 
					            self.nf_model = params['nf_model']
 | 
				
			||||||
 | 
					            self.nf_min = params['nf_min']
 | 
				
			||||||
 | 
					            self.nf_max = params['nf_max']
 | 
				
			||||||
 | 
					            self.nf_coef = params['nf_coef']
 | 
				
			||||||
 | 
					            self.nf0 = params['nf0']
 | 
				
			||||||
 | 
					            self.nf_fit_coeff = params['nf_fit_coeff']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            nf_ripple = params['nf_ripple']
 | 
				
			||||||
 | 
					            if nf_ripple == 0:
 | 
				
			||||||
 | 
					                self.nf_ripple = full(self.gain_ripple.size, 0)
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self.nf_ripple = asarray(nf_ripple)
 | 
				
			||||||
 | 
					                if self.nf_ripple.size != self.gain_ripple.size:
 | 
				
			||||||
 | 
					                    raise ParametersError("The noise figure ripple and the gain ripple must have the same size.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # VOA
 | 
				
			||||||
 | 
					            self.out_voa_auto = params['out_voa_auto']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Dual Stage
 | 
				
			||||||
 | 
					            self.dual_stage_model = params['dual_stage_model']
 | 
				
			||||||
 | 
					            if self.dual_stage_model is not None:
 | 
				
			||||||
 | 
					                # Preamp
 | 
				
			||||||
 | 
					                self.preamp_variety = params['preamp_variety']
 | 
				
			||||||
 | 
					                self.preamp_type_def = params['preamp_type_def']
 | 
				
			||||||
 | 
					                self.preamp_nf_model = params['preamp_nf_model']
 | 
				
			||||||
 | 
					                self.preamp_nf_fit_coeff = params['preamp_nf_fit_coeff']
 | 
				
			||||||
 | 
					                self.preamp_gain_min = params['preamp_gain_min']
 | 
				
			||||||
 | 
					                self.preamp_gain_flatmax = params['preamp_gain_flatmax']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # Booster
 | 
				
			||||||
 | 
					                self.booster_variety = params['booster_variety']
 | 
				
			||||||
 | 
					                self.booster_type_def = params['booster_type_def']
 | 
				
			||||||
 | 
					                self.booster_nf_model = params['booster_nf_model']
 | 
				
			||||||
 | 
					                self.booster_nf_fit_coeff = params['booster_nf_fit_coeff']
 | 
				
			||||||
 | 
					                self.booster_gain_min = params['booster_gain_min']
 | 
				
			||||||
 | 
					                self.booster_gain_flatmax = params['booster_gain_flatmax']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Others
 | 
				
			||||||
 | 
					            self.pmd = params['pmd']
 | 
				
			||||||
 | 
					            self.pdl = params['pdl']
 | 
				
			||||||
 | 
					            self.raman = params['raman']
 | 
				
			||||||
 | 
					            self.dgt = params['dgt']
 | 
				
			||||||
 | 
					            self.advance_configurations_from_json = params['advance_configurations_from_json']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Design
 | 
				
			||||||
 | 
					            self.allowed_for_design = params['allowed_for_design']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        except KeyError as e:
 | 
				
			||||||
 | 
					            raise ParametersError(f'Edfa configurations json must include {e}. Configuration: {params}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update_params(self, kwargs):
 | 
				
			||||||
 | 
					        for k, v in kwargs.items():
 | 
				
			||||||
 | 
					            setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EdfaOperational:
 | 
				
			||||||
 | 
					    default_values = {
 | 
				
			||||||
 | 
					        'gain_target': None,
 | 
				
			||||||
 | 
					        'delta_p': None,
 | 
				
			||||||
 | 
					        'out_voa': None,
 | 
				
			||||||
 | 
					        'tilt_target': 0
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, **operational):
 | 
				
			||||||
 | 
					        self.update_attr(operational)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update_attr(self, kwargs):
 | 
				
			||||||
 | 
					        clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
 | 
				
			||||||
 | 
					        for k, v in self.default_values.items():
 | 
				
			||||||
 | 
					            setattr(self, k, clean_kwargs.get(k, v))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __repr__(self):
 | 
				
			||||||
 | 
					        return (f'{type(self).__name__}('
 | 
				
			||||||
 | 
					                f'gain_target={self.gain_target!r}, '
 | 
				
			||||||
 | 
					                f'tilt_target={self.tilt_target!r})')
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -9,8 +9,9 @@ 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 copy import deepcopy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from gnpy.core.exceptions import ConfigurationError
 | 
					from gnpy.core.exceptions import ConfigurationError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -106,6 +107,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 +230,31 @@ 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
 | 
				
			||||||
@@ -185,9 +274,9 @@ def deltawl2deltaf(delta_wl, wavelength):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def deltaf2deltawl(delta_f, frequency):
 | 
					def deltaf2deltawl(delta_f, frequency):
 | 
				
			||||||
    """ deltawl2deltaf(delta_f, frequency):
 | 
					    """convert delta frequency to delta wavelength
 | 
				
			||||||
        converts delta frequency to delta wavelength
 | 
					
 | 
				
			||||||
        units for delta_wl and wavelength must be same
 | 
					    Units for delta_wl and wavelength must be same.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param delta_f: delta frequency in same units as frequency
 | 
					    :param delta_f: delta frequency in same units as frequency
 | 
				
			||||||
    :param frequency: frequency BW is relevant for
 | 
					    :param frequency: frequency BW is relevant for
 | 
				
			||||||
@@ -202,8 +291,7 @@ def deltaf2deltawl(delta_f, frequency):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def rrc(ffs, baud_rate, alpha):
 | 
					def rrc(ffs, baud_rate, alpha):
 | 
				
			||||||
    """ rrc(ffs, baud_rate, alpha): computes the root-raised cosine filter
 | 
					    """compute the root-raised cosine filter function
 | 
				
			||||||
    function.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param ffs: A numpy array of frequencies
 | 
					    :param ffs: A numpy array of frequencies
 | 
				
			||||||
    :param baud_rate: The Baud Rate of the System
 | 
					    :param baud_rate: The Baud Rate of the System
 | 
				
			||||||
@@ -229,7 +317,7 @@ def rrc(ffs, baud_rate, alpha):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def merge_amplifier_restrictions(dict1, dict2):
 | 
					def merge_amplifier_restrictions(dict1, dict2):
 | 
				
			||||||
    """Updates contents of dicts recursively
 | 
					    """Update contents of dicts recursively
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    >>> d1 = {'params': {'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []}}}
 | 
					    >>> d1 = {'params': {'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []}}}
 | 
				
			||||||
    >>> d2 = {'params': {'target_pch_out_db': -20}}
 | 
					    >>> d2 = {'params': {'target_pch_out_db': -20}}
 | 
				
			||||||
@@ -324,3 +412,43 @@ def convert_length(value, units):
 | 
				
			|||||||
        return value * 1e3
 | 
					        return value * 1e3
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        raise ConfigurationError(f'Cannot convert length in "{units}" into meters')
 | 
					        raise ConfigurationError(f'Cannot convert length in "{units}" into meters')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def replace_none(dictionary):
 | 
				
			||||||
 | 
					    """ Replaces None with inf values in a frequency slots dict
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    >>> replace_none({'N': 3, 'M': None})
 | 
				
			||||||
 | 
					    {'N': 3, 'M': inf}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    for key, val in dictionary.items():
 | 
				
			||||||
 | 
					        if val is None:
 | 
				
			||||||
 | 
					            dictionary[key] = float('inf')
 | 
				
			||||||
 | 
					        if val == float('inf'):
 | 
				
			||||||
 | 
					            dictionary[key] = None
 | 
				
			||||||
 | 
					    return dictionary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def order_slots(slots):
 | 
				
			||||||
 | 
					    """ Order frequency slots from larger slots to smaller ones up to None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    >>> l = [{'N': 3, 'M': None}, {'N': 2, 'M': 1}, {'N': None, 'M': None},{'N': 7, 'M': 2},{'N': None, 'M': 1} , {'N': None, 'M': 0}]
 | 
				
			||||||
 | 
					    >>> order_slots(l)
 | 
				
			||||||
 | 
					    ([7, 2, None, None, 3, None], [2, 1, 1, 0, None, None], [3, 1, 4, 5, 0, 2])
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    slots_list = deepcopy(slots)
 | 
				
			||||||
 | 
					    slots_list = [replace_none(e) for e in slots_list]
 | 
				
			||||||
 | 
					    for i, e in enumerate(slots_list):
 | 
				
			||||||
 | 
					        e['i'] = i
 | 
				
			||||||
 | 
					    slots_list = sorted(slots_list, key=lambda x: (-x['M'], x['N']) if x['M'] != float('inf') else (x['M'], x['N']))
 | 
				
			||||||
 | 
					    slots_list = [replace_none(e) for e in slots_list]
 | 
				
			||||||
 | 
					    return [e['N'] for e in slots_list], [e['M'] for e in slots_list], [e['i'] for e in slots_list]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def restore_order(elements, order):
 | 
				
			||||||
 | 
					    """ Use order to re-order the element of the list, and ignore None values
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    >>> restore_order([7, 2, None, None, 3, None], [3, 1, 4, 5, 0, 2])
 | 
				
			||||||
 | 
					    [3, 2, 7]
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    return [elements[i[0]] for i in sorted(enumerate(order), key=lambda x:x[1]) if elements[i[0]] is not None]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,8 @@
 | 
				
			|||||||
    "gain_ripple": [
 | 
					    "gain_ripple": [
 | 
				
			||||||
        0.0
 | 
					        0.0
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					    "f_min": 191.35e12,
 | 
				
			||||||
 | 
					    "f_max": 196.1e12,
 | 
				
			||||||
    "dgt": [
 | 
					    "dgt": [
 | 
				
			||||||
        1.0,
 | 
					        1.0,
 | 
				
			||||||
        1.017807767853702,
 | 
					        1.017807767853702,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -180,51 +180,27 @@
 | 
				
			|||||||
      "Fiber":[{
 | 
					      "Fiber":[{
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
            "type_variety": "NZDF",
 | 
					            "type_variety": "NZDF",
 | 
				
			||||||
            "dispersion": 0.5e-05,
 | 
					            "dispersion": 0.5e-05,
 | 
				
			||||||
            "gamma": 0.00146,
 | 
					            "effective_area": 72e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
            "type_variety": "LOF",
 | 
					            "type_variety": "LOF",
 | 
				
			||||||
            "dispersion": 2.2e-05,
 | 
					            "dispersion": 2.2e-05,
 | 
				
			||||||
            "gamma": 0.000843,
 | 
					            "effective_area": 125e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "RamanFiber":[{
 | 
					      "RamanFiber":[{
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15,
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            "raman_efficiency": {
 | 
					 | 
				
			||||||
              "cr":[
 | 
					 | 
				
			||||||
                  0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
 | 
					 | 
				
			||||||
                  0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
 | 
					 | 
				
			||||||
                  0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
 | 
					 | 
				
			||||||
                  0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
 | 
					 | 
				
			||||||
                  7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
 | 
					 | 
				
			||||||
                  2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
 | 
					 | 
				
			||||||
                  2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
 | 
					 | 
				
			||||||
                  1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
 | 
					 | 
				
			||||||
                  1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
 | 
					 | 
				
			||||||
                  2E-07, 1E-07
 | 
					 | 
				
			||||||
              ],
 | 
					 | 
				
			||||||
              "frequency_offset":[
 | 
					 | 
				
			||||||
                0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
 | 
					 | 
				
			||||||
                7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
 | 
					 | 
				
			||||||
                13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
 | 
					 | 
				
			||||||
                17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
 | 
					 | 
				
			||||||
                22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
 | 
					 | 
				
			||||||
                28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
 | 
					 | 
				
			||||||
                35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
 | 
					 | 
				
			||||||
                41.5e12, 42e12
 | 
					 | 
				
			||||||
              ]
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "Span":[{
 | 
					      "Span":[{
 | 
				
			||||||
@@ -245,6 +221,7 @@
 | 
				
			|||||||
            "target_pch_out_db": -20,
 | 
					            "target_pch_out_db": -20,
 | 
				
			||||||
            "add_drop_osnr": 38,
 | 
					            "add_drop_osnr": 38,
 | 
				
			||||||
            "pmd": 0,
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "restrictions": {
 | 
					            "restrictions": {
 | 
				
			||||||
                            "preamp_variety_list":[],
 | 
					                            "preamp_variety_list":[],
 | 
				
			||||||
                            "booster_variety_list":[]
 | 
					                            "booster_variety_list":[]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
{     "Edfa":[
 | 
					{
 | 
				
			||||||
 | 
					    "Edfa": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "openroadm_ila_low_noise",
 | 
					            "type_variety": "openroadm_ila_low_noise",
 | 
				
			||||||
            "type_def": "openroadm",
 | 
					            "type_def": "openroadm",
 | 
				
			||||||
@@ -6,6 +7,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
					            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
				
			||||||
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 0.7,
 | 
				
			||||||
            "allowed_for_design": true
 | 
					            "allowed_for_design": true
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -15,6 +18,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
					            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
				
			||||||
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 0.7,
 | 
				
			||||||
            "allowed_for_design": true
 | 
					            "allowed_for_design": true
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -23,6 +28,8 @@
 | 
				
			|||||||
            "gain_flatmax": 27,
 | 
					            "gain_flatmax": 27,
 | 
				
			||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "allowed_for_design": false
 | 
					            "allowed_for_design": false
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -31,6 +38,8 @@
 | 
				
			|||||||
            "gain_flatmax": 32,
 | 
					            "gain_flatmax": 32,
 | 
				
			||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "allowed_for_design": false
 | 
					            "allowed_for_design": false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
@@ -38,19 +47,19 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "NZDF",
 | 
					            "type_variety": "NZDF",
 | 
				
			||||||
            "dispersion": 0.5e-05,
 | 
					            "dispersion": 0.5e-05,
 | 
				
			||||||
            "gamma": 0.00146,
 | 
					            "effective_area": 72e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "LOF",
 | 
					            "type_variety": "LOF",
 | 
				
			||||||
            "dispersion": 2.2e-05,
 | 
					            "dispersion": 2.2e-05,
 | 
				
			||||||
            "gamma": 0.000843,
 | 
					            "effective_area": 125e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
@@ -58,32 +67,8 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15,
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            "raman_efficiency": {
 | 
					 | 
				
			||||||
              "cr":[
 | 
					 | 
				
			||||||
                  0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
 | 
					 | 
				
			||||||
                  0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
 | 
					 | 
				
			||||||
                  0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
 | 
					 | 
				
			||||||
                  0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
 | 
					 | 
				
			||||||
                  7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
 | 
					 | 
				
			||||||
                  2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
 | 
					 | 
				
			||||||
                  2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
 | 
					 | 
				
			||||||
                  1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
 | 
					 | 
				
			||||||
                  1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
 | 
					 | 
				
			||||||
                  2E-07, 1E-07
 | 
					 | 
				
			||||||
              ],
 | 
					 | 
				
			||||||
              "frequency_offset":[
 | 
					 | 
				
			||||||
                0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
 | 
					 | 
				
			||||||
                7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
 | 
					 | 
				
			||||||
                13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
 | 
					 | 
				
			||||||
                17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
 | 
					 | 
				
			||||||
                22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
 | 
					 | 
				
			||||||
                28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
 | 
					 | 
				
			||||||
                35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
 | 
					 | 
				
			||||||
                41.5e12, 42e12
 | 
					 | 
				
			||||||
              ]
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "Span": [
 | 
					    "Span": [
 | 
				
			||||||
@@ -105,7 +90,8 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "target_pch_out_db": -20,
 | 
					            "target_pch_out_db": -20,
 | 
				
			||||||
            "add_drop_osnr": 30,
 | 
					            "add_drop_osnr": 30,
 | 
				
			||||||
            "pmd": 0,
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 1.5,
 | 
				
			||||||
            "restrictions": {
 | 
					            "restrictions": {
 | 
				
			||||||
                "preamp_variety_list": ["openroadm_mw_mw_preamp"],
 | 
					                "preamp_variety_list": ["openroadm_mw_mw_preamp"],
 | 
				
			||||||
                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
					                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
				
			||||||
@@ -140,6 +126,40 @@
 | 
				
			|||||||
                    "bit_rate": 100e9,
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
                    "roll_off": null,
 | 
					                    "roll_off": null,
 | 
				
			||||||
                    "tx_osnr": 33,
 | 
					                    "tx_osnr": 33,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 18e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 30,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 6,
 | 
				
			||||||
 | 
					                            "penalty_value": 4
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 50e9,
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -150,6 +170,44 @@
 | 
				
			|||||||
                    "bit_rate": 100e9,
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 35,
 | 
					                    "tx_osnr": 35,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 40e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 30,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 6,
 | 
				
			||||||
 | 
					                            "penalty_value": 4
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 50e9,
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -160,6 +218,40 @@
 | 
				
			|||||||
                    "bit_rate": 200e9,
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 24e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 25,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -170,6 +262,40 @@
 | 
				
			|||||||
                    "bit_rate": 300e9,
 | 
					                    "bit_rate": 300e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 18e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 25,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -180,11 +306,44 @@
 | 
				
			|||||||
                    "bit_rate": 400e9,
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 12e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 20,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
{     "Edfa":[
 | 
					{
 | 
				
			||||||
 | 
					    "Edfa": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "openroadm_ila_low_noise",
 | 
					            "type_variety": "openroadm_ila_low_noise",
 | 
				
			||||||
            "type_def": "openroadm",
 | 
					            "type_def": "openroadm",
 | 
				
			||||||
@@ -6,6 +7,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
					            "nf_coef": [-8.104e-4, -6.221e-2, -5.889e-1, 37.62],
 | 
				
			||||||
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 0.7,
 | 
				
			||||||
            "allowed_for_design": true
 | 
					            "allowed_for_design": true
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -15,6 +18,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
					            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
				
			||||||
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 0.7,
 | 
				
			||||||
            "allowed_for_design": true
 | 
					            "allowed_for_design": true
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -24,6 +29,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
					            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 28.99],
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "allowed_for_design": false
 | 
					            "allowed_for_design": false
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -33,6 +40,8 @@
 | 
				
			|||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 27.99],
 | 
					            "nf_coef": [-5.952e-4, -6.250e-2, -1.071, 27.99],
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "allowed_for_design": false
 | 
					            "allowed_for_design": false
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -41,6 +50,8 @@
 | 
				
			|||||||
            "gain_flatmax": 32,
 | 
					            "gain_flatmax": 32,
 | 
				
			||||||
            "gain_min": 0,
 | 
					            "gain_min": 0,
 | 
				
			||||||
            "p_max": 22,
 | 
					            "p_max": 22,
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "allowed_for_design": false
 | 
					            "allowed_for_design": false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
@@ -48,19 +59,19 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "NZDF",
 | 
					            "type_variety": "NZDF",
 | 
				
			||||||
            "dispersion": 0.5e-05,
 | 
					            "dispersion": 0.5e-05,
 | 
				
			||||||
            "gamma": 0.00146,
 | 
					            "effective_area": 72e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "LOF",
 | 
					            "type_variety": "LOF",
 | 
				
			||||||
            "dispersion": 2.2e-05,
 | 
					            "dispersion": 2.2e-05,
 | 
				
			||||||
            "gamma": 0.000843,
 | 
					            "effective_area": 125e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
@@ -68,32 +79,8 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15,
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            "raman_efficiency": {
 | 
					 | 
				
			||||||
              "cr":[
 | 
					 | 
				
			||||||
                  0, 9.4E-06, 2.92E-05, 4.88E-05, 6.82E-05, 8.31E-05, 9.4E-05, 0.0001014, 0.0001069, 0.0001119,
 | 
					 | 
				
			||||||
                  0.0001217, 0.0001268, 0.0001365, 0.000149, 0.000165, 0.000181, 0.0001977, 0.0002192, 0.0002469,
 | 
					 | 
				
			||||||
                  0.0002749, 0.0002999, 0.0003206, 0.0003405, 0.0003592, 0.000374, 0.0003826, 0.0003841, 0.0003826,
 | 
					 | 
				
			||||||
                  0.0003802, 0.0003756, 0.0003549, 0.0003795, 0.000344, 0.0002933, 0.0002024, 0.0001158, 8.46E-05,
 | 
					 | 
				
			||||||
                  7.14E-05, 6.86E-05, 8.5E-05, 8.93E-05, 9.01E-05, 8.15E-05, 6.67E-05, 4.37E-05, 3.28E-05, 2.96E-05,
 | 
					 | 
				
			||||||
                  2.65E-05, 2.57E-05, 2.81E-05, 3.08E-05, 3.67E-05, 5.85E-05, 6.63E-05, 6.36E-05, 5.5E-05, 4.06E-05,
 | 
					 | 
				
			||||||
                  2.77E-05, 2.42E-05, 1.87E-05, 1.6E-05, 1.4E-05, 1.13E-05, 1.05E-05, 9.8E-06, 9.8E-06, 1.13E-05,
 | 
					 | 
				
			||||||
                  1.64E-05, 1.95E-05, 2.38E-05, 2.26E-05, 2.03E-05, 1.48E-05, 1.09E-05, 9.8E-06, 1.05E-05, 1.17E-05,
 | 
					 | 
				
			||||||
                  1.25E-05, 1.21E-05, 1.09E-05, 9.8E-06, 8.2E-06, 6.6E-06, 4.7E-06, 2.7E-06, 1.9E-06, 1.2E-06, 4E-07,
 | 
					 | 
				
			||||||
                  2E-07, 1E-07
 | 
					 | 
				
			||||||
              ],
 | 
					 | 
				
			||||||
              "frequency_offset":[
 | 
					 | 
				
			||||||
                0, 0.5e12, 1e12, 1.5e12, 2e12, 2.5e12, 3e12, 3.5e12, 4e12, 4.5e12, 5e12, 5.5e12, 6e12, 6.5e12, 7e12,
 | 
					 | 
				
			||||||
                7.5e12, 8e12, 8.5e12, 9e12, 9.5e12, 10e12, 10.5e12, 11e12, 11.5e12, 12e12, 12.5e12, 12.75e12,
 | 
					 | 
				
			||||||
                13e12, 13.25e12, 13.5e12, 14e12, 14.5e12, 14.75e12, 15e12, 15.5e12, 16e12, 16.5e12, 17e12,
 | 
					 | 
				
			||||||
                17.5e12, 18e12, 18.25e12, 18.5e12, 18.75e12, 19e12, 19.5e12, 20e12, 20.5e12, 21e12, 21.5e12,
 | 
					 | 
				
			||||||
                22e12, 22.5e12, 23e12, 23.5e12, 24e12, 24.5e12, 25e12, 25.5e12, 26e12, 26.5e12, 27e12, 27.5e12, 28e12,
 | 
					 | 
				
			||||||
                28.5e12, 29e12, 29.5e12, 30e12, 30.5e12, 31e12, 31.5e12, 32e12, 32.5e12, 33e12, 33.5e12, 34e12, 34.5e12,
 | 
					 | 
				
			||||||
                35e12, 35.5e12, 36e12, 36.5e12, 37e12, 37.5e12, 38e12, 38.5e12, 39e12, 39.5e12, 40e12, 40.5e12, 41e12,
 | 
					 | 
				
			||||||
                41.5e12, 42e12
 | 
					 | 
				
			||||||
              ]
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "Span": [
 | 
					    "Span": [
 | 
				
			||||||
@@ -115,7 +102,8 @@
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            "target_pch_out_db": -20,
 | 
					            "target_pch_out_db": -20,
 | 
				
			||||||
            "add_drop_osnr": 33,
 | 
					            "add_drop_osnr": 33,
 | 
				
			||||||
            "pmd": 0,
 | 
					            "pmd": 3e-12,
 | 
				
			||||||
 | 
					            "pdl": 1.5,
 | 
				
			||||||
            "restrictions": {
 | 
					            "restrictions": {
 | 
				
			||||||
                "preamp_variety_list": ["openroadm_mw_mw_preamp_worstcase_ver5"],
 | 
					                "preamp_variety_list": ["openroadm_mw_mw_preamp_worstcase_ver5"],
 | 
				
			||||||
                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
					                "booster_variety_list": ["openroadm_mw_mw_booster"]
 | 
				
			||||||
@@ -150,6 +138,40 @@
 | 
				
			|||||||
                    "bit_rate": 100e9,
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
                    "roll_off": null,
 | 
					                    "roll_off": null,
 | 
				
			||||||
                    "tx_osnr": 33,
 | 
					                    "tx_osnr": 33,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 18e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 30,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 6,
 | 
				
			||||||
 | 
					                            "penalty_value": 4
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 50e9,
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -160,6 +182,44 @@
 | 
				
			|||||||
                    "bit_rate": 100e9,
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 48e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 30,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 6,
 | 
				
			||||||
 | 
					                            "penalty_value": 4
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 50e9,
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -170,6 +230,44 @@
 | 
				
			|||||||
                    "bit_rate": 100e9,
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 24e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 30,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 6,
 | 
				
			||||||
 | 
					                            "penalty_value": 4
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 50e9,
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -180,6 +278,40 @@
 | 
				
			|||||||
                    "bit_rate": 200e9,
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 24e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 25,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -190,6 +322,40 @@
 | 
				
			|||||||
                    "bit_rate": 300e9,
 | 
					                    "bit_rate": 300e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 18e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 25,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
@@ -200,11 +366,44 @@
 | 
				
			|||||||
                    "bit_rate": 400e9,
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
                    "roll_off": 0.15,
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
                    "tx_osnr": 36,
 | 
					                    "tx_osnr": 36,
 | 
				
			||||||
 | 
					                    "penalties": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": -1e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 4e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "chromatic_dispersion": 12e3,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 10,
 | 
				
			||||||
 | 
					                            "penalty_value": 0
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pmd": 20,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 1,
 | 
				
			||||||
 | 
					                            "penalty_value": 0.5
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 2,
 | 
				
			||||||
 | 
					                            "penalty_value": 1
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "pdl": 4,
 | 
				
			||||||
 | 
					                            "penalty_value": 2.5
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
                    "min_spacing": 87.5e9,
 | 
					                    "min_spacing": 87.5e9,
 | 
				
			||||||
                    "cost": 1
 | 
					                    "cost": 1
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -20,12 +20,12 @@
 | 
				
			|||||||
        "temperature": 283,
 | 
					        "temperature": 283,
 | 
				
			||||||
        "raman_pumps": [
 | 
					        "raman_pumps": [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "power": 200e-3,
 | 
					            "power": 224.403e-3,
 | 
				
			||||||
            "frequency": 205e12,
 | 
					            "frequency": 205e12,
 | 
				
			||||||
            "propagation_direction": "counterprop"
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "power": 206e-3,
 | 
					            "power": 231.135e-3,
 | 
				
			||||||
            "frequency": 201e12,
 | 
					            "frequency": 201e12,
 | 
				
			||||||
            "propagation_direction": "counterprop"
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -49,6 +49,21 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "uid": "Fused1",
 | 
				
			||||||
 | 
					      "type": "Fused",
 | 
				
			||||||
 | 
					      "params": {
 | 
				
			||||||
 | 
					        "loss": 0
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "metadata": {
 | 
				
			||||||
 | 
					        "location": {
 | 
				
			||||||
 | 
					          "latitude": 1.5,
 | 
				
			||||||
 | 
					          "longitude": 0,
 | 
				
			||||||
 | 
					          "city": null,
 | 
				
			||||||
 | 
					          "region": ""
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "uid": "Edfa1",
 | 
					      "uid": "Edfa1",
 | 
				
			||||||
      "type": "Edfa",
 | 
					      "type": "Edfa",
 | 
				
			||||||
@@ -88,6 +103,10 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "from_node": "Span1",
 | 
					      "from_node": "Span1",
 | 
				
			||||||
 | 
					      "to_node": "Fused1"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "from_node": "Fused1",
 | 
				
			||||||
      "to_node": "Edfa1"
 | 
					      "to_node": "Edfa1"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "raman_parameters": {
 | 
					  "raman_params": {
 | 
				
			||||||
    "flag_raman": true,
 | 
					    "flag": true,
 | 
				
			||||||
    "space_resolution": 10e3,
 | 
					    "result_spatial_resolution": 10e3,
 | 
				
			||||||
    "tolerance": 1e-8
 | 
					    "solver_spatial_resolution": 50
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "nli_parameters": {
 | 
					  "nli_params": {
 | 
				
			||||||
  	"nli_method_name": "ggn_spectrally_separated",
 | 
					    "method": "ggn_spectrally_separated",
 | 
				
			||||||
  	"wdm_grid_size": 50e9,
 | 
					 | 
				
			||||||
    "dispersion_tolerance": 1,
 | 
					    "dispersion_tolerance": 1,
 | 
				
			||||||
    "phase_shift_tolerance": 0.1,
 | 
					    "phase_shift_tolerance": 0.1,
 | 
				
			||||||
    "computed_channels": [1, 18, 37, 56, 75]
 | 
					    "computed_channels": [1, 18, 37, 56, 75]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
'''
 | 
					"""
 | 
				
			||||||
Processing of data via :py:mod:`.json_io`.
 | 
					Processing of data via :py:mod:`.json_io`.
 | 
				
			||||||
Utilities for Excel conversion in :py:mod:`.convert` and :py:mod:`.service_sheet`.
 | 
					Utilities for Excel conversion in :py:mod:`.convert` and :py:mod:`.service_sheet`.
 | 
				
			||||||
Example code in :py:mod:`.cli_examples` and :py:mod:`.plots`.
 | 
					Example code in :py:mod:`.cli_examples` and :py:mod:`.plots`.
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,35 +1,34 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.tools.cli_examples
 | 
					gnpy.tools.cli_examples
 | 
				
			||||||
=======================
 | 
					=======================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Common code for CLI examples
 | 
					Common code for CLI examples
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os.path
 | 
					 | 
				
			||||||
import sys
 | 
					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
 | 
				
			||||||
import gnpy.core.exceptions as exceptions
 | 
					import gnpy.core.exceptions as exceptions
 | 
				
			||||||
from gnpy.core.network import build_network
 | 
					from gnpy.core.network import add_missing_elements_in_network, design_network
 | 
				
			||||||
from gnpy.core.parameters import SimParams
 | 
					from gnpy.core.parameters import SimParams
 | 
				
			||||||
from gnpy.core.science_utils import Simulation
 | 
					from gnpy.core.utils import db2lin, lin2db, automatic_nch, watt2dbm, dbm2watt
 | 
				
			||||||
from gnpy.core.utils import db2lin, lin2db, automatic_nch
 | 
					 | 
				
			||||||
from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation,
 | 
					from gnpy.topology.request import (ResultElement, jsontocsv, compute_path_dsjctn, requests_aggregation,
 | 
				
			||||||
                                   BLOCKING_NOPATH, correct_json_route_list,
 | 
					                                   BLOCKING_NOPATH, correct_json_route_list,
 | 
				
			||||||
                                   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__)
 | 
				
			||||||
@@ -49,7 +48,7 @@ def show_example_data_dir():
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def load_common_data(equipment_filename, topology_filename, simulation_filename, save_raw_network_filename):
 | 
					def load_common_data(equipment_filename, topology_filename, simulation_filename, save_raw_network_filename):
 | 
				
			||||||
    '''Load common configuration from JSON files'''
 | 
					    """Load common configuration from JSON files"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        equipment = load_equipment(equipment_filename)
 | 
					        equipment = load_equipment(equipment_filename)
 | 
				
			||||||
@@ -57,14 +56,15 @@ def load_common_data(equipment_filename, topology_filename, simulation_filename,
 | 
				
			|||||||
        if save_raw_network_filename is not None:
 | 
					        if save_raw_network_filename is not None:
 | 
				
			||||||
            save_network(network, save_raw_network_filename)
 | 
					            save_network(network, save_raw_network_filename)
 | 
				
			||||||
            print(f'{ansi_escapes.blue}Raw network (no optimizations) saved to {save_raw_network_filename}{ansi_escapes.reset}')
 | 
					            print(f'{ansi_escapes.blue}Raw network (no optimizations) saved to {save_raw_network_filename}{ansi_escapes.reset}')
 | 
				
			||||||
        sim_params = SimParams(**load_json(simulation_filename)) if simulation_filename is not None else None
 | 
					        if not simulation_filename:
 | 
				
			||||||
        if not sim_params:
 | 
					            sim_params = {}
 | 
				
			||||||
            if next((node for node in network if isinstance(node, RamanFiber)), None) is not None:
 | 
					            if next((node for node in network if isinstance(node, RamanFiber)), None) is not None:
 | 
				
			||||||
                print(f'{ansi_escapes.red}Invocation error:{ansi_escapes.reset} '
 | 
					                print(f'{ansi_escapes.red}Invocation error:{ansi_escapes.reset} '
 | 
				
			||||||
                      f'RamanFiber requires passing simulation params via --sim-params')
 | 
					                      f'RamanFiber requires passing simulation params via --sim-params')
 | 
				
			||||||
                sys.exit(1)
 | 
					                sys.exit(1)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            Simulation.set_params(sim_params)
 | 
					            sim_params = load_json(simulation_filename)
 | 
				
			||||||
 | 
					        SimParams.set_params(sim_params)
 | 
				
			||||||
    except exceptions.EquipmentConfigError as e:
 | 
					    except exceptions.EquipmentConfigError as e:
 | 
				
			||||||
        print(f'{ansi_escapes.red}Configuration error in the equipment library:{ansi_escapes.reset} {e}')
 | 
					        print(f'{ansi_escapes.red}Configuration error in the equipment library:{ansi_escapes.reset} {e}')
 | 
				
			||||||
        sys.exit(1)
 | 
					        sys.exit(1)
 | 
				
			||||||
@@ -85,7 +85,7 @@ def load_common_data(equipment_filename, topology_filename, simulation_filename,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _setup_logging(args):
 | 
					def _setup_logging(args):
 | 
				
			||||||
    logging.basicConfig(level={2: logging.DEBUG, 1: logging.INFO, 0: logging.CRITICAL}.get(args.verbose, logging.DEBUG))
 | 
					    logging.basicConfig(level={2: logging.DEBUG, 1: logging.INFO, 0: logging.WARNING}.get(args.verbose, logging.DEBUG))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
 | 
					def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
 | 
				
			||||||
@@ -119,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')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -195,29 +196,38 @@ 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
 | 
				
			||||||
 | 
					    params['nb_channel'] = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
 | 
				
			||||||
 | 
					    # use ref_req to hold reference channel used for design and req for the propagation
 | 
				
			||||||
 | 
					    # and req to hold channels to be propagated
 | 
				
			||||||
 | 
					    # apply power sweep on the design and on the channels
 | 
				
			||||||
 | 
					    ref_req = PathRequest(**params)
 | 
				
			||||||
 | 
					    pref_ch_db = watt2dbm(ref_req.power)
 | 
				
			||||||
 | 
					    if args.spectrum:
 | 
				
			||||||
 | 
					        # use the spectrum defined by user for the propagation.
 | 
				
			||||||
 | 
					        # the nb of channel for design remains the one of the reference channel
 | 
				
			||||||
 | 
					        initial_spectrum = load_initial_spectrum(args.spectrum)
 | 
				
			||||||
 | 
					        params['nb_channel'] = len(initial_spectrum)
 | 
				
			||||||
 | 
					        print('User input for spectrum used for propagation instead of SI')
 | 
				
			||||||
    req = PathRequest(**params)
 | 
					    req = PathRequest(**params)
 | 
				
			||||||
 | 
					    p_ch_db = watt2dbm(req.power)
 | 
				
			||||||
 | 
					    req.initial_spectrum = initial_spectrum
 | 
				
			||||||
 | 
					    print(f'There are {req.nb_channel} 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']))
 | 
					                     '=> it can be modified in eqpt_config.json - Span']))
 | 
				
			||||||
 | 
					    if not args.no_insert_edfas:
 | 
				
			||||||
    pref_ch_db = lin2db(req.power * 1e3)  # reference channel power / span (SL=20dB)
 | 
					 | 
				
			||||||
    pref_total_db = pref_ch_db + lin2db(req.nb_channel)  # reference total power / span (SL=20dB)
 | 
					 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
        build_network(network, equipment, pref_ch_db, pref_total_db, args.no_insert_edfas)
 | 
					            add_missing_elements_in_network(network, equipment)
 | 
				
			||||||
        except exceptions.NetworkTopologyError as e:
 | 
					        except exceptions.NetworkTopologyError as e:
 | 
				
			||||||
            print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
					            print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
				
			||||||
            sys.exit(1)
 | 
					            sys.exit(1)
 | 
				
			||||||
        except exceptions.ConfigurationError as e:
 | 
					        except exceptions.ConfigurationError as e:
 | 
				
			||||||
            print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
					            print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
				
			||||||
            sys.exit(1)
 | 
					            sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    path = compute_constrained_path(network, req)
 | 
					    path = compute_constrained_path(network, req)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)]
 | 
					    spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)]
 | 
				
			||||||
    print(f'\nThere are {len(spans)} fiber spans over {sum(spans)/1000:.0f} km between {source.uid} '
 | 
					 | 
				
			||||||
          f'and {destination.uid}')
 | 
					 | 
				
			||||||
    print(f'\nNow propagating between {source.uid} and {destination.uid}:')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    power_range = [0]
 | 
					    power_range = [0]
 | 
				
			||||||
    if power_mode:
 | 
					    if power_mode:
 | 
				
			||||||
        # power cannot be changed in gain mode
 | 
					        # power cannot be changed in gain mode
 | 
				
			||||||
@@ -227,11 +237,32 @@ 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]')
 | 
				
			||||||
 | 
					    # initial network is designed using req.power. that is that any missing information (amp gain or delta_p) is filled
 | 
				
			||||||
 | 
					    # using this req.power, previous to any sweep requested later on.
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        design_network(ref_req, network, equipment, set_connector_losses=True, verbose=True)
 | 
				
			||||||
 | 
					    except exceptions.NetworkTopologyError as e:
 | 
				
			||||||
 | 
					        print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
				
			||||||
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					    except exceptions.ConfigurationError as e:
 | 
				
			||||||
 | 
					        print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
				
			||||||
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print(f'\nThere are {len(spans)} fiber spans over {sum(spans)/1000:.0f} km between {source.uid} '
 | 
				
			||||||
 | 
					          f'and {destination.uid}')
 | 
				
			||||||
 | 
					    print(f'\nNow propagating between {source.uid} and {destination.uid}:')
 | 
				
			||||||
    for dp_db in power_range:
 | 
					    for dp_db in power_range:
 | 
				
			||||||
        req.power = db2lin(pref_ch_db + dp_db) * 1e-3
 | 
					        ref_req.power = dbm2watt(pref_ch_db + dp_db)
 | 
				
			||||||
 | 
					        req.power = dbm2watt(p_ch_db + dp_db)
 | 
				
			||||||
 | 
					        design_network(ref_req, network, equipment, set_connector_losses=False, verbose=False)
 | 
				
			||||||
 | 
					        # if initial spectrum did not contain any power, now we need to use this one.
 | 
				
			||||||
 | 
					        # note the initial power defines a differential wrt req.power so that if req.power is set to 2mW (3dBm)
 | 
				
			||||||
 | 
					        # and initial spectrum was set to 0, this sets a initial per channel delta power to -3dB, so that
 | 
				
			||||||
 | 
					        # whatever the equalization, -3 dB is applied on all channels (ie initial power in initial spectrum pre-empts
 | 
				
			||||||
 | 
					        # "--power" option)
 | 
				
			||||||
        if power_mode:
 | 
					        if power_mode:
 | 
				
			||||||
            print(f'\nPropagating with input power = {ansi_escapes.cyan}{lin2db(req.power*1e3):.2f} dBm{ansi_escapes.reset}:')
 | 
					            print(f'\nPropagating with input power = {ansi_escapes.cyan}{watt2dbm(req.power):.2f} '
 | 
				
			||||||
 | 
					                  + f'dBm{ansi_escapes.reset}:')
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            print(f'\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
 | 
					            print(f'\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
 | 
				
			||||||
        infos = propagate(path, req, equipment)
 | 
					        infos = propagate(path, req, equipment)
 | 
				
			||||||
@@ -265,9 +296,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(
 | 
				
			||||||
@@ -309,25 +340,50 @@ def path_requests_run(args=None):
 | 
				
			|||||||
    args = parser.parse_args(args if args is not None else sys.argv[1:])
 | 
					    args = parser.parse_args(args if args is not None else sys.argv[1:])
 | 
				
			||||||
    _setup_logging(args)
 | 
					    _setup_logging(args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _logger.info(f'Computing path requests {args.service_filename} into JSON format')
 | 
					    _logger.info(f'Computing path requests {args.service_filename.name} into JSON format')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
 | 
					    (equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Build the network once using the default power defined in SI in eqpt config
 | 
					    # Build the network once using the default power defined in SI in eqpt config
 | 
				
			||||||
    # TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
 | 
					    # TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
 | 
				
			||||||
    # spacing, f_min and f_max
 | 
					    # spacing, f_min and f_max
 | 
				
			||||||
    p_db = equipment['SI']['default'].power_dbm
 | 
					    if not args.no_insert_edfas:
 | 
				
			||||||
 | 
					 | 
				
			||||||
    p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
 | 
					 | 
				
			||||||
                                             equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | 
					 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
        build_network(network, equipment, p_db, p_total_db, args.no_insert_edfas)
 | 
					            add_missing_elements_in_network(network, equipment)
 | 
				
			||||||
        except exceptions.NetworkTopologyError as e:
 | 
					        except exceptions.NetworkTopologyError as e:
 | 
				
			||||||
            print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
					            print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
				
			||||||
            sys.exit(1)
 | 
					            sys.exit(1)
 | 
				
			||||||
        except exceptions.ConfigurationError as e:
 | 
					        except exceptions.ConfigurationError as e:
 | 
				
			||||||
            print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
					            print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
				
			||||||
            sys.exit(1)
 | 
					            sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    params = {
 | 
				
			||||||
 | 
					        'request_id': 'reference',
 | 
				
			||||||
 | 
					        'trx_type': '',
 | 
				
			||||||
 | 
					        'trx_mode': '',
 | 
				
			||||||
 | 
					        'source': None,
 | 
				
			||||||
 | 
					        'destination': None,
 | 
				
			||||||
 | 
					        'bidir': False,
 | 
				
			||||||
 | 
					        'nodes_list': [],
 | 
				
			||||||
 | 
					        'loose_list': [],
 | 
				
			||||||
 | 
					        'format': '',
 | 
				
			||||||
 | 
					        'path_bandwidth': 0,
 | 
				
			||||||
 | 
					        'effective_freq_slot': None,
 | 
				
			||||||
 | 
					        'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max,
 | 
				
			||||||
 | 
					                                    equipment['SI']['default'].spacing)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    trx_params = trx_mode_params(equipment)
 | 
				
			||||||
 | 
					    params.update(trx_params)
 | 
				
			||||||
 | 
					    reference_channel = PathRequest(**params)
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        design_network(reference_channel, network, equipment, verbose=True)
 | 
				
			||||||
 | 
					    except exceptions.NetworkTopologyError as e:
 | 
				
			||||||
 | 
					        print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
 | 
				
			||||||
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					    except exceptions.ConfigurationError as e:
 | 
				
			||||||
 | 
					        print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
 | 
				
			||||||
 | 
					        sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if args.save_network is not None:
 | 
					    if args.save_network is not None:
 | 
				
			||||||
        save_network(network, args.save_network)
 | 
					        save_network(network, args.save_network)
 | 
				
			||||||
        print(f'{ansi_escapes.blue}Network (after autodesign) saved to {args.save_network}{ansi_escapes.reset}')
 | 
					        print(f'{ansi_escapes.blue}Network (after autodesign) saved to {args.save_network}{ansi_escapes.reset}')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,18 +21,22 @@ the "east" information so that it is possible to input undirected data.
 | 
				
			|||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from xlrd import open_workbook
 | 
					from xlrd import open_workbook
 | 
				
			||||||
 | 
					from logging import getLogger
 | 
				
			||||||
from argparse import ArgumentParser
 | 
					from argparse import ArgumentParser
 | 
				
			||||||
from collections import namedtuple, Counter, defaultdict
 | 
					from collections import namedtuple, Counter, defaultdict
 | 
				
			||||||
from itertools import chain
 | 
					from itertools import chain
 | 
				
			||||||
from json import dumps
 | 
					from json import dumps
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from copy import copy
 | 
					from copy import copy
 | 
				
			||||||
from gnpy.core import ansi_escapes
 | 
					
 | 
				
			||||||
from gnpy.core.utils import silent_remove
 | 
					from gnpy.core.utils import silent_remove
 | 
				
			||||||
from gnpy.core.exceptions import NetworkTopologyError
 | 
					from gnpy.core.exceptions import NetworkTopologyError
 | 
				
			||||||
from gnpy.core.elements import Edfa, Fused, Fiber
 | 
					from gnpy.core.elements import Edfa, Fused, Fiber
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_logger = getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def all_rows(sh, start=0):
 | 
					def all_rows(sh, start=0):
 | 
				
			||||||
    return (sh.row(x) for x in range(start, sh.nrows))
 | 
					    return (sh.row(x) for x in range(start, sh.nrows))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -183,18 +187,18 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
 | 
				
			|||||||
            slice_out = read_slice(my_sheet, start_line + iteration, slice_in, h0)
 | 
					            slice_out = read_slice(my_sheet, start_line + iteration, slice_in, h0)
 | 
				
			||||||
            iteration += 1
 | 
					            iteration += 1
 | 
				
			||||||
        if slice_out == (-1, -1):
 | 
					        if slice_out == (-1, -1):
 | 
				
			||||||
 | 
					            msg = f'missing header {h0}'
 | 
				
			||||||
            if h0 in ('east', 'Node A', 'Node Z', 'City'):
 | 
					            if h0 in ('east', 'Node A', 'Node Z', 'City'):
 | 
				
			||||||
                print(f'{ansi_escapes.red}CRITICAL{ansi_escapes.reset}: missing _{h0}_ header: EXECUTION ENDS')
 | 
					                raise NetworkTopologyError(msg)
 | 
				
			||||||
                raise NetworkTopologyError(f'Missing _{h0}_ header')
 | 
					 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                print(f'missing header {h0}')
 | 
					                _logger.warning(msg)
 | 
				
			||||||
        elif not isinstance(input_headers_dict[h0], dict):
 | 
					        elif not isinstance(input_headers_dict[h0], dict):
 | 
				
			||||||
            headers[slice_out[0]] = input_headers_dict[h0]
 | 
					            headers[slice_out[0]] = input_headers_dict[h0]
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            headers = parse_headers(my_sheet, input_headers_dict[h0], headers, start_line + 1, slice_out)
 | 
					            headers = parse_headers(my_sheet, input_headers_dict[h0], headers, start_line + 1, slice_out)
 | 
				
			||||||
    if headers == {}:
 | 
					    if headers == {}:
 | 
				
			||||||
        print(f'{ansi_escapes.red}CRITICAL ERROR{ansi_escapes.reset}: could not find any header to read _ ABORT')
 | 
					        msg = 'CRITICAL ERROR: could not find any header to read _ ABORT'
 | 
				
			||||||
        raise NetworkTopologyError('Could not find any header to read')
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
    return headers
 | 
					    return headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -219,40 +223,76 @@ def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
 | 
				
			|||||||
    for l1 in links:
 | 
					    for l1 in links:
 | 
				
			||||||
        for l2 in links:
 | 
					        for l2 in links:
 | 
				
			||||||
            if l1 is not l2 and l1 == l2 and l2 not in duplicate_links:
 | 
					            if l1 is not l2 and l1 == l2 and l2 not in duplicate_links:
 | 
				
			||||||
                print(f'\nWARNING\n \
 | 
					                _logger.warning(f'\nWARNING\n \
 | 
				
			||||||
                    link {l1.from_city}-{l1.to_city} is duplicate \
 | 
					                    link {l1.from_city}-{l1.to_city} is duplicate \
 | 
				
			||||||
                    \nthe 1st duplicate link will be removed but you should check Links sheet input')
 | 
					                    \nthe 1st duplicate link will be removed but you should check Links sheet input')
 | 
				
			||||||
                duplicate_links.append(l1)
 | 
					                duplicate_links.append(l1)
 | 
				
			||||||
    for l in duplicate_links:
 | 
					    if duplicate_links:
 | 
				
			||||||
        links.remove(l)
 | 
					        msg = 'XLS error: ' \
 | 
				
			||||||
        links_by_city[l.from_city].remove(l)
 | 
					              + f'links {_format_items([(d.from_city, d.to_city) for d in duplicate_links])} are duplicate'
 | 
				
			||||||
        links_by_city[l.to_city].remove(l)
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    unreferenced_nodes = [n for n in nodes_by_city if n not in links_by_city]
 | 
					    unreferenced_nodes = [n for n in nodes_by_city if n not in links_by_city]
 | 
				
			||||||
    if unreferenced_nodes:
 | 
					    if unreferenced_nodes:
 | 
				
			||||||
        raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} The following nodes are not '
 | 
					        msg = 'XLS error: The following nodes are not ' \
 | 
				
			||||||
                                   f'referenced from the {ansi_escapes.cyan}Links{ansi_escapes.reset} sheet. '
 | 
					              + 'referenced from the Links sheet. ' \
 | 
				
			||||||
                                   f'If unused, remove them from the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} '
 | 
					              + 'If unused, remove them from the Nodes sheet:\n' \
 | 
				
			||||||
                                   f'sheet:\n'
 | 
					              + _format_items(unreferenced_nodes)
 | 
				
			||||||
                                   + _format_items(unreferenced_nodes))
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
    # no need to check "Links" for invalid nodes because that's already in parse_excel()
 | 
					    # no need to check "Links" for invalid nodes because that's already in parse_excel()
 | 
				
			||||||
    wrong_eqpt_from = [n for n in eqpts_by_city if n not in nodes_by_city]
 | 
					    wrong_eqpt_from = [n for n in eqpts_by_city if n not in nodes_by_city]
 | 
				
			||||||
    wrong_eqpt_to = [n.to_city for destinations in eqpts_by_city.values()
 | 
					    wrong_eqpt_to = [n.to_city for destinations in eqpts_by_city.values()
 | 
				
			||||||
                     for n in destinations if n.to_city not in nodes_by_city]
 | 
					                     for n in destinations if n.to_city not in nodes_by_city]
 | 
				
			||||||
    wrong_eqpt = wrong_eqpt_from + wrong_eqpt_to
 | 
					    wrong_eqpt = wrong_eqpt_from + wrong_eqpt_to
 | 
				
			||||||
    if wrong_eqpt:
 | 
					    if wrong_eqpt:
 | 
				
			||||||
        raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} '
 | 
					        msg = 'XLS error: ' \
 | 
				
			||||||
                                   f'The {ansi_escapes.cyan}Eqpt{ansi_escapes.reset} sheet refers to nodes that '
 | 
					              + 'The Eqpt sheet refers to nodes that ' \
 | 
				
			||||||
                                   f'are not defined in the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} sheet:\n'
 | 
					              + 'are not defined in the Nodes sheet:\n'\
 | 
				
			||||||
                                   + _format_items(wrong_eqpt))
 | 
					              + _format_items(wrong_eqpt)
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					    # Now check links that are not listed in Links sheet, and duplicates
 | 
				
			||||||
 | 
					    bad_eqpt = []
 | 
				
			||||||
 | 
					    possible_links = [f'{e.from_city}|{e.to_city}' for e in links] + [f'{e.to_city}|{e.from_city}' for e in links]
 | 
				
			||||||
 | 
					    possible_eqpt = []
 | 
				
			||||||
 | 
					    duplicate_eqpt = []
 | 
				
			||||||
 | 
					    duplicate_ila = []
 | 
				
			||||||
 | 
					    for city, eqpts in eqpts_by_city.items():
 | 
				
			||||||
 | 
					        for eqpt in eqpts:
 | 
				
			||||||
 | 
					            # Check that each node_A-node_Z exists in links
 | 
				
			||||||
 | 
					            nodea_nodez = f'{eqpt.from_city}|{eqpt.to_city}'
 | 
				
			||||||
 | 
					            nodez_nodea = f'{eqpt.to_city}|{eqpt.from_city}'
 | 
				
			||||||
 | 
					            if nodea_nodez not in possible_links \
 | 
				
			||||||
 | 
					                    or nodez_nodea not in possible_links:
 | 
				
			||||||
 | 
					                bad_eqpt.append([eqpt.from_city, eqpt.to_city])
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # Check that there are no duplicate lines in the Eqpt sheet
 | 
				
			||||||
 | 
					                if nodea_nodez in possible_eqpt:
 | 
				
			||||||
 | 
					                    duplicate_eqpt.append([eqpt.from_city, eqpt.to_city])
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    possible_eqpt.append(nodea_nodez)
 | 
				
			||||||
 | 
					            # check that there are no two lines defining an ILA with different directions
 | 
				
			||||||
 | 
					        if nodes_by_city[city].node_type == 'ILA' and len(eqpts) > 1:
 | 
				
			||||||
 | 
					            duplicate_ila.append(city)
 | 
				
			||||||
 | 
					    if bad_eqpt:
 | 
				
			||||||
 | 
					        msg = 'XLS error: ' \
 | 
				
			||||||
 | 
					              + 'The Eqpt sheet references links that ' \
 | 
				
			||||||
 | 
					              + 'are not defined in the Links sheet:\n' \
 | 
				
			||||||
 | 
					              + _format_items(f'{item[0]} -> {item[1]}' for item in bad_eqpt)
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					    if duplicate_eqpt:
 | 
				
			||||||
 | 
					        msg = 'XLS error: Duplicate lines in Eqpt sheet:' \
 | 
				
			||||||
 | 
					              + _format_items(f'{item[0]} -> {item[1]}' for item in duplicate_eqpt)
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					    if duplicate_ila:
 | 
				
			||||||
 | 
					        msg = 'XLS error: Duplicate ILA eqpt definition in Eqpt sheet:' \
 | 
				
			||||||
 | 
					              + _format_items(duplicate_ila)
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for city, link in links_by_city.items():
 | 
					    for city, link in links_by_city.items():
 | 
				
			||||||
        if nodes_by_city[city].node_type.lower() == 'ila' and len(link) != 2:
 | 
					        if nodes_by_city[city].node_type.lower() == 'ila' and len(link) != 2:
 | 
				
			||||||
            # wrong input: ILA sites can only be Degree 2
 | 
					            # wrong input: ILA sites can only be Degree 2
 | 
				
			||||||
            # => correct to make it a ROADM and remove entry in links_by_city
 | 
					            # => correct to make it a ROADM and remove entry in links_by_city
 | 
				
			||||||
            # TODO: put in log rather than print
 | 
					            _logger.warning(f'invalid node type ({nodes_by_city[city].node_type}) '
 | 
				
			||||||
            print(f'invalid node type ({nodes_by_city[city].node_type})\
 | 
					                            + f'specified in {city}, replaced by ROADM')
 | 
				
			||||||
                  specified in {city}, replaced by ROADM')
 | 
					 | 
				
			||||||
            nodes_by_city[city].node_type = 'ROADM'
 | 
					            nodes_by_city[city].node_type = 'ROADM'
 | 
				
			||||||
            for n in nodes:
 | 
					            for n in nodes:
 | 
				
			||||||
                if n.city == city:
 | 
					                if n.city == city:
 | 
				
			||||||
@@ -642,17 +682,19 @@ def parse_excel(input_filename):
 | 
				
			|||||||
    # sanity check
 | 
					    # sanity check
 | 
				
			||||||
    all_cities = Counter(n.city for n in nodes)
 | 
					    all_cities = Counter(n.city for n in nodes)
 | 
				
			||||||
    if len(all_cities) != len(nodes):
 | 
					    if len(all_cities) != len(nodes):
 | 
				
			||||||
        raise ValueError(f'Duplicate city: {all_cities}')
 | 
					        msg = f'Duplicate city: {all_cities}'
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
    bad_links = []
 | 
					    bad_links = []
 | 
				
			||||||
    for lnk in links:
 | 
					    for lnk in links:
 | 
				
			||||||
        if lnk.from_city not in all_cities or lnk.to_city not in all_cities:
 | 
					        if lnk.from_city not in all_cities or lnk.to_city not in all_cities:
 | 
				
			||||||
            bad_links.append([lnk.from_city, lnk.to_city])
 | 
					            bad_links.append([lnk.from_city, lnk.to_city])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if bad_links:
 | 
					    if bad_links:
 | 
				
			||||||
        raise NetworkTopologyError(f'{ansi_escapes.red}XLS error:{ansi_escapes.reset} '
 | 
					        msg = 'XLS error: ' \
 | 
				
			||||||
                                   f'The {ansi_escapes.cyan}Links{ansi_escapes.reset} sheet references nodes that '
 | 
					              + 'The Links sheet references nodes that ' \
 | 
				
			||||||
                                   f'are not defined in the {ansi_escapes.cyan}Nodes{ansi_escapes.reset} sheet:\n'
 | 
					              + 'are not defined in the Nodes sheet:\n' \
 | 
				
			||||||
                                   + _format_items(f'{item[0]} -> {item[1]}' for item in bad_links))
 | 
					              + _format_items(f'{item[0]} -> {item[1]}' for item in bad_links)
 | 
				
			||||||
 | 
					        raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return nodes, links, eqpts, roadms
 | 
					    return nodes, links, eqpts, roadms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,24 +1,29 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.tools.json_io
 | 
					gnpy.tools.json_io
 | 
				
			||||||
==================
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Loading and saving data from JSON files in GNPy's internal data format
 | 
					Loading and saving data from JSON files in GNPy's internal data format
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from networkx import DiGraph
 | 
					from networkx import DiGraph
 | 
				
			||||||
from logging import getLogger
 | 
					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 gnpy.core import ansi_escapes, elements
 | 
					from numpy import arange
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from gnpy.core import 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.core.parameters import DEFAULT_RAMAN_COEFFICIENT
 | 
				
			||||||
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.topology.spectrum_assignment import mvalue_to_slots
 | 
				
			||||||
from gnpy.tools.convert import xls_to_json_data
 | 
					from gnpy.tools.convert import xls_to_json_data
 | 
				
			||||||
from gnpy.tools.service_sheet import read_service_sheet
 | 
					from gnpy.tools.service_sheet import read_service_sheet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,10 +52,9 @@ class _JsonThing:
 | 
				
			|||||||
        for k, v in default_values.items():
 | 
					        for k, v in default_values.items():
 | 
				
			||||||
            setattr(self, k, clean_kwargs.get(k, v))
 | 
					            setattr(self, k, clean_kwargs.get(k, v))
 | 
				
			||||||
            if k not in clean_kwargs and name != 'Amp':
 | 
					            if k not in clean_kwargs and name != 'Amp':
 | 
				
			||||||
                print(ansi_escapes.red +
 | 
					                msg = f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' \
 | 
				
			||||||
                      f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' +
 | 
					                    + f'\n default value is {k} = {v}'
 | 
				
			||||||
                      f'\n default value is {k} = {v}' +
 | 
					                _logger.warning(msg)
 | 
				
			||||||
                      ansi_escapes.reset)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SI(_JsonThing):
 | 
					class SI(_JsonThing):
 | 
				
			||||||
@@ -91,9 +95,9 @@ 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,
 | 
				
			||||||
        'restrictions': {
 | 
					        'restrictions': {
 | 
				
			||||||
            'preamp_variety_list': [],
 | 
					            'preamp_variety_list': [],
 | 
				
			||||||
            'booster_variety_list': []
 | 
					            'booster_variety_list': []
 | 
				
			||||||
@@ -101,6 +105,21 @@ 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:
 | 
				
			||||||
 | 
					            msg = 'Only one equalization type should be set in ROADM, found: ' \
 | 
				
			||||||
 | 
					                  + ', '.join(eq for eq in allowed_equalisations if eq in kwargs)
 | 
				
			||||||
 | 
					            raise EquipmentConfigError(msg)
 | 
				
			||||||
 | 
					        if not any(requested_eq_mask):
 | 
				
			||||||
 | 
					            msg = 'No equalization type set in ROADM'
 | 
				
			||||||
 | 
					            raise EquipmentConfigError(msg)
 | 
				
			||||||
 | 
					        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')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,36 +132,51 @@ class Transceiver(_JsonThing):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    def __init__(self, **kwargs):
 | 
				
			||||||
        self.update_attr(self.default_values, kwargs, 'Transceiver')
 | 
					        self.update_attr(self.default_values, kwargs, 'Transceiver')
 | 
				
			||||||
 | 
					        for mode_params in self.mode:
 | 
				
			||||||
 | 
					            penalties = mode_params.get('penalties')
 | 
				
			||||||
 | 
					            mode_params['penalties'] = {}
 | 
				
			||||||
 | 
					            mode_params['equalization_offset_db'] = mode_params.get('equalization_offset_db', 0)
 | 
				
			||||||
 | 
					            if not penalties:
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            for impairment in ('chromatic_dispersion', 'pmd', 'pdl'):
 | 
				
			||||||
 | 
					                imp_penalties = [p for p in penalties if impairment in p]
 | 
				
			||||||
 | 
					                if not imp_penalties:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                if all(p[impairment] > 0 for p in imp_penalties):
 | 
				
			||||||
 | 
					                    # make sure the list of penalty values include a proper lower boundary
 | 
				
			||||||
 | 
					                    # (we assume 0 penalty for 0 impairment)
 | 
				
			||||||
 | 
					                    imp_penalties.insert(0, {impairment: 0, 'penalty_value': 0})
 | 
				
			||||||
 | 
					                # make sure the list of penalty values are sorted by impairment value
 | 
				
			||||||
 | 
					                imp_penalties.sort(key=lambda i: i[impairment])
 | 
				
			||||||
 | 
					                # rearrange as dict of lists instead of list of dicts
 | 
				
			||||||
 | 
					                mode_params['penalties'][impairment] = {
 | 
				
			||||||
 | 
					                    'up_to_boundary': [p[impairment] for p in imp_penalties],
 | 
				
			||||||
 | 
					                    'penalty_value': [p['penalty_value'] for p in imp_penalties]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Fiber(_JsonThing):
 | 
					class Fiber(_JsonThing):
 | 
				
			||||||
    default_values = {
 | 
					    default_values = {
 | 
				
			||||||
        'type_variety': '',
 | 
					        'type_variety': '',
 | 
				
			||||||
        'dispersion': None,
 | 
					        'dispersion': None,
 | 
				
			||||||
        'gamma': 0,
 | 
					        'effective_area': None,
 | 
				
			||||||
        'pmd_coef': 0
 | 
					        'pmd_coef': 0
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    def __init__(self, **kwargs):
 | 
				
			||||||
        self.update_attr(self.default_values, kwargs, 'Fiber')
 | 
					        self.update_attr(self.default_values, kwargs, self.__class__.__name__)
 | 
				
			||||||
 | 
					        if 'gamma' in kwargs:
 | 
				
			||||||
 | 
					            setattr(self, 'gamma', kwargs['gamma'])
 | 
				
			||||||
 | 
					        if 'raman_efficiency' in kwargs:
 | 
				
			||||||
 | 
					            raman_coefficient = kwargs['raman_efficiency']
 | 
				
			||||||
 | 
					            cr = raman_coefficient.pop('cr')
 | 
				
			||||||
 | 
					            raman_coefficient['g0'] = cr
 | 
				
			||||||
 | 
					            raman_coefficient['reference_frequency'] = DEFAULT_RAMAN_COEFFICIENT['reference_frequency']
 | 
				
			||||||
 | 
					            setattr(self, 'raman_coefficient', raman_coefficient)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RamanFiber(_JsonThing):
 | 
					class RamanFiber(Fiber):
 | 
				
			||||||
    default_values = {
 | 
					    pass
 | 
				
			||||||
        'type_variety': '',
 | 
					 | 
				
			||||||
        'dispersion': None,
 | 
					 | 
				
			||||||
        'gamma': 0,
 | 
					 | 
				
			||||||
        'pmd_coef': 0,
 | 
					 | 
				
			||||||
        'raman_efficiency': None
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					 | 
				
			||||||
        self.update_attr(self.default_values, kwargs, 'RamanFiber')
 | 
					 | 
				
			||||||
        for param in ('cr', 'frequency_offset'):
 | 
					 | 
				
			||||||
            if param not in self.raman_efficiency:
 | 
					 | 
				
			||||||
                raise EquipmentConfigError(f'RamanFiber.raman_efficiency: missing "{param}" parameter')
 | 
					 | 
				
			||||||
        if self.raman_efficiency['frequency_offset'] != sorted(self.raman_efficiency['frequency_offset']):
 | 
					 | 
				
			||||||
            raise EquipmentConfigError(f'RamanFiber.raman_efficiency.frequency_offset is not sorted')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Amp(_JsonThing):
 | 
					class Amp(_JsonThing):
 | 
				
			||||||
@@ -156,13 +190,24 @@ class Amp(_JsonThing):
 | 
				
			|||||||
        'p_max': None,
 | 
					        'p_max': None,
 | 
				
			||||||
        'nf_model': None,
 | 
					        'nf_model': None,
 | 
				
			||||||
        'dual_stage_model': None,
 | 
					        'dual_stage_model': None,
 | 
				
			||||||
 | 
					        'preamp_variety': None,
 | 
				
			||||||
 | 
					        'booster_variety': None,
 | 
				
			||||||
 | 
					        'nf_min': None,
 | 
				
			||||||
 | 
					        'nf_max': None,
 | 
				
			||||||
 | 
					        'nf_coef': None,
 | 
				
			||||||
 | 
					        'nf0': None,
 | 
				
			||||||
        'nf_fit_coeff': None,
 | 
					        'nf_fit_coeff': None,
 | 
				
			||||||
        'nf_ripple': None,
 | 
					        'nf_ripple': 0,
 | 
				
			||||||
        'dgt': None,
 | 
					        'dgt': None,
 | 
				
			||||||
        'gain_ripple': None,
 | 
					        'gain_ripple': 0,
 | 
				
			||||||
 | 
					        'tilt_ripple': 0,
 | 
				
			||||||
 | 
					        'f_ripple_ref': None,
 | 
				
			||||||
        'out_voa_auto': False,
 | 
					        'out_voa_auto': False,
 | 
				
			||||||
        'allowed_for_design': False,
 | 
					        'allowed_for_design': False,
 | 
				
			||||||
        'raman': False
 | 
					        'raman': False,
 | 
				
			||||||
 | 
					        'pmd': 0,
 | 
				
			||||||
 | 
					        'pdl': 0,
 | 
				
			||||||
 | 
					        'advance_configurations_from_json': None
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, **kwargs):
 | 
					    def __init__(self, **kwargs):
 | 
				
			||||||
@@ -181,7 +226,8 @@ class Amp(_JsonThing):
 | 
				
			|||||||
            try:
 | 
					            try:
 | 
				
			||||||
                nf0 = kwargs.pop('nf0')
 | 
					                nf0 = kwargs.pop('nf0')
 | 
				
			||||||
            except KeyError:  # nf0 is expected for a fixed gain amp
 | 
					            except KeyError:  # nf0 is expected for a fixed gain amp
 | 
				
			||||||
                raise EquipmentConfigError(f'missing nf0 value input for amplifier: {type_variety} in equipment config')
 | 
					                msg = f'missing nf0 value input for amplifier: {type_variety} in equipment config'
 | 
				
			||||||
 | 
					                raise EquipmentConfigError(msg)
 | 
				
			||||||
            for k in ('nf_min', 'nf_max'):
 | 
					            for k in ('nf_min', 'nf_max'):
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    del kwargs[k]
 | 
					                    del kwargs[k]
 | 
				
			||||||
@@ -196,7 +242,8 @@ class Amp(_JsonThing):
 | 
				
			|||||||
                nf_min = kwargs.pop('nf_min')
 | 
					                nf_min = kwargs.pop('nf_min')
 | 
				
			||||||
                nf_max = kwargs.pop('nf_max')
 | 
					                nf_max = kwargs.pop('nf_max')
 | 
				
			||||||
            except KeyError:
 | 
					            except KeyError:
 | 
				
			||||||
                raise EquipmentConfigError(f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config')
 | 
					                msg = f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config'
 | 
				
			||||||
 | 
					                raise EquipmentConfigError(msg)
 | 
				
			||||||
            try:  # remove all remaining nf inputs
 | 
					            try:  # remove all remaining nf inputs
 | 
				
			||||||
                del kwargs['nf0']
 | 
					                del kwargs['nf0']
 | 
				
			||||||
            except KeyError:
 | 
					            except KeyError:
 | 
				
			||||||
@@ -218,7 +265,8 @@ class Amp(_JsonThing):
 | 
				
			|||||||
                preamp_variety = kwargs.pop('preamp_variety')
 | 
					                preamp_variety = kwargs.pop('preamp_variety')
 | 
				
			||||||
                booster_variety = kwargs.pop('booster_variety')
 | 
					                booster_variety = kwargs.pop('booster_variety')
 | 
				
			||||||
            except KeyError:
 | 
					            except KeyError:
 | 
				
			||||||
                raise EquipmentConfigError(f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config')
 | 
					                msg = f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config'
 | 
				
			||||||
 | 
					                raise EquipmentConfigError(msg)
 | 
				
			||||||
            dual_stage_def = Model_dual_stage(preamp_variety, booster_variety)
 | 
					            dual_stage_def = Model_dual_stage(preamp_variety, booster_variety)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist')
 | 
					            raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist')
 | 
				
			||||||
@@ -237,11 +285,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():
 | 
				
			||||||
@@ -262,9 +388,7 @@ def _update_dual_stage(equipment):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _roadm_restrictions_sanity_check(equipment):
 | 
					def _roadm_restrictions_sanity_check(equipment):
 | 
				
			||||||
    """ verifies that booster and preamp restrictions specified in roadm equipment are listed
 | 
					    """verifies that booster and preamp restrictions specified in roadm equipment are listed in the edfa."""
 | 
				
			||||||
    in the edfa.
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    restrictions = equipment['Roadm']['default'].restrictions['booster_variety_list'] + \
 | 
					    restrictions = equipment['Roadm']['default'].restrictions['booster_variety_list'] + \
 | 
				
			||||||
        equipment['Roadm']['default'].restrictions['preamp_variety_list']
 | 
					        equipment['Roadm']['default'].restrictions['preamp_variety_list']
 | 
				
			||||||
    for amp_name in restrictions:
 | 
					    for amp_name in restrictions:
 | 
				
			||||||
@@ -277,7 +401,7 @@ def _check_fiber_vs_raman_fiber(equipment):
 | 
				
			|||||||
    if 'RamanFiber' not in equipment:
 | 
					    if 'RamanFiber' not in equipment:
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    for fiber_type in set(equipment['Fiber'].keys()) & set(equipment['RamanFiber'].keys()):
 | 
					    for fiber_type in set(equipment['Fiber'].keys()) & set(equipment['RamanFiber'].keys()):
 | 
				
			||||||
        for attr in ('dispersion', 'dispersion-slope', 'gamma', 'pmd-coefficient'):
 | 
					        for attr in ('dispersion', 'dispersion-slope', 'effective_area', 'gamma', 'pmd-coefficient'):
 | 
				
			||||||
            fiber = equipment['Fiber'][fiber_type]
 | 
					            fiber = equipment['Fiber'][fiber_type]
 | 
				
			||||||
            raman = equipment['RamanFiber'][fiber_type]
 | 
					            raman = equipment['RamanFiber'][fiber_type]
 | 
				
			||||||
            a = getattr(fiber, attr, None)
 | 
					            a = getattr(fiber, attr, None)
 | 
				
			||||||
@@ -334,11 +458,11 @@ def load_network(filename, equipment):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def save_network(network: DiGraph, filename: str):
 | 
					def save_network(network: DiGraph, filename: str):
 | 
				
			||||||
    '''Dump the network into a JSON file
 | 
					    """Dump the network into a JSON file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    :param network: network to work on
 | 
					    :param network: network to work on
 | 
				
			||||||
    :param filename: file to write to
 | 
					    :param filename: file to write to
 | 
				
			||||||
    '''
 | 
					    """
 | 
				
			||||||
    save_json(network_to_json(network), filename)
 | 
					    save_json(network_to_json(network), filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -372,14 +496,28 @@ 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:
 | 
				
			||||||
 | 
					                    msg = f'ROADM {el_config["uid"]}: invalid equalization settings'
 | 
				
			||||||
 | 
					                    raise ConfigurationError(msg)
 | 
				
			||||||
 | 
					            temp = merge_amplifier_restrictions(temp, extra_params)
 | 
				
			||||||
            el_config['params'] = temp
 | 
					            el_config['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']):
 | 
				
			||||||
            raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
 | 
					            raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
 | 
				
			||||||
                                     '\nplease check it is properly defined in the eqpt_config json file')
 | 
					                                     '\nplease check it is properly defined in the eqpt_config json file')
 | 
				
			||||||
 | 
					        elif typ == 'Edfa':
 | 
				
			||||||
 | 
					            if variety in ['default', '']:
 | 
				
			||||||
 | 
					                el_config['params'] = Amp.default_values
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                raise ConfigurationError(f'The Edfa of variety type {variety} was not recognized:'
 | 
				
			||||||
 | 
					                                         '\nplease check it is properly defined in the eqpt_config json file')
 | 
				
			||||||
        el = cls(**el_config)
 | 
					        el = cls(**el_config)
 | 
				
			||||||
        g.add_node(el)
 | 
					        g.add_node(el)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -394,7 +532,8 @@ def network_from_json(json_data, equipment):
 | 
				
			|||||||
                edge_length = 0.01
 | 
					                edge_length = 0.01
 | 
				
			||||||
            g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
 | 
					            g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            raise NetworkTopologyError(f'can not find {from_node} or {to_node} defined in {cx}')
 | 
					            msg = f'can not find {from_node} or {to_node} defined in {cx}'
 | 
				
			||||||
 | 
					            raise NetworkTopologyError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return g
 | 
					    return g
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -425,15 +564,13 @@ def save_json(obj, filename):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def load_requests(filename, eqpt, bidir, network, network_filename):
 | 
					def load_requests(filename, eqpt, bidir, network, network_filename):
 | 
				
			||||||
    """ loads the requests from a json or an excel file into a data string
 | 
					    """loads the requests from a json or an excel file into a data string"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    if filename.suffix.lower() in ('.xls', '.xlsx'):
 | 
					    if filename.suffix.lower() in ('.xls', '.xlsx'):
 | 
				
			||||||
        _logger.info('Automatically converting requests from XLS to JSON')
 | 
					        _logger.info('Automatically converting requests from XLS to JSON')
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
 | 
					            return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
 | 
				
			||||||
        except ServiceError as this_e:
 | 
					        except ServiceError as this_e:
 | 
				
			||||||
            print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {this_e}')
 | 
					            raise ServiceError(f'Service error: {this_e}')
 | 
				
			||||||
            exit(1)
 | 
					 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return load_json(filename)
 | 
					        return load_json(filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -445,16 +582,19 @@ 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']
 | 
					        if params['trx_type'] is None:
 | 
				
			||||||
 | 
					            msg = f'Request {req["request-id"]} has no transceiver type defined.'
 | 
				
			||||||
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
 | 
					        params['trx_mode'] = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
 | 
				
			||||||
        params['format'] = params['trx_mode']
 | 
					        params['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]
 | 
				
			||||||
@@ -462,9 +602,12 @@ def requests_from_json(json_data, equipment):
 | 
				
			|||||||
        # recover trx physical param (baudrate, ...) from type and mode
 | 
					        # recover trx physical param (baudrate, ...) from type and mode
 | 
				
			||||||
        # in trx_mode_params optical power is read from equipment['SI']['default'] and
 | 
					        # in trx_mode_params optical power is read from equipment['SI']['default'] and
 | 
				
			||||||
        # nb_channel is computed based on min max frequency and spacing
 | 
					        # nb_channel is computed based on min max frequency and spacing
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
            trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
					            trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
 | 
				
			||||||
 | 
					        except EquipmentConfigError as e:
 | 
				
			||||||
 | 
					            msg = f'Equipment Config error in {req["request-id"]}: {e}'
 | 
				
			||||||
 | 
					            raise EquipmentConfigError(msg) from e
 | 
				
			||||||
        params.update(trx_params)
 | 
					        params.update(trx_params)
 | 
				
			||||||
        # print(trx_params['min_spacing'])
 | 
					 | 
				
			||||||
        # optical power might be set differently in the request. if it is indicated then the
 | 
					        # optical power might be set differently in the request. if it is indicated then the
 | 
				
			||||||
        # params['power'] is updated
 | 
					        # params['power'] is updated
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
@@ -485,7 +628,8 @@ def requests_from_json(json_data, equipment):
 | 
				
			|||||||
                params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
					                params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
					            params['nb_channel'] = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
				
			||||||
        params['effective_freq_slot'] = req['path-constraints']['te-bandwidth'].get('effective-freq-slot', [None])[0]
 | 
					        params['effective_freq_slot'] = \
 | 
				
			||||||
 | 
					            req['path-constraints']['te-bandwidth'].get('effective-freq-slot', [{'N': None, 'M': None}])
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
 | 
					            params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
@@ -499,39 +643,61 @@ def _check_one_request(params, f_max_from_si):
 | 
				
			|||||||
    """Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
 | 
					    """Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
 | 
				
			||||||
    f_min = params['f_min']
 | 
					    f_min = params['f_min']
 | 
				
			||||||
    f_max = params['f_max']
 | 
					    f_max = params['f_max']
 | 
				
			||||||
    max_recommanded_nb_channels = automatic_nch(f_min, f_max, params['spacing'])
 | 
					    max_recommanded_nb_channels = automatic_nch(f_min, f_max_from_si, params['spacing'])
 | 
				
			||||||
    if params['baud_rate'] is not None:
 | 
					    if params['baud_rate'] is not None:
 | 
				
			||||||
        # implicitly means that a mode is defined with min_spacing
 | 
					        # implicitly means that a mode is defined with min_spacing
 | 
				
			||||||
        if params['min_spacing'] > params['spacing']:
 | 
					        if params['min_spacing'] > params['spacing']:
 | 
				
			||||||
            msg = f'Request {params["request_id"]} has spacing below transponder ' +\
 | 
					            msg = f'Request {params["request_id"]} has spacing below transponder ' +\
 | 
				
			||||||
                  f'{params["trx_type"]} {params["trx_mode"]} min spacing value ' +\
 | 
					                  f'{params["trx_type"]} {params["trx_mode"]} min spacing value ' +\
 | 
				
			||||||
                  f'{params["min_spacing"]*1e-9}GHz.\nComputation stopped'
 | 
					                  f'{params["min_spacing"]*1e-9}GHz.\nComputation stopped'
 | 
				
			||||||
            print(msg)
 | 
					 | 
				
			||||||
            _logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
        if f_max > f_max_from_si:
 | 
					        if f_max > f_max_from_si:
 | 
				
			||||||
            msg = f'''Requested channel number {params["nb_channel"]}, baud rate {params["baud_rate"]} GHz
 | 
					            msg = f'Requested channel number {params["nb_channel"]}, baud rate {params["baud_rate"] * 1e-9} GHz' \
 | 
				
			||||||
            and requested spacing {params["spacing"]*1e-9}GHz is not consistent with frequency range
 | 
					                  + f' and requested spacing {params["spacing"]*1e-9}GHz is not consistent with frequency range' \
 | 
				
			||||||
            {f_min*1e-12} THz, {f_max*1e-12} THz, min recommanded spacing {params["min_spacing"]*1e-9}GHz.
 | 
					                  + f' {f_min*1e-12} THz, {f_max_from_si*1e-12} THz.' \
 | 
				
			||||||
            max recommanded nb of channels is {max_recommanded_nb_channels}.'''
 | 
					                  + f' Max recommanded nb of channels is {max_recommanded_nb_channels}.'
 | 
				
			||||||
            _logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
    # Transponder mode already selected; will it fit to the requested bandwidth?
 | 
					    # Transponder mode already selected; will it fit to the requested bandwidth?
 | 
				
			||||||
    if params['trx_mode'] is not None and params['effective_freq_slot'] is not None \
 | 
					    if params['trx_mode'] is not None and params['effective_freq_slot'] is not None:
 | 
				
			||||||
            and params['effective_freq_slot']['M'] is not None:
 | 
					        required_nb_of_channels, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
 | 
				
			||||||
        _, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
 | 
					 | 
				
			||||||
                                                                                  params['spacing'],
 | 
					                                                                                  params['spacing'],
 | 
				
			||||||
                                                                                  params['bit_rate'])
 | 
					                                                                                  params['bit_rate'])
 | 
				
			||||||
        # params['effective_freq_slot']['M'] value should be bigger than the computed requested_m (simple estimate)
 | 
					        _, per_channel_m = compute_spectrum_slot_vs_bandwidth(params['bit_rate'],
 | 
				
			||||||
 | 
					                                                              params['spacing'],
 | 
				
			||||||
 | 
					                                                              params['bit_rate'])
 | 
				
			||||||
 | 
					        # each M should fit one or more channels if it is not None
 | 
				
			||||||
 | 
					        # spectrum slots should not overlap
 | 
				
			||||||
 | 
					        # resulting nb of channels should be bigger than the nb computed with path_bandwidth
 | 
				
			||||||
 | 
					        # without being splitted
 | 
				
			||||||
        # TODO: elaborate a more accurate estimate with nb_wl * tx_osnr + possibly guardbands in case of
 | 
					        # TODO: elaborate a more accurate estimate with nb_wl * tx_osnr + possibly guardbands in case of
 | 
				
			||||||
        # superchannel closed packing.
 | 
					        # superchannel closed packing.
 | 
				
			||||||
 | 
					        nb_of_channels = 0
 | 
				
			||||||
        if requested_m > params['effective_freq_slot']['M']:
 | 
					        # order slots
 | 
				
			||||||
            msg = f'requested M {params["effective_freq_slot"]["M"]} number of slots for request' +\
 | 
					        slots = sorted(params['effective_freq_slot'], key=lambda x: float('inf') if x['N'] is None else x['N'])
 | 
				
			||||||
                  f'{params["request_id"]} should be greater than {requested_m} to support request' +\
 | 
					        for slot in slots:
 | 
				
			||||||
                  f'{params["path_bandwidth"] * 1e-9} Gbit/s with {params["trx_type"]} {params["trx_mode"]}'
 | 
					            nb_of_channels = nb_of_channels + slot['M'] // per_channel_m if slot['M'] is not None \
 | 
				
			||||||
 | 
					                and nb_of_channels is not None else None
 | 
				
			||||||
 | 
					            if slot['M'] is not None and slot['M'] < per_channel_m:
 | 
				
			||||||
 | 
					                msg = f'Requested M {slot} number of slots for request' +\
 | 
				
			||||||
 | 
					                      f' {params["request_id"]} should be greater than {per_channel_m} to support request' +\
 | 
				
			||||||
 | 
					                      f'with {params["trx_type"]} {params["trx_mode"]}'
 | 
				
			||||||
                _logger.critical(msg)
 | 
					                _logger.critical(msg)
 | 
				
			||||||
 | 
					        if nb_of_channels is not None and nb_of_channels < required_nb_of_channels:
 | 
				
			||||||
 | 
					            msg = f'Requested M {slots} number of slots for request {params["request_id"]} support {nb_of_channels}' +\
 | 
				
			||||||
 | 
					                  f' nb of channels while {required_nb_of_channels} are required to support request' +\
 | 
				
			||||||
 | 
					                  f' {params["path_bandwidth"] * 1e-9} Gbit/s with {params["trx_type"]} {params["trx_mode"]}'
 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
 | 
					        if nb_of_channels is not None:
 | 
				
			||||||
 | 
					            _, stop0n = mvalue_to_slots(slots[0]['N'], slots[0]['M'])
 | 
				
			||||||
 | 
					            i = 1
 | 
				
			||||||
 | 
					            while i < len(slots):
 | 
				
			||||||
 | 
					                slot = slots[i]
 | 
				
			||||||
 | 
					                startn, stopn = mvalue_to_slots(slot['N'], slot['M'])
 | 
				
			||||||
 | 
					                if startn <= stop0n:
 | 
				
			||||||
 | 
					                    msg = f'Requested M {slots} for request {params["request_id"]} overlap'
 | 
				
			||||||
 | 
					                    raise ServiceError(msg)
 | 
				
			||||||
 | 
					                _, stop0n = startn, stopn
 | 
				
			||||||
 | 
					                i += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def disjunctions_from_json(json_data):
 | 
					def disjunctions_from_json(json_data):
 | 
				
			||||||
@@ -564,3 +730,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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,12 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
gnpy.tools.plots
 | 
					gnpy.tools.plots
 | 
				
			||||||
================
 | 
					================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Graphs and plots usable from a CLI application
 | 
					Graphs and plots usable from a CLI application
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from matplotlib.pyplot import show, axis, figure, title, text
 | 
					from matplotlib.pyplot import show, axis, figure, title, text
 | 
				
			||||||
from networkx import draw_networkx
 | 
					from networkx import draw_networkx
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ from copy import deepcopy
 | 
				
			|||||||
from gnpy.core.utils import db2lin
 | 
					from gnpy.core.utils import db2lin
 | 
				
			||||||
from gnpy.core.exceptions import ServiceError
 | 
					from gnpy.core.exceptions import ServiceError
 | 
				
			||||||
from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
 | 
					from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
 | 
				
			||||||
import gnpy.core.ansi_escapes as ansi_escapes
 | 
					 | 
				
			||||||
from gnpy.tools.convert import corresp_names, corresp_next_node
 | 
					from gnpy.tools.convert import corresp_names, corresp_next_node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SERVICES_COLUMN = 12
 | 
					SERVICES_COLUMN = 12
 | 
				
			||||||
@@ -68,24 +67,21 @@ class Request_element(Element):
 | 
				
			|||||||
                if [mode for mode in equipment['Transceiver'][Request.trx_type].mode if mode['format'] == Requestmode]:
 | 
					                if [mode for mode in equipment['Transceiver'][Request.trx_type].mode if mode['format'] == Requestmode]:
 | 
				
			||||||
                    self.mode = Requestmode
 | 
					                    self.mode = Requestmode
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
 | 
					                    msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
 | 
				
			||||||
                    # print(msg)
 | 
					                        + f'with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
 | 
				
			||||||
                    logger.critical(msg)
 | 
					 | 
				
			||||||
                    raise ServiceError(msg)
 | 
					                    raise ServiceError(msg)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                Requestmode = None
 | 
					                Requestmode = None
 | 
				
			||||||
                self.mode = Request.mode
 | 
					                self.mode = Request.mode
 | 
				
			||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
 | 
					            msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
 | 
				
			||||||
            # print(msg)
 | 
					                + f'with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
 | 
				
			||||||
            logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
        # excel input are in GHz and dBm
 | 
					        # excel input are in GHz and dBm
 | 
				
			||||||
        if Request.spacing is not None:
 | 
					        if Request.spacing is not None:
 | 
				
			||||||
            self.spacing = Request.spacing * 1e9
 | 
					            self.spacing = Request.spacing * 1e9
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
 | 
					            msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
 | 
				
			||||||
            logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
        if Request.power is not None:
 | 
					        if Request.power is not None:
 | 
				
			||||||
            self.power = db2lin(Request.power) * 1e-3
 | 
					            self.power = db2lin(Request.power) * 1e-3
 | 
				
			||||||
@@ -225,7 +221,7 @@ def parse_excel(input_filename):
 | 
				
			|||||||
def parse_service_sheet(service_sheet):
 | 
					def parse_service_sheet(service_sheet):
 | 
				
			||||||
    """ reads each column according to authorized fieldnames. order is not important.
 | 
					    """ reads each column according to authorized fieldnames. order is not important.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    logger.info(f'Validating headers on {service_sheet.name!r}')
 | 
					    logger.debug(f'Validating headers on {service_sheet.name!r}')
 | 
				
			||||||
    # add a test on field to enable the '' field case that arises when columns on the
 | 
					    # add a test on field to enable the '' field case that arises when columns on the
 | 
				
			||||||
    # right hand side are used as comments or drawing in the excel sheet
 | 
					    # right hand side are used as comments or drawing in the excel sheet
 | 
				
			||||||
    header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
 | 
					    header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
 | 
				
			||||||
@@ -245,7 +241,6 @@ def parse_service_sheet(service_sheet):
 | 
				
			|||||||
        service_fieldnames = [authorized_fieldnames[e] for e in header]
 | 
					        service_fieldnames = [authorized_fieldnames[e] for e in header]
 | 
				
			||||||
    except KeyError:
 | 
					    except KeyError:
 | 
				
			||||||
        msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
 | 
					        msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
 | 
				
			||||||
        logger.critical(msg)
 | 
					 | 
				
			||||||
        raise ValueError(msg)
 | 
					        raise ValueError(msg)
 | 
				
			||||||
    for row in all_rows(service_sheet, start=5):
 | 
					    for row in all_rows(service_sheet, start=5):
 | 
				
			||||||
        yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
 | 
					        yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
 | 
				
			||||||
@@ -273,15 +268,13 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
 | 
				
			|||||||
    for pathreq in pathreqlist:
 | 
					    for pathreq in pathreqlist:
 | 
				
			||||||
        # first check that source and dest are transceivers
 | 
					        # first check that source and dest are transceivers
 | 
				
			||||||
        if pathreq.source not in transponders:
 | 
					        if pathreq.source not in transponders:
 | 
				
			||||||
            msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find' +\
 | 
					            msg = f'Request: {pathreq.request_id}: could not find' +\
 | 
				
			||||||
                f' transponder source : {pathreq.source}.{ansi_escapes.reset}'
 | 
					                f' transponder source : {pathreq.source}.'
 | 
				
			||||||
            logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if pathreq.destination not in transponders:
 | 
					        if pathreq.destination not in transponders:
 | 
				
			||||||
            msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find' +\
 | 
					            msg = f'Request: {pathreq.request_id}: could not find' +\
 | 
				
			||||||
                f' transponder destination: {pathreq.destination}.{ansi_escapes.reset}'
 | 
					                f' transponder destination: {pathreq.destination}.'
 | 
				
			||||||
            logger.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
        # silently pop source and dest nodes from the list if they were added by the user as first
 | 
					        # silently pop source and dest nodes from the list if they were added by the user as first
 | 
				
			||||||
        # and last elem in the constraints respectively. Other positions must lead to an error
 | 
					        # and last elem in the constraints respectively. Other positions must lead to an error
 | 
				
			||||||
@@ -333,17 +326,16 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
 | 
				
			|||||||
                            # too much ambiguity, 'b' is an ila, its name can be:
 | 
					                            # too much ambiguity, 'b' is an ila, its name can be:
 | 
				
			||||||
                            # Edfa0_fiber (a → b)-xx if next node is c or
 | 
					                            # Edfa0_fiber (a → b)-xx if next node is c or
 | 
				
			||||||
                            # Edfa0_fiber (c → b)-xx if next node is a
 | 
					                            # Edfa0_fiber (c → b)-xx if next node is a
 | 
				
			||||||
                            msg = f'{ansi_escapes.yellow}Invalid route node specified:' +\
 | 
					                            msg = f'Request {pathreq.request_id}: Invalid route node specified:' \
 | 
				
			||||||
                                f'\n\t\'{n_id}\', replaced with \'{new_n}\'{ansi_escapes.reset}'
 | 
					                                + f'\n\t\'{n_id}\', replaced with \'{new_n}\''
 | 
				
			||||||
                            logger.info(msg)
 | 
					                            logger.warning(msg)
 | 
				
			||||||
                            pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
 | 
					                            pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
 | 
				
			||||||
                    except StopIteration:
 | 
					                    except StopIteration:
 | 
				
			||||||
                        # shall not come in this case, unless requested direction does not exist
 | 
					                        # shall not come in this case, unless requested direction does not exist
 | 
				
			||||||
                        msg = f'{ansi_escapes.yellow}Invalid route specified {n_id}: could' +\
 | 
					                        msg = f'Request {pathreq.request_id}: Invalid route specified {n_id}: could' \
 | 
				
			||||||
                            f' not decide on direction, skipped!.\nPlease add a valid' +\
 | 
					                            + ' not decide on direction, skipped!.\nPlease add a valid' \
 | 
				
			||||||
                            f' direction in constraints (next neighbour node){ansi_escapes.reset}'
 | 
					                            + ' direction in constraints (next neighbour node)'
 | 
				
			||||||
                        print(msg)
 | 
					                        logger.warning(msg)
 | 
				
			||||||
                        logger.info(msg)
 | 
					 | 
				
			||||||
                        pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
					                        pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
				
			||||||
                        pathreq.nodes_list.remove(n_id)
 | 
					                        pathreq.nodes_list.remove(n_id)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
@@ -351,28 +343,24 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
 | 
				
			|||||||
                        # if no matching can be found in the network just ignore this constraint
 | 
					                        # if no matching can be found in the network just ignore this constraint
 | 
				
			||||||
                        # if it is a loose constraint
 | 
					                        # if it is a loose constraint
 | 
				
			||||||
                        # warns the user that this node is not part of the topology
 | 
					                        # warns the user that this node is not part of the topology
 | 
				
			||||||
                        msg = f'{ansi_escapes.yellow}Invalid node specified:\n\t\'{n_id}\'' +\
 | 
					                        msg = f'Request {pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
 | 
				
			||||||
                            f', could not use it as constraint, skipped!{ansi_escapes.reset}'
 | 
					                            + ', could not use it as constraint, skipped!'
 | 
				
			||||||
                        print(msg)
 | 
					                        logger.warning(msg)
 | 
				
			||||||
                        logger.info(msg)
 | 
					 | 
				
			||||||
                        pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
					                        pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
				
			||||||
                        pathreq.nodes_list.remove(n_id)
 | 
					                        pathreq.nodes_list.remove(n_id)
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        msg = f'{ansi_escapes.red}Could not find node:\n\t\'{n_id}\' in network' +\
 | 
					                        msg = f'Request {pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
 | 
				
			||||||
                            f' topology. Strict constraint can not be applied.{ansi_escapes.reset}'
 | 
					                            + ' topology. Strict constraint can not be applied.'
 | 
				
			||||||
                        logger.critical(msg)
 | 
					 | 
				
			||||||
                        raise ServiceError(msg)
 | 
					                        raise ServiceError(msg)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                if temp.loose_list[i] == 'LOOSE':
 | 
					                if temp.loose_list[i] == 'LOOSE':
 | 
				
			||||||
                    print(f'{ansi_escapes.yellow}Invalid route node specified:\n\t\'{n_id}\'' +
 | 
					                    logger.warning(f'Request {pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\''
 | 
				
			||||||
                          f' type is not supported as constraint with xls network input,' +
 | 
					                                   + ' type is not supported as constraint with xls network input, skipped!')
 | 
				
			||||||
                          f' skipped!{ansi_escapes.reset}')
 | 
					 | 
				
			||||||
                    pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
					                    pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
				
			||||||
                    pathreq.nodes_list.remove(n_id)
 | 
					                    pathreq.nodes_list.remove(n_id)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    msg = f'{ansi_escapes.red}Invalid route node specified \n\t\'{n_id}\'' +\
 | 
					                    msg = f'Invalid route node specified \n\t\'{n_id}\'' \
 | 
				
			||||||
                        f' type is not supported as constraint with xls network input,' +\
 | 
					                        + ' type is not supported as constraint with xls network input,' \
 | 
				
			||||||
                        f', Strict constraint can not be applied.{ansi_escapes.reset}'
 | 
					                        + ', Strict constraint can not be applied.'
 | 
				
			||||||
                    logger.critical(msg)
 | 
					 | 
				
			||||||
                    raise ServiceError(msg)
 | 
					                    raise ServiceError(msg)
 | 
				
			||||||
    return pathreqlist
 | 
					    return pathreqlist
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
'''
 | 
					"""
 | 
				
			||||||
Tracking :py:mod:`.request` for spectrum and their :py:mod:`.spectrum_assignment`.
 | 
					Tracking :py:mod:`.request` for spectrum and their :py:mod:`.spectrum_assignment`.
 | 
				
			||||||
'''
 | 
					"""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,30 +20,29 @@ from logging import getLogger
 | 
				
			|||||||
from networkx import (dijkstra_path, NetworkXNoPath,
 | 
					from networkx import (dijkstra_path, NetworkXNoPath,
 | 
				
			||||||
                      all_simple_paths, shortest_simple_paths)
 | 
					                      all_simple_paths, shortest_simple_paths)
 | 
				
			||||||
from networkx.utils import pairwise
 | 
					from networkx.utils import pairwise
 | 
				
			||||||
from numpy import mean
 | 
					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
 | 
				
			||||||
 | 
					from gnpy.core import network as network_module
 | 
				
			||||||
from gnpy.core.exceptions import ServiceError, DisjunctionError
 | 
					from gnpy.core.exceptions import ServiceError, DisjunctionError
 | 
				
			||||||
import gnpy.core.ansi_escapes as ansi_escapes
 | 
					 | 
				
			||||||
from copy import deepcopy
 | 
					from copy import deepcopy
 | 
				
			||||||
from csv import writer
 | 
					from csv import writer
 | 
				
			||||||
from math import ceil
 | 
					from math import ceil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOGGER = getLogger(__name__)
 | 
					LOGGER = getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RequestParams = namedtuple('RequestParams', 'request_id source destination bidir trx_type' +
 | 
					RequestParams = namedtuple('RequestParams', 'request_id source destination bidir trx_type'
 | 
				
			||||||
                           ' trx_mode nodes_list loose_list spacing power nb_channel f_min' +
 | 
					                           ' trx_mode nodes_list loose_list spacing power nb_channel f_min'
 | 
				
			||||||
                           ' f_max format baud_rate OSNR bit_rate roll_off tx_osnr' +
 | 
					                           ' f_max format baud_rate OSNR penalties bit_rate'
 | 
				
			||||||
                           ' min_spacing cost path_bandwidth effective_freq_slot')
 | 
					                           ' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
 | 
				
			||||||
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link' +
 | 
					                           ' equalization_offset_db')
 | 
				
			||||||
                               '_diverse node_diverse disjunctions_req')
 | 
					DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
 | 
				
			||||||
 | 
					                               ' node_diverse disjunctions_req')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PathRequest:
 | 
					class PathRequest:
 | 
				
			||||||
    """ the class that contains all attributes related to a request
 | 
					    """the class that contains all attributes related to a request"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __init__(self, *args, **params):
 | 
					    def __init__(self, *args, **params):
 | 
				
			||||||
        params = RequestParams(**params)
 | 
					        params = RequestParams(**params)
 | 
				
			||||||
        self.request_id = params.request_id
 | 
					        self.request_id = params.request_id
 | 
				
			||||||
@@ -62,6 +61,7 @@ class PathRequest:
 | 
				
			|||||||
        self.f_max = params.f_max
 | 
					        self.f_max = params.f_max
 | 
				
			||||||
        self.format = params.format
 | 
					        self.format = params.format
 | 
				
			||||||
        self.OSNR = params.OSNR
 | 
					        self.OSNR = params.OSNR
 | 
				
			||||||
 | 
					        self.penalties = params.penalties
 | 
				
			||||||
        self.bit_rate = params.bit_rate
 | 
					        self.bit_rate = params.bit_rate
 | 
				
			||||||
        self.roll_off = params.roll_off
 | 
					        self.roll_off = params.roll_off
 | 
				
			||||||
        self.tx_osnr = params.tx_osnr
 | 
					        self.tx_osnr = params.tx_osnr
 | 
				
			||||||
@@ -69,8 +69,10 @@ class PathRequest:
 | 
				
			|||||||
        self.cost = params.cost
 | 
					        self.cost = params.cost
 | 
				
			||||||
        self.path_bandwidth = params.path_bandwidth
 | 
					        self.path_bandwidth = params.path_bandwidth
 | 
				
			||||||
        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 = [s['N'] for s in params.effective_freq_slot]
 | 
				
			||||||
            self.M = params.effective_freq_slot['M']
 | 
					            self.M = [s['M'] for s in params.effective_freq_slot]
 | 
				
			||||||
 | 
					        self.initial_spectrum = None
 | 
				
			||||||
 | 
					        self.offset_db = params.equalization_offset_db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __str__(self):
 | 
					    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}',
 | 
				
			||||||
@@ -102,8 +104,7 @@ class PathRequest:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Disjunction:
 | 
					class Disjunction:
 | 
				
			||||||
    """ the class that contains all attributes related to disjunction constraints
 | 
					    """the class that contains all attributes related to disjunction constraints"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, *args, **params):
 | 
					    def __init__(self, *args, **params):
 | 
				
			||||||
        params = DisjunctionParams(**params)
 | 
					        params = DisjunctionParams(**params)
 | 
				
			||||||
@@ -148,8 +149,7 @@ class ResultElement:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def detailed_path_json(self):
 | 
					    def detailed_path_json(self):
 | 
				
			||||||
        """ a function that builds path object for normal and blocking cases
 | 
					        """a function that builds path object for normal and blocking cases"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        index = 0
 | 
					        index = 0
 | 
				
			||||||
        pro_list = []
 | 
					        pro_list = []
 | 
				
			||||||
        for element in self.computed_path:
 | 
					        for element in self.computed_path:
 | 
				
			||||||
@@ -173,10 +173,10 @@ class ResultElement:
 | 
				
			|||||||
                temp = {
 | 
					                temp = {
 | 
				
			||||||
                    'path-route-object': {
 | 
					                    'path-route-object': {
 | 
				
			||||||
                        'index': index,
 | 
					                        'index': index,
 | 
				
			||||||
                        "label-hop": {
 | 
					                        "label-hop": [{
 | 
				
			||||||
                            "N": self.path_request.N,
 | 
					                            "N": n,
 | 
				
			||||||
                            "M": self.path_request.M
 | 
					                            "M": m
 | 
				
			||||||
                        },
 | 
					                        } for n, m in zip(self.path_request.N, self.path_request.M)],
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                pro_list.append(temp)
 | 
					                pro_list.append(temp)
 | 
				
			||||||
@@ -205,11 +205,9 @@ class ResultElement:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def path_properties(self):
 | 
					    def path_properties(self):
 | 
				
			||||||
        """ a function that returns the path properties (metrics, crossed elements) into a dict
 | 
					        """a function that returns the path properties (metrics, crossed elements) into a dict"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        def path_metric(pth, req):
 | 
					        def path_metric(pth, req):
 | 
				
			||||||
            """ creates the metrics dictionary
 | 
					            """creates the metrics dictionary"""
 | 
				
			||||||
            """
 | 
					 | 
				
			||||||
            return [
 | 
					            return [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    'metric-type': 'SNR-bandwidth',
 | 
					                    'metric-type': 'SNR-bandwidth',
 | 
				
			||||||
@@ -251,8 +249,7 @@ class ResultElement:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def pathresult(self):
 | 
					    def pathresult(self):
 | 
				
			||||||
        """ create the result dictionnary (response for a request)
 | 
					        """create the result dictionnary (response for a request)"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if self.path_request.blocking_reason in BLOCKING_NOPATH:
 | 
					            if self.path_request.blocking_reason in BLOCKING_NOPATH:
 | 
				
			||||||
                response = {
 | 
					                response = {
 | 
				
			||||||
@@ -290,7 +287,6 @@ def compute_constrained_path(network, req):
 | 
				
			|||||||
        # been corrected and harmonized before
 | 
					        # been corrected and harmonized before
 | 
				
			||||||
        msg = (f'Request {req.request_id} malformed list of nodes: last node should '
 | 
					        msg = (f'Request {req.request_id} malformed list of nodes: last node should '
 | 
				
			||||||
               'be destination trx')
 | 
					               'be destination trx')
 | 
				
			||||||
        LOGGER.critical(msg)
 | 
					 | 
				
			||||||
        raise ValueError()
 | 
					        raise ValueError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trx = [n for n in network if isinstance(n, Transceiver)]
 | 
					    trx = [n for n in network if isinstance(n, Transceiver)]
 | 
				
			||||||
@@ -305,10 +301,9 @@ def compute_constrained_path(network, req):
 | 
				
			|||||||
        path_generator = shortest_simple_paths(network, source, destination, weight='weight')
 | 
					        path_generator = shortest_simple_paths(network, source, destination, weight='weight')
 | 
				
			||||||
        total_path = next(path for path in path_generator if ispart(nodes_list, path))
 | 
					        total_path = next(path for path in path_generator if ispart(nodes_list, path))
 | 
				
			||||||
    except NetworkXNoPath:
 | 
					    except NetworkXNoPath:
 | 
				
			||||||
        msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path from'
 | 
					        msg = (f'Request {req.request_id} could not find a path from'
 | 
				
			||||||
               f' {source.uid} to node: {destination.uid} in network topology{ansi_escapes.reset}')
 | 
					               f' {source.uid} to node: {destination.uid} in network topology')
 | 
				
			||||||
        LOGGER.critical(msg)
 | 
					        LOGGER.critical(msg)
 | 
				
			||||||
        print(msg)
 | 
					 | 
				
			||||||
        req.blocking_reason = 'NO_PATH'
 | 
					        req.blocking_reason = 'NO_PATH'
 | 
				
			||||||
        total_path = []
 | 
					        total_path = []
 | 
				
			||||||
    except StopIteration:
 | 
					    except StopIteration:
 | 
				
			||||||
@@ -317,80 +312,91 @@ def compute_constrained_path(network, req):
 | 
				
			|||||||
        # last node which is the transceiver)
 | 
					        # last node which is the transceiver)
 | 
				
			||||||
        # if all nodes i n node_list are LOOSE constraint, skip the constraints and find
 | 
					        # if all nodes i n node_list are LOOSE constraint, skip the constraints and find
 | 
				
			||||||
        # a path w/o constraints, else there is no possible path
 | 
					        # a path w/o constraints, else there is no possible path
 | 
				
			||||||
        print(f'{ansi_escapes.yellow}Request {req.request_id} could not find a path crossing '
 | 
					        LOGGER.warning(f'Request {req.request_id} could not find a path crossing '
 | 
				
			||||||
              f'{[el.uid for el in nodes_list[:-1]]} in network topology{ansi_escapes.reset}')
 | 
					                       f'{[el.uid for el in nodes_list[:-1]]} in network topology')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if 'STRICT' not in req.loose_list[:-1]:
 | 
					        if 'STRICT' not in req.loose_list[:-1]:
 | 
				
			||||||
            msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path with user_'
 | 
					            msg = (f'Request {req.request_id} could not find a path with user_'
 | 
				
			||||||
                   f'include node constraints{ansi_escapes.reset}')
 | 
					                   f'include node constraints. Constraint ignored')
 | 
				
			||||||
            LOGGER.info(msg)
 | 
					            LOGGER.warning(msg)
 | 
				
			||||||
            print(f'constraint ignored')
 | 
					 | 
				
			||||||
            total_path = dijkstra_path(network, source, destination, weight='weight')
 | 
					            total_path = dijkstra_path(network, source, destination, weight='weight')
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            # one STRICT makes the whole list STRICT
 | 
					            # one STRICT makes the whole list STRICT
 | 
				
			||||||
            msg = (f'{ansi_escapes.yellow}Request {req.request_id} could not find a path with user '
 | 
					            msg = (f'Request {req.request_id} could not find a path with user '
 | 
				
			||||||
                   f'include node constraints.\nNo path computed{ansi_escapes.reset}')
 | 
					                   f'include node constraints.\nNo path computed')
 | 
				
			||||||
            LOGGER.critical(msg)
 | 
					            LOGGER.critical(msg)
 | 
				
			||||||
            print(msg)
 | 
					 | 
				
			||||||
            req.blocking_reason = 'NO_PATH_WITH_CONSTRAINT'
 | 
					            req.blocking_reason = 'NO_PATH_WITH_CONSTRAINT'
 | 
				
			||||||
            total_path = []
 | 
					            total_path = []
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return total_path
 | 
					    return total_path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def propagate(path, req, equipment):
 | 
					def propagate(path, req, equipment):
 | 
				
			||||||
 | 
					    """propagates signals in each element according to initial spectrum set by user"""
 | 
				
			||||||
 | 
					    if req.initial_spectrum is not None:
 | 
				
			||||||
 | 
					        si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum, power=req.power)
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
        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, delta_pdb=req.offset_db)
 | 
				
			||||||
    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, from_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)
 | 
				
			||||||
    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)
 | 
				
			||||||
    return si
 | 
					    return si
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def propagate_and_optimize_mode(path, req, equipment):
 | 
					def propagate_and_optimize_mode(path, req, equipment):
 | 
				
			||||||
    # if mode is unknown : loops on the modes starting from the highest baudrate fiting in the
 | 
					    # if mode is unknown : loops on the modes starting from the highest baudrate fiting in the
 | 
				
			||||||
    # step 1: create an ordered list of modes based on baudrate
 | 
					    # step 1: create an ordered list of modes based on baudrate and power offset
 | 
				
			||||||
    baudrate_to_explore = list(set([this_mode['baud_rate']
 | 
					    # order higher baudrate with higher power offset first
 | 
				
			||||||
 | 
					    baudrate_offset_to_explore = list(set([(this_mode['baud_rate'], this_mode['equalization_offset_db'])
 | 
				
			||||||
                                           for this_mode in equipment['Transceiver'][req.tsp].mode
 | 
					                                           for this_mode in equipment['Transceiver'][req.tsp].mode
 | 
				
			||||||
                                           if float(this_mode['min_spacing']) <= req.spacing]))
 | 
					                                           if float(this_mode['min_spacing']) <= req.spacing]))
 | 
				
			||||||
    # TODO be carefull on limits cases if spacing very close to req spacing eg 50.001 50.000
 | 
					    # TODO be carefull on limits cases if spacing very close to req spacing eg 50.001 50.000
 | 
				
			||||||
    baudrate_to_explore = sorted(baudrate_to_explore, reverse=True)
 | 
					    baudrate_offset_to_explore = sorted(baudrate_offset_to_explore, reverse=True)
 | 
				
			||||||
    if baudrate_to_explore:
 | 
					    if baudrate_offset_to_explore:
 | 
				
			||||||
        # at least 1 baudrate can be tested wrt spacing
 | 
					        # at least 1 baudrate can be tested wrt spacing
 | 
				
			||||||
        for this_br in baudrate_to_explore:
 | 
					        for (this_br, this_offset) in baudrate_offset_to_explore:
 | 
				
			||||||
            modes_to_explore = [this_mode for this_mode in equipment['Transceiver'][req.tsp].mode
 | 
					            modes_to_explore = [this_mode for this_mode in equipment['Transceiver'][req.tsp].mode
 | 
				
			||||||
                                if this_mode['baud_rate'] == this_br and
 | 
					                                if this_mode['baud_rate'] == this_br
 | 
				
			||||||
                                float(this_mode['min_spacing']) <= req.spacing]
 | 
					                                and 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'], x['equalization_offset_db']), 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,
 | 
				
			||||||
 | 
					                                                         delta_pdb=this_offset, tx_osnr=req.tx_osnr)
 | 
				
			||||||
            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, from_degree=path[i - 1].uid)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    spc_info = el(spc_info)
 | 
					                    spc_info = el(spc_info)
 | 
				
			||||||
            for this_mode in modes_to_explore:
 | 
					            for this_mode in modes_to_explore:
 | 
				
			||||||
                if path[-1].snr is not None:
 | 
					                if path[-1].snr is not None:
 | 
				
			||||||
                    path[0].update_snr(this_mode['tx_osnr'])
 | 
					                    path[0].update_snr(this_mode['tx_osnr'])
 | 
				
			||||||
 | 
					                    path[0].calc_penalties(this_mode['penalties'])
 | 
				
			||||||
                    if any(isinstance(el, Roadm) for el in path):
 | 
					                    if any(isinstance(el, Roadm) for el in path):
 | 
				
			||||||
                        path[-1].update_snr(this_mode['tx_osnr'], equipment['Roadm']['default'].add_drop_osnr)
 | 
					                        path[-1].update_snr(this_mode['tx_osnr'], equipment['Roadm']['default'].add_drop_osnr)
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        path[-1].update_snr(this_mode['tx_osnr'])
 | 
					                        path[-1].update_snr(this_mode['tx_osnr'])
 | 
				
			||||||
                    if round(min(path[-1].snr + lin2db(this_br / (12.5e9))), 2) \
 | 
					                    path[-1].calc_penalties(this_mode['penalties'])
 | 
				
			||||||
 | 
					                    if round(min(path[-1].snr_01nm - path[-1].total_penalty), 2) \
 | 
				
			||||||
                            > this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
 | 
					                            > this_mode['OSNR'] + equipment['SI']['default'].sys_margins:
 | 
				
			||||||
                        return path, this_mode
 | 
					                        return path, this_mode
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
@@ -402,22 +408,19 @@ def propagate_and_optimize_mode(path, req, equipment):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # returns the last propagated path and mode
 | 
					        # returns the last propagated path and mode
 | 
				
			||||||
        msg = f'\tWarning! Request {req.request_id}: no mode satisfies path SNR requirement.\n'
 | 
					        msg = f'\tWarning! Request {req.request_id}: no mode satisfies path SNR requirement.\n'
 | 
				
			||||||
        print(msg)
 | 
					        LOGGER.warning(msg)
 | 
				
			||||||
        LOGGER.info(msg)
 | 
					 | 
				
			||||||
        req.blocking_reason = 'NO_FEASIBLE_MODE'
 | 
					        req.blocking_reason = 'NO_FEASIBLE_MODE'
 | 
				
			||||||
        return path, last_explored_mode
 | 
					        return path, last_explored_mode
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        # no baudrate satisfying spacing
 | 
					        # no baudrate satisfying spacing
 | 
				
			||||||
        msg = f'\tWarning! Request {req.request_id}: no baudrate satisfies spacing requirement.\n'
 | 
					        msg = f'\tWarning! Request {req.request_id}: no baudrate satisfies spacing requirement.\n'
 | 
				
			||||||
        print(msg)
 | 
					        LOGGER.warning(msg)
 | 
				
			||||||
        LOGGER.info(msg)
 | 
					 | 
				
			||||||
        req.blocking_reason = 'NO_FEASIBLE_BAUDRATE_WITH_SPACING'
 | 
					        req.blocking_reason = 'NO_FEASIBLE_BAUDRATE_WITH_SPACING'
 | 
				
			||||||
        return [], None
 | 
					        return [], None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def jsontopath_metric(path_metric):
 | 
					def jsontopath_metric(path_metric):
 | 
				
			||||||
    """ a functions that reads resulting metric  from json string
 | 
					    """a functions that reads resulting metric  from json string"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    output_snr = next(e['accumulative-value']
 | 
					    output_snr = next(e['accumulative-value']
 | 
				
			||||||
                      for e in path_metric if e['metric-type'] == 'SNR-0.1nm')
 | 
					                      for e in path_metric if e['metric-type'] == 'SNR-0.1nm')
 | 
				
			||||||
    output_snrbandwidth = next(e['accumulative-value']
 | 
					    output_snrbandwidth = next(e['accumulative-value']
 | 
				
			||||||
@@ -435,9 +438,7 @@ def jsontopath_metric(path_metric):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def jsontoparams(my_p, tsp, mode, equipment):
 | 
					def jsontoparams(my_p, tsp, mode, equipment):
 | 
				
			||||||
    """ a function that derives optical params from transponder type and mode
 | 
					    """a function that derives optical params from transponder type and mode supports the no mode case"""
 | 
				
			||||||
        supports the no mode case
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    temp = []
 | 
					    temp = []
 | 
				
			||||||
    for elem in my_p['path-properties']['path-route-objects']:
 | 
					    for elem in my_p['path-properties']['path-route-objects']:
 | 
				
			||||||
        if 'num-unnum-hop' in elem['path-route-object']:
 | 
					        if 'num-unnum-hop' in elem['path-route-object']:
 | 
				
			||||||
@@ -447,8 +448,8 @@ def jsontoparams(my_p, tsp, mode, equipment):
 | 
				
			|||||||
    temp2 = []
 | 
					    temp2 = []
 | 
				
			||||||
    for elem in my_p['path-properties']['path-route-objects']:
 | 
					    for elem in my_p['path-properties']['path-route-objects']:
 | 
				
			||||||
        if 'label-hop' in elem['path-route-object'].keys():
 | 
					        if 'label-hop' in elem['path-route-object'].keys():
 | 
				
			||||||
            temp2.append(f'{elem["path-route-object"]["label-hop"]["N"]}, ' +
 | 
					            temp2.append(f'{[e["N"] for e in elem["path-route-object"]["label-hop"]]}, '
 | 
				
			||||||
                         f'{elem["path-route-object"]["label-hop"]["M"]}')
 | 
					                         + f'{[e["M"] for e in elem["path-route-object"]["label-hop"]]}')
 | 
				
			||||||
    # OrderedDict.fromkeys returns the unique set of strings.
 | 
					    # OrderedDict.fromkeys returns the unique set of strings.
 | 
				
			||||||
    # TODO: if spectrum changes along the path, we should be able to give the segments
 | 
					    # TODO: if spectrum changes along the path, we should be able to give the segments
 | 
				
			||||||
    #       eg for regeneration case
 | 
					    #       eg for regeneration case
 | 
				
			||||||
@@ -810,13 +811,13 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
 | 
				
			|||||||
                    if not ispart(allpaths[id(pth)].req.nodes_list, pth):
 | 
					                    if not ispart(allpaths[id(pth)].req.nodes_list, pth):
 | 
				
			||||||
                        testispartok = False
 | 
					                        testispartok = False
 | 
				
			||||||
                        if 'STRICT' in allpaths[id(pth)].req.loose_list:
 | 
					                        if 'STRICT' in allpaths[id(pth)].req.loose_list:
 | 
				
			||||||
                            LOGGER.info(f'removing solution from candidate paths\n{pth}')
 | 
					                            LOGGER.debug(f'removing solution from candidate paths\n{pth}')
 | 
				
			||||||
                            testispartnokloose = False
 | 
					                            testispartnokloose = False
 | 
				
			||||||
                            break
 | 
					                            break
 | 
				
			||||||
            if testispartok:
 | 
					            if testispartok:
 | 
				
			||||||
                temp.append(sol)
 | 
					                temp.append(sol)
 | 
				
			||||||
            elif testispartnokloose:
 | 
					            elif testispartnokloose:
 | 
				
			||||||
                LOGGER.info(f'Adding solution as alternate solution not satisfying constraint\n{pth}')
 | 
					                LOGGER.debug(f'Adding solution as alternate solution not satisfying constraint\n{pth}')
 | 
				
			||||||
                alternatetemp.append(sol)
 | 
					                alternatetemp.append(sol)
 | 
				
			||||||
        if temp:
 | 
					        if temp:
 | 
				
			||||||
            candidates[this_d.disjunction_id] = temp
 | 
					            candidates[this_d.disjunction_id] = temp
 | 
				
			||||||
@@ -838,9 +839,7 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
 | 
				
			|||||||
                    # remove duplicated candidates
 | 
					                    # remove duplicated candidates
 | 
				
			||||||
                    candidates = remove_candidate(candidates, allpaths, allpaths[id(pth)].req, pth)
 | 
					                    candidates = remove_candidate(candidates, allpaths, allpaths[id(pth)].req, pth)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            msg = f'No disjoint path found with added constraint'
 | 
					            msg = 'No disjoint path found with added constraint\nComputation stopped.'
 | 
				
			||||||
            LOGGER.critical(msg)
 | 
					 | 
				
			||||||
            print(f'{msg}\nComputation stopped.')
 | 
					 | 
				
			||||||
            # TODO in this case: replay step 5  with the candidate without constraints
 | 
					            # TODO in this case: replay step 5  with the candidate without constraints
 | 
				
			||||||
            raise DisjunctionError(msg)
 | 
					            raise DisjunctionError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -861,8 +860,7 @@ def compute_path_dsjctn(network, equipment, pathreqlist, disjunctions_list):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def isdisjoint(pth1, pth2):
 | 
					def isdisjoint(pth1, pth2):
 | 
				
			||||||
    """ returns 0 if disjoint
 | 
					    """returns 0 if disjoint"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    edge1 = list(pairwise(pth1))
 | 
					    edge1 = list(pairwise(pth1))
 | 
				
			||||||
    edge2 = list(pairwise(pth2))
 | 
					    edge2 = list(pairwise(pth2))
 | 
				
			||||||
    for edge in edge1:
 | 
					    for edge in edge1:
 | 
				
			||||||
@@ -897,9 +895,8 @@ def find_reversed_path(pth):
 | 
				
			|||||||
            # concatenation should be [roadma el1 el2 roadmb el3 el4 roadmc]
 | 
					            # concatenation should be [roadma el1 el2 roadmb el3 el4 roadmc]
 | 
				
			||||||
            reversed_path = list(OrderedDict.fromkeys(reversed_path))
 | 
					            reversed_path = list(OrderedDict.fromkeys(reversed_path))
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            msg = f'Error while handling reversed path {pth[-1].uid} to {pth[0].uid}:' +\
 | 
					            msg = f'Error while handling reversed path {pth[-1].uid} to {pth[0].uid}:' \
 | 
				
			||||||
                ' can not handle unidir topology. TO DO.'
 | 
					                + ' can not handle unidir topology. TO DO.'
 | 
				
			||||||
            LOGGER.critical(msg)
 | 
					 | 
				
			||||||
            raise ValueError(msg)
 | 
					            raise ValueError(msg)
 | 
				
			||||||
    reversed_path.append(pth[0])
 | 
					    reversed_path.append(pth[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -907,9 +904,7 @@ def find_reversed_path(pth):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def ispart(ptha, pthb):
 | 
					def ispart(ptha, pthb):
 | 
				
			||||||
    """ the functions takes two paths a and b and retrns True
 | 
					    """the functions takes two paths a and b and retrns True if all a elements are part of b and in the same order"""
 | 
				
			||||||
        if all a elements are part of b and in the same order
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    j = 0
 | 
					    j = 0
 | 
				
			||||||
    for elem in ptha:
 | 
					    for elem in ptha:
 | 
				
			||||||
        if elem in pthb:
 | 
					        if elem in pthb:
 | 
				
			||||||
@@ -923,8 +918,7 @@ def ispart(ptha, pthb):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def remove_candidate(candidates, allpaths, rqst, pth):
 | 
					def remove_candidate(candidates, allpaths, rqst, pth):
 | 
				
			||||||
    """ filter duplicate candidates
 | 
					    """filter duplicate candidates"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    # print(f'coucou {rqst.request_id}')
 | 
					    # print(f'coucou {rqst.request_id}')
 | 
				
			||||||
    for key, candidate in candidates.items():
 | 
					    for key, candidate in candidates.items():
 | 
				
			||||||
        temp = candidate.copy()
 | 
					        temp = candidate.copy()
 | 
				
			||||||
@@ -939,8 +933,7 @@ def remove_candidate(candidates, allpaths, rqst, pth):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def compare_reqs(req1, req2, disjlist):
 | 
					def compare_reqs(req1, req2, disjlist):
 | 
				
			||||||
    """ compare two requests: returns True or False
 | 
					    """compare two requests: returns True or False"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    dis1 = [d for d in disjlist if req1.request_id in d.disjunctions_req]
 | 
					    dis1 = [d for d in disjlist if req1.request_id in d.disjunctions_req]
 | 
				
			||||||
    dis2 = [d for d in disjlist if req2.request_id in d.disjunctions_req]
 | 
					    dis2 = [d for d in disjlist if req2.request_id in d.disjunctions_req]
 | 
				
			||||||
    same_disj = False
 | 
					    same_disj = False
 | 
				
			||||||
@@ -973,9 +966,7 @@ def compare_reqs(req1, req2, disjlist):
 | 
				
			|||||||
            req1.format == req2.format and \
 | 
					            req1.format == req2.format and \
 | 
				
			||||||
            req1.OSNR == req2.OSNR and \
 | 
					            req1.OSNR == req2.OSNR and \
 | 
				
			||||||
            req1.roll_off == req2.roll_off and \
 | 
					            req1.roll_off == req2.roll_off and \
 | 
				
			||||||
            same_disj and \
 | 
					            same_disj:
 | 
				
			||||||
            getattr(req1, 'N', None) is None and getattr(req2, 'N', None) is None and \
 | 
					 | 
				
			||||||
            getattr(req1, 'M', None) is None and getattr(req2, 'M', None) is None:
 | 
					 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
@@ -984,17 +975,22 @@ def compare_reqs(req1, req2, disjlist):
 | 
				
			|||||||
def requests_aggregation(pathreqlist, disjlist):
 | 
					def requests_aggregation(pathreqlist, disjlist):
 | 
				
			||||||
    """this function aggregates requests so that if several requests
 | 
					    """this function aggregates requests so that if several requests
 | 
				
			||||||
    exist between same source and destination and with same transponder type
 | 
					    exist between same source and destination and with same transponder type
 | 
				
			||||||
 | 
					    If transponder mode is defined and identical, then also agregates demands.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    # todo maybe add conditions on mode ??, spacing ...
 | 
					    # todo maybe add conditions on mode ??, spacing ...
 | 
				
			||||||
    # currently if undefined takes the default values
 | 
					    # currently if undefined takes the default values
 | 
				
			||||||
    local_list = pathreqlist.copy()
 | 
					    local_list = pathreqlist.copy()
 | 
				
			||||||
    for req in pathreqlist:
 | 
					    for req in pathreqlist:
 | 
				
			||||||
        for this_r in local_list:
 | 
					        for this_r in local_list:
 | 
				
			||||||
            if req.request_id != this_r.request_id and compare_reqs(req, this_r, disjlist):
 | 
					            if req.request_id != this_r.request_id and compare_reqs(req, this_r, disjlist) and\
 | 
				
			||||||
 | 
					                    this_r.tsp_mode is not None:
 | 
				
			||||||
                # aggregate
 | 
					                # aggregate
 | 
				
			||||||
                this_r.path_bandwidth += req.path_bandwidth
 | 
					                this_r.path_bandwidth += req.path_bandwidth
 | 
				
			||||||
 | 
					                this_r.N = this_r.N + req.N
 | 
				
			||||||
 | 
					                this_r.M = this_r.M + req.M
 | 
				
			||||||
                temp_r_id = this_r.request_id
 | 
					                temp_r_id = this_r.request_id
 | 
				
			||||||
                this_r.request_id = ' | '.join((this_r.request_id, req.request_id))
 | 
					                this_r.request_id = ' | '.join((this_r.request_id, req.request_id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # remove request from list
 | 
					                # remove request from list
 | 
				
			||||||
                local_list.remove(req)
 | 
					                local_list.remove(req)
 | 
				
			||||||
                # todo change also disjunction req with new demand
 | 
					                # todo change also disjunction req with new demand
 | 
				
			||||||
@@ -1012,6 +1008,7 @@ def requests_aggregation(pathreqlist, disjlist):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def correct_json_route_list(network, pathreqlist):
 | 
					def correct_json_route_list(network, pathreqlist):
 | 
				
			||||||
    """all names in list should be exact name in the network, and there is no ambiguity
 | 
					    """all names in list should be exact name in the network, and there is no ambiguity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This function only checks that list is correct, warns user if the name is incorrect and
 | 
					    This function only checks that list is correct, warns user if the name is incorrect and
 | 
				
			||||||
    suppresses the constraint it it is loose or raises an error if it is strict
 | 
					    suppresses the constraint it it is loose or raises an error if it is strict
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
@@ -1019,15 +1016,13 @@ def correct_json_route_list(network, pathreqlist):
 | 
				
			|||||||
    transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
 | 
					    transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
 | 
				
			||||||
    for pathreq in pathreqlist:
 | 
					    for pathreq in pathreqlist:
 | 
				
			||||||
        if pathreq.source not in transponders:
 | 
					        if pathreq.source not in transponders:
 | 
				
			||||||
            msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find transponder' +\
 | 
					            msg = f'Request: {pathreq.request_id}: could not find transponder' \
 | 
				
			||||||
                f' source : {pathreq.source}.{ansi_escapes.reset}'
 | 
					                + f' source : {pathreq.source}.'
 | 
				
			||||||
            LOGGER.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if pathreq.destination not in transponders:
 | 
					        if pathreq.destination not in transponders:
 | 
				
			||||||
            msg = f'{ansi_escapes.red}Request: {pathreq.request_id}: could not find transponder' +\
 | 
					            msg = f'Request: {pathreq.request_id}: could not find transponder' \
 | 
				
			||||||
                f' destination : {pathreq.destination}.{ansi_escapes.reset}'
 | 
					                + f' destination : {pathreq.destination}.'
 | 
				
			||||||
            LOGGER.critical(msg)
 | 
					 | 
				
			||||||
            raise ServiceError(msg)
 | 
					            raise ServiceError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # silently remove source and dest nodes from the list
 | 
					        # silently remove source and dest nodes from the list
 | 
				
			||||||
@@ -1046,24 +1041,21 @@ def correct_json_route_list(network, pathreqlist):
 | 
				
			|||||||
                    # if no matching can be found in the network just ignore this constraint
 | 
					                    # if no matching can be found in the network just ignore this constraint
 | 
				
			||||||
                    # if it is a loose constraint
 | 
					                    # if it is a loose constraint
 | 
				
			||||||
                    # warns the user that this node is not part of the topology
 | 
					                    # warns the user that this node is not part of the topology
 | 
				
			||||||
                    msg = f'{ansi_escapes.yellow}invalid route node specified:\n\t\'{n_id}\',' +\
 | 
					                    msg = f'invalid route node specified:\n\t\'{n_id}\',' \
 | 
				
			||||||
                        f' could not use it as constraint, skipped!{ansi_escapes.reset}'
 | 
					                        + ' could not use it as constraint, skipped!'
 | 
				
			||||||
                    print(msg)
 | 
					                    LOGGER.warning(msg)
 | 
				
			||||||
                    LOGGER.info(msg)
 | 
					 | 
				
			||||||
                    pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
					                    pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
 | 
				
			||||||
                    pathreq.nodes_list.remove(n_id)
 | 
					                    pathreq.nodes_list.remove(n_id)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    msg = f'{ansi_escapes.red}could not find node:\n\t \'{n_id}\' in network' +\
 | 
					                    msg = f'could not find node:\n\t \'{n_id}\' in network' \
 | 
				
			||||||
                        f' topology. Strict constraint can not be applied.{ansi_escapes.reset}'
 | 
					                        + ' topology. Strict constraint can not be applied.'
 | 
				
			||||||
                    LOGGER.critical(msg)
 | 
					 | 
				
			||||||
                    raise ServiceError(msg)
 | 
					                    raise ServiceError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return pathreqlist
 | 
					    return pathreqlist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def deduplicate_disjunctions(disjn):
 | 
					def deduplicate_disjunctions(disjn):
 | 
				
			||||||
    """ clean disjunctions to remove possible repetition
 | 
					    """clean disjunctions to remove possible repetition"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    local_disjn = disjn.copy()
 | 
					    local_disjn = disjn.copy()
 | 
				
			||||||
    for elem in local_disjn:
 | 
					    for elem in local_disjn:
 | 
				
			||||||
        for dis_elem in local_disjn:
 | 
					        for dis_elem in local_disjn:
 | 
				
			||||||
@@ -1075,6 +1067,7 @@ def deduplicate_disjunctions(disjn):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
					def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			||||||
    """use a list but a dictionnary might be helpful to find path based on request_id
 | 
					    """use a list but a dictionnary might be helpful to find path based on request_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TODO change all these req, dsjct, res lists into dict !
 | 
					    TODO change all these req, dsjct, res lists into dict !
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    path_res_list = []
 | 
					    path_res_list = []
 | 
				
			||||||
@@ -1086,10 +1079,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			|||||||
        # use the power specified in requests but might be different from the one
 | 
					        # use the power specified in requests but might be different from the one
 | 
				
			||||||
        # specified for design the power is an optional parameter for requests
 | 
					        # specified for design the power is an optional parameter for requests
 | 
				
			||||||
        # definition if optional, use the one defines in eqt_config.json
 | 
					        # definition if optional, use the one defines in eqt_config.json
 | 
				
			||||||
        print(f'request {pathreq.request_id}')
 | 
					        msg = f'\n\trequest {pathreq.request_id}\n' \
 | 
				
			||||||
        print(f'Computing path from {pathreq.source} to {pathreq.destination}')
 | 
					              + f'\tComputing path from {pathreq.source} to {pathreq.destination}\n' \
 | 
				
			||||||
        # adding first node to be clearer on the output
 | 
					              + f'\twith path constraint: {[pathreq.source] + pathreq.nodes_list}'
 | 
				
			||||||
        print(f'with path constraint: {[pathreq.source] + pathreq.nodes_list}')
 | 
					        # # adding first node to be clearer on the output
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # pathlist[i] contains the whole path information for request i
 | 
					        # pathlist[i] contains the whole path information for request i
 | 
				
			||||||
        # last element is a transciver and where the result of the propagation is
 | 
					        # last element is a transciver and where the result of the propagation is
 | 
				
			||||||
@@ -1098,8 +1091,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			|||||||
        # elements to simulate performance, several demands having the same destination
 | 
					        # elements to simulate performance, several demands having the same destination
 | 
				
			||||||
        # may use the same transponder for the performance simulation. This is why
 | 
					        # may use the same transponder for the performance simulation. This is why
 | 
				
			||||||
        # we use deepcopy: to ensure that each propagation is recorded and not overwritten
 | 
					        # we use deepcopy: to ensure that each propagation is recorded and not overwritten
 | 
				
			||||||
 | 
					        network_module.design_network(pathreq, network, equipment, set_connector_losses=False, verbose=False)
 | 
				
			||||||
        total_path = deepcopy(pathlist[i])
 | 
					        total_path = deepcopy(pathlist[i])
 | 
				
			||||||
        print(f'Computed path (roadms):{[e.uid for e in total_path  if isinstance(e, Roadm)]}')
 | 
					        msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path  if isinstance(e, Roadm)]}'
 | 
				
			||||||
 | 
					        LOGGER.info(msg)
 | 
				
			||||||
        # for debug
 | 
					        # for debug
 | 
				
			||||||
        # print(f'{pathreq.baud_rate}   {pathreq.power}   {pathreq.spacing}   {pathreq.nb_channel}')
 | 
					        # print(f'{pathreq.baud_rate}   {pathreq.power}   {pathreq.spacing}   {pathreq.nb_channel}')
 | 
				
			||||||
        if total_path:
 | 
					        if total_path:
 | 
				
			||||||
@@ -1107,13 +1102,15 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			|||||||
                # means that at this point the mode was entered/forced by user and thus a
 | 
					                # means that at this point the mode was entered/forced by user and thus a
 | 
				
			||||||
                # baud_rate was defined
 | 
					                # baud_rate was defined
 | 
				
			||||||
                propagate(total_path, pathreq, equipment)
 | 
					                propagate(total_path, pathreq, equipment)
 | 
				
			||||||
                temp_snr01nm = round(mean(total_path[-1].snr+lin2db(pathreq.baud_rate/(12.5e9))), 2)
 | 
					                snr01nm_with_penalty = total_path[-1].snr_01nm - total_path[-1].total_penalty
 | 
				
			||||||
                if temp_snr01nm < pathreq.OSNR + equipment['SI']['default'].sys_margins:
 | 
					                min_ind = argmin(snr01nm_with_penalty)
 | 
				
			||||||
                    msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
 | 
					                if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
 | 
				
			||||||
                          f' {pathreq.source} to {pathreq.destination} does not pass with' +\
 | 
					                    msg = f'\tWarning! Request {pathreq.request_id} computed path from' \
 | 
				
			||||||
                          f' {pathreq.tsp_mode}\n\tcomputedSNR in 0.1nm = {temp_snr01nm} ' +\
 | 
					                          + f' {pathreq.source} to {pathreq.destination} does not pass with {pathreq.tsp_mode}' \
 | 
				
			||||||
                          f'- required osnr {pathreq.OSNR} + {equipment["SI"]["default"].sys_margins} margin'
 | 
					                          + f'\n\tcomputed SNR in 0.1nm = {round(total_path[-1].snr_01nm[min_ind], 2)}'
 | 
				
			||||||
                    print(msg)
 | 
					                    msg = _penalty_msg(total_path, msg, min_ind) \
 | 
				
			||||||
 | 
					                        + f'\n\trequired osnr = {pathreq.OSNR}' \
 | 
				
			||||||
 | 
					                        + f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
 | 
				
			||||||
                    LOGGER.warning(msg)
 | 
					                    LOGGER.warning(msg)
 | 
				
			||||||
                    pathreq.blocking_reason = 'MODE_NOT_FEASIBLE'
 | 
					                    pathreq.blocking_reason = 'MODE_NOT_FEASIBLE'
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
@@ -1133,6 +1130,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']
 | 
				
			||||||
@@ -1141,26 +1139,27 @@ 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])
 | 
				
			||||||
            if pathreq.bidir and pathreq.baud_rate is not None:
 | 
					            if pathreq.bidir and pathreq.baud_rate is not None:
 | 
				
			||||||
                # Both directions requested, and a feasible mode was found
 | 
					                # Both directions requested, and a feasible mode was found
 | 
				
			||||||
                rev_p = deepcopy(reversed_path)
 | 
					                rev_p = deepcopy(reversed_path)
 | 
				
			||||||
 | 
					                msg = f'\n\tPropagating Z to A direction {pathreq.destination} to {pathreq.source}\n' \
 | 
				
			||||||
                print(f'\n\tPropagating Z to A direction {pathreq.destination} to {pathreq.source}')
 | 
					                      + f'\tPath (roadms) {[r.uid for r in rev_p if isinstance(r,Roadm)]}\n'
 | 
				
			||||||
                print(f'\tPath (roadsm) {[r.uid for r in rev_p if isinstance(r,Roadm)]}\n')
 | 
					                LOGGER.info(msg)
 | 
				
			||||||
                propagate(rev_p, pathreq, equipment)
 | 
					                propagate(rev_p, pathreq, equipment)
 | 
				
			||||||
                propagated_reversed_path = rev_p
 | 
					                propagated_reversed_path = rev_p
 | 
				
			||||||
                temp_snr01nm = round(mean(propagated_reversed_path[-1].snr +\
 | 
					                snr01nm_with_penalty = rev_p[-1].snr_01nm - rev_p[-1].total_penalty
 | 
				
			||||||
                                          lin2db(pathreq.baud_rate/(12.5e9))), 2)
 | 
					                min_ind = argmin(snr01nm_with_penalty)
 | 
				
			||||||
                if temp_snr01nm < pathreq.OSNR + equipment['SI']['default'].sys_margins:
 | 
					                if round(snr01nm_with_penalty[min_ind], 2) < pathreq.OSNR + equipment['SI']['default'].sys_margins:
 | 
				
			||||||
                    msg = f'\tWarning! Request {pathreq.request_id} computed path from' +\
 | 
					                    msg = f'\tWarning! Request {pathreq.request_id} computed path from' \
 | 
				
			||||||
                          f' {pathreq.source} to {pathreq.destination} does not pass with' +\
 | 
					                          + f' {pathreq.destination} to {pathreq.source} does not pass with {pathreq.tsp_mode}' \
 | 
				
			||||||
                          f' {pathreq.tsp_mode}\n' +\
 | 
					                          + f'\n\tcomputed SNR in 0.1nm = {round(rev_p[-1].snr_01nm[min_ind], 2)}'
 | 
				
			||||||
                          f'\tcomputedSNR in 0.1nm = {temp_snr01nm} -' \
 | 
					                    msg = _penalty_msg(rev_p, msg, min_ind) \
 | 
				
			||||||
                          f' required osnr {pathreq.OSNR} + {equipment["SI"]["default"].sys_margins} margin'
 | 
					                        + f'\n\trequired osnr = {pathreq.OSNR}' \
 | 
				
			||||||
                    print(msg)
 | 
					                        + f'\n\tsystem margin = {equipment["SI"]["default"].sys_margins}'
 | 
				
			||||||
                    LOGGER.warning(msg)
 | 
					                    LOGGER.warning(msg)
 | 
				
			||||||
                    # TODO selection of mode should also be on reversed direction !!
 | 
					                    # TODO selection of mode should also be on reversed direction !!
 | 
				
			||||||
                    if not hasattr(pathreq, 'blocking_reason'):
 | 
					                    if not hasattr(pathreq, 'blocking_reason'):
 | 
				
			||||||
@@ -1168,9 +1167,8 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			|||||||
            else:
 | 
					            else:
 | 
				
			||||||
                propagated_reversed_path = []
 | 
					                propagated_reversed_path = []
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            msg = 'Total path is empty. No propagation'
 | 
					            msg = f'Request {pathreq.request_id}: Total path is empty. No propagation'
 | 
				
			||||||
            print(msg)
 | 
					            LOGGER.warning(msg)
 | 
				
			||||||
            LOGGER.info(msg)
 | 
					 | 
				
			||||||
            reversed_path = []
 | 
					            reversed_path = []
 | 
				
			||||||
            propagated_reversed_path = []
 | 
					            propagated_reversed_path = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1178,12 +1176,12 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
 | 
				
			|||||||
        reversed_path_res_list.append(reversed_path)
 | 
					        reversed_path_res_list.append(reversed_path)
 | 
				
			||||||
        propagated_reversed_path_res_list.append(propagated_reversed_path)
 | 
					        propagated_reversed_path_res_list.append(propagated_reversed_path)
 | 
				
			||||||
        # print to have a nice output
 | 
					        # print to have a nice output
 | 
				
			||||||
        print('')
 | 
					 | 
				
			||||||
    return path_res_list, reversed_path_res_list, propagated_reversed_path_res_list
 | 
					    return path_res_list, reversed_path_res_list, propagated_reversed_path_res_list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def compute_spectrum_slot_vs_bandwidth(bandwidth, spacing, bit_rate, slot_width=0.0125e12):
 | 
					def compute_spectrum_slot_vs_bandwidth(bandwidth, spacing, bit_rate, slot_width=0.0125e12):
 | 
				
			||||||
    """Compute the number of required wavelengths and the M value (number of consumed slots)
 | 
					    """Compute the number of required wavelengths and the M value (number of consumed slots)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Each wavelength consumes one `spacing`, and the result is rounded up to consume a natural number of slots.
 | 
					    Each wavelength consumes one `spacing`, and the result is rounded up to consume a natural number of slots.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    >>> compute_spectrum_slot_vs_bandwidth(400e9, 50e9, 200e9)
 | 
					    >>> compute_spectrum_slot_vs_bandwidth(400e9, 50e9, 200e9)
 | 
				
			||||||
@@ -1192,3 +1190,19 @@ def compute_spectrum_slot_vs_bandwidth(bandwidth, spacing, bit_rate, slot_width=
 | 
				
			|||||||
    number_of_wavelengths = ceil(bandwidth / bit_rate)
 | 
					    number_of_wavelengths = ceil(bandwidth / bit_rate)
 | 
				
			||||||
    total_number_of_slots = ceil(spacing / slot_width) * number_of_wavelengths
 | 
					    total_number_of_slots = ceil(spacing / slot_width) * number_of_wavelengths
 | 
				
			||||||
    return number_of_wavelengths, total_number_of_slots
 | 
					    return number_of_wavelengths, total_number_of_slots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def _penalty_msg(total_path, msg, min_ind):
 | 
				
			||||||
 | 
					    """formatting helper for reporting unfeasible paths
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    The penalty info are optional, so this checks that penalty exists before creating a message."""
 | 
				
			||||||
 | 
					    penalty_dict = {
 | 
				
			||||||
 | 
					        'pdl': 'PDL',
 | 
				
			||||||
 | 
					        'chromatic_dispersion': 'CD',
 | 
				
			||||||
 | 
					        'pmd': 'PMD'}
 | 
				
			||||||
 | 
					    for key, pretty in penalty_dict.items():
 | 
				
			||||||
 | 
					        if key in total_path[-1].penalties:
 | 
				
			||||||
 | 
					            msg += f'\n\t{pretty} penalty = {round(total_path[-1].penalties[key][min_ind], 2)}'
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            msg += f'\n\t{pretty} penalty not evaluated'
 | 
				
			||||||
 | 
					    return msg
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,17 +15,16 @@ element/oms correspondace
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
from logging import getLogger
 | 
					from logging import getLogger
 | 
				
			||||||
from math import ceil
 | 
					 | 
				
			||||||
from gnpy.core.elements import Roadm, Transceiver
 | 
					from gnpy.core.elements import Roadm, Transceiver
 | 
				
			||||||
from gnpy.core.exceptions import ServiceError, SpectrumError
 | 
					from gnpy.core.exceptions import ServiceError, SpectrumError
 | 
				
			||||||
 | 
					from gnpy.core.utils import order_slots, restore_order
 | 
				
			||||||
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth
 | 
					from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LOGGER = getLogger(__name__)
 | 
					LOGGER = getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Bitmap:
 | 
					class Bitmap:
 | 
				
			||||||
    """ records the spectrum occupation
 | 
					    """records the spectrum occupation"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, f_min, f_max, grid, guardband=0.15e12, bitmap=None):
 | 
					    def __init__(self, f_min, f_max, grid, guardband=0.15e12, bitmap=None):
 | 
				
			||||||
        # n is the min index including guardband. Guardband is require to be sure
 | 
					        # n is the min index including guardband. Guardband is require to be sure
 | 
				
			||||||
@@ -46,26 +45,22 @@ class Bitmap:
 | 
				
			|||||||
            raise SpectrumError(f'bitmap is not consistant with f_min{f_min} - n: {n_min} and f_max{f_max}- n :{n_max}')
 | 
					            raise SpectrumError(f'bitmap is not consistant with f_min{f_min} - n: {n_min} and f_max{f_max}- n :{n_max}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getn(self, i):
 | 
					    def getn(self, i):
 | 
				
			||||||
        """ converts the n (itu grid) into a local index
 | 
					        """converts the n (itu grid) into a local index"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        return self.freq_index[i]
 | 
					        return self.freq_index[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def geti(self, nvalue):
 | 
					    def geti(self, nvalue):
 | 
				
			||||||
        """ converts the local index into n (itu grid)
 | 
					        """converts the local index into n (itu grid)"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        return self.freq_index.index(nvalue)
 | 
					        return self.freq_index.index(nvalue)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def insert_left(self, newbitmap):
 | 
					    def insert_left(self, newbitmap):
 | 
				
			||||||
        """ insert bitmap on the left to align oms bitmaps if their start frequencies are different
 | 
					        """insert bitmap on the left to align oms bitmaps if their start frequencies are different"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        self.bitmap = newbitmap + self.bitmap
 | 
					        self.bitmap = newbitmap + self.bitmap
 | 
				
			||||||
        temp = list(range(self.n_min - len(newbitmap), self.n_min))
 | 
					        temp = list(range(self.n_min - len(newbitmap), self.n_min))
 | 
				
			||||||
        self.freq_index = temp + self.freq_index
 | 
					        self.freq_index = temp + self.freq_index
 | 
				
			||||||
        self.n_min = self.freq_index[0]
 | 
					        self.n_min = self.freq_index[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def insert_right(self, newbitmap):
 | 
					    def insert_right(self, newbitmap):
 | 
				
			||||||
        """ insert bitmap on the right to align oms bitmaps if their stop frequencies are different
 | 
					        """insert bitmap on the right to align oms bitmaps if their stop frequencies are different"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        self.bitmap = self.bitmap + newbitmap
 | 
					        self.bitmap = self.bitmap + newbitmap
 | 
				
			||||||
        self.freq_index = self.freq_index + list(range(self.n_max, self.n_max + len(newbitmap)))
 | 
					        self.freq_index = self.freq_index + list(range(self.n_max, self.n_max + len(newbitmap)))
 | 
				
			||||||
        self.n_max = self.freq_index[-1]
 | 
					        self.n_max = self.freq_index[-1]
 | 
				
			||||||
@@ -99,36 +94,28 @@ class OMS:
 | 
				
			|||||||
                            f'{self.el_id_list[0]} - {self.el_id_list[-1]}', '\n'])
 | 
					                            f'{self.el_id_list[0]} - {self.el_id_list[-1]}', '\n'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add_element(self, elem):
 | 
					    def add_element(self, elem):
 | 
				
			||||||
        """ records oms elements
 | 
					        """records oms elements"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        self.el_id_list.append(elem.uid)
 | 
					        self.el_id_list.append(elem.uid)
 | 
				
			||||||
        self.el_list.append(elem)
 | 
					        self.el_list.append(elem)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def update_spectrum(self, f_min, f_max, guardband=0.15e12, existing_spectrum=None,
 | 
					    def update_spectrum(self, f_min, f_max, guardband=0.15e12, existing_spectrum=None, grid=0.00625e12):
 | 
				
			||||||
                        grid=0.00625e12):
 | 
					        """Frequencies expressed in Hz.
 | 
				
			||||||
        """ frequencies expressed in Hz
 | 
					        Add 150 GHz margin to enable a center channel on f_min
 | 
				
			||||||
 | 
					        Use ITU-T G694.1 Flexible DWDM grid definition
 | 
				
			||||||
 | 
					        For the flexible DWDM grid, the allowed frequency slots have a nominal central frequency (in THz) defined by:
 | 
				
			||||||
 | 
					        193.1 + n × 0.00625 where n is a positive or negative integer including 0
 | 
				
			||||||
 | 
					        and 0.00625 is the nominal central frequency granularity in THz
 | 
				
			||||||
 | 
					        and a slot width defined by:
 | 
				
			||||||
 | 
					        12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.
 | 
				
			||||||
 | 
					        Any combination of frequency slots is allowed as long as no two frequency slots overlap.
 | 
				
			||||||
 | 
					        If bitmap is not None, then use it: Bitmap checks its consistency with f_min f_max
 | 
				
			||||||
 | 
					        else a brand new bitmap is created
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if existing_spectrum is None:
 | 
					        self.spectrum_bitmap = Bitmap(f_min=f_min, f_max=f_max, grid=grid, guardband=guardband,
 | 
				
			||||||
            # add some 150 GHz margin to enable a center channel on f_min
 | 
					                                      bitmap=existing_spectrum)
 | 
				
			||||||
            # use ITU-T G694.1
 | 
					 | 
				
			||||||
            # Flexible DWDM grid definition
 | 
					 | 
				
			||||||
            # For the flexible DWDM grid, the allowed frequency slots have a nominal
 | 
					 | 
				
			||||||
            # central frequency (in THz) defined by:
 | 
					 | 
				
			||||||
            # 193.1 + n × 0.00625 where n is a positive or negative integer including 0
 | 
					 | 
				
			||||||
            # and 0.00625 is the nominal central frequency granularity in THz
 | 
					 | 
				
			||||||
            # and a slot width defined by:
 | 
					 | 
				
			||||||
            # 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in
 | 
					 | 
				
			||||||
            # GHz.
 | 
					 | 
				
			||||||
            # Any combination of frequency slots is allowed as long as no two frequency
 | 
					 | 
				
			||||||
            # slots overlap.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            # TODO : add explaination on that / parametrize ....
 | 
					 | 
				
			||||||
            self.spectrum_bitmap = Bitmap(f_min, f_max, grid, guardband)
 | 
					 | 
				
			||||||
            # print(len(self.spectrum_bitmap.bitmap))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def assign_spectrum(self, nvalue, mvalue):
 | 
					    def assign_spectrum(self, nvalue, mvalue):
 | 
				
			||||||
        """ change oms spectrum to mark spectrum assigned
 | 
					        """change oms spectrum to mark spectrum assigned"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        if not isinstance(nvalue, int):
 | 
					        if not isinstance(nvalue, int):
 | 
				
			||||||
            raise SpectrumError(f'N must be a signed integer, got {nvalue}')
 | 
					            raise SpectrumError(f'N must be a signed integer, got {nvalue}')
 | 
				
			||||||
        if not isinstance(mvalue, int):
 | 
					        if not isinstance(mvalue, int):
 | 
				
			||||||
@@ -147,14 +134,14 @@ class OMS:
 | 
				
			|||||||
        self.spectrum_bitmap.bitmap[self.spectrum_bitmap.geti(startn):self.spectrum_bitmap.geti(stopn) + 1] = [0] * (stopn - startn + 1)
 | 
					        self.spectrum_bitmap.bitmap[self.spectrum_bitmap.geti(startn):self.spectrum_bitmap.geti(stopn) + 1] = [0] * (stopn - startn + 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def add_service(self, service_id, nb_wl):
 | 
					    def add_service(self, service_id, nb_wl):
 | 
				
			||||||
        """ record service and mark spectrum as occupied
 | 
					        """record service and mark spectrum as occupied"""
 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        self.service_list.append(service_id)
 | 
					        self.service_list.append(service_id)
 | 
				
			||||||
        self.nb_channels += nb_wl
 | 
					        self.nb_channels += nb_wl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def frequency_to_n(freq, grid=0.00625e12):
 | 
					def frequency_to_n(freq, grid=0.00625e12):
 | 
				
			||||||
    """converts frequency into the n value (ITU grid)
 | 
					    """converts frequency into the n value (ITU grid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
					    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
				
			||||||
    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
					    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,6 +156,7 @@ def frequency_to_n(freq, grid=0.00625e12):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def nvalue_to_frequency(nvalue, grid=0.00625e12):
 | 
					def nvalue_to_frequency(nvalue, grid=0.00625e12):
 | 
				
			||||||
    """converts n value into a frequency
 | 
					    """converts n value into a frequency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reference to Recommendation G.694.1 (02/12), Table 1
 | 
					    reference to Recommendation G.694.1 (02/12), Table 1
 | 
				
			||||||
    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
					    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -182,8 +170,7 @@ def nvalue_to_frequency(nvalue, grid=0.00625e12):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def mvalue_to_slots(nvalue, mvalue):
 | 
					def mvalue_to_slots(nvalue, mvalue):
 | 
				
			||||||
    """ convert center n an m into start and stop n
 | 
					    """convert center n an m into start and stop n"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    startn = nvalue - mvalue
 | 
					    startn = nvalue - mvalue
 | 
				
			||||||
    stopn = nvalue + mvalue - 1
 | 
					    stopn = nvalue + mvalue - 1
 | 
				
			||||||
    return startn, stopn
 | 
					    return startn, stopn
 | 
				
			||||||
@@ -191,6 +178,7 @@ def mvalue_to_slots(nvalue, mvalue):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def slots_to_m(startn, stopn):
 | 
					def slots_to_m(startn, stopn):
 | 
				
			||||||
    """converts the start and stop n values to the center n and m value
 | 
					    """converts the start and stop n values to the center n and m value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
					    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
				
			||||||
    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
					    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -208,6 +196,7 @@ def slots_to_m(startn, stopn):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def m_to_freq(nvalue, mvalue, grid=0.00625e12):
 | 
					def m_to_freq(nvalue, mvalue, grid=0.00625e12):
 | 
				
			||||||
    """converts m into frequency range
 | 
					    """converts m into frequency range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    spectrum(13,7) is (193137500000000.0, 193225000000000.0)
 | 
					    spectrum(13,7) is (193137500000000.0, 193225000000000.0)
 | 
				
			||||||
    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
					    reference to Recommendation G.694.1 (02/12), Figure I.3
 | 
				
			||||||
    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
					    https://www.itu.int/rec/T-REC-G.694.1-201202-I/en
 | 
				
			||||||
@@ -226,9 +215,7 @@ def m_to_freq(nvalue, mvalue, grid=0.00625e12):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def align_grids(oms_list):
 | 
					def align_grids(oms_list):
 | 
				
			||||||
    """ used to apply same grid to all oms : same starting n, stop n and slot size
 | 
					    """Used to apply same grid to all oms : same starting n, stop n and slot size. Out of grid slots are set to 0."""
 | 
				
			||||||
        out of grid slots are set to 0
 | 
					 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    n_min = min([o.spectrum_bitmap.n_min for o in oms_list])
 | 
					    n_min = min([o.spectrum_bitmap.n_min for o in oms_list])
 | 
				
			||||||
    n_max = max([o.spectrum_bitmap.n_max for o in oms_list])
 | 
					    n_max = max([o.spectrum_bitmap.n_max for o in oms_list])
 | 
				
			||||||
    for this_o in oms_list:
 | 
					    for this_o in oms_list:
 | 
				
			||||||
@@ -241,6 +228,7 @@ def align_grids(oms_list):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def build_oms_list(network, equipment):
 | 
					def build_oms_list(network, equipment):
 | 
				
			||||||
    """initialization of OMS list in the network
 | 
					    """initialization of OMS list in the network
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    an oms is build reading all intermediate nodes between two adjacent ROADMs
 | 
					    an oms is build reading all intermediate nodes between two adjacent ROADMs
 | 
				
			||||||
    each element within the list is being added an oms and oms_id to record the
 | 
					    each element within the list is being added an oms and oms_id to record the
 | 
				
			||||||
    oms it belongs to.
 | 
					    oms it belongs to.
 | 
				
			||||||
@@ -298,6 +286,7 @@ def build_oms_list(network, equipment):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def reversed_oms(oms_list):
 | 
					def reversed_oms(oms_list):
 | 
				
			||||||
    """identifies reversed OMS
 | 
					    """identifies reversed OMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    only applicable for non parallel OMS
 | 
					    only applicable for non parallel OMS
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    for oms in oms_list:
 | 
					    for oms in oms_list:
 | 
				
			||||||
@@ -323,28 +312,41 @@ def bitmap_sum(band1, band2):
 | 
				
			|||||||
    return res
 | 
					    return res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def spectrum_selection(pth, oms_list, requested_m, requested_n=None):
 | 
					def build_path_oms_id_list(pth):
 | 
				
			||||||
    """Collects spectrum availability and call the select_candidate function"""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # use indexes instead of ITU-T n values
 | 
					 | 
				
			||||||
    path_oms = []
 | 
					    path_oms = []
 | 
				
			||||||
    for elem in pth:
 | 
					    for elem in pth:
 | 
				
			||||||
        if not isinstance(elem, Roadm) and not isinstance(elem, Transceiver):
 | 
					        if not isinstance(elem, Roadm) and not isinstance(elem, Transceiver):
 | 
				
			||||||
            # only edfa, fused and fibers have oms_id attribute
 | 
					            # only edfa, fused and fibers have oms_id attribute
 | 
				
			||||||
            path_oms.append(elem.oms_id)
 | 
					            path_oms.append(elem.oms_id)
 | 
				
			||||||
    # remove duplicate oms_id, order is not important
 | 
					    # remove duplicate oms_id, order is not important
 | 
				
			||||||
    path_oms = list(set(path_oms))
 | 
					    return list(set(path_oms))
 | 
				
			||||||
    # assuming all oms have same freq index
 | 
					 | 
				
			||||||
    if not path_oms:
 | 
					 | 
				
			||||||
        candidate = (None, None, None)
 | 
					 | 
				
			||||||
        return candidate, path_oms
 | 
					 | 
				
			||||||
    freq_index = oms_list[path_oms[0]].spectrum_bitmap.freq_index
 | 
					 | 
				
			||||||
    freq_index_min = oms_list[path_oms[0]].spectrum_bitmap.freq_index_min
 | 
					 | 
				
			||||||
    freq_index_max = oms_list[path_oms[0]].spectrum_bitmap.freq_index_max
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    freq_availability = oms_list[path_oms[0]].spectrum_bitmap.bitmap
 | 
					
 | 
				
			||||||
 | 
					def aggregate_oms_bitmap(path_oms, oms_list):
 | 
				
			||||||
 | 
					    spectrum = oms_list[path_oms[0]].spectrum_bitmap
 | 
				
			||||||
 | 
					    bitmap = spectrum.bitmap
 | 
				
			||||||
 | 
					    # assuming all oms have same freq indices
 | 
				
			||||||
    for oms in path_oms[1:]:
 | 
					    for oms in path_oms[1:]:
 | 
				
			||||||
        freq_availability = bitmap_sum(oms_list[oms].spectrum_bitmap.bitmap, freq_availability)
 | 
					        bitmap = bitmap_sum(oms_list[oms].spectrum_bitmap.bitmap, bitmap)
 | 
				
			||||||
 | 
					    params = {
 | 
				
			||||||
 | 
					        'oms_id': 0,
 | 
				
			||||||
 | 
					        'el_id_list': 0,
 | 
				
			||||||
 | 
					        'el_list': []
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    freq_min = nvalue_to_frequency(spectrum.freq_index_min)
 | 
				
			||||||
 | 
					    freq_max = nvalue_to_frequency(spectrum.freq_index_max)
 | 
				
			||||||
 | 
					    aggregate_oms = OMS(**params)
 | 
				
			||||||
 | 
					    aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, existing_spectrum=bitmap)
 | 
				
			||||||
 | 
					    return aggregate_oms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def spectrum_selection(test_oms, requested_m, requested_n=None):
 | 
				
			||||||
 | 
					    """Collects spectrum availability and call the select_candidate function"""
 | 
				
			||||||
 | 
					    freq_index = test_oms.spectrum_bitmap.freq_index
 | 
				
			||||||
 | 
					    freq_index_min = test_oms.spectrum_bitmap.freq_index_min
 | 
				
			||||||
 | 
					    freq_index_max = test_oms.spectrum_bitmap.freq_index_max
 | 
				
			||||||
 | 
					    freq_availability = test_oms.spectrum_bitmap.bitmap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if requested_n is None:
 | 
					    if requested_n is None:
 | 
				
			||||||
        # avoid slots reserved on the edge 0.15e-12 on both sides -> 24
 | 
					        # avoid slots reserved on the edge 0.15e-12 on both sides -> 24
 | 
				
			||||||
        candidates = [(freq_index[i] + requested_m, freq_index[i], freq_index[i] + 2 * requested_m - 1)
 | 
					        candidates = [(freq_index[i] + requested_m, freq_index[i], freq_index[i] + 2 * requested_m - 1)
 | 
				
			||||||
@@ -355,29 +357,36 @@ def spectrum_selection(pth, oms_list, requested_m, requested_n=None):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        candidate = select_candidate(candidates, policy='first_fit')
 | 
					        candidate = select_candidate(candidates, policy='first_fit')
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        i = oms_list[path_oms[0]].spectrum_bitmap.geti(requested_n)
 | 
					        i = test_oms.spectrum_bitmap.geti(requested_n)
 | 
				
			||||||
        # print(f'N {requested_n} i {i}')
 | 
					        if (freq_availability[i - requested_m:i + requested_m] == [1] * (2 * requested_m)
 | 
				
			||||||
        # print(freq_availability[i-m:i+m] )
 | 
					                and freq_index[i - requested_m] >= freq_index_min
 | 
				
			||||||
        # print(freq_index[i-m:i+m])
 | 
					 | 
				
			||||||
        if (freq_availability[i - requested_m:i + requested_m] == [1] * (2 * requested_m) and
 | 
					 | 
				
			||||||
                freq_index[i - requested_m] >= freq_index_min
 | 
					 | 
				
			||||||
                and freq_index[i + requested_m - 1] <= freq_index_max):
 | 
					                and freq_index[i + requested_m - 1] <= freq_index_max):
 | 
				
			||||||
            # candidate is the triplet center_n, startn and stopn
 | 
					            # candidate is the triplet center_n, startn and stopn
 | 
				
			||||||
            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")
 | 
					    return candidate
 | 
				
			||||||
        # print(candidate)
 | 
					
 | 
				
			||||||
    # print(freq_availability[321:321+2*m])
 | 
					
 | 
				
			||||||
    # a = [i+321 for i in range(2*m)]
 | 
					def determine_slot_numbers(test_oms, requested_n, required_m, per_channel_m):
 | 
				
			||||||
    # print(a)
 | 
					    """determines max availability around requested_n. requested_n should not be None"""
 | 
				
			||||||
    # print(candidate)
 | 
					    bitmap = test_oms.spectrum_bitmap
 | 
				
			||||||
    return candidate, path_oms
 | 
					    freq_index = bitmap.freq_index
 | 
				
			||||||
 | 
					    freq_index_min = bitmap.freq_index_min
 | 
				
			||||||
 | 
					    freq_index_max = bitmap.freq_index_max
 | 
				
			||||||
 | 
					    freq_availability = bitmap.bitmap
 | 
				
			||||||
 | 
					    center_i = bitmap.geti(requested_n)
 | 
				
			||||||
 | 
					    i = per_channel_m
 | 
				
			||||||
 | 
					    while (freq_availability[center_i - i:center_i + i] == [1] * (2 * i)
 | 
				
			||||||
 | 
					           and freq_index[center_i - i] >= freq_index_min
 | 
				
			||||||
 | 
					           and freq_index[center_i + i - 1] <= freq_index_max
 | 
				
			||||||
 | 
					           and i <= required_m):
 | 
				
			||||||
 | 
					        i += per_channel_m
 | 
				
			||||||
 | 
					    return i - per_channel_m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def select_candidate(candidates, policy):
 | 
					def select_candidate(candidates, policy):
 | 
				
			||||||
    """ selects a candidate among all available spectrum
 | 
					    """selects a candidate among all available spectrum"""
 | 
				
			||||||
    """
 | 
					 | 
				
			||||||
    if policy == 'first_fit':
 | 
					    if policy == 'first_fit':
 | 
				
			||||||
        if candidates:
 | 
					        if candidates:
 | 
				
			||||||
            return candidates[0]
 | 
					            return candidates[0]
 | 
				
			||||||
@@ -387,44 +396,112 @@ def select_candidate(candidates, policy):
 | 
				
			|||||||
        raise ServiceError('Only first_fit spectrum assignment policy is implemented.')
 | 
					        raise ServiceError('Only first_fit spectrum assignment policy is implemented.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def compute_n_m(required_m, rq, path_oms, oms_list, per_channel_m, policy='first_fit'):
 | 
				
			||||||
 | 
					    """ based on requested path_bandwidth fill in M=None values with uint values, using per_channel_m
 | 
				
			||||||
 | 
					    and center frequency, with first fit strategy. The function checks the available spectrum but check
 | 
				
			||||||
 | 
					    consistencies among M values of the request, but not with other requests.
 | 
				
			||||||
 | 
					    For example, if request is for 32 slots corresponding to 8 x 4 slots of 32Gbauds channels,
 | 
				
			||||||
 | 
					    the following frequency slots will result in the following assignment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    N = 0, 8,    16, 32           -> 0,   8,   16,   32
 | 
				
			||||||
 | 
					    M = 8, None, 8,  None         -> 8,   8,    8,    8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    N = 0,    8,    16, 32        -> 0,   , 16
 | 
				
			||||||
 | 
					    M = None, None, 8,  None      -> 24,  , 8
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    selected_m = []
 | 
				
			||||||
 | 
					    selected_n = []
 | 
				
			||||||
 | 
					    remaining_slots_to_serve = required_m
 | 
				
			||||||
 | 
					    # order slots for the computation: assign biggest m first
 | 
				
			||||||
 | 
					    rq_N, rq_M, order = order_slots([{'N': n, 'M': m} for n, m in zip(rq.N, rq.M)])
 | 
				
			||||||
 | 
					    # Create an oms that represents current assignments of all oms listed in path_oms, and test N and M on it.
 | 
				
			||||||
 | 
					    # If M is defined, checks that proposed N, M is free
 | 
				
			||||||
 | 
					    test_oms = aggregate_oms_bitmap(path_oms, oms_list)
 | 
				
			||||||
 | 
					    for n, m in zip(rq_N, rq_M):
 | 
				
			||||||
 | 
					        if m is not None and n is not None:
 | 
				
			||||||
 | 
					            # check availabilityfor this n, m
 | 
				
			||||||
 | 
					            available_slots = determine_slot_numbers(test_oms, n, m, m)
 | 
				
			||||||
 | 
					            if available_slots == 0:
 | 
				
			||||||
 | 
					                # if n, m are not feasible, break at this point no have non zero remaining_slots_to_serve
 | 
				
			||||||
 | 
					                # in order to blocks the request (even is other N,M where feasible)
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        elif m is not None and n is None:
 | 
				
			||||||
 | 
					            # find a candidate n
 | 
				
			||||||
 | 
					            n, _, _ = spectrum_selection(test_oms, m, None)
 | 
				
			||||||
 | 
					            if n is None:
 | 
				
			||||||
 | 
					                # if no n is feasible for the m, block the request
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        elif m is None and n is not None:
 | 
				
			||||||
 | 
					            # find a feasible m for this n. If None is found, then block the request
 | 
				
			||||||
 | 
					            m = determine_slot_numbers(test_oms, n, remaining_slots_to_serve, per_channel_m)
 | 
				
			||||||
 | 
					            if m == 0 or remaining_slots_to_serve == 0:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            # if n and m are not defined, try to find a single  assignment to fits the remaining slots to serve
 | 
				
			||||||
 | 
					            # (first fit strategy)
 | 
				
			||||||
 | 
					            n, _, _ = spectrum_selection(test_oms, remaining_slots_to_serve, None)
 | 
				
			||||||
 | 
					            if n is None or remaining_slots_to_serve == 0:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                m = remaining_slots_to_serve
 | 
				
			||||||
 | 
					        selected_m.append(m)
 | 
				
			||||||
 | 
					        selected_n.append(n)
 | 
				
			||||||
 | 
					        test_oms.assign_spectrum(n, m)
 | 
				
			||||||
 | 
					        remaining_slots_to_serve = remaining_slots_to_serve - m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # re-order selected_m and selected_n according to initial request N, M order, ignoring None values
 | 
				
			||||||
 | 
					    not_selected = [None for i in range(len(rq_N) - len(selected_n))]
 | 
				
			||||||
 | 
					    selected_m = restore_order(selected_m + not_selected, order)
 | 
				
			||||||
 | 
					    selected_n = restore_order(selected_n + not_selected, order)
 | 
				
			||||||
 | 
					    return selected_n, selected_m, remaining_slots_to_serve
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def pth_assign_spectrum(pths, rqs, oms_list, rpths):
 | 
					def pth_assign_spectrum(pths, rqs, oms_list, rpths):
 | 
				
			||||||
    """basic first fit assignment
 | 
					    """basic first fit assignment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if reversed path are provided, means that occupation is bidir
 | 
					    if reversed path are provided, means that occupation is bidir
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    for pth, rq, rpth in zip(pths, rqs, rpths):
 | 
					    for pth, rq, rpth in zip(pths, rqs, rpths):
 | 
				
			||||||
        # computes the number of channels required
 | 
					 | 
				
			||||||
        if hasattr(rq, 'blocking_reason'):
 | 
					        if hasattr(rq, 'blocking_reason'):
 | 
				
			||||||
            rq.N = None
 | 
					            rq.N = None
 | 
				
			||||||
            rq.M = None
 | 
					            rq.M = None
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            nb_wl, requested_m = compute_spectrum_slot_vs_bandwidth(rq.path_bandwidth,
 | 
					            # computes the number of channels required for path_bandwidth and the min required nb of slots
 | 
				
			||||||
 | 
					            # for one channel (corresponds to the spacing)
 | 
				
			||||||
 | 
					            nb_wl, required_m = compute_spectrum_slot_vs_bandwidth(rq.path_bandwidth,
 | 
				
			||||||
                                                                   rq.spacing, rq.bit_rate)
 | 
					                                                                   rq.spacing, rq.bit_rate)
 | 
				
			||||||
            if getattr(rq, 'M', None) is not None:
 | 
					            _, per_channel_m = compute_spectrum_slot_vs_bandwidth(rq.bit_rate,
 | 
				
			||||||
                # Consistency check between the requested M and path_bandwidth
 | 
					                                                                  rq.spacing, rq.bit_rate)
 | 
				
			||||||
                # M value should be bigger than the computed requested_m (simple estimate)
 | 
					            # find oms ids that are concerned both by pth and rpth
 | 
				
			||||||
                # TODO: elaborate a more accurate estimate with nb_wl * tx_osnr + possibly guardbands in case of
 | 
					            path_oms = build_path_oms_id_list(pth + rpth)
 | 
				
			||||||
 | 
					            if getattr(rq, 'M', None) is not None and all(rq.M):
 | 
				
			||||||
 | 
					                # if all M are well defined: Consistency check that the requested M are enough to carry the nb_wl:
 | 
				
			||||||
 | 
					                # check that the integer number of per_channel_m carried in each M value is enough to carry nb_wl.
 | 
				
			||||||
 | 
					                # if not, blocks the demand
 | 
				
			||||||
 | 
					                nb_channels_of_request = sum([m // per_channel_m for m in rq.M])
 | 
				
			||||||
 | 
					                # TODO: elaborate a more accurate estimate with nb_wl * min_spacing + possibly guardbands in case of
 | 
				
			||||||
                # superchannel closed packing.
 | 
					                # superchannel closed packing.
 | 
				
			||||||
                if requested_m > rq.M:
 | 
					                if nb_wl > nb_channels_of_request:
 | 
				
			||||||
                    rq.N = None
 | 
					                    rq.N = None
 | 
				
			||||||
                    rq.M = None
 | 
					                    rq.M = None
 | 
				
			||||||
                    rq.blocking_reason = 'NOT_ENOUGH_RESERVED_SPECTRUM'
 | 
					                    rq.blocking_reason = 'NOT_ENOUGH_RESERVED_SPECTRUM'
 | 
				
			||||||
                    # need to stop here for this request and not go though spectrum selection process with requested_m
 | 
					                    # need to stop here for this request and not go though spectrum selection process
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
                # use the req.M even if requested_m is smaller
 | 
					            # Use the req.M even if nb_wl and required_m are smaller.
 | 
				
			||||||
                requested_m = rq.M
 | 
					            # first fit strategy: assign as many lambda as possible in the None remaining N, M values
 | 
				
			||||||
            requested_n = getattr(rq, 'N', None)
 | 
					            selected_n, selected_m, remaining_slots_to_serve = \
 | 
				
			||||||
            (center_n, startn, stopn), path_oms = spectrum_selection(pth + rpth, oms_list, requested_m,
 | 
					                compute_n_m(required_m, rq, path_oms, oms_list, per_channel_m)
 | 
				
			||||||
                                                                     requested_n)
 | 
					            # if there are some remaining_slots_to_serve, this means that provided rq.M and rq.N values were
 | 
				
			||||||
            # if requested n and m concern already occupied spectrum the previous function returns a None candidate
 | 
					            # not possible. Then do not go though spectrum assignment process and blocks the demand
 | 
				
			||||||
            # if not None, center_n and start, stop frequencies are applicable to all oms of pth
 | 
					            if remaining_slots_to_serve > 0:
 | 
				
			||||||
            # checks that spectrum is not None else indicate blocking reason
 | 
					 | 
				
			||||||
            if center_n is not None:
 | 
					 | 
				
			||||||
                for oms_elem in path_oms:
 | 
					 | 
				
			||||||
                    oms_list[oms_elem].assign_spectrum(center_n, requested_m)
 | 
					 | 
				
			||||||
                    oms_list[oms_elem].add_service(rq.request_id, nb_wl)
 | 
					 | 
				
			||||||
                rq.N = center_n
 | 
					 | 
				
			||||||
                rq.M = requested_m
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                rq.N = None
 | 
					                rq.N = None
 | 
				
			||||||
                rq.M = None
 | 
					                rq.M = None
 | 
				
			||||||
                rq.blocking_reason = 'NO_SPECTRUM'
 | 
					                rq.blocking_reason = 'NO_SPECTRUM'
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            for oms_elem in path_oms:
 | 
				
			||||||
 | 
					                for this_n, this_m in zip(selected_n, selected_m):
 | 
				
			||||||
 | 
					                    if this_m is not None:
 | 
				
			||||||
 | 
					                        oms_list[oms_elem].assign_spectrum(this_n, this_m)
 | 
				
			||||||
 | 
					                oms_list[oms_elem].add_service(rq.request_id, nb_wl)
 | 
				
			||||||
 | 
					            rq.N = selected_n
 | 
				
			||||||
 | 
					            rq.M = selected_m
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
matplotlib>=3.3.3,<4
 | 
					 | 
				
			||||||
networkx>=2.5,<3
 | 
					 | 
				
			||||||
numpy>=1.19.4,<2
 | 
					 | 
				
			||||||
pandas>=1.1.5,<2
 | 
					 | 
				
			||||||
pbr>=5.5.1,<6
 | 
					 | 
				
			||||||
scipy>=1.5.4,<2
 | 
					 | 
				
			||||||
xlrd>=1.2.0,<2
 | 
					 | 
				
			||||||
							
								
								
									
										40
									
								
								setup.cfg
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								setup.cfg
									
									
									
									
									
								
							@@ -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 =
 | 
				
			||||||
@@ -21,6 +21,9 @@ classifier =
 | 
				
			|||||||
    Programming Language :: Python :: 3 :: Only
 | 
					    Programming Language :: Python :: 3 :: Only
 | 
				
			||||||
    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.11
 | 
				
			||||||
 | 
					    Programming Language :: Python :: 3.12
 | 
				
			||||||
    Programming Language :: Python :: Implementation :: CPython
 | 
					    Programming Language :: Python :: Implementation :: CPython
 | 
				
			||||||
    Topic :: Scientific/Engineering
 | 
					    Topic :: Scientific/Engineering
 | 
				
			||||||
    Topic :: Scientific/Engineering :: Physics
 | 
					    Topic :: Scientific/Engineering :: Physics
 | 
				
			||||||
@@ -39,9 +42,6 @@ warnerrors = True
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[files]
 | 
					[files]
 | 
				
			||||||
packages = gnpy
 | 
					packages = gnpy
 | 
				
			||||||
data_files =
 | 
					 | 
				
			||||||
	examples = examples/*
 | 
					 | 
				
			||||||
# FIXME: solve example data files
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[options.entry_points]
 | 
					[options.entry_points]
 | 
				
			||||||
console_scripts =
 | 
					console_scripts =
 | 
				
			||||||
@@ -49,3 +49,35 @@ console_scripts =
 | 
				
			|||||||
    gnpy-transmission-example = gnpy.tools.cli_examples:transmission_main_example
 | 
					    gnpy-transmission-example = gnpy.tools.cli_examples:transmission_main_example
 | 
				
			||||||
    gnpy-path-request = gnpy.tools.cli_examples:path_requests_run
 | 
					    gnpy-path-request = gnpy.tools.cli_examples:path_requests_run
 | 
				
			||||||
    gnpy-convert-xls = gnpy.tools.convert:_do_convert
 | 
					    gnpy-convert-xls = gnpy.tools.convert:_do_convert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[options]
 | 
				
			||||||
 | 
					install_requires =
 | 
				
			||||||
 | 
						# matplotlib 3.8 removed support for Python 3.8
 | 
				
			||||||
 | 
						matplotlib>=3.7.3,<4
 | 
				
			||||||
 | 
						# networkx 3.2 removed support for Python 3.8
 | 
				
			||||||
 | 
						networkx>=3.1,<4
 | 
				
			||||||
 | 
						# numpy 1.25 removed support for Python 3.8
 | 
				
			||||||
 | 
						numpy>=1.24.4,<2
 | 
				
			||||||
 | 
						pbr>=6.0.0,<7
 | 
				
			||||||
 | 
						# scipy 1.11 removed support for Python 3.8
 | 
				
			||||||
 | 
						scipy>=1.10.1,<2
 | 
				
			||||||
 | 
						# xlrd 2.x removed support for .xlsx, it's only .xls now
 | 
				
			||||||
 | 
						xlrd>=1.2.0,<2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[options.extras_require]
 | 
				
			||||||
 | 
					tests =
 | 
				
			||||||
 | 
						build>=1.0.3,<2
 | 
				
			||||||
 | 
						pytest>=7.4.3,<8
 | 
				
			||||||
 | 
						# pandas 2.1 removed support for Python 3.8
 | 
				
			||||||
 | 
						pandas>=2.0.3,<3
 | 
				
			||||||
 | 
						# flake v6 killed the --diff option
 | 
				
			||||||
 | 
						flake8>=5.0.4,<6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docs =
 | 
				
			||||||
 | 
						alabaster>=0.7.12,<1
 | 
				
			||||||
 | 
						docutils>=0.17.1,<1
 | 
				
			||||||
 | 
						myst-parser>=0.16.1,<1
 | 
				
			||||||
 | 
						Pygments>=2.11.2,<3
 | 
				
			||||||
 | 
						rstcheck
 | 
				
			||||||
 | 
						Sphinx>=5.3.0,<6
 | 
				
			||||||
 | 
						sphinxcontrib-bibtex>=2.4.1,<3
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										135
									
								
								tests/compare.py
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								tests/compare.py
									
									
									
									
									
								
							@@ -1,135 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					 | 
				
			||||||
from json import dump
 | 
					 | 
				
			||||||
from pathlib import Path
 | 
					 | 
				
			||||||
from argparse import ArgumentParser
 | 
					 | 
				
			||||||
from collections import namedtuple
 | 
					 | 
				
			||||||
from gnpy.tools.json_io import load_json
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Results(namedtuple('Results', 'missing extra different expected actual')):
 | 
					 | 
				
			||||||
    def _asdict(self):
 | 
					 | 
				
			||||||
        return {'missing': self.missing,
 | 
					 | 
				
			||||||
                'extra': self.extra,
 | 
					 | 
				
			||||||
                'different': self.different}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __str__(self):
 | 
					 | 
				
			||||||
        rv = []
 | 
					 | 
				
			||||||
        if self.missing:
 | 
					 | 
				
			||||||
            rv.append('Missing: {len(self.missing)}/{len(self.expected)}')
 | 
					 | 
				
			||||||
            rv.extend(f'\t{x}' for x in sorted(self.missing))
 | 
					 | 
				
			||||||
        if self.extra:
 | 
					 | 
				
			||||||
            rv.append('Extra: {len(self.extra)}/{len(self.expected)}')
 | 
					 | 
				
			||||||
            rv.extend(f'\t{x}' for x in sorted(self.extra))
 | 
					 | 
				
			||||||
        if self.different:
 | 
					 | 
				
			||||||
            rv.append('Different: {len(self.different)}/{len(self.expected)}')
 | 
					 | 
				
			||||||
            rv.extend(f'\tExpected: {x}\n\tActual:   {y}' for x, y in self.different)
 | 
					 | 
				
			||||||
        if not self.missing and not self.extra and not self.different:
 | 
					 | 
				
			||||||
            rv.append('All match!')
 | 
					 | 
				
			||||||
        return '\n'.join(rv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class NetworksResults(namedtuple('NetworksResult', 'elements connections')):
 | 
					 | 
				
			||||||
    def _asdict(self):
 | 
					 | 
				
			||||||
        return {'elements': self.elements._asdict(),
 | 
					 | 
				
			||||||
                'connections': self.connections._asdict()}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __str__(self):
 | 
					 | 
				
			||||||
        return '\n'.join([
 | 
					 | 
				
			||||||
            'Elements'.center(40, '='),
 | 
					 | 
				
			||||||
            str(self.elements),
 | 
					 | 
				
			||||||
            'Connections'.center(40, '='),
 | 
					 | 
				
			||||||
            str(self.connections),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ServicesResults(namedtuple('ServicesResult', 'requests synchronizations')):
 | 
					 | 
				
			||||||
    def _asdict(self):
 | 
					 | 
				
			||||||
        return {'requests': self.requests.asdict(),
 | 
					 | 
				
			||||||
                'synchronizations': self.synchronizations.asdict()}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __str__(self):
 | 
					 | 
				
			||||||
        return '\n'.join([
 | 
					 | 
				
			||||||
            'Requests'.center(40, '='),
 | 
					 | 
				
			||||||
            str(self.requests),
 | 
					 | 
				
			||||||
            'Synchronizations'.center(40, '='),
 | 
					 | 
				
			||||||
            str(self.synchronizations),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class PathsResults(namedtuple('PathsResults', 'paths')):
 | 
					 | 
				
			||||||
    def _asdict(self):
 | 
					 | 
				
			||||||
        return {'paths': self.paths.asdict()}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __str__(self):
 | 
					 | 
				
			||||||
        return '\n'.join([
 | 
					 | 
				
			||||||
            'Paths'.center(40, '='),
 | 
					 | 
				
			||||||
            str(self.paths),
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def compare(expected, actual, key=lambda x: x):
 | 
					 | 
				
			||||||
    expected = {key(el): el for el in expected}
 | 
					 | 
				
			||||||
    actual = {key(el): el for el in actual}
 | 
					 | 
				
			||||||
    missing = set(expected) - set(actual)
 | 
					 | 
				
			||||||
    extra = set(actual) - set(expected)
 | 
					 | 
				
			||||||
    different = [(expected[x], actual[x]) for
 | 
					 | 
				
			||||||
                 x in set(expected) & set(actual)
 | 
					 | 
				
			||||||
                 if expected[x] != actual[x]]
 | 
					 | 
				
			||||||
    return Results(missing, extra, different, expected, actual)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def compare_networks(expected, actual):
 | 
					 | 
				
			||||||
    elements = compare(expected['elements'], actual['elements'],
 | 
					 | 
				
			||||||
                       key=lambda el: el['uid'])
 | 
					 | 
				
			||||||
    connections = compare(expected['connections'], actual['connections'],
 | 
					 | 
				
			||||||
                          key=lambda el: (el['from_node'], el['to_node']))
 | 
					 | 
				
			||||||
    return NetworksResults(elements, connections)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def compare_services(expected, actual):
 | 
					 | 
				
			||||||
    requests = compare(expected['path-request'], actual['path-request'],
 | 
					 | 
				
			||||||
                       key=lambda el: el['request-id'])
 | 
					 | 
				
			||||||
    synchronizations = compare(expected['path-request'], expected['path-request'],
 | 
					 | 
				
			||||||
                               key=lambda el: el['request-id'])
 | 
					 | 
				
			||||||
    if 'synchronization' in expected.keys():
 | 
					 | 
				
			||||||
        synchronizations = compare(expected['synchronization'], actual['synchronization'],
 | 
					 | 
				
			||||||
                                   key=lambda el: el['synchronization-id'])
 | 
					 | 
				
			||||||
    return ServicesResults(requests, synchronizations)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def compare_paths(expected_output, actual_output):
 | 
					 | 
				
			||||||
    paths = compare(expected['path'], actual['path'], key=lambda el: el['path-id'])
 | 
					 | 
				
			||||||
    return PathsResults(paths)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
COMPARISONS = {
 | 
					 | 
				
			||||||
    'networks': compare_networks,
 | 
					 | 
				
			||||||
    'services': compare_services,
 | 
					 | 
				
			||||||
    'paths': compare_paths,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
parser = ArgumentParser()
 | 
					 | 
				
			||||||
parser.add_argument('expected_output', type=Path, metavar='FILE')
 | 
					 | 
				
			||||||
parser.add_argument('actual_output', type=Path, metavar='FILE')
 | 
					 | 
				
			||||||
parser.add_argument('-o', '--output', default=None)
 | 
					 | 
				
			||||||
parser.add_argument('-c', '--comparison', choices=COMPARISONS, default='networks')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def encode_sets(obj):
 | 
					 | 
				
			||||||
    if isinstance(obj, set):
 | 
					 | 
				
			||||||
        return list(obj)
 | 
					 | 
				
			||||||
    raise TypeError(f'{obj!r} is not JSON serializable!')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == '__main__':
 | 
					 | 
				
			||||||
    args = parser.parse_args()
 | 
					 | 
				
			||||||
    expected = load_json(args.expected_output)
 | 
					 | 
				
			||||||
    actual = load_json(args.actual_output)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    result = COMPARISONS[args.comparison](expected, actual)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if args.output:
 | 
					 | 
				
			||||||
        with open(args.output, 'w', encoding='utf-8') as f:
 | 
					 | 
				
			||||||
            dump(result, f, default=encode_sets, indent=2, ensure_ascii=False)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        print(str(result))
 | 
					 | 
				
			||||||
							
								
								
									
										13
									
								
								tests/conftest.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/conftest.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					# SPDX-License-Identifier: BSD-3-Clause
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (C) 2020 Telecom Infra Project and GNPy contributors
 | 
				
			||||||
 | 
					# see LICENSE.md for a list of contributors
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import pytest
 | 
				
			||||||
 | 
					from gnpy.core.parameters import SimParams, NLIParams, RamanParams
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.fixture
 | 
				
			||||||
 | 
					def set_sim_params(monkeypatch):
 | 
				
			||||||
 | 
					    monkeypatch.setattr(SimParams, '_shared_dict', {'nli_params': NLIParams(), 'raman_params': RamanParams()})
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										21
									
								
								tests/data/CORONET_services.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tests/data/CORONET_services.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "path-request": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "request-id": "0",
 | 
				
			||||||
 | 
					      "source": "trx Abilene",
 | 
				
			||||||
 | 
					      "destination": "trx Albany",
 | 
				
			||||||
 | 
					      "src-tp-id": "trx Abilene",
 | 
				
			||||||
 | 
					      "dst-tp-id": "trx Albany",
 | 
				
			||||||
 | 
					      "bidirectional": false,
 | 
				
			||||||
 | 
					      "path-constraints": {
 | 
				
			||||||
 | 
					        "te-bandwidth": {
 | 
				
			||||||
 | 
					          "technology": "flexi-grid",
 | 
				
			||||||
 | 
					          "trx_type": "Voyager",
 | 
				
			||||||
 | 
					          "trx_mode": "mode 3",
 | 
				
			||||||
 | 
					          "spacing": 62500000000.0,
 | 
				
			||||||
 | 
					          "path_bandwidth": 100000000000.0
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    "f_min": 191.35e12,
 | 
				
			||||||
 | 
					    "f_max": 196.1e12,
 | 
				
			||||||
    "nf_ripple": [
 | 
					    "nf_ripple": [
 | 
				
			||||||
        0.0,
 | 
					        0.0,
 | 
				
			||||||
        0.0,
 | 
					        0.0,
 | 
				
			||||||
@@ -196,101 +198,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
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -63,7 +63,7 @@
 | 
				
			|||||||
      "Fiber":[{
 | 
					      "Fiber":[{
 | 
				
			||||||
            "type_variety": "SSMF",
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
            "dispersion": 1.67e-05,
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
            "gamma": 0.00127,
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
            "pmd_coef": 1.265e-15
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@@ -85,6 +85,7 @@
 | 
				
			|||||||
            "target_pch_out_db": -20,
 | 
					            "target_pch_out_db": -20,
 | 
				
			||||||
            "add_drop_osnr": 38,
 | 
					            "add_drop_osnr": 38,
 | 
				
			||||||
            "pmd": 0,
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
            "restrictions": {
 | 
					            "restrictions": {
 | 
				
			||||||
                            "preamp_variety_list":[],
 | 
					                            "preamp_variety_list":[],
 | 
				
			||||||
                            "booster_variety_list":[]
 | 
					                            "booster_variety_list":[]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										220
									
								
								tests/data/eqpt_config_psd.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								tests/data/eqpt_config_psd.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "Edfa": [{
 | 
				
			||||||
 | 
					            "type_variety": "CienaDB_medium_gain",
 | 
				
			||||||
 | 
					            "type_def": "advanced_model",
 | 
				
			||||||
 | 
					            "gain_flatmax": 25,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_medium_gain",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 26,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 6,
 | 
				
			||||||
 | 
					            "nf_max": 10,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_low_gain",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 16,
 | 
				
			||||||
 | 
					            "gain_min": 8,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 7,
 | 
				
			||||||
 | 
					            "nf_max": 11,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "test",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 25,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 5.8,
 | 
				
			||||||
 | 
					            "nf_max": 10,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "test_fixed_gain",
 | 
				
			||||||
 | 
					            "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 21,
 | 
				
			||||||
 | 
					            "gain_min": 20,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf0": 5,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_booster",
 | 
				
			||||||
 | 
					            "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 21,
 | 
				
			||||||
 | 
					            "gain_min": 20,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf0": 5,
 | 
				
			||||||
 | 
					            "allowed_for_design": false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Fiber": [{
 | 
				
			||||||
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Span": [{
 | 
				
			||||||
 | 
					            "power_mode": true,
 | 
				
			||||||
 | 
					            "delta_power_range_db": [0, 0, 0.5],
 | 
				
			||||||
 | 
					            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
				
			||||||
 | 
					            "target_extended_gain": 2.5,
 | 
				
			||||||
 | 
					            "max_length": 150,
 | 
				
			||||||
 | 
					            "length_units": "km",
 | 
				
			||||||
 | 
					            "max_loss": 28,
 | 
				
			||||||
 | 
					            "padding": 10,
 | 
				
			||||||
 | 
					            "EOL": 0,
 | 
				
			||||||
 | 
					            "con_in": 0,
 | 
				
			||||||
 | 
					            "con_out": 0
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Roadm": [{
 | 
				
			||||||
 | 
					            "target_psd_out_mWperGHz": 3.125e-4,
 | 
				
			||||||
 | 
					            "add_drop_osnr": 38,
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
 | 
					            "restrictions": {
 | 
				
			||||||
 | 
					                "preamp_variety_list": [],
 | 
				
			||||||
 | 
					                "booster_variety_list": []
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "SI": [{
 | 
				
			||||||
 | 
					            "f_min": 191.35e12,
 | 
				
			||||||
 | 
					            "f_max": 196.1e12,
 | 
				
			||||||
 | 
					            "baud_rate": 32e9,
 | 
				
			||||||
 | 
					            "spacing": 50e9,
 | 
				
			||||||
 | 
					            "power_dbm": 0,
 | 
				
			||||||
 | 
					            "power_range_db": [0, 0, 0.5],
 | 
				
			||||||
 | 
					            "roll_off": 0.15,
 | 
				
			||||||
 | 
					            "tx_osnr": 100,
 | 
				
			||||||
 | 
					            "sys_margins": 0
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Transceiver": [{
 | 
				
			||||||
 | 
					            "type_variety": "vendorA_trx-type1",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "PS_SP64_1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 11,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "PS_SP64_2",
 | 
				
			||||||
 | 
					                    "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                    "OSNR": 15,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 11,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2",
 | 
				
			||||||
 | 
					                    "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                    "OSNR": 15,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager_16QAM",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "16QAM",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 19,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "mode 1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 12,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 3",
 | 
				
			||||||
 | 
					                    "baud_rate": 44e9,
 | 
				
			||||||
 | 
					                    "OSNR": 18,
 | 
				
			||||||
 | 
					                    "bit_rate": 300e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 62.5e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 21,
 | 
				
			||||||
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2 - fake",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 21,
 | 
				
			||||||
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 4",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 16,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										220
									
								
								tests/data/eqpt_config_psw.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								tests/data/eqpt_config_psw.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "Edfa": [{
 | 
				
			||||||
 | 
					            "type_variety": "CienaDB_medium_gain",
 | 
				
			||||||
 | 
					            "type_def": "advanced_model",
 | 
				
			||||||
 | 
					            "gain_flatmax": 25,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_medium_gain",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 26,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 6,
 | 
				
			||||||
 | 
					            "nf_max": 10,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_low_gain",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 16,
 | 
				
			||||||
 | 
					            "gain_min": 8,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 7,
 | 
				
			||||||
 | 
					            "nf_max": 11,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "test",
 | 
				
			||||||
 | 
					            "type_def": "variable_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 25,
 | 
				
			||||||
 | 
					            "gain_min": 15,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf_min": 5.8,
 | 
				
			||||||
 | 
					            "nf_max": 10,
 | 
				
			||||||
 | 
					            "out_voa_auto": false,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "test_fixed_gain",
 | 
				
			||||||
 | 
					            "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 21,
 | 
				
			||||||
 | 
					            "gain_min": 20,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf0": 5,
 | 
				
			||||||
 | 
					            "allowed_for_design": true
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "std_booster",
 | 
				
			||||||
 | 
					            "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					            "gain_flatmax": 21,
 | 
				
			||||||
 | 
					            "gain_min": 20,
 | 
				
			||||||
 | 
					            "p_max": 21,
 | 
				
			||||||
 | 
					            "nf0": 5,
 | 
				
			||||||
 | 
					            "allowed_for_design": false
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Fiber": [{
 | 
				
			||||||
 | 
					            "type_variety": "SSMF",
 | 
				
			||||||
 | 
					            "dispersion": 1.67e-05,
 | 
				
			||||||
 | 
					            "effective_area": 83e-12,
 | 
				
			||||||
 | 
					            "pmd_coef": 1.265e-15
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Span": [{
 | 
				
			||||||
 | 
					            "power_mode": true,
 | 
				
			||||||
 | 
					            "delta_power_range_db": [0, 0, 0.5],
 | 
				
			||||||
 | 
					            "max_fiber_lineic_loss_for_raman": 0.25,
 | 
				
			||||||
 | 
					            "target_extended_gain": 2.5,
 | 
				
			||||||
 | 
					            "max_length": 150,
 | 
				
			||||||
 | 
					            "length_units": "km",
 | 
				
			||||||
 | 
					            "max_loss": 28,
 | 
				
			||||||
 | 
					            "padding": 10,
 | 
				
			||||||
 | 
					            "EOL": 0,
 | 
				
			||||||
 | 
					            "con_in": 0,
 | 
				
			||||||
 | 
					            "con_out": 0
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Roadm": [{
 | 
				
			||||||
 | 
					            "target_out_mWperSlotWidth": 2.0e-4,
 | 
				
			||||||
 | 
					            "add_drop_osnr": 38,
 | 
				
			||||||
 | 
					            "pmd": 0,
 | 
				
			||||||
 | 
					            "pdl": 0,
 | 
				
			||||||
 | 
					            "restrictions": {
 | 
				
			||||||
 | 
					                "preamp_variety_list": [],
 | 
				
			||||||
 | 
					                "booster_variety_list": []
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "SI": [{
 | 
				
			||||||
 | 
					            "f_min": 191.35e12,
 | 
				
			||||||
 | 
					            "f_max": 196.1e12,
 | 
				
			||||||
 | 
					            "baud_rate": 32e9,
 | 
				
			||||||
 | 
					            "spacing": 50e9,
 | 
				
			||||||
 | 
					            "power_dbm": 0,
 | 
				
			||||||
 | 
					            "power_range_db": [0, 0, 0.5],
 | 
				
			||||||
 | 
					            "roll_off": 0.15,
 | 
				
			||||||
 | 
					            "tx_osnr": 100,
 | 
				
			||||||
 | 
					            "sys_margins": 0
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "Transceiver": [{
 | 
				
			||||||
 | 
					            "type_variety": "vendorA_trx-type1",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "PS_SP64_1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 11,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "PS_SP64_2",
 | 
				
			||||||
 | 
					                    "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                    "OSNR": 15,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 11,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2",
 | 
				
			||||||
 | 
					                    "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                    "OSNR": 15,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager_16QAM",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "16QAM",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 19,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 100,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }, {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                "min": 191.4e12,
 | 
				
			||||||
 | 
					                "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [{
 | 
				
			||||||
 | 
					                    "format": "mode 1",
 | 
				
			||||||
 | 
					                    "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                    "OSNR": 12,
 | 
				
			||||||
 | 
					                    "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 3",
 | 
				
			||||||
 | 
					                    "baud_rate": 44e9,
 | 
				
			||||||
 | 
					                    "OSNR": 18,
 | 
				
			||||||
 | 
					                    "bit_rate": 300e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 62.5e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 21,
 | 
				
			||||||
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 2 - fake",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 21,
 | 
				
			||||||
 | 
					                    "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }, {
 | 
				
			||||||
 | 
					                    "format": "mode 4",
 | 
				
			||||||
 | 
					                    "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                    "OSNR": 16,
 | 
				
			||||||
 | 
					                    "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                    "roll_off": 0.15,
 | 
				
			||||||
 | 
					                    "tx_osnr": 45,
 | 
				
			||||||
 | 
					                    "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                    "cost": 1
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										238
									
								
								tests/data/eqpt_config_sweep.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								tests/data/eqpt_config_sweep.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,238 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					      "Edfa": [{
 | 
				
			||||||
 | 
					                  "type_variety": "CienaDB_medium_gain",
 | 
				
			||||||
 | 
					                  "type_def": "advanced_model",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 25,
 | 
				
			||||||
 | 
					                  "gain_min": 15,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "advanced_config_from_json": "std_medium_gain_advanced_config.json",
 | 
				
			||||||
 | 
					                  "out_voa_auto": false,
 | 
				
			||||||
 | 
					                  "allowed_for_design": true
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                  "type_variety": "std_medium_gain",
 | 
				
			||||||
 | 
					                  "type_def": "variable_gain",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 26,
 | 
				
			||||||
 | 
					                  "gain_min": 15,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "nf_min": 6,
 | 
				
			||||||
 | 
					                  "nf_max": 10,
 | 
				
			||||||
 | 
					                  "out_voa_auto": false,
 | 
				
			||||||
 | 
					                  "allowed_for_design": true
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                  "type_variety": "std_low_gain",
 | 
				
			||||||
 | 
					                  "type_def": "variable_gain",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 16,
 | 
				
			||||||
 | 
					                  "gain_min": 8,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "nf_min": 7,
 | 
				
			||||||
 | 
					                  "nf_max": 11,
 | 
				
			||||||
 | 
					                  "out_voa_auto": false,
 | 
				
			||||||
 | 
					                  "allowed_for_design": true
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                  "type_variety": "test",
 | 
				
			||||||
 | 
					                  "type_def": "variable_gain",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 25,
 | 
				
			||||||
 | 
					                  "gain_min": 15,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "nf_min": 5.8,
 | 
				
			||||||
 | 
					                  "nf_max": 10,
 | 
				
			||||||
 | 
					                  "out_voa_auto": false,
 | 
				
			||||||
 | 
					                  "allowed_for_design": true
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                  "type_variety": "test_fixed_gain",
 | 
				
			||||||
 | 
					                  "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 21,
 | 
				
			||||||
 | 
					                  "gain_min": 20,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "nf0": 5,
 | 
				
			||||||
 | 
					                  "allowed_for_design": true
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                  "type_variety": "std_booster",
 | 
				
			||||||
 | 
					                  "type_def": "fixed_gain",
 | 
				
			||||||
 | 
					                  "gain_flatmax": 21,
 | 
				
			||||||
 | 
					                  "gain_min": 20,
 | 
				
			||||||
 | 
					                  "p_max": 21,
 | 
				
			||||||
 | 
					                  "nf0": 5,
 | 
				
			||||||
 | 
					                  "allowed_for_design": false
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "Fiber": [{
 | 
				
			||||||
 | 
					                  "type_variety": "SSMF",
 | 
				
			||||||
 | 
					                  "dispersion": 1.67e-05,
 | 
				
			||||||
 | 
					                  "effective_area": 83e-12,
 | 
				
			||||||
 | 
					                  "pmd_coef": 1.265e-15
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "Span": [{
 | 
				
			||||||
 | 
					                  "power_mode":true,
 | 
				
			||||||
 | 
					                  "delta_power_range_db": [0,0,0.5],
 | 
				
			||||||
 | 
					                  "max_fiber_lineic_loss_for_raman": 0.25,
 | 
				
			||||||
 | 
					                  "target_extended_gain": 2.5,
 | 
				
			||||||
 | 
					                  "max_length": 150,
 | 
				
			||||||
 | 
					                  "length_units": "km",
 | 
				
			||||||
 | 
					                  "max_loss": 28,
 | 
				
			||||||
 | 
					                  "padding": 10,
 | 
				
			||||||
 | 
					                  "EOL": 0,
 | 
				
			||||||
 | 
					                  "con_in": 0,
 | 
				
			||||||
 | 
					                  "con_out": 0
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "Roadm": [{
 | 
				
			||||||
 | 
					                  "target_pch_out_db": -20,
 | 
				
			||||||
 | 
					                  "add_drop_osnr": 38,
 | 
				
			||||||
 | 
					                  "pmd": 0,
 | 
				
			||||||
 | 
					                  "pdl": 0,
 | 
				
			||||||
 | 
					                  "restrictions": {
 | 
				
			||||||
 | 
					                                  "preamp_variety_list":[],
 | 
				
			||||||
 | 
					                                  "booster_variety_list":[]
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "SI": [{
 | 
				
			||||||
 | 
					                  "f_min": 191.35e12,
 | 
				
			||||||
 | 
					                  "f_max": 196.1e12,
 | 
				
			||||||
 | 
					                  "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                  "spacing": 50e9,
 | 
				
			||||||
 | 
					                  "power_dbm": 0,
 | 
				
			||||||
 | 
					                  "power_range_db": [-6,0,0.5],
 | 
				
			||||||
 | 
					                  "roll_off": 0.15,
 | 
				
			||||||
 | 
					                  "tx_osnr": 100,
 | 
				
			||||||
 | 
					                  "sys_margins": 0
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "Transceiver":[
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            "type_variety": "vendorA_trx-type1",
 | 
				
			||||||
 | 
					            "frequency":{
 | 
				
			||||||
 | 
					                  "min": 191.4e12,
 | 
				
			||||||
 | 
					                  "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode":[
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "PS_SP64_1",
 | 
				
			||||||
 | 
					                             "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                             "OSNR": 11,
 | 
				
			||||||
 | 
					                             "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 100,
 | 
				
			||||||
 | 
					                             "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "PS_SP64_2",
 | 
				
			||||||
 | 
					                             "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                             "OSNR": 15,
 | 
				
			||||||
 | 
					                             "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 100,
 | 
				
			||||||
 | 
					                             "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 1",
 | 
				
			||||||
 | 
					                             "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                             "OSNR": 11,
 | 
				
			||||||
 | 
					                             "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 100,
 | 
				
			||||||
 | 
					                             "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 2",
 | 
				
			||||||
 | 
					                             "baud_rate": 64e9,
 | 
				
			||||||
 | 
					                             "OSNR": 15,
 | 
				
			||||||
 | 
					                             "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 100,
 | 
				
			||||||
 | 
					                             "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                  ]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager_16QAM",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                  "min": 191.4e12,
 | 
				
			||||||
 | 
					                  "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "16QAM",
 | 
				
			||||||
 | 
					                             "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                             "OSNR": 19,
 | 
				
			||||||
 | 
					                             "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 100,
 | 
				
			||||||
 | 
					                             "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                  ]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            "type_variety": "Voyager",
 | 
				
			||||||
 | 
					            "frequency": {
 | 
				
			||||||
 | 
					                  "min": 191.4e12,
 | 
				
			||||||
 | 
					                  "max": 196.1e12
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "mode": [
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 1",
 | 
				
			||||||
 | 
					                             "baud_rate": 32e9,
 | 
				
			||||||
 | 
					                             "OSNR": 12,
 | 
				
			||||||
 | 
					                             "bit_rate": 100e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 45,
 | 
				
			||||||
 | 
					                             "min_spacing": 50e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 3",
 | 
				
			||||||
 | 
					                             "baud_rate": 44e9,
 | 
				
			||||||
 | 
					                             "OSNR": 18,
 | 
				
			||||||
 | 
					                             "bit_rate": 300e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 45,
 | 
				
			||||||
 | 
					                             "min_spacing": 62.5e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 2",
 | 
				
			||||||
 | 
					                             "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                             "OSNR": 21,
 | 
				
			||||||
 | 
					                             "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 45,
 | 
				
			||||||
 | 
					                             "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 2 - fake",
 | 
				
			||||||
 | 
					                             "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                             "OSNR": 21,
 | 
				
			||||||
 | 
					                             "bit_rate": 400e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 45,
 | 
				
			||||||
 | 
					                             "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       },
 | 
				
			||||||
 | 
					                       {
 | 
				
			||||||
 | 
					                             "format": "mode 4",
 | 
				
			||||||
 | 
					                             "baud_rate": 66e9,
 | 
				
			||||||
 | 
					                             "OSNR": 16,
 | 
				
			||||||
 | 
					                             "bit_rate": 200e9,
 | 
				
			||||||
 | 
					                             "roll_off": 0.15,
 | 
				
			||||||
 | 
					                             "tx_osnr": 45,
 | 
				
			||||||
 | 
					                             "min_spacing": 75e9,
 | 
				
			||||||
 | 
					                             "cost": 1
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                  ]
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,224 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "uid": "Span1",
 | 
					 | 
				
			||||||
  "params": {
 | 
					 | 
				
			||||||
    "length": 80,
 | 
					 | 
				
			||||||
    "loss_coef": 0.2,
 | 
					 | 
				
			||||||
    "length_units": "km",
 | 
					 | 
				
			||||||
    "att_in": 0,
 | 
					 | 
				
			||||||
    "con_in": 0.5,
 | 
					 | 
				
			||||||
    "con_out": 0.5,
 | 
					 | 
				
			||||||
    "type_variety": "SSMF",
 | 
					 | 
				
			||||||
    "dispersion": 0.0000167,
 | 
					 | 
				
			||||||
    "gamma": 0.00127,
 | 
					 | 
				
			||||||
    "pmd_coef": 1.265e-15,
 | 
					 | 
				
			||||||
    "raman_efficiency": {
 | 
					 | 
				
			||||||
      "cr": [
 | 
					 | 
				
			||||||
        0,
 | 
					 | 
				
			||||||
        0.0000094,
 | 
					 | 
				
			||||||
        0.0000292,
 | 
					 | 
				
			||||||
        0.0000488,
 | 
					 | 
				
			||||||
        0.0000682,
 | 
					 | 
				
			||||||
        0.0000831,
 | 
					 | 
				
			||||||
        0.000094,
 | 
					 | 
				
			||||||
        0.0001014,
 | 
					 | 
				
			||||||
        0.0001069,
 | 
					 | 
				
			||||||
        0.0001119,
 | 
					 | 
				
			||||||
        0.0001217,
 | 
					 | 
				
			||||||
        0.0001268,
 | 
					 | 
				
			||||||
        0.0001365,
 | 
					 | 
				
			||||||
        0.000149,
 | 
					 | 
				
			||||||
        0.000165,
 | 
					 | 
				
			||||||
        0.000181,
 | 
					 | 
				
			||||||
        0.0001977,
 | 
					 | 
				
			||||||
        0.0002192,
 | 
					 | 
				
			||||||
        0.0002469,
 | 
					 | 
				
			||||||
        0.0002749,
 | 
					 | 
				
			||||||
        0.0002999,
 | 
					 | 
				
			||||||
        0.0003206,
 | 
					 | 
				
			||||||
        0.0003405,
 | 
					 | 
				
			||||||
        0.0003592,
 | 
					 | 
				
			||||||
        0.000374,
 | 
					 | 
				
			||||||
        0.0003826,
 | 
					 | 
				
			||||||
        0.0003841,
 | 
					 | 
				
			||||||
        0.0003826,
 | 
					 | 
				
			||||||
        0.0003802,
 | 
					 | 
				
			||||||
        0.0003756,
 | 
					 | 
				
			||||||
        0.0003549,
 | 
					 | 
				
			||||||
        0.0003795,
 | 
					 | 
				
			||||||
        0.000344,
 | 
					 | 
				
			||||||
        0.0002933,
 | 
					 | 
				
			||||||
        0.0002024,
 | 
					 | 
				
			||||||
        0.0001158,
 | 
					 | 
				
			||||||
        0.0000846,
 | 
					 | 
				
			||||||
        0.0000714,
 | 
					 | 
				
			||||||
        0.0000686,
 | 
					 | 
				
			||||||
        0.000085,
 | 
					 | 
				
			||||||
        0.0000893,
 | 
					 | 
				
			||||||
        0.0000901,
 | 
					 | 
				
			||||||
        0.0000815,
 | 
					 | 
				
			||||||
        0.0000667,
 | 
					 | 
				
			||||||
        0.0000437,
 | 
					 | 
				
			||||||
        0.0000328,
 | 
					 | 
				
			||||||
        0.0000296,
 | 
					 | 
				
			||||||
        0.0000265,
 | 
					 | 
				
			||||||
        0.0000257,
 | 
					 | 
				
			||||||
        0.0000281,
 | 
					 | 
				
			||||||
        0.0000308,
 | 
					 | 
				
			||||||
        0.0000367,
 | 
					 | 
				
			||||||
        0.0000585,
 | 
					 | 
				
			||||||
        0.0000663,
 | 
					 | 
				
			||||||
        0.0000636,
 | 
					 | 
				
			||||||
        0.000055,
 | 
					 | 
				
			||||||
        0.0000406,
 | 
					 | 
				
			||||||
        0.0000277,
 | 
					 | 
				
			||||||
        0.0000242,
 | 
					 | 
				
			||||||
        0.0000187,
 | 
					 | 
				
			||||||
        0.000016,
 | 
					 | 
				
			||||||
        0.000014,
 | 
					 | 
				
			||||||
        0.0000113,
 | 
					 | 
				
			||||||
        0.0000105,
 | 
					 | 
				
			||||||
        0.0000098,
 | 
					 | 
				
			||||||
        0.0000098,
 | 
					 | 
				
			||||||
        0.0000113,
 | 
					 | 
				
			||||||
        0.0000164,
 | 
					 | 
				
			||||||
        0.0000195,
 | 
					 | 
				
			||||||
        0.0000238,
 | 
					 | 
				
			||||||
        0.0000226,
 | 
					 | 
				
			||||||
        0.0000203,
 | 
					 | 
				
			||||||
        0.0000148,
 | 
					 | 
				
			||||||
        0.0000109,
 | 
					 | 
				
			||||||
        0.0000098,
 | 
					 | 
				
			||||||
        0.0000105,
 | 
					 | 
				
			||||||
        0.0000117,
 | 
					 | 
				
			||||||
        0.0000125,
 | 
					 | 
				
			||||||
        0.0000121,
 | 
					 | 
				
			||||||
        0.0000109,
 | 
					 | 
				
			||||||
        0.0000098,
 | 
					 | 
				
			||||||
        0.0000082,
 | 
					 | 
				
			||||||
        0.0000066,
 | 
					 | 
				
			||||||
        0.0000047,
 | 
					 | 
				
			||||||
        0.0000027,
 | 
					 | 
				
			||||||
        0.0000019,
 | 
					 | 
				
			||||||
        0.0000012,
 | 
					 | 
				
			||||||
        4e-7,
 | 
					 | 
				
			||||||
        2e-7,
 | 
					 | 
				
			||||||
        1e-7
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "frequency_offset": [
 | 
					 | 
				
			||||||
        0,
 | 
					 | 
				
			||||||
        500000000000,
 | 
					 | 
				
			||||||
        1000000000000,
 | 
					 | 
				
			||||||
        1500000000000,
 | 
					 | 
				
			||||||
        2000000000000,
 | 
					 | 
				
			||||||
        2500000000000,
 | 
					 | 
				
			||||||
        3000000000000,
 | 
					 | 
				
			||||||
        3500000000000,
 | 
					 | 
				
			||||||
        4000000000000,
 | 
					 | 
				
			||||||
        4500000000000,
 | 
					 | 
				
			||||||
        5000000000000,
 | 
					 | 
				
			||||||
        5500000000000,
 | 
					 | 
				
			||||||
        6000000000000,
 | 
					 | 
				
			||||||
        6500000000000,
 | 
					 | 
				
			||||||
        7000000000000,
 | 
					 | 
				
			||||||
        7500000000000,
 | 
					 | 
				
			||||||
        8000000000000,
 | 
					 | 
				
			||||||
        8500000000000,
 | 
					 | 
				
			||||||
        9000000000000,
 | 
					 | 
				
			||||||
        9500000000000,
 | 
					 | 
				
			||||||
        10000000000000,
 | 
					 | 
				
			||||||
        10500000000000,
 | 
					 | 
				
			||||||
        11000000000000,
 | 
					 | 
				
			||||||
        11500000000000,
 | 
					 | 
				
			||||||
        12000000000000,
 | 
					 | 
				
			||||||
        12500000000000,
 | 
					 | 
				
			||||||
        12750000000000,
 | 
					 | 
				
			||||||
        13000000000000,
 | 
					 | 
				
			||||||
        13250000000000,
 | 
					 | 
				
			||||||
        13500000000000,
 | 
					 | 
				
			||||||
        14000000000000,
 | 
					 | 
				
			||||||
        14500000000000,
 | 
					 | 
				
			||||||
        14750000000000,
 | 
					 | 
				
			||||||
        15000000000000,
 | 
					 | 
				
			||||||
        15500000000000,
 | 
					 | 
				
			||||||
        16000000000000,
 | 
					 | 
				
			||||||
        16500000000000,
 | 
					 | 
				
			||||||
        17000000000000,
 | 
					 | 
				
			||||||
        17500000000000,
 | 
					 | 
				
			||||||
        18000000000000,
 | 
					 | 
				
			||||||
        18250000000000,
 | 
					 | 
				
			||||||
        18500000000000,
 | 
					 | 
				
			||||||
        18750000000000,
 | 
					 | 
				
			||||||
        19000000000000,
 | 
					 | 
				
			||||||
        19500000000000,
 | 
					 | 
				
			||||||
        20000000000000,
 | 
					 | 
				
			||||||
        20500000000000,
 | 
					 | 
				
			||||||
        21000000000000,
 | 
					 | 
				
			||||||
        21500000000000,
 | 
					 | 
				
			||||||
        22000000000000,
 | 
					 | 
				
			||||||
        22500000000000,
 | 
					 | 
				
			||||||
        23000000000000,
 | 
					 | 
				
			||||||
        23500000000000,
 | 
					 | 
				
			||||||
        24000000000000,
 | 
					 | 
				
			||||||
        24500000000000,
 | 
					 | 
				
			||||||
        25000000000000,
 | 
					 | 
				
			||||||
        25500000000000,
 | 
					 | 
				
			||||||
        26000000000000,
 | 
					 | 
				
			||||||
        26500000000000,
 | 
					 | 
				
			||||||
        27000000000000,
 | 
					 | 
				
			||||||
        27500000000000,
 | 
					 | 
				
			||||||
        28000000000000,
 | 
					 | 
				
			||||||
        28500000000000,
 | 
					 | 
				
			||||||
        29000000000000,
 | 
					 | 
				
			||||||
        29500000000000,
 | 
					 | 
				
			||||||
        30000000000000,
 | 
					 | 
				
			||||||
        30500000000000,
 | 
					 | 
				
			||||||
        31000000000000,
 | 
					 | 
				
			||||||
        31500000000000,
 | 
					 | 
				
			||||||
        32000000000000,
 | 
					 | 
				
			||||||
        32500000000000,
 | 
					 | 
				
			||||||
        33000000000000,
 | 
					 | 
				
			||||||
        33500000000000,
 | 
					 | 
				
			||||||
        34000000000000,
 | 
					 | 
				
			||||||
        34500000000000,
 | 
					 | 
				
			||||||
        35000000000000,
 | 
					 | 
				
			||||||
        35500000000000,
 | 
					 | 
				
			||||||
        36000000000000,
 | 
					 | 
				
			||||||
        36500000000000,
 | 
					 | 
				
			||||||
        37000000000000,
 | 
					 | 
				
			||||||
        37500000000000,
 | 
					 | 
				
			||||||
        38000000000000,
 | 
					 | 
				
			||||||
        38500000000000,
 | 
					 | 
				
			||||||
        39000000000000,
 | 
					 | 
				
			||||||
        39500000000000,
 | 
					 | 
				
			||||||
        40000000000000,
 | 
					 | 
				
			||||||
        40500000000000,
 | 
					 | 
				
			||||||
        41000000000000,
 | 
					 | 
				
			||||||
        41500000000000,
 | 
					 | 
				
			||||||
        42000000000000
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "operational": {
 | 
					 | 
				
			||||||
    "temperature": 283,
 | 
					 | 
				
			||||||
    "raman_pumps": [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        "power": 0.2,
 | 
					 | 
				
			||||||
        "frequency": 205000000000000,
 | 
					 | 
				
			||||||
        "propagation_direction": "counterprop"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        "power": 0.206,
 | 
					 | 
				
			||||||
        "frequency": 201000000000000,
 | 
					 | 
				
			||||||
        "propagation_direction": "counterprop"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "metadata": {
 | 
					 | 
				
			||||||
    "location": {
 | 
					 | 
				
			||||||
      "latitude": 1,
 | 
					 | 
				
			||||||
      "longitude": 0,
 | 
					 | 
				
			||||||
      "city": null,
 | 
					 | 
				
			||||||
      "region": ""
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,12 +1,11 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "raman_parameters": {
 | 
					  "raman_params": {
 | 
				
			||||||
    "flag_raman": true,
 | 
					    "flag": true,
 | 
				
			||||||
    "space_resolution": 10e3,
 | 
					    "result_spatial_resolution": 10e3,
 | 
				
			||||||
    "tolerance": 1e-8
 | 
					    "solver_spatial_resolution": 50
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "nli_parameters": {
 | 
					  "nli_params": {
 | 
				
			||||||
    "nli_method_name": "ggn_spectrally_separated",
 | 
					    "method": "ggn_spectrally_separated",
 | 
				
			||||||
    "wdm_grid_size": 50e9,
 | 
					 | 
				
			||||||
    "dispersion_tolerance": 1,
 | 
					    "dispersion_tolerance": 1,
 | 
				
			||||||
    "phase_shift_tolerance": 0.1,
 | 
					    "phase_shift_tolerance": 0.1,
 | 
				
			||||||
    "computed_channels": [1, 18, 37, 56, 75]
 | 
					    "computed_channels": [1, 18, 37, 56, 75]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -240,7 +240,6 @@
 | 
				
			|||||||
          "east edfa in Rennes_STA to Stbrieuc": -20,
 | 
					          "east edfa in Rennes_STA to Stbrieuc": -20,
 | 
				
			||||||
          "east edfa in Rennes_STA to Ploermel": -20
 | 
					          "east edfa in Rennes_STA to Ploermel": -20
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "metadata": {
 | 
					      "metadata": {
 | 
				
			||||||
        "location": {
 | 
					        "location": {
 | 
				
			||||||
@@ -1593,7 +1592,7 @@
 | 
				
			|||||||
      "type": "Edfa",
 | 
					      "type": "Edfa",
 | 
				
			||||||
      "type_variety": "std_medium_gain",
 | 
					      "type_variety": "std_medium_gain",
 | 
				
			||||||
      "operational": {
 | 
					      "operational": {
 | 
				
			||||||
        "gain_target": 18.5,
 | 
					        "gain_target": 13.177288,
 | 
				
			||||||
        "delta_p": null,
 | 
					        "delta_p": null,
 | 
				
			||||||
        "tilt_target": 0,
 | 
					        "tilt_target": 0,
 | 
				
			||||||
        "out_voa": 0
 | 
					        "out_voa": 0
 | 
				
			||||||
@@ -2235,7 +2234,7 @@
 | 
				
			|||||||
      "type": "Edfa",
 | 
					      "type": "Edfa",
 | 
				
			||||||
      "type_variety": "std_low_gain",
 | 
					      "type_variety": "std_low_gain",
 | 
				
			||||||
      "operational": {
 | 
					      "operational": {
 | 
				
			||||||
        "gain_target": 6.5,
 | 
					        "gain_target": 11.822712,
 | 
				
			||||||
        "delta_p": null,
 | 
					        "delta_p": null,
 | 
				
			||||||
        "tilt_target": 0,
 | 
					        "tilt_target": 0,
 | 
				
			||||||
        "out_voa": 0
 | 
					        "out_voa": 0
 | 
				
			||||||
@@ -2292,7 +2291,7 @@
 | 
				
			|||||||
      "type": "Edfa",
 | 
					      "type": "Edfa",
 | 
				
			||||||
      "type_variety": "std_low_gain",
 | 
					      "type_variety": "std_low_gain",
 | 
				
			||||||
      "operational": {
 | 
					      "operational": {
 | 
				
			||||||
        "gain_target": 13.82,
 | 
					        "gain_target": 13.822712,
 | 
				
			||||||
        "delta_p": null,
 | 
					        "delta_p": null,
 | 
				
			||||||
        "tilt_target": 0,
 | 
					        "tilt_target": 0,
 | 
				
			||||||
        "out_voa": 0
 | 
					        "out_voa": 0
 | 
				
			||||||
@@ -2311,7 +2310,7 @@
 | 
				
			|||||||
      "type": "Edfa",
 | 
					      "type": "Edfa",
 | 
				
			||||||
      "type_variety": "test_fixed_gain",
 | 
					      "type_variety": "test_fixed_gain",
 | 
				
			||||||
      "operational": {
 | 
					      "operational": {
 | 
				
			||||||
        "gain_target": 15.18,
 | 
					        "gain_target": 15.177288,
 | 
				
			||||||
        "delta_p": null,
 | 
					        "delta_p": null,
 | 
				
			||||||
        "tilt_target": 0,
 | 
					        "tilt_target": 0,
 | 
				
			||||||
        "out_voa": 0
 | 
					        "out_voa": 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,10 +42,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 1,
 | 
					              "index": 1,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -69,10 +71,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 4,
 | 
					              "index": 4,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -87,10 +91,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 6,
 | 
					              "index": 6,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -105,10 +111,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 8,
 | 
					              "index": 8,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -123,10 +131,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 10,
 | 
					              "index": 10,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -141,10 +151,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 12,
 | 
					              "index": 12,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -159,10 +171,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 14,
 | 
					              "index": 14,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -219,10 +233,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 1,
 | 
					              "index": 1,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -246,10 +262,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 4,
 | 
					              "index": 4,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -264,10 +282,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 6,
 | 
					              "index": 6,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -282,10 +302,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 8,
 | 
					              "index": 8,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -300,10 +322,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 10,
 | 
					              "index": 10,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -318,10 +342,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 12,
 | 
					              "index": 12,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -336,10 +362,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 14,
 | 
					              "index": 14,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -354,10 +382,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 16,
 | 
					              "index": 16,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -372,10 +402,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 18,
 | 
					              "index": 18,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -390,10 +422,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 20,
 | 
					              "index": 20,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -408,10 +442,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 22,
 | 
					              "index": 22,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -426,10 +462,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 24,
 | 
					              "index": 24,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -444,10 +482,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 26,
 | 
					              "index": 26,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -462,10 +502,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 28,
 | 
					              "index": 28,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -480,10 +522,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 30,
 | 
					              "index": 30,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -498,10 +542,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 32,
 | 
					              "index": 32,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -516,10 +562,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 34,
 | 
					              "index": 34,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -534,10 +582,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 36,
 | 
					              "index": 36,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -552,10 +602,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 38,
 | 
					              "index": 38,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -570,10 +622,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 40,
 | 
					              "index": 40,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -588,10 +642,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 42,
 | 
					              "index": 42,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -276,
 | 
					                  "N": -276,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -648,10 +704,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 1,
 | 
					              "index": 1,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -675,10 +733,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 4,
 | 
					              "index": 4,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -693,10 +753,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 6,
 | 
					              "index": 6,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -711,10 +773,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 8,
 | 
					              "index": 8,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -729,10 +793,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 10,
 | 
					              "index": 10,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -747,10 +813,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 12,
 | 
					              "index": 12,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -765,10 +833,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 14,
 | 
					              "index": 14,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -783,10 +853,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 16,
 | 
					              "index": 16,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -801,10 +873,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 18,
 | 
					              "index": 18,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -284,
 | 
					                  "N": -284,
 | 
				
			||||||
                  "M": 4
 | 
					                  "M": 4
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -829,7 +903,7 @@
 | 
				
			|||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "metric-type": "SNR-0.1nm",
 | 
					            "metric-type": "SNR-0.1nm",
 | 
				
			||||||
            "accumulative-value": 22.15
 | 
					            "accumulative-value": 22.14
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "metric-type": "OSNR-bandwidth",
 | 
					            "metric-type": "OSNR-bandwidth",
 | 
				
			||||||
@@ -861,10 +935,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 1,
 | 
					              "index": 1,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -888,10 +964,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 4,
 | 
					              "index": 4,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -906,10 +984,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 6,
 | 
					              "index": 6,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -924,10 +1004,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 8,
 | 
					              "index": 8,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -942,10 +1024,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 10,
 | 
					              "index": 10,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -960,10 +1044,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 12,
 | 
					              "index": 12,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -978,10 +1064,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 14,
 | 
					              "index": 14,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -996,10 +1084,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 16,
 | 
					              "index": 16,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1014,10 +1104,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 18,
 | 
					              "index": 18,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1032,10 +1124,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 20,
 | 
					              "index": 20,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1050,10 +1144,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 22,
 | 
					              "index": 22,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1068,10 +1164,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 24,
 | 
					              "index": 24,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1086,10 +1184,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 26,
 | 
					              "index": 26,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1104,10 +1204,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 28,
 | 
					              "index": 28,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1122,10 +1224,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 30,
 | 
					              "index": 30,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1140,10 +1244,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 32,
 | 
					              "index": 32,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1158,10 +1264,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 34,
 | 
					              "index": 34,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1176,10 +1284,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 36,
 | 
					              "index": 36,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1194,10 +1304,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 38,
 | 
					              "index": 38,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1212,10 +1324,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 40,
 | 
					              "index": 40,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1230,10 +1344,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 42,
 | 
					              "index": 42,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -266,
 | 
					                  "N": -266,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1254,11 +1370,11 @@
 | 
				
			|||||||
        "path-metric": [
 | 
					        "path-metric": [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "metric-type": "SNR-bandwidth",
 | 
					            "metric-type": "SNR-bandwidth",
 | 
				
			||||||
            "accumulative-value": 21.68
 | 
					            "accumulative-value": 21.67
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "metric-type": "SNR-0.1nm",
 | 
					            "metric-type": "SNR-0.1nm",
 | 
				
			||||||
            "accumulative-value": 28.77
 | 
					            "accumulative-value": 28.76
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            "metric-type": "OSNR-bandwidth",
 | 
					            "metric-type": "OSNR-bandwidth",
 | 
				
			||||||
@@ -1290,10 +1406,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 1,
 | 
					              "index": 1,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1317,10 +1435,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 4,
 | 
					              "index": 4,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1335,10 +1455,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 6,
 | 
					              "index": 6,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1353,10 +1475,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 8,
 | 
					              "index": 8,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1371,10 +1495,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 10,
 | 
					              "index": 10,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1389,10 +1515,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 12,
 | 
					              "index": 12,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1407,10 +1535,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 14,
 | 
					              "index": 14,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1425,10 +1555,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 16,
 | 
					              "index": 16,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
@@ -1443,10 +1575,12 @@
 | 
				
			|||||||
          {
 | 
					          {
 | 
				
			||||||
            "path-route-object": {
 | 
					            "path-route-object": {
 | 
				
			||||||
              "index": 18,
 | 
					              "index": 18,
 | 
				
			||||||
              "label-hop": {
 | 
					              "label-hop": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                  "N": -274,
 | 
					                  "N": -274,
 | 
				
			||||||
                  "M": 6
 | 
					                  "M": 6
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					              ]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
response-id,source,destination,path_bandwidth,Pass?,nb of tsp pairs,total cost,transponder-type,transponder-mode,OSNR-0.1nm,SNR-0.1nm,SNR-bandwidth,baud rate (Gbaud),input power (dBm),path,"spectrum (N,M)",reversed path OSNR-0.1nm,reversed path SNR-0.1nm,reversed path SNR-bandwidth
 | 
					response-id,source,destination,path_bandwidth,Pass?,nb of tsp pairs,total cost,transponder-type,transponder-mode,OSNR-0.1nm,SNR-0.1nm,SNR-bandwidth,baud rate (Gbaud),input power (dBm),path,"spectrum (N,M)",reversed path OSNR-0.1nm,reversed path SNR-0.1nm,reversed path SNR-bandwidth
 | 
				
			||||||
0,trx Lorient_KMA,trx Vannes_KBE,100.0,True,1,1,Voyager,mode 1,30.84,30.84,26.75,32.0,0.0,trx Lorient_KMA | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"-284, 4",,,
 | 
					0,trx Lorient_KMA,trx Vannes_KBE,100.0,True,1,1,Voyager,mode 1,30.84,30.84,26.75,32.0,0.0,trx Lorient_KMA | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"[-284], [4]",,,
 | 
				
			||||||
1,trx Brest_KLA,trx Vannes_KBE,10.0,True,1,1,Voyager,mode 1,22.65,22.11,18.03,32.0,1.0,trx Brest_KLA | roadm Brest_KLA | east edfa in Brest_KLA to Morlaix | fiber (Brest_KLA → Morlaix)-F060 | east fused spans in Morlaix | fiber (Morlaix → Lannion_CAS)-F059 | west edfa in Lannion_CAS to Morlaix | roadm Lannion_CAS | east edfa in Lannion_CAS to Corlay | fiber (Lannion_CAS → Corlay)-F061 | west fused spans in Corlay | fiber (Corlay → Loudeac)-F010 | west fused spans in Loudeac | fiber (Loudeac → Lorient_KMA)-F054 | west edfa in Lorient_KMA to Loudeac | roadm Lorient_KMA | east edfa in Lorient_KMA to Vannes_KBE | fiber (Lorient_KMA → Vannes_KBE)-F055 | west edfa in Vannes_KBE to Lorient_KMA | roadm Vannes_KBE | trx Vannes_KBE,"-276, 4",,,
 | 
					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.14,15.05,64.0,0.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Ploermel | fiber (Rennes_STA → Ploermel)- | east edfa in Ploermel to Vannes_KBE | fiber (Ploermel → Vannes_KBE)- | west edfa in Vannes_KBE to Ploermel | roadm Vannes_KBE | east edfa in Vannes_KBE to Lorient_KMA | fiber (Vannes_KBE → Lorient_KMA)-F055 | west edfa in Lorient_KMA to Vannes_KBE | roadm Lorient_KMA | east edfa in Lorient_KMA to Loudeac | fiber (Lorient_KMA → Loudeac)-F054 | east fused spans in Loudeac | fiber (Loudeac → Corlay)-F010 | east fused spans in Corlay | fiber (Corlay → Lannion_CAS)-F061 | west edfa in Lannion_CAS to Corlay | roadm Lannion_CAS | trx Lannion_CAS,"[-266], [6]",,,
 | 
				
			||||||
5,trx Rennes_STA,trx Lannion_CAS,20.0,True,1,1,vendorA_trx-type1,mode 2,30.79,28.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.76,21.67,64.0,3.0,trx Rennes_STA | roadm Rennes_STA | east edfa in Rennes_STA to Stbrieuc | fiber (Rennes_STA → Stbrieuc)-F057 | west edfa in Stbrieuc to Rennes_STA | fiber (Stbrieuc → Lannion_CAS)-F056 | west edfa in Lannion_CAS to Stbrieuc | roadm Lannion_CAS | trx Lannion_CAS,"[-274], [6]",,,
 | 
				
			||||||
6,,,,NO_PATH,,,,,,,,,,,,,,
 | 
					6,,,,NO_PATH,,,,,,,,,,,,,,
 | 
				
			||||||
 
 | 
				
			|||||||
		
		
			
  | 
							
								
								
									
										97
									
								
								tests/data/test_fiber_fix_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								tests/data/test_fiber_fix_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					signal,nli
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.0570305869494063e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.1989102199581664e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.2687787891259665e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.3153676763101585e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.3504001312414315e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.378517965356758e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4020312829929705e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4222564206194578e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.440014394542033e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4558516068269932e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4701499315172012e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4831866587815758e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4951694168451522e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.506257639956634e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5165763570833366e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5262253772723937e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.535285600134073e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.543823467328411e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.551894175425445e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5595440417063968e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5668122772822936e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5737323370281063e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5803329618444796e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5866389935670908e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.592672019391794e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.598450886742589e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6039921184766554e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.609310250559421e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.61441810880001e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6193270372246937e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6240470877236143e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6285871784230113e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6329552265978812e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6371582606990462e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.641202515119326e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6450935105904177e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6488361225310858e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6524346392188574e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6558928113022246e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6592138938867027e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6624006821997905e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.665455541654349e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.668380432977811e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6711769329485368e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6738462511750264e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6763892432637406e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6788064206436675e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.681097957247311e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6832636931862217e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6853031355021186e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.687215456020574e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.688999486281053e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.690653709463382e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6921762491746848e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6935648549006222e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6948168838584662e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.695929278914847e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.696898542145055e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6977207035104874e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6983912840119302e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6989052525338295e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.699256975421989e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6994401576260005e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6994477739772384e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.699271988849318e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6989040620420942e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6983342382173362e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6975516165613388e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6965439965112504e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6952976942961452e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.693797323625088e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6920255319826076e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6899626814970685e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6875864599859146e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6848714031984708e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6817883029489423e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6783034669737056e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.674377783759437e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.669965527407164e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6650128108596616e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6594555557112625e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6532167853144137e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6462029512327026e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6382988469074245e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.6293604020234886e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.619204201130206e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.607591759753518e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5942050594874486e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.578606776895102e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5601720601345105e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5379633197361104e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.5104793671989548e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4750892345803154e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.4265134295425351e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.3514359541675816e-08
 | 
				
			||||||
 | 
					1.9952623149688796e-05,1.194579997186553e-08
 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										6
									
								
								tests/data/test_fiber_flex_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/data/test_fiber_flex_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					signal,nli
 | 
				
			||||||
 | 
					1.9952623149688796e-05,5.183134799604202e-09
 | 
				
			||||||
 | 
					1.7957360834719913e-05,4.286200408629989e-09
 | 
				
			||||||
 | 
					2.593841009459543e-05,6.2510001955285065e-09
 | 
				
			||||||
 | 
					1.5962098519751036e-05,4.082332034495425e-09
 | 
				
			||||||
 | 
					2.3943147779626556e-05,7.857762167195498e-09
 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										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"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										96
									
								
								tests/data/test_lumped_losses_fiber_no_pumps.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								tests/data/test_lumped_losses_fiber_no_pumps.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					0.001,0.0007537739940510926,0.0005921033539224395,0.000384643453726324,0.00024710943492700773,0.00015765779381207088,0.00010015276356884663,6.345008665672524e-05,4.012925332336102e-05,2.535268958174273e-05
 | 
				
			||||||
 | 
					0.001,0.0007532443480762404,0.0005915606741358828,0.00038408573214392957,0.00024666764094038643,0.00015734224135307426,9.993879038586218e-05,6.330912140259024e-05,4.003794165686942e-05,2.529414108865862e-05
 | 
				
			||||||
 | 
					0.001,0.0007527148738848327,0.0005910183036445593,0.0003835286706438232,0.0002462265418760313,0.00015702726304657165,9.972523988324127e-05,6.316844848796591e-05,3.994682503096186e-05,2.5235719950422228e-05
 | 
				
			||||||
 | 
					0.001,0.0007521855703345118,0.0005904762413907948,0.00038297226807207136,0.0002457861365766504,0.00015671285789580896,9.9512111295817e-05,6.302806736731544e-05,3.985590307420444e-05,2.5177425921282973e-05
 | 
				
			||||||
 | 
					0.001,0.0007516564362539944,0.0005899344862777934,0.00038241652320864807,0.0002453464238190796,0.00015639902485083639,9.929940381972637e-05,6.288797746852316e-05,3.976517539750482e-05,2.511925874398998e-05
 | 
				
			||||||
 | 
					0.001,0.0007511274704431355,0.0005893930371697809,0.0003818614347679428,0.0002449074023149522,0.00015608576280913723,9.908711661290977e-05,6.27481781932559e-05,3.967464159435973e-05,2.5061218149955632e-05
 | 
				
			||||||
 | 
					0.001,0.0007505986716729718,0.0005888518928921378,0.00038130700139925517,0.0002444690707113658,0.00015577307061625246,9.887524879560432e-05,6.260866891731864e-05,3.958430124109855e-05,2.5003303859417958e-05
 | 
				
			||||||
 | 
					0.001,0.0007500678710880661,0.0005883088511431218,0.000380751009486411,0.0002440296996901373,0.00015545972380501664,9.866297459432463e-05,6.246890748950651e-05,3.949380391318895e-05,2.4945291488462056e-05
 | 
				
			||||||
 | 
					0.001,0.0007495350705096461,0.0005877639154939723,0.000380193466563788,0.00024358929686534952,0.00015514572847430736,9.8450298405315e-05,6.232889690863924e-05,3.9403151593579556e-05,2.4887182324516918e-05
 | 
				
			||||||
 | 
					0.001,0.0007490002717484986,0.0005872170894971442,0.00037963438011605534,0.00024314786979147204,0.00015483109067004745,9.823722458416644e-05,6.218864014470764e-05,3.931234624568946e-05,2.4828977642138712e-05
 | 
				
			||||||
 | 
					0.001,0.0007484634766050366,0.000586668376686434,0.0003790737575785661,0.00024270542596389042,0.0001545158163857142,9.802375744622405e-05,6.204814013916893e-05,3.9221389813611975e-05,2.4770678703146694e-05
 | 
				
			||||||
 | 
					0.001,0.0007479199274773811,0.0005861128912299699,0.0003785065486556895,0.00024225795000622747,0.0001541970308568484,9.780794472023814e-05,6.190610951865765e-05,3.9129447888412384e-05,2.471175028700643e-05
 | 
				
			||||||
 | 
					0.001,0.0007473696306726699,0.0005855506450602122,0.0003779327791658341,0.00024180546890527417,0.0001538747562360148,9.758980264023896e-05,6.176255947727244e-05,3.903652792388679e-05,2.4652197254708885e-05
 | 
				
			||||||
 | 
					0.001,0.0007468125926679213,0.0005849816503235855,0.0003773524752207052,0.00024134800990073543,0.00015354901486124996,9.736934756691086e-05,6.161750129261558e-05,3.8942637427869684e-05,2.459202450185328e-05
 | 
				
			||||||
 | 
					0.001,0.0007462488201102061,0.0005844059193804029,0.00037676566322402907,0.00024088560048334876,0.0001532198292542639,9.714659598616437e-05,6.147094632476142e-05,3.884778396152801e-05,2.4531236958179027e-05
 | 
				
			||||||
 | 
					0.001,0.0007456783198168171,0.0005838234648047683,0.00037617236987025305,0.00024041826839299018,0.00015288722211863548,9.692156450770277e-05,6.132290601522212e-05,3.875197513865345e-05,2.4469839587096592e-05
 | 
				
			||||||
 | 
					0.001,0.0007451010987754332,0.0005832342993844907,0.0003755726221432343,0.0002399460416167659,0.00015255121633799497,9.66942698635831e-05,6.11733918859104e-05,3.8655218624953314e-05,2.4407837385217267e-05
 | 
				
			||||||
 | 
					0.001,0.0007445173992825126,0.0005826386743528757,0.00037496668540476865,0.00023946913369259697,0.00015221196586566552,9.646481704279825e-05,6.102247334575324e-05,3.85575594785277e-05,2.4345259282747418e-05
 | 
				
			||||||
 | 
					0.001,0.0007439272282773631,0.0005820366023339485,0.0003743545861363169,0.00023898757201912962,0.00015186949307274757,9.623322238874437e-05,6.0870161643097905e-05,3.845900518061352e-05,2.4282110155051444e-05
 | 
				
			||||||
 | 
					0.001,0.0007433305928659832,0.0005814280961601982,0.00037373635109929905,0.0002385013842326201,0.0001515238205025659,9.599950236146117e-05,6.071646810276464e-05,3.835956326175255e-05,2.4218394908993806e-05
 | 
				
			||||||
 | 
					0.001,0.0007427275003211868,0.0005808131688724332,0.0003731120073337174,0.00023801059820498021,0.0001511749708688244,9.576367353617374e-05,6.05614041249978e-05,3.825924130107498e-05,2.4154118482464792e-05
 | 
				
			||||||
 | 
					0.001,0.0007421180800523362,0.0005801919587229117,0.00037248171070273063,0.0002375153439047009,0.00015082303982525373,9.55258019540184e-05,6.0405013700224733e-05,3.815806798909622e-05,2.4089299350133826e-05
 | 
				
			||||||
 | 
					0.001,0.0007415023395254894,0.0005795644789202474,0.00037184548827748576,0.0002370156491221818,0.00015046804996987382,9.528590408468248e-05,6.0247308147258e-05,3.8056050847170796e-05,2.4023942410771268e-05
 | 
				
			||||||
 | 
					0.001,0.0007408802863797739,0.000578930742889133,0.00037120336741830446,0.00023651154189285886,0.00015011002407818366,9.504399651802114e-05,6.008829886368558e-05,3.7953197447440844e-05,2.395805259559495e-05
 | 
				
			||||||
 | 
					0.001,0.0007402519284274773,0.00057829076427012,0.0003705553757730914,0.00023600305049498863,0.0001497489851010917,9.480009596242987e-05,5.992799732470356e-05,3.784951541204015e-05,2.389163486774317e-05
 | 
				
			||||||
 | 
					0.001,0.0007396172736541335,0.0005776445569193926,0.0003699015412757306,0.000235490203447419,0.00014938495616282697,9.455421924320194e-05,5.976641508193571e-05,3.774501241228877e-05,2.38246942217421e-05
 | 
				
			||||||
 | 
					0.001,0.0007389763302186035,0.0005769921349085269,0.00036924189214444916,0.00023497302950733012,0.00014901796055883247,9.4306383300876e-05,5.960356376224896e-05,3.763969616788547e-05,2.37572356829714e-05
 | 
				
			||||||
 | 
					0.001,0.000738329973009011,0.0005763343882557762,0.00036857732657886674,0.00023445223185895243,0.00014864849677321228,9.40569245366171e-05,5.943966431343476e-05,3.753370952478887e-05,2.3689350732036766e-05
 | 
				
			||||||
 | 
					0.001,0.0007376782088319843,0.0005756713289449496,0.0003679078688863157,0.00023392783529630037,0.00014827658488585004,9.38058575472753e-05,5.927472675087035e-05,3.7427059131368685e-05,2.362104369630353e-05
 | 
				
			||||||
 | 
					0.001,0.0007370210446325295,0.0005750029691304239,0.000367233543593211,0.00023339986479263558,0.00014790224510292775,9.355319701349314e-05,5.910876114408311e-05,3.7319751670569666e-05,2.3552318925085614e-05
 | 
				
			||||||
 | 
					0.001,0.0007363584874940915,0.0005743293211369546,0.0003665543754437431,0.00023286834549865966,0.00014752549775524457,9.329895769838934e-05,5.8941777615809794e-05,3.721179385927125e-05,2.348318078922229e-05
 | 
				
			||||||
 | 
					0.001,0.0007356906659117175,0.0005736505214206793,0.00036587051603697917,0.00023233340267585003,0.00014714643450378646,9.30432026577021e-05,5.8773818072131705e-05,3.710321298927822e-05,2.3413646846771747e-05
 | 
				
			||||||
 | 
					0.001,0.0007350175870680764,0.0005729665823498456,0.00036518198995355594,0.00023179506120909636,0.00014676507541963834,9.278594644638945e-05,5.8604892484780656e-05,3.699401567385024e-05,2.3343721399750524e-05
 | 
				
			||||||
 | 
					0.001,0.000734339258284937,0.0005722775164633901,0.0003644888219905243,0.00023125334615855053,0.0001463814406964208,9.252720370024704e-05,5.8435010877524154e-05,3.688420855938328e-05,2.327340877117354e-05
 | 
				
			||||||
 | 
					0.001,0.0007336556870231954,0.0005715833364706749,0.00036379103715988533,0.00023070828275766533,0.00014599555064848363,9.226698913450141e-05,5.82641833251609e-05,3.677379832472749e-05,2.320271330460301e-05
 | 
				
			||||||
 | 
					0.001,0.0007329668808828947,0.0005708840552512191,0.00036308866068712113,0.00023015989641122435,0.00014560742570909416,9.200531754239911e-05,5.8092419952513674e-05,3.666279168050168e-05,2.313163936369656e-05
 | 
				
			||||||
 | 
					0.001,0.000732272847603227,0.0005701796858544125,0.000362381718009681,0.0002296082126933358,0.00014521708642859763,9.174220379377606e-05,5.791973093340874e-05,3.6551195368400524e-05,2.3060191331749373e-05
 | 
				
			||||||
 | 
					0.001,0.0007315751779154508,0.0005694718366517781,0.00036167180797618383,0.00022905447155647377,0.00014482540661409508,9.147823538482221e-05,5.774650123146614e-05,3.643925790598459e-05,2.2988528215049473e-05
 | 
				
			||||||
 | 
					0.001,0.0007308738763564251,0.0005687605159526348,0.00036095894758939165,0.00022849869020493823,0.00014443240010265552,9.121342232553745e-05,5.7572737692798364e-05,3.6326983828340116e-05,2.2916652961499898e-05
 | 
				
			||||||
 | 
					0.001,0.0007301689475478705,0.0005680457321686527,0.00036024315397386176,0.00022794088593578913,0.00014403808079282816,9.094777466478586e-05,5.739844718775089e-05,3.6214377685641065e-05,2.2844568528419092e-05
 | 
				
			||||||
 | 
					0.001,0.0007294603961963875,0.0005673274938137002,0.0003595244443750873,0.00022738107613769066,0.00014364246264358423,9.068130248947494e-05,5.72236366103174e-05,3.610144404275241e-05,2.2772277882278848e-05
 | 
				
			||||||
 | 
					0.001,0.0007287502876018436,0.0005666079096289159,0.00035880496633647314,0.00022682095171468864,0.00014324674865159545,9.041481948469436e-05,5.7048841153261715e-05,3.598852922211342e-05,2.270000293927642e-05
 | 
				
			||||||
 | 
					0.001,0.0007280386231103084,0.0005658869826353605,0.0003580847262718071,0.00022626051891339797,0.00014285094367250402,9.014832907727154e-05,5.687406312117876e-05,3.587563473352017e-05,2.2627744673782604e-05
 | 
				
			||||||
 | 
					0.001,0.0007273254041056322,0.0005651647158992671,0.00035736373064750184,0.00022569978402038908,0.00014245505258865028,8.988183471111395e-05,5.669930482943582e-05,3.5762762093538084e-05,2.2555504064421286e-05
 | 
				
			||||||
 | 
					0.001,0.0007266106320094578,0.0005644411125319691,0.00035664198598218,0.00022513875336164715,0.0001420590803085807,8.961533984682783e-05,5.652456860390248e-05,3.564991282531874e-05,2.2483282093948716e-05
 | 
				
			||||||
 | 
					0.001,0.000725894308281204,0.0005637161756897977,0.0003559194988462394,0.00022457743330201225,0.00014166303176654256,8.934884796133105e-05,5.634985678067539e-05,3.5537088458413665e-05,2.2411079749130865e-05
 | 
				
			||||||
 | 
					0.001,0.0007251764344180624,0.0005629899085739927,0.00035519627586142176,0.0002240158302446243,0.00014126691192198565,8.90823625474685e-05,5.6175171705805915e-05,3.542429052859005e-05,2.233889802062196e-05
 | 
				
			||||||
 | 
					0.001,0.0007244588135748975,0.0005622641246704724,0.00035447409591105305,0.0002234553120905153,0.00014087167955905718,8.881652603390643e-05,5.600093342830372e-05,3.531178983274928e-05,2.2266910019981595e-05
 | 
				
			||||||
 | 
					0.001,0.000723741443178776,0.000561538821268995,0.0003537529553873339,0.00022289587522719752,0.00014047733166655684,8.855133617099835e-05,5.5827140373801375e-05,3.519958531186087e-05,2.219511505192651e-05
 | 
				
			||||||
 | 
					0.001,0.0007230243206833482,0.0005608139956950427,0.00035303285074046774,0.00022233751609917817,0.00014008386527925162,8.82867907426191e-05,5.565379099102327e-05,3.508767592227262e-05,2.212351243120618e-05
 | 
				
			||||||
 | 
					0.001,0.0007223074435688039,0.0005600896453097011,0.0003523137784782074,0.00022178023120736695,0.00013969127747733319,8.802288756574066e-05,5.5480883751481105e-05,3.4976060635503277e-05,2.2052101482465692e-05
 | 
				
			||||||
 | 
					0.001,0.0007215926247557181,0.0005593676122940626,0.00035159759247597197,0.00022122546934306127,0.00013930059415776796,8.776031848020719e-05,5.5308872854303e-05,3.486503301641155e-05,2.198107017600086e-05
 | 
				
			||||||
 | 
					0.001,0.0007208798585848073,0.0005586478889723664,0.0003508842795507963,0.0002206732171528304,0.00013891180440309996,8.749907547557891e-05,5.513775276548628e-05,3.475458937431628e-05,2.1910416102241813e-05
 | 
				
			||||||
 | 
					0.001,0.0007201691394257483,0.000557930467712979,0.00035017382661216696,0.00022012346138632064,0.00013852489738482468,8.723915060881119e-05,5.49675179985075e-05,3.464472605058592e-05,2.184013687270143e-05
 | 
				
			||||||
 | 
					0.001,0.0007194604616770773,0.00055721534092818,0.00034946622066134466,0.00021957618889536463,0.00013813986236255893,8.698053600359808e-05,5.4798163113848986e-05,3.453543941831367e-05,2.177023011975932e-05
 | 
				
			||||||
 | 
					0.001,0.0007187538197660722,0.0005565025010739346,0.00034876144879066544,0.00021903138663308575,0.0001377566886832086,8.672322384971475e-05,5.462968271852315e-05,3.442672588199151e-05,2.1700693496445714e-05
 | 
				
			||||||
 | 
					0.001,0.0007180492081486484,0.0005557919406496801,0.00034805949818288173,0.0002184890416530366,0.00013737536578016266,8.646720640237894e-05,5.446207146561145e-05,3.431858187719449e-05,2.1631524676231647e-05
 | 
				
			||||||
 | 
					0.001,0.000717348639431565,0.0005550856739198547,0.00034736232071304855,0.00021795064331956514,0.00013699693247692832,8.621317757037385e-05,5.429578217858938e-05,3.421129897003673e-05,2.1562909902755936e-05
 | 
				
			||||||
 | 
					0.001,0.0007166521035756881,0.0005543836868927082,0.0003466698924934393,0.00021741616794755068,0.00013662136971116798,8.596112351100096e-05,5.413080535731451e-05,3.410487085131832e-05,2.1494845067789903e-05
 | 
				
			||||||
 | 
					0.001,0.0007159595906065037,0.0005536859656730149,0.00034598218983055497,0.0002168855920630381,0.0001362486585998701,8.571103051605296e-05,5.396713159578493e-05,3.399929127512844e-05,2.142732610463052e-05
 | 
				
			||||||
 | 
					0.001,0.0007152710906138687,0.0005529924964615861,0.00034529918922366796,0.00021635889240138666,0.0001358787804376394,8.546288501047042e-05,5.380475158117202e-05,3.389455405818364e-05,2.1360348987661796e-05
 | 
				
			||||||
 | 
					0.001,0.0007145881681833736,0.0005523048607339887,0.0003446224616264519,0.00021583728670966556,0.00013551259312919557,8.521726369129195e-05,5.364404315662281e-05,3.379090310339315e-05,2.129406976339983e-05
 | 
				
			||||||
 | 
					0.001,0.0007139108109389651,0.0005516230407004492,0.0003439519758859039,0.00021532074399295122,0.00013515007172518374,8.497414844816332e-05,5.3484993898260945e-05,3.368833016244125e-05,2.122848306212633e-05
 | 
				
			||||||
 | 
					0.001,0.0007132390066148024,0.0005509470187317473,0.00034328770115903844,0.00021480923358720733,0.0001347911915544671,8.473352137819455e-05,5.3327591526929936e-05,3.358682708410006e-05,2.1163583577742056e-05
 | 
				
			||||||
 | 
					0.001,0.0007125727430549207,0.0005502767773585094,0.000342629606910633,0.00021430272515636744,0.0001344359282214269,8.449536478383494e-05,5.317182390666476e-05,3.348638581318404e-05,2.109936606707349e-05
 | 
				
			||||||
 | 
					0.001,0.0007119120082129148,0.0005496122992705212,0.0003419776629110174,0.0002138011886894788,0.00013408425760331254,8.425966117078749e-05,5.3017679043188334e-05,3.3386998389521964e-05,2.1035825349191292e-05
 | 
				
			||||||
 | 
					0.001,0.000711256790151613,0.0005489535673160376,0.0003413318392338714,0.00021330459449785352,0.00013373615584760944,8.40263932459383e-05,5.286514508242194e-05,3.3288656946938245e-05,2.0972956304734848e-05
 | 
				
			||||||
 | 
					0.001,0.0007106071943639499,0.0005483006816957998,0.00034069221933208274,0.0002128129992904075,0.00013339165932644894,8.379558393280961e-05,5.271423641048183e-05,3.31913705135711e-05,2.091076460544407e-05
 | 
				
			||||||
 | 
					0.001,0.000709963208882901,0.0005476536252143895,0.0003400587732671483,0.0002123263734210078,0.00013305074425072359,8.356721599784782e-05,5.256494122003263e-05,3.3095131256746724e-05,2.0849245154782437e-05
 | 
				
			||||||
 | 
					0.001,0.0007093248218486061,0.0005470123808316875,0.00033943147139689077,0.0002118446875576196,0.00013271338709432742,8.334127240311385e-05,5.241724783997488e-05,3.299993143509595e-05,2.0788392916005465e-05
 | 
				
			||||||
 | 
					0.001,0.0007086920215080653,0.0005463769316622218,0.0003388102843733889,0.00021136791267964032,0.0001323795645916927,8.311773630434548e-05,5.2271144734051514e-05,3.290576339760186e-05,2.07282029115292e-05
 | 
				
			||||||
 | 
					0.001,0.0007080656480431051,0.0005457481216341828,0.0003381960373995552,0.00021089668206097172,0.0001320497200486003,8.289690449717853e-05,5.2126825862102536e-05,3.2812752146082854e-05,2.0668755034757233e-05
 | 
				
			||||||
 | 
					0.001,0.0007074456886869565,0.0005451259321489777,0.0003375886977799707,0.0002104309633113142,0.00013172382748945162,8.26787581753205e-05,5.198427834496719e-05,3.2720889139431744e-05,2.061004372929991e-05
 | 
				
			||||||
 | 
					0.001,0.0007068321308093747,0.0005445103448031184,0.0003369882331820464,0.00020997072442018424,0.00013140186125447996,8.246327876643199e-05,5.18434894660219e-05,3.2630165945308436e-05,2.055206350992823e-05
 | 
				
			||||||
 | 
					0.001,0.0007062249619162967,0.0005439013413874698,0.00033639461163356655,0.00020951593375373114,0.00013108379599680725,8.225044792981545e-05,5.170444666951808e-05,3.254057423900392e-05,2.0494808961820763e-05
 | 
				
			||||||
 | 
					0.001,0.00070562416964951,0.0005432989038865089,0.00033580780152024723,0.000209066560051587,0.00013076960667953474,8.204024755412909e-05,5.156713755893784e-05,3.2452105802317056e-05,2.0438274739819433e-05
 | 
				
			||||||
 | 
					0.001,0.0007050297417863318,0.0005427030144775926,0.0003352277715833316,0.00020862257242375786,0.00013045926857287288,8.183265975513502e-05,5.143154989537623e-05,3.236475252244954e-05,2.038245556769746e-05
 | 
				
			||||||
 | 
					0.001,0.0007044417829621171,0.000542113771820027,0.0003346546023905152,0.00020818402485557293,0.00013015281596227648,8.162770599537212e-05,5.129769708700084e-05,3.227852278867728e-05,2.032735670561579e-05
 | 
				
			||||||
 | 
					0.001,0.0007038602809995153,0.0005415311581470623,0.00033408826282687573,0.00020775088664703998,0.00012985022429639665,8.142536853201701e-05,5.116556699709043e-05,3.219340855821242e-05,2.0272972923816322e-05
 | 
				
			||||||
 | 
					0.001,0.0007032852238493367,0.0005409551558747416,0.0003335287221154158,0.00020732312745044945,0.00012955146931603386,8.122562983828357e-05,5.103514763884953e-05,3.2109401888525124e-05,2.0219299058105656e-05
 | 
				
			||||||
 | 
					0.001,0.0007027165995902542,0.0005403857476012292,0.00033297594981485264,0.00020690071726752732,0.0001292565270515082,8.102847260135871e-05,5.090642717392409e-05,3.202649493632917e-05,2.0166330009182866e-05
 | 
				
			||||||
 | 
					0.001,0.0007021546252265139,0.0005398231466905069,0.00033243014325207994,0.00020648380199548492,0.0001289654971719027,8.083396250547584e-05,5.077944809587575e-05,3.194471491165552e-05,2.0114083097018264e-05
 | 
				
			||||||
 | 
					0.001,0.0007015992888126556,0.0005392673356287205,0.0003318912717105927,0.00020607235137144977,0.0001286783555062261,8.06420820982489e-05,5.065419847368218e-05,3.186405391103787e-05,2.006255318369691e-05
 | 
				
			||||||
 | 
					0.001,0.0007010505785332368,0.0005387182970867077,0.00033135930481238495,0.00020566633548374424,0.0001283950781739038,8.04528141416734e-05,5.053066652493675e-05,3.1784504130324826e-05,2.001173519622426e-05
 | 
				
			||||||
 | 
					0.001,0.000700508482702546,0.0005381760139193414,0.00033083421251577956,0.00020526572476908743,0.000128115641582197,8.026614161010359e-05,5.040884061439589e-05,3.170605786368809e-05,1.9961624125869314e-05
 | 
				
			||||||
 | 
					0.001,0.0006999729897643184,0.0005376404691648787,0.00033031596511327947,0.00020487049000982136,0.00012784002242364822,8.008204768824872e-05,5.028870925253973e-05,3.1628707502639986e-05,1.9912215027513866e-05
 | 
				
			||||||
 | 
					0.001,0.0006994440882914515,0.0005371116460443127,0.0003298045332294241,0.0002044806023311588,0.0001275681976735486,7.990051576919067e-05,5.0170261094149856e-05,3.155244553506268e-05,1.9863503019009735e-05
 | 
				
			||||||
 | 
					0.001,0.0006989172535560769,0.0005365850419669894,0.000329295612913881,0.00020409280438264766,0.00012729790663346764,7.972004038787022e-05,5.0052515589855926e-05,3.147664135129994e-05,1.9815085586326718e-05
 | 
				
			||||||
 | 
					0.001,0.0006983924815322933,0.0005360606511477293,0.0003287891938968759,0.00020370708584067882,0.00012702914094133737,7.954061545150935e-05,4.993546855036179e-05,3.140129216611291e-05,1.9766960914662127e-05
 | 
				
			||||||
 | 
					0.001,0.0006978697681747856,0.000535538467781285,0.000328285265898271,0.00020332343638453147,0.00012676189224377013,7.936223487646896e-05,4.981911579385119e-05,3.1326395199731696e-05,1.971912719297887e-05
 | 
				
			||||||
 | 
					0.001,0.0006973491094188342,0.0005350184860423863,0.0003277838186277228,0.0002029418456965422,0.0001264961521961901,7.918489258833681e-05,4.970345314604528e-05,3.125194767789152e-05,1.967158261402843e-05
 | 
				
			||||||
 | 
					0.001,0.0006968284099289676,0.000534498597351666,0.00032728277956097635,0.00020256071739357045,0.0001262308004979493,7.900783730702533e-05,4.958798911408524e-05,3.1177632631488905e-05,1.9624124503146986e-05
 | 
				
			||||||
 | 
					0.001,0.0006963076677967887,0.0005339787996978908,0.00032678214616920946,0.00020218004908417888,0.0001259658352285323,7.883106763041168e-05,4.947272273059253e-05,3.110344941552445e-05,1.957675243920473e-05
 | 
				
			||||||
 | 
					0.001,0.0006957868810888677,0.0005334590910383602,0.00032628191587964447,0.00020179983833834103,0.00012570125443876325,7.865458213663353e-05,4.935765301510161e-05,3.102939737649859e-05,1.9529465995615212e-05
 | 
				
			||||||
 | 
					0.001,0.0006952660478468047,0.0005329394692990367,0.0003257820860759608,0.00020142008268794192,0.0001254370561512512,7.847837938443003e-05,4.924277897429975e-05,3.0955475852573814e-05,1.94822647404421e-05
 | 
				
			||||||
 | 
					0.001,0.00069474516608728,0.0005324199323746772,0.00032528265409871067,0.0002010407796272818,0.0001251732383608348,7.830245791348127e-05,4.91280996022673e-05,3.088168417373684e-05,1.943514823650581e-05
 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										96
									
								
								tests/data/test_lumped_losses_fiber_no_raman.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								tests/data/test_lumped_losses_fiber_no_raman.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
 | 
					1.000000000000000021e-03,6.456542290346556703e-04,2.238721138568339957e-05
 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										98
									
								
								tests/data/test_lumped_losses_raman_fiber.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								tests/data/test_lumped_losses_raman_fiber.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
				
			|||||||
 | 
					0.001,0.0007651928200015371,0.0006070713937965498,0.00041423535558437785,0.0002897888610631573,0.00021340907299884933,0.00017198131811953097,0.00016127923791982795,0.00019503601408127412,0.00036549739730595273
 | 
				
			||||||
 | 
					0.001,0.0007645995806173374,0.0006064422887178694,0.00041349144049413134,0.00028906380160320487,0.00021270693331134475,0.0001712438796411692,0.0001603765556252246,0.00019363496213474675,0.00036239423700181427
 | 
				
			||||||
 | 
					0.001,0.0007640065772643761,0.0006058136176614386,0.00041274866023030733,0.0002883403899406645,0.0002120069527025505,0.00017050944162049183,0.000159478716966613,0.00019224364342300643,0.0003593168093314386
 | 
				
			||||||
 | 
					0.001,0.0007634138087852742,0.000605185379478,0.0004120070127662441,0.0002876186224176594,0.00021130912485491145,0.00016977799240843955,0.0001585856969223786,0.00019086199210672448,0.0003562649023666937
 | 
				
			||||||
 | 
					0.001,0.0007628028346998721,0.0006045332187986192,0.0004112166712442958,0.0002868226029691562,0.00021050564591298308,0.0001688917074786142,0.00015743651373617922,0.00018893812235512526,0.0003514029291704815
 | 
				
			||||||
 | 
					0.001,0.0007621921143131398,0.0006038815297458003,0.00041042762231867933,0.00028602858816935265,0.00020970502628600424,0.00016800982241073787,0.00015629534163924753,0.00018703308452519017,0.00034660591682276115
 | 
				
			||||||
 | 
					0.001,0.0007615816463554626,0.0006032303109890501,0.0004096398633263614,0.0002852365728026657,0.00020890725596775628,0.00016713231600712825,0.00015516212643578583,0.00018514669874176095,0.00034187301148734186
 | 
				
			||||||
 | 
					0.001,0.0007609692265548555,0.000602577299493926,0.0004088509941253184,0.00028444450359523985,0.00020811064471691694,0.00016625772561605027,0.00015403541161623416,0.00018327705284413884,0.00033720006213702974
 | 
				
			||||||
 | 
					0.001,0.0007603548574442921,0.0006019224999904981,0.0004080610253035772,0.00028365239238410656,0.0002073152021201705,0.00016538605339556675,0.00015291517504370476,0.00018142402424673905,0.0003325863766610152
 | 
				
			||||||
 | 
					0.001,0.0007597350402439383,0.0006012612395706585,0.0004072600935672035,0.0002828447987841907,0.00020649842223713097,0.00016448344741808307,0.00015174362495246272,0.00017946021794659197,0.00032758319657592714
 | 
				
			||||||
 | 
					0.001,0.0007591132829776185,0.0006005982088110791,0.0004064581175876688,0.00028203726728774387,0.00020568299547110922,0.00016358411213968798,0.00015057934813125987,0.00017751539893581778,0.00032265060787650516
 | 
				
			||||||
 | 
					0.001,0.000758484736453085,0.0005999283660908604,0.0004056495676510805,0.00028122495212139567,0.00020486486304104927,0.00016268449575399985,0.00014941879820841596,0.00017558496339953558,0.0003177787884410679
 | 
				
			||||||
 | 
					0.001,0.0007578494094215417,0.0005992517275730322,0.0004048344831924046,0.000280407904430663,0.00020404408117776887,0.0001617846565020927,0.00014826202727426984,0.00017366890284920263,0.0003129672376410902
 | 
				
			||||||
 | 
					0.001,0.0007572073108060312,0.0005985683096346821,0.0004040129039083478,0.0002795861755026316,0.00020322070604404603,0.00016088465224596546,0.00014710908652278506,0.00017176720707727308,0.00030821545426856767
 | 
				
			||||||
 | 
					0.001,0.0007565575890478602,0.00059787696153193,0.0004031823074325593,0.00027875567967892653,0.00020238859856737548,0.00015997497741322437,0.00014594324831107206,0.00016984173084389243,0.0003033838449669414
 | 
				
			||||||
 | 
					0.001,0.0007559011152632264,0.0005971788697390111,0.00040234530612592536,0.0002779206290242912,0.00020155405878687617,0.00015906535701622418,0.0001447815990558725,0.00016793142878541938,0.0002986152551090434
 | 
				
			||||||
 | 
					0.001,0.000755237898986442,0.000596474051424026,0.00040150194087318277,0.00027708107588917086,0.00020071714346489746,0.00015815584855490808,0.00014362418708307366,0.00016603627832169687,0.00029390910930431773
 | 
				
			||||||
 | 
					0.001,0.0007545681886825906,0.0005957627683701927,0.00040065250958751827,0.00027623729012494873,0.00019987808563904174,0.00015724665811831285,0.0001424712015659587,0.00016415642490307197,0.0002892651425802985
 | 
				
			||||||
 | 
					0.001,0.0007538919937536639,0.0005950450374279253,0.0003997970520738093,0.0002753893223189692,0.00019903693960802692,0.00015633783972296886,0.0001413226854400146,0.00016229183664828758,0.0002846827650697017
 | 
				
			||||||
 | 
					0.001,0.0007532045557665671,0.0005943145247994342,0.0003989223236188871,0.00027451662339635243,0.0001981640806362608,0.00015538551594067732,0.00014010540813129958,0.00016028630721570607,0.00027963581042999
 | 
				
			||||||
 | 
					0.001,0.0007525106592079478,0.0005935776116184588,0.00039804170193550713,0.0002736399653899091,0.00019728948692008958,0.00015443417816766013,0.00013889388158999866,0.0001582996284854468,0.0002746667454821644
 | 
				
			||||||
 | 
					0.001,0.0007518104383956622,0.000592834444449282,0.0003971553683797481,0.0002727595219957832,0.00019641331428482412,0.00015348396557824612,0.00013768822268133468,0.000156331819705631,0.00026977480754699626
 | 
				
			||||||
 | 
					0.001,0.0007511039033537896,0.0005920850408658466,0.0003962633635582371,0.00027187534416274955,0.00019553561634171146,0.00015253492870981108,0.00013648846139846028,0.00015438279270990136,0.0002649590347362105
 | 
				
			||||||
 | 
					0.001,0.0007503910642803073,0.0005913294186556257,0.0003953657283217157,0.0002709874829437419,0.00019465644657888978,0.0001515871176567501,0.0001352946268320504,0.0001524524582210848,0.0002602184722292356
 | 
				
			||||||
 | 
					0.001,0.0007496855573046408,0.0005905851062898704,0.00039449552403657745,0.00027014241927282736,0.0001938361803657908,0.0001507194393001951,0.00013421767536698768,0.000150722476765932,0.0002559376038022294
 | 
				
			||||||
 | 
					0.001,0.0007489737467556278,0.0005898345737440663,0.000393619635985906,0.00026929349394052985,0.00019301404332913125,0.00014985216957655317,0.00013314488789598826,0.00014900672746282064,0.00025171693602497907
 | 
				
			||||||
 | 
					0.001,0.0007482556429977025,0.0005890778388714725,0.00039273810426086416,0.0002684407562332248,0.0001921900867993824,0.00014898535811302548,0.00013207630234912348,0.00014730517414690737,0.000247555825445753
 | 
				
			||||||
 | 
					0.001,0.000747532135526673,0.0005883158165865031,0.0003918519024244402,0.00026758503804540166,0.0001913649895279964,0.00014811957577380352,0.00013101244041258906,0.0001456183389249714,0.00024345460151209766
 | 
				
			||||||
 | 
					0.001,0.0007468032330641541,0.0005875485221384682,0.0003909610648762846,0.00026672638132361175,0.0001905387943939666,0.00014725486211264363,0.00012995332641946747,0.00014394616337354944,0.00023941257691738652
 | 
				
			||||||
 | 
					0.001,0.0007460689444707028,0.0005867759709451519,0.0003900656262003575,0.00026586482808789615,0.00018971154418348472,0.00014639125636754904,0.00012889898406950181,0.00014228858823944247,0.00023542906884335907
 | 
				
			||||||
 | 
					0.001,0.0007453292787585437,0.0005859981786120694,0.0003891656212152682,0.00026500042051039684,0.000188883281693472,0.0001455287975953345,0.000127849436626481,0.0001406455538271199,0.00023150340029334736
 | 
				
			||||||
 | 
					0.001,0.0007445843685250069,0.0005852152884984452,0.0003882612223549495,0.00026413331906842847,0.00018805414639063353,0.00014466760638632992,0.00012680478406473458,0.00013901709088191773,0.00022763506393382832
 | 
				
			||||||
 | 
					0.001,0.0007438342228409441,0.0005844273161744179,0.0003873524639441998,0.00026326356496406687,0.00018722417962072503,0.0001438077197030893,0.00012576504647438162,0.00013740313489262333,0.00022382338328436597
 | 
				
			||||||
 | 
					0.001,0.0007430788509165626,0.0005836342773781009,0.0003864393804873395,0.0002623911994661588,0.00018639342263244998,0.00014294917419819004,0.000124730243348245,0.00013580362065026603,0.00022006768669446508
 | 
				
			||||||
 | 
					0.001,0.000742327254060605,0.0005828476385639736,0.00038554300530339766,0.00026154496076193957,0.00018559797011481673,0.0001421370333657246,0.00012375932796391997,0.00013430279846409174,0.00021649152387618443
 | 
				
			||||||
 | 
					0.001,0.0007415704350109161,0.0005820559385468977,0.00038464228372291103,0.0002606960153281244,0.00018480150743526303,0.00014132579578003348,0.000122792459010487,0.0001328143978658426,0.0002129659469511457
 | 
				
			||||||
 | 
					0.001,0.0007408084031449065,0.0005812591931755618,0.00038373724983374976,0.00025984440338310303,0.0001840040745362742,0.0001405154975809745,0.00012182965960439977,0.00013133837476817992,0.00020949038404752677
 | 
				
			||||||
 | 
					0.001,0.0007400427720784002,0.0005804590496942265,0.00038282961864956994,0.0002589915613698488,0.00018320681873232144,0.00013970708155515462,0.00012087177639736769,0.00012987560432955444,0.00020606578076074432
 | 
				
			||||||
 | 
					0.001,0.0007392735475065714,0.0005796555183614057,0.00038191941292656456,0.0002581375157328154,0.0001824097650442608,0.00013890056717630873,0.00011991881140841177,0.0001284260094133047,0.00020269149646849757
 | 
				
			||||||
 | 
					0.001,0.0007385007352097838,0.0005788486095364762,0.00038100665551987393,0.00025728229294257515,0.00018161293842329387,0.00013809597373520515,0.00011897076635433426,0.0001269895128043655,0.00019936689671873207
 | 
				
			||||||
 | 
					0.001,0.0007377243410529983,0.0005780383336785572,0.0003800913693799712,0.0002564259194903244,0.00018081636374445108,0.00013729332033271256,0.00011802764264291933,0.00012556603720150224,0.00019609135315036536
 | 
				
			||||||
 | 
					0.001,0.0007369464655998592,0.0005772268587748353,0.0003791758785432219,0.0002555703831979673,0.00018002165393456068,0.00013649394990366146,0.00011709066577140669,0.00012415690240967774,0.0001928666431485617
 | 
				
			||||||
 | 
					0.001,0.0007361671107233329,0.000576414188654825,0.000378260191109379,0.00025471569177879693,0.0001792288130669198,0.00013569785799734456,0.00011615980704210183,0.00012276198311838844,0.00018969202938803596
 | 
				
			||||||
 | 
					0.001,0.0007353862783344302,0.000575600327192691,0.00037734431522203,0.00025386185296321013,0.00017843784520433673,0.00013490504014296103,0.00011523503783001357,0.00012138115492992521,0.0001865667844236815
 | 
				
			||||||
 | 
					0.001,0.0007346027258369329,0.0005747835721418604,0.00037642443290667116,0.0002530026346493095,0.000177639416207763,0.0001341012793025371,0.0001142922256260196,0.00011996295037667013,0.00018332302768968173
 | 
				
			||||||
 | 
					0.001,0.0007338177018431625,0.0005739656376861859,0.00037550439543261463,0.0002521443237629474,0.00017684294734265143,0.00013330094534015117,0.00011335582519792064,0.00011855974750452474,0.00018013280630154984
 | 
				
			||||||
 | 
					0.001,0.0007330312083387708,0.0005731465277735759,0.000374584210907019,0.00025128692777751636,0.0001760484420635206,0.00013250403238709868,0.00011242580398299235,0.00011717140625198769,0.000176995286763841
 | 
				
			||||||
 | 
					0.001,0.0007322450716827681,0.0005723280950701311,0.00037366577307640326,0.00025043200586833656,0.00017525712146802507,0.00013171151729665014,0.00011150300328069361,0.00011579873047427355,0.00017391111613739919
 | 
				
			||||||
 | 
					0.001,0.0007314592892342591,0.0005715103366354928,0.0003727490765712826,0.00024957954955556494,0.0001744689721973381,0.00013092337604814113,0.00011058736861417956,0.00011444154833756723,0.0001708794064250159
 | 
				
			||||||
 | 
					0.001,0.0007306738583803173,0.0005706932495677312,0.00037183411609277345,0.00024872955044744495,0.00017368398100343736,0.0001301395848004509,0.00010967884595770732,0.00011309968990727626,0.00016789928423747183
 | 
				
			||||||
 | 
					0.001,0.0007298887765314699,0.0005698768309963597,0.00037092088639398746,0.0002478820002115871,0.00017290213471209804,0.00012936011984533696,0.0001087773816703527,0.00011177298701463364,0.00016496989019036454
 | 
				
			||||||
 | 
					0.001,0.0007291058850619836,0.0005690629705872476,0.0003700113801847071,0.0002470385774678141,0.00017212477134492983,0.0001285860674779147,0.00010788392632853856,0.00011046237940908493,0.00016209217355659912
 | 
				
			||||||
 | 
					0.001,0.0007283251776795193,0.0005682516594285885,0.0003691055790623401,0.0002461992575642169,0.00017135185999287266,0.00012781738439880834,0.00010699840217906239,0.00010916766306641233,0.00015926520709064215
 | 
				
			||||||
 | 
					0.001,0.000727546648123048,0.000567442888658507,0.0003682034647519281,0.00024536401604150686,0.00017058337001160307,0.00012705402771768452,0.00010612073231230378,0.0001078886367084761,0.00015648808062028533
 | 
				
			||||||
 | 
					0.001,0.0007267691175258129,0.0005666351120658079,0.00036730194585451363,0.00024452825978826814,0.00016981299319253088,0.00012628722374912656,0.00010523753204397677,0.00010660034638564814,0.00015369233245141463
 | 
				
			||||||
 | 
					0.001,0.0007259937543683618,0.0005658298620581495,0.00036640409142867466,0.00024369656281803695,0.0001690470312136919,0.00012552576286196436,0.00010436224908854787,0.00010532792661952348,0.00015094700928094292
 | 
				
			||||||
 | 
					0.001,0.0007252205525006216,0.0005650271299429238,0.0003655098835814395,0.0002428689011484816,0.0001682854538881413,0.00012476960247399048,0.00010349480634605481,0.00010407117393308648,0.00014825118806841486
 | 
				
			||||||
 | 
					0.001,0.0007244515476870691,0.0005642289688561167,0.00036462138604045246,0.00024204694758546622,0.00016752954803985582,0.00012401974721449815,0.00010263603739686231,0.00010283083470852359,0.0001456053538142381
 | 
				
			||||||
 | 
					0.001,0.0007236867286572494,0.0005634353625294562,0.0003637385663464586,0.00024123066115747858,0.00016677926586679636,0.00012327613591461942,0.00010178584352378332,0.00010160667618634935,0.0001430085413998934
 | 
				
			||||||
 | 
					0.001,0.0007229260842094953,0.0005626462948017631,0.0003628613922977866,0.00024042000126051454,0.00016603456004153966,0.00012253870808207087,0.0001009441272602465,0.00010039846917127745,0.000140459805170444
 | 
				
			||||||
 | 
					0.001,0.0007221696032014468,0.000561861749604344,0.00036198983191176377,0.0002396149275989645,0.00016529538363567852,0.00012180740380654271,0.00010011079225737115,9.920598777483068e-05,0.00013795821792425024
 | 
				
			||||||
 | 
					0.001,0.0007214188723728384,0.00056108334509554,0.0003611255610840681,0.0002388168283348348,0.00016456282140960994,0.00012108307905286178,9.928655238677393e-05,9.802986918413655e-05,0.0001355041849544529
 | 
				
			||||||
 | 
					0.001,0.0007206738776295639,0.0005603110603628828,0.0003602685373417506,0.00023802565027806571,0.00016383681258690845,0.00012036565891864721,9.847129356381268e-05,9.686986333449523e-05,0.0001330967445342526
 | 
				
			||||||
 | 
					0.001,0.0007199346049934109,0.0005595448746691314,0.00035941871861020354,0.00023724134078502595,0.00016311729706930416,0.00011965506942237431,9.7664903298557e-05,9.57257243308077e-05,0.00013073495556510661
 | 
				
			||||||
 | 
					0.001,0.0007192103057281418,0.0005587965882928195,0.000358597914203722,0.00023649404923234267,0.0001624426539507404,0.00011900000933912548,9.693290327537121e-05,9.469853254875163e-05,0.0001286228242214262
 | 
				
			||||||
 | 
					0.001,0.0007184916860834766,0.000558054333130965,0.0003577841401235257,0.0002357533416394368,0.00016177407584741055,0.00011835110239617177,9.620855295571759e-05,9.368449216343134e-05,0.0001265476735456528
 | 
				
			||||||
 | 
					0.001,0.000717778732645577,0.0005573180893469085,0.0003569773567342285,0.0002350191694371068,0.0001611115088719043,0.00011770828481211398,9.549176022876216e-05,9.268341301362701e-05,0.00012450880618841231
 | 
				
			||||||
 | 
					0.001,0.0007170715507844816,0.0005565879566941514,0.0003561776441627035,0.00023429158098135867,0.00016045497378223205,0.00011707155159443024,9.47824835635146e-05,9.169515755193108e-05,0.00012250560759307665
 | 
				
			||||||
 | 
					0.001,0.0007163701270344053,0.0005558639152622166,0.0003553849627325309,0.00023357052778616886,0.00015980441694230793,0.00011644083951173604,9.408063218207804e-05,9.071953997714039e-05,0.00012053740486430812
 | 
				
			||||||
 | 
					0.001,0.0007156744480415676,0.0005551459453084167,0.00035459927313802623,0.00023285596185845654,0.00015915978530381373,0.00011581608608941654,9.338611653058621e-05,8.975637744384618e-05,0.00011860353870291344
 | 
				
			||||||
 | 
					0.001,0.0007149845005557793,0.0005544340272448129,0.0003538205364097734,0.0002321478356456351,0.0001585210263398076,0.00011519722952770958,9.269884816673769e-05,8.880548985453175e-05,0.00011670336266552508
 | 
				
			||||||
 | 
					0.001,0.0007143011352806332,0.0005537290222260827,0.0003530496254918224,0.00023144685778402562,0.00015788868071804074,0.00011458468167101622,9.20191492389152e-05,8.786712068874325e-05,0.00011483685132763588
 | 
				
			||||||
 | 
					0.001,0.0007136243377311475,0.0005530309085687206,0.00035228649684153725,0.0002307529751854999,0.00015726269010384348,0.00011397837465469773,9.134692457668887e-05,8.694108196461404e-05,0.00011300335424584403
 | 
				
			||||||
 | 
					0.001,0.0007129540935643617,0.0005523396647985742,0.000351531107363628,0.0002300661353432777,0.0001566429968410848,0.00011337824146720777,9.06820803490277e-05,8.602718880727694e-05,0.00011120223452206596
 | 
				
			||||||
 | 
					0.001,0.0007122949300063586,0.0005516609446370161,0.0003507932546232374,0.0002293990178082647,0.00015604454205901748,0.00011280134646728481,9.004396195380538e-05,8.514641523915274e-05,0.00010944396621311202
 | 
				
			||||||
 | 
					0.001,0.0007116422850379047,0.0005509890404263221,0.00035006301886912226,0.00022873877079420107,0.00015545216193435095,0.00011223032450910806,8.941277122627028e-05,8.427699754143763e-05,0.00010771649233683978
 | 
				
			||||||
 | 
					0.001,0.0007109961448775265,0.0005503239315436604,0.00034934035900275196,0.00022808534468017605,0.00015486580256638324,0.00011166511373672321,8.878842266662507e-05,8.341876815036907e-05,0.00010601922394974779
 | 
				
			||||||
 | 
					0.001,0.0007103566138672342,0.0005496657159311855,0.0003486253516297722,0.00022743878433373037,0.00015428548213839886,0.00011110570832676001,8.81708780194749e-05,8.25716070442755e-05,0.00010435164299643007
 | 
				
			||||||
 | 
					0.001,0.0007097236782517396,0.0005490143729973408,0.0003479179557857281,0.0002267990403962617,0.0001537111471536449,0.00011055204708289399,8.756005313455197e-05,8.173535064610718e-05,0.0001027131817052566
 | 
				
			||||||
 | 
					0.001,0.0007090973244087274,0.0005483698823458906,0.00034721813091834777,0.000226166064037726,0.00015314274472297157,0.00011000406955950422,8.695586501935841e-05,8.090983803329783e-05,0.00010110328401062253
 | 
				
			||||||
 | 
					0.001,0.0007084775388425413,0.0005477322237660661,0.0003465258368613831,0.00022553980691704316,0.00015258022251510344,0.00010946171600087524,8.635823175652435e-05,8.00949107862898e-05,9.952140501322636e-05
 | 
				
			||||||
 | 
					0.001,0.0007078645400735427,0.0005471016129101978,0.0003458412757255009,0.00022492042013778988,0.00015202368335334558,0.00010892504915290583,8.57671759148139e-05,7.929051589048381e-05,9.796715152670613e-05
 | 
				
			||||||
 | 
					0.001,0.0007072583145347741,0.0005464780293804963,0.00034516440688163317,0.00022430785483116316,0.0001514730744232032,0.00010839400891826328,8.518261565996433e-05,7.84964968569563e-05,9.643999410136803e-05
 | 
				
			||||||
 | 
					0.001,0.0007066588487940405,0.000545861452976259,0.0003444951901125997,0.00022370206265319418,0.00015092834351042303,0.00010786853593723236,8.460447028623623e-05,7.771269974698105e-05,9.493941424410264e-05
 | 
				
			||||||
 | 
					0.001,0.0007060768113835355,0.0005452653567881146,0.00034385780916102886,0.0002231355522451839,0.0001504295746545273,0.00010739737531972382,8.409424224945842e-05,7.702434963545377e-05,9.360618912201228e-05
 | 
				
			||||||
 | 
					0.001,0.0007055014939207988,0.0005446762036784223,0.00034322791998477503,0.0002225755642266546,0.00014993632274793293,0.00010693123855410087,8.358951092264173e-05,7.634435339541097e-05,9.22944227993744e-05
 | 
				
			||||||
 | 
					0.001,0.0007049328836329239,0.0005440939744776738,0.0003426054850001757,0.00022202205441602206,0.000149448541485554,0.00010647007505716636,8.309021096715739e-05,7.567259318109089e-05,9.100372969350909e-05
 | 
				
			||||||
 | 
					0.001,0.0007043664108869901,0.0005435140913972429,0.00034198598587466614,0.00022147141590047654,0.00014896349766232102,0.00010601178096740148,8.259459730216135e-05,7.500736724232048e-05,8.973176442333615e-05
 | 
				
			||||||
 | 
					0.001,0.0007038020712072354,0.0005429365478183962,0.00034136940918446675,0.0002209236320980648,0.00014848117283038098,0.00010555633431743894,8.210263744821714e-05,7.434860458126827e-05,8.847824135377829e-05
 | 
				
			||||||
 | 
					0.001,0.0007032398600991381,0.0005423613371043419,0.00034075574151016483,0.0002203786864681782,0.00014800154862415601,0.00010510371328265478,8.161429921011451e-05,7.369623501807121e-05,8.724287943554497e-05
 | 
				
			||||||
 | 
					0.001,0.0007026797730466592,0.0005417884525961108,0.00034014496942632764,0.0002198365624959981,0.00014752460674093983,0.00010465389615779026,8.112955064604149e-05,7.305018913687007e-05,8.602540201539488e-05
 | 
				
			||||||
 | 
					0.001,0.0007021196874055633,0.0005412157406692665,0.0003395348927353949,0.00021929545761274023,0.00014704895219343257,0.00010420578859113516,8.064746506639534e-05,7.240953347459202e-05,8.482441661675139e-05
 | 
				
			||||||
 | 
					0.001,0.0007015596012323657,0.0005406431992153213,0.0003389255082691921,0.00021875536780717296,0.00014657457987728414,0.00010375938295149973,8.016802726693694e-05,7.17742234562459e-05,8.363970356449741e-05
 | 
				
			||||||
 | 
					0.001,0.0007009995125587165,0.0005400708260946051,0.0003383168128172846,0.00021821628903476192,0.00014610148467187763,0.0001033146716169485,7.969122211456026e-05,7.114421486558773e-05,8.247104609297546e-05
 | 
				
			||||||
 | 
					0.001,0.000700426120570031,0.0005394817717340144,0.00033767827777106695,0.00021763678242090514,0.00014557802543177205,0.00010280805245363877,7.913535785684264e-05,7.040274681183516e-05,8.111172191387726e-05
 | 
				
			||||||
 | 
					0.001,0.0006998527383823768,0.0005388929110101418,0.0003370405259007354,0.00021705847496470142,0.00014505616500334602,0.00010230367256069614,7.858312049704058e-05,6.966868896041247e-05,7.977423771714316e-05
 | 
				
			||||||
 | 
					0.0010496228983614124,0.002020602352332682,0.0024834354692445607,0.004712247621156641,0.00854174709233096,0.015197203876184536,0.027142477151470907,0.049749449744480465,0.09589624880110185,0.2
 | 
				
			||||||
 | 
					0.004235602571438949,0.007336805952289255,0.008714058005603317,0.015024716476258112,0.025061770718850837,0.04079161627542227,0.0649508755581543,0.10074574737193842,0.14993445055894863,0.206
 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										36
									
								
								tests/data/test_lumped_losses_raman_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								tests/data/test_lumped_losses_raman_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "uid": "Span1",
 | 
				
			||||||
 | 
					  "params": {
 | 
				
			||||||
 | 
					    "length": 80,
 | 
				
			||||||
 | 
					    "loss_coef": 0.2,
 | 
				
			||||||
 | 
					    "length_units": "km",
 | 
				
			||||||
 | 
					    "att_in": 0,
 | 
				
			||||||
 | 
					    "con_in": 0.5,
 | 
				
			||||||
 | 
					    "con_out": 0.0,
 | 
				
			||||||
 | 
					    "lumped_losses": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "position": 7,
 | 
				
			||||||
 | 
					        "loss": 0.5
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "type_variety": "SSMF",
 | 
				
			||||||
 | 
					    "dispersion": 0.0000167,
 | 
				
			||||||
 | 
					    "effective_area": 83e-12,
 | 
				
			||||||
 | 
					    "pmd_coef": 1.265e-15
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "operational": {
 | 
				
			||||||
 | 
					    "temperature": 283,
 | 
				
			||||||
 | 
					    "raman_pumps": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "power": 0.2,
 | 
				
			||||||
 | 
					        "frequency": 205000000000000,
 | 
				
			||||||
 | 
					        "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "power": 0.206,
 | 
				
			||||||
 | 
					        "frequency": 201000000000000,
 | 
				
			||||||
 | 
					        "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										224
									
								
								tests/data/test_old_parameters_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								tests/data/test_old_parameters_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "uid": "Span1",
 | 
				
			||||||
 | 
					  "params": {
 | 
				
			||||||
 | 
					    "length": 80,
 | 
				
			||||||
 | 
					    "loss_coef": 0.2,
 | 
				
			||||||
 | 
					    "length_units": "km",
 | 
				
			||||||
 | 
					    "att_in": 0,
 | 
				
			||||||
 | 
					    "con_in": 0.5,
 | 
				
			||||||
 | 
					    "con_out": 0.5,
 | 
				
			||||||
 | 
					    "type_variety": "SSMF",
 | 
				
			||||||
 | 
					    "dispersion": 0.0000167,
 | 
				
			||||||
 | 
					    "effective_area": 83e-12,
 | 
				
			||||||
 | 
					    "pmd_coef": 1.265e-15,
 | 
				
			||||||
 | 
					    "raman_efficiency": {
 | 
				
			||||||
 | 
					      "cr": [
 | 
				
			||||||
 | 
					        0.00000000e+00,
 | 
				
			||||||
 | 
					        1.12351610e-05,
 | 
				
			||||||
 | 
					        3.47838074e-05,
 | 
				
			||||||
 | 
					        5.79356636e-05,
 | 
				
			||||||
 | 
					        8.06921680e-05,
 | 
				
			||||||
 | 
					        9.79845709e-05,
 | 
				
			||||||
 | 
					        1.10454361e-04,
 | 
				
			||||||
 | 
					        1.18735302e-04,
 | 
				
			||||||
 | 
					        1.24736889e-04,
 | 
				
			||||||
 | 
					        1.30110053e-04,
 | 
				
			||||||
 | 
					        1.41001273e-04,
 | 
				
			||||||
 | 
					        1.46383247e-04,
 | 
				
			||||||
 | 
					        1.57011792e-04,
 | 
				
			||||||
 | 
					        1.70765865e-04,
 | 
				
			||||||
 | 
					        1.88408911e-04,
 | 
				
			||||||
 | 
					        2.05914127e-04,
 | 
				
			||||||
 | 
					        2.24074028e-04,
 | 
				
			||||||
 | 
					        2.47508283e-04,
 | 
				
			||||||
 | 
					        2.77729174e-04,
 | 
				
			||||||
 | 
					        3.08044243e-04,
 | 
				
			||||||
 | 
					        3.34764439e-04,
 | 
				
			||||||
 | 
					        3.56481704e-04,
 | 
				
			||||||
 | 
					        3.77127256e-04,
 | 
				
			||||||
 | 
					        3.96269124e-04,
 | 
				
			||||||
 | 
					        4.10955175e-04,
 | 
				
			||||||
 | 
					        4.18718761e-04,
 | 
				
			||||||
 | 
					        4.19511263e-04,
 | 
				
			||||||
 | 
					        4.17025384e-04,
 | 
				
			||||||
 | 
					        4.13565369e-04,
 | 
				
			||||||
 | 
					        4.07726048e-04,
 | 
				
			||||||
 | 
					        3.83671291e-04,
 | 
				
			||||||
 | 
					        4.08564283e-04,
 | 
				
			||||||
 | 
					        3.69571936e-04,
 | 
				
			||||||
 | 
					        3.14442090e-04,
 | 
				
			||||||
 | 
					        2.16074535e-04,
 | 
				
			||||||
 | 
					        1.23097823e-04,
 | 
				
			||||||
 | 
					        8.95457457e-05,
 | 
				
			||||||
 | 
					        7.52470400e-05,
 | 
				
			||||||
 | 
					        7.19806145e-05,
 | 
				
			||||||
 | 
					        8.87961158e-05,
 | 
				
			||||||
 | 
					        9.30812065e-05,
 | 
				
			||||||
 | 
					        9.37058268e-05,
 | 
				
			||||||
 | 
					        8.45719619e-05,
 | 
				
			||||||
 | 
					        6.90585286e-05,
 | 
				
			||||||
 | 
					        4.50407159e-05,
 | 
				
			||||||
 | 
					        3.36521245e-05,
 | 
				
			||||||
 | 
					        3.02292475e-05,
 | 
				
			||||||
 | 
					        2.69376939e-05,
 | 
				
			||||||
 | 
					        2.60020897e-05,
 | 
				
			||||||
 | 
					        2.82958958e-05,
 | 
				
			||||||
 | 
					        3.08667558e-05,
 | 
				
			||||||
 | 
					        3.66024657e-05,
 | 
				
			||||||
 | 
					        5.80610307e-05,
 | 
				
			||||||
 | 
					        6.54797937e-05,
 | 
				
			||||||
 | 
					        6.25022715e-05,
 | 
				
			||||||
 | 
					        5.37806442e-05,
 | 
				
			||||||
 | 
					        3.94996621e-05,
 | 
				
			||||||
 | 
					        2.68120644e-05,
 | 
				
			||||||
 | 
					        2.33038554e-05,
 | 
				
			||||||
 | 
					        1.79140757e-05,
 | 
				
			||||||
 | 
					        1.52472424e-05,
 | 
				
			||||||
 | 
					        1.32707565e-05,
 | 
				
			||||||
 | 
					        1.06541760e-05,
 | 
				
			||||||
 | 
					        9.84649374e-06,
 | 
				
			||||||
 | 
					        9.13999627e-06,
 | 
				
			||||||
 | 
					        9.08971012e-06,
 | 
				
			||||||
 | 
					        1.04227525e-05,
 | 
				
			||||||
 | 
					        1.50419271e-05,
 | 
				
			||||||
 | 
					        1.77838232e-05,
 | 
				
			||||||
 | 
					        2.15810815e-05,
 | 
				
			||||||
 | 
					        2.03744008e-05,
 | 
				
			||||||
 | 
					        1.81939341e-05,
 | 
				
			||||||
 | 
					        1.31862121e-05,
 | 
				
			||||||
 | 
					        9.65352116e-06,
 | 
				
			||||||
 | 
					        8.62698322e-06,
 | 
				
			||||||
 | 
					        9.18688016e-06,
 | 
				
			||||||
 | 
					        1.01737784e-05,
 | 
				
			||||||
 | 
					        1.08017817e-05,
 | 
				
			||||||
 | 
					        1.03903588e-05,
 | 
				
			||||||
 | 
					        9.30040333e-06,
 | 
				
			||||||
 | 
					        8.30809173e-06,
 | 
				
			||||||
 | 
					        6.90650401e-06,
 | 
				
			||||||
 | 
					        5.52238029e-06,
 | 
				
			||||||
 | 
					        3.90648708e-06,
 | 
				
			||||||
 | 
					        2.22908227e-06,
 | 
				
			||||||
 | 
					        1.55796177e-06,
 | 
				
			||||||
 | 
					        9.77218716e-07,
 | 
				
			||||||
 | 
					        3.23477236e-07,
 | 
				
			||||||
 | 
					        1.60602454e-07,
 | 
				
			||||||
 | 
					        7.97306386e-08
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "frequency_offset": [
 | 
				
			||||||
 | 
					        0.0e12,
 | 
				
			||||||
 | 
					        0.5e12,
 | 
				
			||||||
 | 
					        1.0e12,
 | 
				
			||||||
 | 
					        1.5e12,
 | 
				
			||||||
 | 
					        2.0e12,
 | 
				
			||||||
 | 
					        2.5e12,
 | 
				
			||||||
 | 
					        3.0e12,
 | 
				
			||||||
 | 
					        3.5e12,
 | 
				
			||||||
 | 
					        4.0e12,
 | 
				
			||||||
 | 
					        4.5e12,
 | 
				
			||||||
 | 
					        5.0e12,
 | 
				
			||||||
 | 
					        5.5e12,
 | 
				
			||||||
 | 
					        6.0e12,
 | 
				
			||||||
 | 
					        6.5e12,
 | 
				
			||||||
 | 
					        7.0e12,
 | 
				
			||||||
 | 
					        7.5e12,
 | 
				
			||||||
 | 
					        8.0e12,
 | 
				
			||||||
 | 
					        8.5e12,
 | 
				
			||||||
 | 
					        9.0e12,
 | 
				
			||||||
 | 
					        9.5e12,
 | 
				
			||||||
 | 
					        10.0e12,
 | 
				
			||||||
 | 
					        10.5e12,
 | 
				
			||||||
 | 
					        11.0e12,
 | 
				
			||||||
 | 
					        11.5e12,
 | 
				
			||||||
 | 
					        12.0e12,
 | 
				
			||||||
 | 
					        12.5e12,
 | 
				
			||||||
 | 
					        12.75e12,
 | 
				
			||||||
 | 
					        13.0e12,
 | 
				
			||||||
 | 
					        13.25e12,
 | 
				
			||||||
 | 
					        13.5e12,
 | 
				
			||||||
 | 
					        14.0e12,
 | 
				
			||||||
 | 
					        14.5e12,
 | 
				
			||||||
 | 
					        14.75e12,
 | 
				
			||||||
 | 
					        15.0e12,
 | 
				
			||||||
 | 
					        15.5e12,
 | 
				
			||||||
 | 
					        16.0e12,
 | 
				
			||||||
 | 
					        16.5e12,
 | 
				
			||||||
 | 
					        17.0e12,
 | 
				
			||||||
 | 
					        17.5e12,
 | 
				
			||||||
 | 
					        18.0e12,
 | 
				
			||||||
 | 
					        18.25e12,
 | 
				
			||||||
 | 
					        18.5e12,
 | 
				
			||||||
 | 
					        18.75e12,
 | 
				
			||||||
 | 
					        19.0e12,
 | 
				
			||||||
 | 
					        19.5e12,
 | 
				
			||||||
 | 
					        20.0e12,
 | 
				
			||||||
 | 
					        20.5e12,
 | 
				
			||||||
 | 
					        21.0e12,
 | 
				
			||||||
 | 
					        21.5e12,
 | 
				
			||||||
 | 
					        22.0e12,
 | 
				
			||||||
 | 
					        22.5e12,
 | 
				
			||||||
 | 
					        23.0e12,
 | 
				
			||||||
 | 
					        23.5e12,
 | 
				
			||||||
 | 
					        24.0e12,
 | 
				
			||||||
 | 
					        24.5e12,
 | 
				
			||||||
 | 
					        25.0e12,
 | 
				
			||||||
 | 
					        25.5e12,
 | 
				
			||||||
 | 
					        26.0e12,
 | 
				
			||||||
 | 
					        26.5e12,
 | 
				
			||||||
 | 
					        27.0e12,
 | 
				
			||||||
 | 
					        27.5e12,
 | 
				
			||||||
 | 
					        28.0e12,
 | 
				
			||||||
 | 
					        28.5e12,
 | 
				
			||||||
 | 
					        29.0e12,
 | 
				
			||||||
 | 
					        29.5e12,
 | 
				
			||||||
 | 
					        30.0e12,
 | 
				
			||||||
 | 
					        30.5e12,
 | 
				
			||||||
 | 
					        31.0e12,
 | 
				
			||||||
 | 
					        31.5e12,
 | 
				
			||||||
 | 
					        32.0e12,
 | 
				
			||||||
 | 
					        32.5e12,
 | 
				
			||||||
 | 
					        33.0e12,
 | 
				
			||||||
 | 
					        33.5e12,
 | 
				
			||||||
 | 
					        34.0e12,
 | 
				
			||||||
 | 
					        34.5e12,
 | 
				
			||||||
 | 
					        35.0e12,
 | 
				
			||||||
 | 
					        35.5e12,
 | 
				
			||||||
 | 
					        36.0e12,
 | 
				
			||||||
 | 
					        36.5e12,
 | 
				
			||||||
 | 
					        37.0e12,
 | 
				
			||||||
 | 
					        37.5e12,
 | 
				
			||||||
 | 
					        38.0e12,
 | 
				
			||||||
 | 
					        38.5e12,
 | 
				
			||||||
 | 
					        39.0e12,
 | 
				
			||||||
 | 
					        39.5e12,
 | 
				
			||||||
 | 
					        40.0e12,
 | 
				
			||||||
 | 
					        40.5e12,
 | 
				
			||||||
 | 
					        41.0e12,
 | 
				
			||||||
 | 
					        41.5e12,
 | 
				
			||||||
 | 
					        42.0e12
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "operational": {
 | 
				
			||||||
 | 
					        "temperature": 283,
 | 
				
			||||||
 | 
					        "raman_pumps": [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 224.403e-3,
 | 
				
			||||||
 | 
					            "frequency": 205e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 231.135e-3,
 | 
				
			||||||
 | 
					            "frequency": 201e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					  "metadata": {
 | 
				
			||||||
 | 
					    "location": {
 | 
				
			||||||
 | 
					      "latitude": 1,
 | 
				
			||||||
 | 
					      "longitude": 0,
 | 
				
			||||||
 | 
					      "city": null,
 | 
				
			||||||
 | 
					      "region": ""
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										225
									
								
								tests/data/test_parameters_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								tests/data/test_parameters_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,225 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "uid": "Span1",
 | 
				
			||||||
 | 
					  "params": {
 | 
				
			||||||
 | 
					    "length": 80,
 | 
				
			||||||
 | 
					    "loss_coef": 0.2,
 | 
				
			||||||
 | 
					    "length_units": "km",
 | 
				
			||||||
 | 
					    "att_in": 0,
 | 
				
			||||||
 | 
					    "con_in": 0.5,
 | 
				
			||||||
 | 
					    "con_out": 0.5,
 | 
				
			||||||
 | 
					    "type_variety": "SSMF",
 | 
				
			||||||
 | 
					    "dispersion": 0.0000167,
 | 
				
			||||||
 | 
					    "effective_area": 83e-12,
 | 
				
			||||||
 | 
					    "pmd_coef": 1.265e-15,
 | 
				
			||||||
 | 
					    "raman_coefficient": {
 | 
				
			||||||
 | 
					      "g0": [
 | 
				
			||||||
 | 
					        0.00000000e+00,
 | 
				
			||||||
 | 
					        1.12351610e-05,
 | 
				
			||||||
 | 
					        3.47838074e-05,
 | 
				
			||||||
 | 
					        5.79356636e-05,
 | 
				
			||||||
 | 
					        8.06921680e-05,
 | 
				
			||||||
 | 
					        9.79845709e-05,
 | 
				
			||||||
 | 
					        1.10454361e-04,
 | 
				
			||||||
 | 
					        1.18735302e-04,
 | 
				
			||||||
 | 
					        1.24736889e-04,
 | 
				
			||||||
 | 
					        1.30110053e-04,
 | 
				
			||||||
 | 
					        1.41001273e-04,
 | 
				
			||||||
 | 
					        1.46383247e-04,
 | 
				
			||||||
 | 
					        1.57011792e-04,
 | 
				
			||||||
 | 
					        1.70765865e-04,
 | 
				
			||||||
 | 
					        1.88408911e-04,
 | 
				
			||||||
 | 
					        2.05914127e-04,
 | 
				
			||||||
 | 
					        2.24074028e-04,
 | 
				
			||||||
 | 
					        2.47508283e-04,
 | 
				
			||||||
 | 
					        2.77729174e-04,
 | 
				
			||||||
 | 
					        3.08044243e-04,
 | 
				
			||||||
 | 
					        3.34764439e-04,
 | 
				
			||||||
 | 
					        3.56481704e-04,
 | 
				
			||||||
 | 
					        3.77127256e-04,
 | 
				
			||||||
 | 
					        3.96269124e-04,
 | 
				
			||||||
 | 
					        4.10955175e-04,
 | 
				
			||||||
 | 
					        4.18718761e-04,
 | 
				
			||||||
 | 
					        4.19511263e-04,
 | 
				
			||||||
 | 
					        4.17025384e-04,
 | 
				
			||||||
 | 
					        4.13565369e-04,
 | 
				
			||||||
 | 
					        4.07726048e-04,
 | 
				
			||||||
 | 
					        3.83671291e-04,
 | 
				
			||||||
 | 
					        4.08564283e-04,
 | 
				
			||||||
 | 
					        3.69571936e-04,
 | 
				
			||||||
 | 
					        3.14442090e-04,
 | 
				
			||||||
 | 
					        2.16074535e-04,
 | 
				
			||||||
 | 
					        1.23097823e-04,
 | 
				
			||||||
 | 
					        8.95457457e-05,
 | 
				
			||||||
 | 
					        7.52470400e-05,
 | 
				
			||||||
 | 
					        7.19806145e-05,
 | 
				
			||||||
 | 
					        8.87961158e-05,
 | 
				
			||||||
 | 
					        9.30812065e-05,
 | 
				
			||||||
 | 
					        9.37058268e-05,
 | 
				
			||||||
 | 
					        8.45719619e-05,
 | 
				
			||||||
 | 
					        6.90585286e-05,
 | 
				
			||||||
 | 
					        4.50407159e-05,
 | 
				
			||||||
 | 
					        3.36521245e-05,
 | 
				
			||||||
 | 
					        3.02292475e-05,
 | 
				
			||||||
 | 
					        2.69376939e-05,
 | 
				
			||||||
 | 
					        2.60020897e-05,
 | 
				
			||||||
 | 
					        2.82958958e-05,
 | 
				
			||||||
 | 
					        3.08667558e-05,
 | 
				
			||||||
 | 
					        3.66024657e-05,
 | 
				
			||||||
 | 
					        5.80610307e-05,
 | 
				
			||||||
 | 
					        6.54797937e-05,
 | 
				
			||||||
 | 
					        6.25022715e-05,
 | 
				
			||||||
 | 
					        5.37806442e-05,
 | 
				
			||||||
 | 
					        3.94996621e-05,
 | 
				
			||||||
 | 
					        2.68120644e-05,
 | 
				
			||||||
 | 
					        2.33038554e-05,
 | 
				
			||||||
 | 
					        1.79140757e-05,
 | 
				
			||||||
 | 
					        1.52472424e-05,
 | 
				
			||||||
 | 
					        1.32707565e-05,
 | 
				
			||||||
 | 
					        1.06541760e-05,
 | 
				
			||||||
 | 
					        9.84649374e-06,
 | 
				
			||||||
 | 
					        9.13999627e-06,
 | 
				
			||||||
 | 
					        9.08971012e-06,
 | 
				
			||||||
 | 
					        1.04227525e-05,
 | 
				
			||||||
 | 
					        1.50419271e-05,
 | 
				
			||||||
 | 
					        1.77838232e-05,
 | 
				
			||||||
 | 
					        2.15810815e-05,
 | 
				
			||||||
 | 
					        2.03744008e-05,
 | 
				
			||||||
 | 
					        1.81939341e-05,
 | 
				
			||||||
 | 
					        1.31862121e-05,
 | 
				
			||||||
 | 
					        9.65352116e-06,
 | 
				
			||||||
 | 
					        8.62698322e-06,
 | 
				
			||||||
 | 
					        9.18688016e-06,
 | 
				
			||||||
 | 
					        1.01737784e-05,
 | 
				
			||||||
 | 
					        1.08017817e-05,
 | 
				
			||||||
 | 
					        1.03903588e-05,
 | 
				
			||||||
 | 
					        9.30040333e-06,
 | 
				
			||||||
 | 
					        8.30809173e-06,
 | 
				
			||||||
 | 
					        6.90650401e-06,
 | 
				
			||||||
 | 
					        5.52238029e-06,
 | 
				
			||||||
 | 
					        3.90648708e-06,
 | 
				
			||||||
 | 
					        2.22908227e-06,
 | 
				
			||||||
 | 
					        1.55796177e-06,
 | 
				
			||||||
 | 
					        9.77218716e-07,
 | 
				
			||||||
 | 
					        3.23477236e-07,
 | 
				
			||||||
 | 
					        1.60602454e-07,
 | 
				
			||||||
 | 
					        7.97306386e-08
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "frequency_offset": [
 | 
				
			||||||
 | 
					        0.0e12,
 | 
				
			||||||
 | 
					        0.5e12,
 | 
				
			||||||
 | 
					        1.0e12,
 | 
				
			||||||
 | 
					        1.5e12,
 | 
				
			||||||
 | 
					        2.0e12,
 | 
				
			||||||
 | 
					        2.5e12,
 | 
				
			||||||
 | 
					        3.0e12,
 | 
				
			||||||
 | 
					        3.5e12,
 | 
				
			||||||
 | 
					        4.0e12,
 | 
				
			||||||
 | 
					        4.5e12,
 | 
				
			||||||
 | 
					        5.0e12,
 | 
				
			||||||
 | 
					        5.5e12,
 | 
				
			||||||
 | 
					        6.0e12,
 | 
				
			||||||
 | 
					        6.5e12,
 | 
				
			||||||
 | 
					        7.0e12,
 | 
				
			||||||
 | 
					        7.5e12,
 | 
				
			||||||
 | 
					        8.0e12,
 | 
				
			||||||
 | 
					        8.5e12,
 | 
				
			||||||
 | 
					        9.0e12,
 | 
				
			||||||
 | 
					        9.5e12,
 | 
				
			||||||
 | 
					        10.0e12,
 | 
				
			||||||
 | 
					        10.5e12,
 | 
				
			||||||
 | 
					        11.0e12,
 | 
				
			||||||
 | 
					        11.5e12,
 | 
				
			||||||
 | 
					        12.0e12,
 | 
				
			||||||
 | 
					        12.5e12,
 | 
				
			||||||
 | 
					        12.75e12,
 | 
				
			||||||
 | 
					        13.0e12,
 | 
				
			||||||
 | 
					        13.25e12,
 | 
				
			||||||
 | 
					        13.5e12,
 | 
				
			||||||
 | 
					        14.0e12,
 | 
				
			||||||
 | 
					        14.5e12,
 | 
				
			||||||
 | 
					        14.75e12,
 | 
				
			||||||
 | 
					        15.0e12,
 | 
				
			||||||
 | 
					        15.5e12,
 | 
				
			||||||
 | 
					        16.0e12,
 | 
				
			||||||
 | 
					        16.5e12,
 | 
				
			||||||
 | 
					        17.0e12,
 | 
				
			||||||
 | 
					        17.5e12,
 | 
				
			||||||
 | 
					        18.0e12,
 | 
				
			||||||
 | 
					        18.25e12,
 | 
				
			||||||
 | 
					        18.5e12,
 | 
				
			||||||
 | 
					        18.75e12,
 | 
				
			||||||
 | 
					        19.0e12,
 | 
				
			||||||
 | 
					        19.5e12,
 | 
				
			||||||
 | 
					        20.0e12,
 | 
				
			||||||
 | 
					        20.5e12,
 | 
				
			||||||
 | 
					        21.0e12,
 | 
				
			||||||
 | 
					        21.5e12,
 | 
				
			||||||
 | 
					        22.0e12,
 | 
				
			||||||
 | 
					        22.5e12,
 | 
				
			||||||
 | 
					        23.0e12,
 | 
				
			||||||
 | 
					        23.5e12,
 | 
				
			||||||
 | 
					        24.0e12,
 | 
				
			||||||
 | 
					        24.5e12,
 | 
				
			||||||
 | 
					        25.0e12,
 | 
				
			||||||
 | 
					        25.5e12,
 | 
				
			||||||
 | 
					        26.0e12,
 | 
				
			||||||
 | 
					        26.5e12,
 | 
				
			||||||
 | 
					        27.0e12,
 | 
				
			||||||
 | 
					        27.5e12,
 | 
				
			||||||
 | 
					        28.0e12,
 | 
				
			||||||
 | 
					        28.5e12,
 | 
				
			||||||
 | 
					        29.0e12,
 | 
				
			||||||
 | 
					        29.5e12,
 | 
				
			||||||
 | 
					        30.0e12,
 | 
				
			||||||
 | 
					        30.5e12,
 | 
				
			||||||
 | 
					        31.0e12,
 | 
				
			||||||
 | 
					        31.5e12,
 | 
				
			||||||
 | 
					        32.0e12,
 | 
				
			||||||
 | 
					        32.5e12,
 | 
				
			||||||
 | 
					        33.0e12,
 | 
				
			||||||
 | 
					        33.5e12,
 | 
				
			||||||
 | 
					        34.0e12,
 | 
				
			||||||
 | 
					        34.5e12,
 | 
				
			||||||
 | 
					        35.0e12,
 | 
				
			||||||
 | 
					        35.5e12,
 | 
				
			||||||
 | 
					        36.0e12,
 | 
				
			||||||
 | 
					        36.5e12,
 | 
				
			||||||
 | 
					        37.0e12,
 | 
				
			||||||
 | 
					        37.5e12,
 | 
				
			||||||
 | 
					        38.0e12,
 | 
				
			||||||
 | 
					        38.5e12,
 | 
				
			||||||
 | 
					        39.0e12,
 | 
				
			||||||
 | 
					        39.5e12,
 | 
				
			||||||
 | 
					        40.0e12,
 | 
				
			||||||
 | 
					        40.5e12,
 | 
				
			||||||
 | 
					        41.0e12,
 | 
				
			||||||
 | 
					        41.5e12,
 | 
				
			||||||
 | 
					        42.0e12
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "reference_frequency": 206184634112792
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "operational": {
 | 
				
			||||||
 | 
					        "temperature": 283,
 | 
				
			||||||
 | 
					        "raman_pumps": [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 224.403e-3,
 | 
				
			||||||
 | 
					            "frequency": 205e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 231.135e-3,
 | 
				
			||||||
 | 
					            "frequency": 201e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					  "metadata": {
 | 
				
			||||||
 | 
					    "location": {
 | 
				
			||||||
 | 
					      "latitude": 1,
 | 
				
			||||||
 | 
					      "longitude": 0,
 | 
				
			||||||
 | 
					      "city": null,
 | 
				
			||||||
 | 
					      "region": ""
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										97
									
								
								tests/data/test_raman_fiber_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								tests/data/test_raman_fiber_expected_results.csv
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					signal,ase,nli
 | 
				
			||||||
 | 
					0.000325019416624,3.8827360617812335e-08,2.397604591245591e-07
 | 
				
			||||||
 | 
					0.0003222815415358,3.8702821151814216e-08,2.4267833614138976e-07
 | 
				
			||||||
 | 
					0.0003195661748689,3.8578942925493807e-08,2.455296149641726e-07
 | 
				
			||||||
 | 
					0.000316873132879,3.8455721305309324e-08,2.483151861322029e-07
 | 
				
			||||||
 | 
					0.0003125687708988,3.815158818797417e-08,2.497308542349044e-07
 | 
				
			||||||
 | 
					0.0003083216327341,3.784989647314237e-08,2.5106122773764815e-07
 | 
				
			||||||
 | 
					0.0003041309702107,3.755062053762566e-08,2.523083160653813e-07
 | 
				
			||||||
 | 
					0.0002999931829076,3.725370771318225e-08,2.534716728592015e-07
 | 
				
			||||||
 | 
					0.0002959076621852,3.695913382975532e-08,2.545532047834699e-07
 | 
				
			||||||
 | 
					0.0002914749637887,3.6620413511505286e-08,2.5520557429118934e-07
 | 
				
			||||||
 | 
					0.0002871045786391,3.62847038107824e-08,2.557776344401253e-07
 | 
				
			||||||
 | 
					0.0002827879891071,3.5951828869209396e-08,2.5626453052593257e-07
 | 
				
			||||||
 | 
					0.0002785247470154,3.562176113110911e-08,2.5666832208790035e-07
 | 
				
			||||||
 | 
					0.0002743144039041,3.5294473123494e-08,2.569910409348857e-07
 | 
				
			||||||
 | 
					0.000270032675166,3.4954880805048256e-08,2.571167784361306e-07
 | 
				
			||||||
 | 
					0.0002658067200554,3.4618272391047544e-08,2.571652788509227e-07
 | 
				
			||||||
 | 
					0.000261636025157,3.428461757057609e-08,2.5713860104931033e-07
 | 
				
			||||||
 | 
					0.00025752034599,3.395388872366444e-08,2.570390408700655e-07
 | 
				
			||||||
 | 
					0.000253459157096,3.362605558722993e-08,2.5284986247287787e-07
 | 
				
			||||||
 | 
					0.000248983782073,3.3242702224575744e-08,2.48252059976888e-07
 | 
				
			||||||
 | 
					0.0002445773493265,3.286328176612301e-08,2.437277481862015e-07
 | 
				
			||||||
 | 
					0.0002402391773459,3.2487750441670215e-08,2.392761376865807e-07
 | 
				
			||||||
 | 
					0.0002359684123723,3.2116061418127753e-08,2.3489626905665574e-07
 | 
				
			||||||
 | 
					0.0002317642070805,3.174816817069829e-08,2.3058719110264335e-07
 | 
				
			||||||
 | 
					0.0002279695550926,3.1424928539548144e-08,2.2668986526609113e-07
 | 
				
			||||||
 | 
					0.0002242281358436,3.1104729317697146e-08,2.228495045304229e-07
 | 
				
			||||||
 | 
					0.0002205393783222,3.078753835343166e-08,2.190654562751529e-07
 | 
				
			||||||
 | 
					0.0002169035545525,3.047333197100547e-08,2.1533790605165431e-07
 | 
				
			||||||
 | 
					0.0002133200561122,3.01620779209974e-08,2.1166616520930645e-07
 | 
				
			||||||
 | 
					0.0002097882786443,2.9853744125792176e-08,2.080495504306458e-07
 | 
				
			||||||
 | 
					0.0002063076230434,2.9548298767727423e-08,2.0448738489666716e-07
 | 
				
			||||||
 | 
					0.0002028776374913,2.9245712991289203e-08,2.009791389793126e-07
 | 
				
			||||||
 | 
					0.0001994977236946,2.8945955168147914e-08,1.975241389908885e-07
 | 
				
			||||||
 | 
					0.0001961672877059,2.8648993828553545e-08,1.9412171682473827e-07
 | 
				
			||||||
 | 
					0.0001929967738963,2.8368195292008612e-08,1.9088102669437356e-07
 | 
				
			||||||
 | 
					0.0001898709450753,2.8090002575266257e-08,1.8768789971552863e-07
 | 
				
			||||||
 | 
					0.0001867892958482,2.7814389032455363e-08,1.8454176486632323e-07
 | 
				
			||||||
 | 
					0.000183752636707,2.754134148447891e-08,1.8115002092564538e-07
 | 
				
			||||||
 | 
					0.0001807604032471,2.7270832946920812e-08,1.7781492252546064e-07
 | 
				
			||||||
 | 
					0.0001778120365192,2.7002836607760232e-08,1.745356369687972e-07
 | 
				
			||||||
 | 
					0.0001749069829579,2.673732582084065e-08,1.7131134159682263e-07
 | 
				
			||||||
 | 
					0.0001720467771106,2.6474316260529432e-08,1.6814325920632144e-07
 | 
				
			||||||
 | 
					0.0001692307716138,2.6213779758633963e-08,1.6503047175593728e-07
 | 
				
			||||||
 | 
					0.0001664583277393,2.5955688359138642e-08,1.619720751255672e-07
 | 
				
			||||||
 | 
					0.0001635796256227,2.5677295228672648e-08,1.588223280583729e-07
 | 
				
			||||||
 | 
					0.0001607481963598,2.540169810843596e-08,1.557306487644946e-07
 | 
				
			||||||
 | 
					0.0001579633073114,2.512886316325068e-08,1.526960267832303e-07
 | 
				
			||||||
 | 
					0.0001552255108883,2.4858770138402143e-08,1.4971869736122287e-07
 | 
				
			||||||
 | 
					0.000152534027681,2.4591385101783997e-08,1.467976093017761e-07
 | 
				
			||||||
 | 
					0.0001498880910245,2.432667443532368e-08,1.439317302908228e-07
 | 
				
			||||||
 | 
					0.0001472869464661,2.4064604800471338e-08,1.411200462508912e-07
 | 
				
			||||||
 | 
					0.0001447314108795,2.3805175801260087e-08,1.3836305172259211e-07
 | 
				
			||||||
 | 
					0.0001422206714078,2.3548353146553164e-08,1.3565967973526553e-07
 | 
				
			||||||
 | 
					0.0001397539300508,2.3294102880186107e-08,1.3300888438790536e-07
 | 
				
			||||||
 | 
					0.0001372700286953,2.3032485432340423e-08,1.3035230831596558e-07
 | 
				
			||||||
 | 
					0.0001348306664569,2.2773547798807564e-08,1.277485195296911e-07
 | 
				
			||||||
 | 
					0.0001324350333325,2.2517253805739807e-08,1.2505815113074245e-07
 | 
				
			||||||
 | 
					0.0001300835425363,2.2263580536243144e-08,1.2242454150816991e-07
 | 
				
			||||||
 | 
					0.0001277753479236,2.2012491805819457e-08,1.1984647647989558e-07
 | 
				
			||||||
 | 
					0.0001255096202792,2.1763951788812352e-08,1.1732276843747534e-07
 | 
				
			||||||
 | 
					0.0001232855464269,2.1517924960982367e-08,1.148522552473446e-07
 | 
				
			||||||
 | 
					0.0001211034718808,2.1274400813402842e-08,1.1243486085670634e-07
 | 
				
			||||||
 | 
					0.0001189625537742,2.1033343271785093e-08,1.100694052812587e-07
 | 
				
			||||||
 | 
					0.0001168619671686,2.0794716623616593e-08,1.0775473577456182e-07
 | 
				
			||||||
 | 
					0.0001149842862687,2.0591381044652174e-08,1.056582342233035e-07
 | 
				
			||||||
 | 
					0.0001131392424142,2.038998454906055e-08,1.0360354473279054e-07
 | 
				
			||||||
 | 
					0.0001113262252932,2.0190503422606346e-08,1.0158979943539652e-07
 | 
				
			||||||
 | 
					0.0001095446965516,1.9992914861970927e-08,9.961620365200192e-08
 | 
				
			||||||
 | 
					0.0001077940670993,1.9797195630879305e-08,9.768192356581421e-08
 | 
				
			||||||
 | 
					0.0001060737596438,1.9603322741072024e-08,9.578614349620901e-08
 | 
				
			||||||
 | 
					0.0001043832080373,1.9411273409584944e-08,9.392806512410292e-08
 | 
				
			||||||
 | 
					0.0001027223865858,1.922103688152168e-08,9.210738192714242e-08
 | 
				
			||||||
 | 
					0.0001010907257366,1.9032590330084783e-08,9.032330177845482e-08
 | 
				
			||||||
 | 
					9.948766769187398e-05,1.8845911172333032e-08,8.857505025129074e-08
 | 
				
			||||||
 | 
					9.792267601599324e-05,1.8663442661346744e-08,8.687075031773093e-08
 | 
				
			||||||
 | 
					9.638489299064336e-05,1.848276820506329e-08,8.550652733411691e-08
 | 
				
			||||||
 | 
					9.48738026587305e-05,1.830386814585904e-08,8.416598440502352e-08
 | 
				
			||||||
 | 
					9.338895072626004e-05,1.8126723701740663e-08,8.284871850980459e-08
 | 
				
			||||||
 | 
					9.192983962632808e-05,1.7951315790883015e-08,8.155428823884958e-08
 | 
				
			||||||
 | 
					9.049598195913348e-05,1.7777625631449783e-08,8.028226120215297e-08
 | 
				
			||||||
 | 
					8.908690001727453e-05,1.7605634715742614e-08,7.903221360818749e-08
 | 
				
			||||||
 | 
					8.77022482135352e-05,1.743532764682425e-08,7.780383887402493e-08
 | 
				
			||||||
 | 
					8.634156228069215e-05,1.7266686393258476e-08,7.659672513140668e-08
 | 
				
			||||||
 | 
					8.50043874741986e-05,1.7099693224424935e-08,7.541046895998541e-08
 | 
				
			||||||
 | 
					8.381694660770028e-05,1.6962933489525264e-08,7.43570471865261e-08
 | 
				
			||||||
 | 
					8.26484651987276e-05,1.682764479561346e-08,7.33204450340972e-08
 | 
				
			||||||
 | 
					8.149860566615124e-05,1.6693821025332528e-08,7.230036302225977e-08
 | 
				
			||||||
 | 
					8.036532369463753e-05,1.6561436760581683e-08,7.129498756488483e-08
 | 
				
			||||||
 | 
					7.924836834130927e-05,1.6430487594212236e-08,7.030409604146297e-08
 | 
				
			||||||
 | 
					7.814749266035204e-05,1.6300969571299207e-08,6.932746937742372e-08
 | 
				
			||||||
 | 
					7.706245353522453e-05,1.6172879193985398e-08,6.836489189528336e-08
 | 
				
			||||||
 | 
					7.599203524832233e-05,1.6046190191322708e-08,6.741528508795074e-08
 | 
				
			||||||
 | 
					7.493604414299442e-05,1.5920900877281144e-08,6.647847715560108e-08
 | 
				
			||||||
 | 
					7.389428911314724e-05,1.57970100612018e-08,6.555429856110159e-08
 | 
				
			||||||
 | 
					7.268136514077581e-05,1.5628904744452727e-08,6.447826980203191e-08
 | 
				
			||||||
 | 
					7.148784598320314e-05,1.5462487634551132e-08,6.341945575654982e-08
 | 
				
			||||||
		
		
			
  | 
@@ -1,97 +0,0 @@
 | 
				
			|||||||
,signal,ase,nli
 | 
					 | 
				
			||||||
0,0.0002869472910749756,3.829244288314411e-08,2.1570435023738975e-07
 | 
					 | 
				
			||||||
1,0.0002844264441819097,3.810807396068084e-08,2.1799950841473497e-07
 | 
					 | 
				
			||||||
2,0.00028192866252406385,3.792544000755193e-08,2.2023841125047751e-07
 | 
					 | 
				
			||||||
3,0.0002794537215642667,3.7744517714620316e-08,2.2242189941355056e-07
 | 
					 | 
				
			||||||
4,0.00027562432957345563,3.739256592350871e-08,2.2343448272115905e-07
 | 
					 | 
				
			||||||
5,0.0002718482755003939,3.7044482870002475e-08,2.2437826192962336e-07
 | 
					 | 
				
			||||||
6,0.00026812479793132313,3.670020704375223e-08,2.2525495466693408e-07
 | 
					 | 
				
			||||||
7,0.000264450700138397,3.635954085714981e-08,2.2606415187873477e-07
 | 
					 | 
				
			||||||
8,0.0002608253488030976,3.602242835595967e-08,2.2680748521505387e-07
 | 
					 | 
				
			||||||
9,0.0002569046888856947,3.564392097524325e-08,2.2718285844823122e-07
 | 
					 | 
				
			||||||
10,0.0002530414048172964,3.52696660940159e-08,2.2749429758474536e-07
 | 
					 | 
				
			||||||
11,0.0002492279873569917,3.489974200864255e-08,2.277374766527899e-07
 | 
					 | 
				
			||||||
12,0.00024546394589921574,3.453407358954537e-08,2.2791414400785136e-07
 | 
					 | 
				
			||||||
13,0.00024174879169001578,3.4172586853993816e-08,2.280260208417818e-07
 | 
					 | 
				
			||||||
14,0.00023798746912554602,3.3802283179520985e-08,2.2798420759778034e-07
 | 
					 | 
				
			||||||
15,0.00023427697848580554,3.343627022987542e-08,2.2788101592695744e-07
 | 
					 | 
				
			||||||
16,0.0002306167836320285,3.307447309241581e-08,2.2771816297650914e-07
 | 
					 | 
				
			||||||
17,0.00022700656967539738,3.2716831574363364e-08,2.274975560288182e-07
 | 
					 | 
				
			||||||
18,0.00022344579480967338,3.236327278261661e-08,2.2361822442592406e-07
 | 
					 | 
				
			||||||
19,0.00021953361935365365,3.195819964288877e-08,2.1939761734541424e-07
 | 
					 | 
				
			||||||
20,0.000215683131390894,3.155821693631402e-08,2.152494588710531e-07
 | 
					 | 
				
			||||||
21,0.0002118936126056039,3.116322947665684e-08,2.1117277567387026e-07
 | 
					 | 
				
			||||||
22,0.00020816423698459974,3.0773146233359933e-08,2.0716649124095414e-07
 | 
					 | 
				
			||||||
23,0.000204494186708796,3.0387877710694614e-08,2.0322954179937734e-07
 | 
					 | 
				
			||||||
24,0.0002011608152067422,3.0044038268833097e-08,1.9963693210325328e-07
 | 
					 | 
				
			||||||
25,0.0001978756946189507,2.9704204306604607e-08,1.9610141536963302e-07
 | 
					 | 
				
			||||||
26,0.00019463824873067792,2.9368307297032184e-08,1.9262221997374404e-07
 | 
					 | 
				
			||||||
27,0.00019144860669288407,2.903632861769827e-08,1.8919927457566036e-07
 | 
					 | 
				
			||||||
28,0.00018830616497929743,2.870820070744311e-08,1.8583178406705711e-07
 | 
					 | 
				
			||||||
29,0.0001852103256336822,2.838385708911634e-08,1.8251896218718027e-07
 | 
					 | 
				
			||||||
30,0.0001821604972098109,2.8063232252848876e-08,1.7926003240910756e-07
 | 
					 | 
				
			||||||
31,0.00017915618670059162,2.774625963676283e-08,1.76054318231953e-07
 | 
					 | 
				
			||||||
32,0.00017619680881745593,2.7432875871797347e-08,1.729010553429381e-07
 | 
					 | 
				
			||||||
33,0.0001732817839023698,2.712301856538676e-08,1.6979948820365403e-07
 | 
					 | 
				
			||||||
34,0.0001704966413678542,2.6828122477482957e-08,1.6683312331765736e-07
 | 
					 | 
				
			||||||
35,0.00016775189226190024,2.6536528664560742e-08,1.639139770351803e-07
 | 
					 | 
				
			||||||
36,0.00016504703499518105,2.624818226917535e-08,1.6104139135569604e-07
 | 
					 | 
				
			||||||
37,0.00016238266779776653,2.5963117448579666e-08,1.5795381794641793e-07
 | 
					 | 
				
			||||||
38,0.0001597582427278871,2.568127942199337e-08,1.5492098715709327e-07
 | 
					 | 
				
			||||||
39,0.0001571732182027887,2.5402614261982925e-08,1.5194201541883415e-07
 | 
					 | 
				
			||||||
40,0.00015462705891567335,2.5127068868391087e-08,1.4901603171959048e-07
 | 
					 | 
				
			||||||
41,0.00015212101646395513,2.4854550603641668e-08,1.4614388817380648e-07
 | 
					 | 
				
			||||||
42,0.00014965447757985992,2.4585009902449718e-08,1.4332463586635585e-07
 | 
					 | 
				
			||||||
43,0.0001472268380950584,2.4318397887399997e-08,1.4055734193945962e-07
 | 
					 | 
				
			||||||
44,0.0001447164668892332,2.4034551917480693e-08,1.377259000826997e-07
 | 
					 | 
				
			||||||
45,0.00014224784112376056,2.3753930444781328e-08,1.3494914625940223e-07
 | 
					 | 
				
			||||||
46,0.000139820283675003,2.3476479506890216e-08,1.3222606385781202e-07
 | 
					 | 
				
			||||||
47,0.00013743418748444287,2.3202247900619965e-08,1.295566531341862e-07
 | 
					 | 
				
			||||||
48,0.00013508884015386686,2.2931181973013504e-08,1.2693987096025158e-07
 | 
					 | 
				
			||||||
49,0.00013278354172498307,2.2663228905058608e-08,1.2437469442130953e-07
 | 
					 | 
				
			||||||
50,0.00013051760419724657,2.2398336706395863e-08,1.2186012017917007e-07
 | 
					 | 
				
			||||||
51,0.00012829168984638487,2.2136423459712534e-08,1.1939640981689728e-07
 | 
					 | 
				
			||||||
52,0.00012610506317956756,2.1877440279108582e-08,1.1698252030563078e-07
 | 
					 | 
				
			||||||
53,0.00012395700285919374,2.1621338937233993e-08,1.1461743054419825e-07
 | 
					 | 
				
			||||||
54,0.00012180241033650921,2.136015630373758e-08,1.1225922783040025e-07
 | 
					 | 
				
			||||||
55,0.0001196865090578088,2.11019103466444e-08,1.0994951537260489e-07
 | 
					 | 
				
			||||||
56,0.00011760857776205185,2.0846552296319304e-08,1.0757395097863843e-07
 | 
					 | 
				
			||||||
57,0.00011556891128259512,2.0594154864038522e-08,1.0524972555992818e-07
 | 
					 | 
				
			||||||
58,0.00011356676177304645,2.0344670536408355e-08,1.0297570549834491e-07
 | 
					 | 
				
			||||||
59,0.00011160139690545148,2.009805268169949e-08,1.007507830554809e-07
 | 
					 | 
				
			||||||
60,0.00010967209909252316,1.9854255584746143e-08,9.857387536569294e-08
 | 
					 | 
				
			||||||
61,0.00010777915187088834,1.961321154131787e-08,9.644480679617587e-08
 | 
					 | 
				
			||||||
62,0.00010592181397175025,1.9374877782865603e-08,9.43624842461164e-08
 | 
					 | 
				
			||||||
63,0.00010409936038609485,1.913921236065976e-08,9.232584080120623e-08
 | 
					 | 
				
			||||||
64,0.00010246447558376296,1.8936229484424864e-08,9.046927135292076e-08
 | 
					 | 
				
			||||||
65,0.00010085803630103994,1.873544193319646e-08,8.865067925960422e-08
 | 
					 | 
				
			||||||
66,9.927950010555374e-05,1.8536821682157304e-08,8.686925127148483e-08
 | 
					 | 
				
			||||||
67,9.772837346090753e-05,1.834034757300294e-08,8.512422533827403e-08
 | 
					 | 
				
			||||||
68,9.62041343011343e-05,1.8145993316507615e-08,8.341482250640209e-08
 | 
					 | 
				
			||||||
69,9.470627135912848e-05,1.7953733512786736e-08,8.174028142913557e-08
 | 
					 | 
				
			||||||
70,9.32342835979764e-05,1.776354374489084e-08,8.009985766376519e-08
 | 
					 | 
				
			||||||
71,9.178813743816069e-05,1.757538990695628e-08,7.849321446941075e-08
 | 
					 | 
				
			||||||
72,9.036733009485282e-05,1.7389250225057777e-08,7.691961625609573e-08
 | 
					 | 
				
			||||||
73,8.897136946428169e-05,1.7205104136353174e-08,7.537834446343352e-08
 | 
					 | 
				
			||||||
74,8.760740745801088e-05,1.7025340034280735e-08,7.38751341742058e-08
 | 
					 | 
				
			||||||
75,8.626710469266231e-05,1.6847609082084475e-08,7.274492099364066e-08
 | 
					 | 
				
			||||||
76,8.495000573672366e-05,1.6671897815367364e-08,7.16342744751107e-08
 | 
					 | 
				
			||||||
77,8.365569697520734e-05,1.6498202874185357e-08,7.054284583689086e-08
 | 
					 | 
				
			||||||
78,8.238374036673638e-05,1.6326516066391613e-08,6.94702656996508e-08
 | 
					 | 
				
			||||||
79,8.11337070649851e-05,1.615683240442047e-08,6.84161724378069e-08
 | 
					 | 
				
			||||||
80,7.990517700271111e-05,1.5989150837085435e-08,6.738021182875641e-08
 | 
					 | 
				
			||||||
81,7.869784230919362e-05,1.5823472723367315e-08,6.63621242598539e-08
 | 
					 | 
				
			||||||
82,7.751129541079501e-05,1.5659808141896922e-08,6.536156604375558e-08
 | 
					 | 
				
			||||||
83,7.634513730458697e-05,1.5498175122781168e-08,6.437820072038669e-08
 | 
					 | 
				
			||||||
84,7.530262080974513e-05,1.5364277079429572e-08,6.349909645089698e-08
 | 
					 | 
				
			||||||
85,7.427675504203511e-05,1.523236493234819e-08,6.263403294276124e-08
 | 
					 | 
				
			||||||
86,7.326723873728716e-05,1.510251249079146e-08,6.178275615432246e-08
 | 
					 | 
				
			||||||
87,7.227232864620995e-05,1.4974078108462424e-08,6.094379608687809e-08
 | 
					 | 
				
			||||||
88,7.1291797553153e-05,1.4847055996011248e-08,6.011696114034367e-08
 | 
					 | 
				
			||||||
89,7.032542203609039e-05,1.4721440784517874e-08,5.930206291361685e-08
 | 
					 | 
				
			||||||
90,6.937298231673965e-05,1.4597227547292096e-08,5.849891607818969e-08
 | 
					 | 
				
			||||||
91,6.843339696762385e-05,1.447443282270653e-08,5.7706608718023645e-08
 | 
					 | 
				
			||||||
92,6.750649045006057e-05,1.4353051811356354e-08,5.6924992809748396e-08
 | 
					 | 
				
			||||||
93,6.65920896785063e-05,1.4233080214004659e-08,5.615392239860827e-08
 | 
					 | 
				
			||||||
94,6.554258932109667e-05,1.407504972937325e-08,5.5268928972034444e-08
 | 
					 | 
				
			||||||
95,6.450957734109368e-05,1.3918655180382722e-08,5.439783940506079e-08
 | 
					 | 
				
			||||||
		
		
			
  | 
							
								
								
									
										38
									
								
								tests/data/test_science_utils_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								tests/data/test_science_utils_fiber_config.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "uid": "Span1",
 | 
				
			||||||
 | 
					  "params": {
 | 
				
			||||||
 | 
					    "length": 80,
 | 
				
			||||||
 | 
					    "loss_coef": 0.2,
 | 
				
			||||||
 | 
					    "length_units": "km",
 | 
				
			||||||
 | 
					    "att_in": 0,
 | 
				
			||||||
 | 
					    "con_in": 0.5,
 | 
				
			||||||
 | 
					    "con_out": 0.5,
 | 
				
			||||||
 | 
					    "type_variety": "SSMF",
 | 
				
			||||||
 | 
					    "dispersion": 0.0000167,
 | 
				
			||||||
 | 
					    "effective_area": 83e-12,
 | 
				
			||||||
 | 
					    "pmd_coef": 1.265e-15
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "operational": {
 | 
				
			||||||
 | 
					        "temperature": 283,
 | 
				
			||||||
 | 
					        "raman_pumps": [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 224.403e-3,
 | 
				
			||||||
 | 
					            "frequency": 205e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "power": 231.135e-3,
 | 
				
			||||||
 | 
					            "frequency": 201e12,
 | 
				
			||||||
 | 
					            "propagation_direction": "counterprop"
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					  "metadata": {
 | 
				
			||||||
 | 
					    "location": {
 | 
				
			||||||
 | 
					      "latitude": 1,
 | 
				
			||||||
 | 
					      "longitude": 0,
 | 
				
			||||||
 | 
					      "city": null,
 | 
				
			||||||
 | 
					      "region": ""
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_duplicate_eqpt_ila_reverse.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_duplicate_eqpt_ila_reverse.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_duplicate_link_reverse.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_duplicate_link_reverse.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_node_type.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_node_type.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_service.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_service.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_service_type.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_service_type.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_bad_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_bad_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_duplicate_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_duplicate_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_duplicate_node.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_duplicate_node.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_eqpt.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_link.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_link.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_link_header.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_link_header.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								tests/data/wrong_topo_node.xlsx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								tests/data/wrong_topo_node.xlsx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										37
									
								
								tests/invocation/logs_path_request
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								tests/invocation/logs_path_request
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
 | 
				
			||||||
 | 
					INFO     gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 0
 | 
				
			||||||
 | 
						Computing path from trx Lorient_KMA to trx Vannes_KBE
 | 
				
			||||||
 | 
						with path constraint: ['trx Lorient_KMA', 'trx Vannes_KBE']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 1
 | 
				
			||||||
 | 
						Computing path from trx Brest_KLA to trx Vannes_KBE
 | 
				
			||||||
 | 
						with path constraint: ['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 3
 | 
				
			||||||
 | 
						Computing path from trx Lannion_CAS to trx Rennes_STA
 | 
				
			||||||
 | 
						with path constraint: ['trx Lannion_CAS', 'trx Rennes_STA']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Lannion_CAS', 'roadm Rennes_STA']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 4
 | 
				
			||||||
 | 
						Computing path from trx Rennes_STA to trx Lannion_CAS
 | 
				
			||||||
 | 
						with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Rennes_STA', 'roadm Vannes_KBE', 'roadm Lorient_KMA', 'roadm Lannion_CAS']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 5
 | 
				
			||||||
 | 
						Computing path from trx Rennes_STA to trx Lannion_CAS
 | 
				
			||||||
 | 
						with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Rennes_STA', 'roadm Lannion_CAS']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 7 | 6
 | 
				
			||||||
 | 
						Computing path from trx Lannion_CAS to trx Lorient_KMA
 | 
				
			||||||
 | 
						with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 7b
 | 
				
			||||||
 | 
						Computing path from trx Lannion_CAS to trx Lorient_KMA
 | 
				
			||||||
 | 
						with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
 | 
				
			||||||
							
								
								
									
										13
									
								
								tests/invocation/logs_path_requests_run_CD_PMD_PDL_missing
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tests/invocation/logs_path_requests_run_CD_PMD_PDL_missing
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
 | 
				
			||||||
 | 
					INFO     gnpy.topology.request:request.py 
 | 
				
			||||||
 | 
						request 0
 | 
				
			||||||
 | 
						Computing path from trx Abilene to trx Albany
 | 
				
			||||||
 | 
						with path constraint: ['trx Abilene', 'trx Albany']
 | 
				
			||||||
 | 
						Computed path (roadms):['roadm Abilene', 'roadm Dallas', 'roadm Little_Rock', 'roadm Memphis', 'roadm Nashville', 'roadm Louisville', 'roadm Cincinnati', 'roadm Columbus', 'roadm Cleveland', 'roadm Buffalo', 'roadm Rochester', 'roadm Syracuse', 'roadm Albany']
 | 
				
			||||||
 | 
					WARNING  gnpy.topology.request:request.py 	Warning! Request 0 computed path from trx Abilene to trx Albany does not pass with mode 3
 | 
				
			||||||
 | 
						computed SNR in 0.1nm = 14.44
 | 
				
			||||||
 | 
						PDL penalty not evaluated
 | 
				
			||||||
 | 
						CD penalty not evaluated
 | 
				
			||||||
 | 
						PMD penalty not evaluated
 | 
				
			||||||
 | 
						required osnr = 18
 | 
				
			||||||
 | 
						system margin = 2
 | 
				
			||||||
							
								
								
									
										307
									
								
								tests/invocation/logs_power_sweep_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								tests/invocation/logs_power_sweep_example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,307 @@
 | 
				
			|||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py source = 'brest'
 | 
				
			||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'rennes'
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Lannion_CAS to Stbrieuc
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Lannion_CAS to Morlaix
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Brest_KLA to Morlaix
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Loudeac
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node west edfa in Lannion_CAS to Corlay
 | 
				
			||||||
 | 
						is above user specified amplifier test
 | 
				
			||||||
 | 
						max flat gain: 25dB ; required gain: 28.0dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Vannes_KBE to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Quimper to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Brest_KLA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Vannes_KBE to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Vannes_KBE to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Ploermel to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Rennes_STA to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Rennes_STA to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Stbrieuc to Rennes_STA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lannion_CAS to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Rennes_STA to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Vannes_KBE to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Brest_KLA to Morlaix
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Brest_KLA to Quimper
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Quimper to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in a to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in b to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in a to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in b to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in a to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in b to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in c to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in a to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in d to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in c to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in d to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in d to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in e to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in e to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in d to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in e to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in g to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in b to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in h to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in g to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in e to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in g to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in h to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in h to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in h to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in g to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.78 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										307
									
								
								tests/invocation/logs_transmission_saturated
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								tests/invocation/logs_transmission_saturated
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,307 @@
 | 
				
			|||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py source = 'lannion'
 | 
				
			||||||
 | 
					INFO     gnpy.tools.cli_examples:cli_examples.py destination = 'lorient'
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Lannion_CAS to Stbrieuc
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Lannion_CAS to Morlaix
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Brest_KLA to Morlaix
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Loudeac
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node west edfa in Lannion_CAS to Corlay
 | 
				
			||||||
 | 
						is above user specified amplifier test
 | 
				
			||||||
 | 
						max flat gain: 25dB ; required gain: 28.0dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Vannes_KBE to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Lorient_KMA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Quimper to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Brest_KLA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Vannes_KBE to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Vannes_KBE to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Ploermel to Vannes_KBE
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Rennes_STA to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Rennes_STA to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Stbrieuc to Rennes_STA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lannion_CAS to Stbrieuc
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Rennes_STA to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Vannes_KBE to Ploermel
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Brest_KLA to Morlaix
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: effective gain in Node east edfa in Brest_KLA to Quimper
 | 
				
			||||||
 | 
						is above user specified amplifier std_low_gain
 | 
				
			||||||
 | 
						max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in Quimper to Lorient_KMA
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in Lorient_KMA to Quimper
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in a to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in b to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in a to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in b to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in a to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in b to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in c to a
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in a to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in d to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in c to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in d to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in d to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in e to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in e to d
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in d to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in e to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in g to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to c
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in c to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to b
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in b to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in f to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in h to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in g to e
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in e to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in g to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in h to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in h to f
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in f to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node east edfa in h to g
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARNING  gnpy.core.network:network.py 
 | 
				
			||||||
 | 
						WARNING: target gain and power in node west edfa in g to h
 | 
				
			||||||
 | 
						is beyond all available amplifiers capabilities and/or extended_gain_range:
 | 
				
			||||||
 | 
						a power reduction of -1.82 is applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,9 +14,12 @@ Transceiver trx_Stockholm
 | 
				
			|||||||
  OSNR ASE (signal bw, dB):  30.98
 | 
					  OSNR ASE (signal bw, dB):  30.98
 | 
				
			||||||
  CD (ps/nm):                0.00
 | 
					  CD (ps/nm):                0.00
 | 
				
			||||||
  PMD (ps):                  0.00
 | 
					  PMD (ps):                  0.00
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              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
 | 
				
			||||||
@@ -28,7 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -37,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
 | 
				
			||||||
@@ -49,7 +53,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  actual pch out (dBm):   2.01
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -58,7 +62,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
 | 
				
			||||||
@@ -66,15 +71,16 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
 | 
				
			|||||||
  noise figure (dB):      12.59
 | 
					  noise figure (dB):      12.59
 | 
				
			||||||
  (including att_in)
 | 
					  (including att_in)
 | 
				
			||||||
  pad att_in (dB):        0.00
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
  Power In (dBm):         5.53
 | 
					  Power In (dBm):         5.52
 | 
				
			||||||
  Power Out (dBm):        21.87
 | 
					  Power Out (dBm):        21.86
 | 
				
			||||||
  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
 | 
					  actual pch out (dBm):   2.03
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -86,7 +92,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -95,7 +101,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
 | 
				
			||||||
@@ -107,11 +114,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
				
			|||||||
  Power Out (dBm):        21.83
 | 
					  Power Out (dBm):        21.83
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -123,7 +131,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -132,7 +140,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
 | 
				
			||||||
@@ -141,14 +150,15 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
 | 
				
			|||||||
  (including att_in)
 | 
					  (including att_in)
 | 
				
			||||||
  pad att_in (dB):        0.00
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
  Power In (dBm):         -4.97
 | 
					  Power In (dBm):         -4.97
 | 
				
			||||||
  Power Out (dBm):        21.86
 | 
					  Power Out (dBm):        21.87
 | 
				
			||||||
  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
 | 
					  actual pch out (dBm):   2.05
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -160,7 +170,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -169,7 +179,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
 | 
				
			||||||
@@ -181,11 +192,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -197,7 +209,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -206,7 +218,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
 | 
				
			||||||
@@ -218,21 +231,24 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  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.89
 | 
				
			||||||
  GSNR (signal bw, dB):      14.88
 | 
					  GSNR (signal bw, dB):      14.86
 | 
				
			||||||
  OSNR ASE (0.1nm, dB):      21.20
 | 
					  OSNR ASE (0.1nm, dB):      21.20
 | 
				
			||||||
  OSNR ASE (signal bw, dB):  17.18
 | 
					  OSNR ASE (signal bw, dB):  17.18
 | 
				
			||||||
  CD (ps/nm):                8350.42
 | 
					  CD (ps/nm):                8350.42
 | 
				
			||||||
  PMD (ps):                  0.89
 | 
					  PMD (ps):                  7.99
 | 
				
			||||||
 | 
					  PDL (dB):                  3.74
 | 
				
			||||||
 | 
					  Latency (ms):              2.45
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Transmission result for input power = 2.00 dBm:
 | 
					Transmission result for input power = 2.00 dBm:
 | 
				
			||||||
  Final GSNR (0.1 nm): [1;36;40m18.90 dB[0m
 | 
					  Final GSNR (0.1 nm): [1;36;40m18.89 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(No source node specified: picked trx_Stockholm)
 | 
					(No source node specified: picked trx_Stockholm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,9 +14,12 @@ Transceiver trx_Stockholm
 | 
				
			|||||||
  OSNR ASE (signal bw, dB):  30.98
 | 
					  OSNR ASE (signal bw, dB):  30.98
 | 
				
			||||||
  CD (ps/nm):                0.00
 | 
					  CD (ps/nm):                0.00
 | 
				
			||||||
  PMD (ps):                  0.00
 | 
					  PMD (ps):                  0.00
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              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
 | 
				
			||||||
@@ -28,7 +31,7 @@ Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -37,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
 | 
				
			||||||
@@ -49,7 +53,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  actual pch out (dBm):   2.01
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -58,23 +62,25 @@ 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
 | 
				
			||||||
  (before att_in and before output VOA)
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
  noise figure (dB):      11.44
 | 
					  noise figure (dB):      11.43
 | 
				
			||||||
  (including att_in)
 | 
					  (including att_in)
 | 
				
			||||||
  pad att_in (dB):        0.00
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
  Power In (dBm):         5.53
 | 
					  Power In (dBm):         5.52
 | 
				
			||||||
  Power Out (dBm):        21.86
 | 
					  Power Out (dBm):        21.85
 | 
				
			||||||
  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
 | 
					  actual pch out (dBm):   2.03
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -86,7 +92,7 @@ Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -95,7 +101,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
 | 
				
			||||||
@@ -107,11 +114,12 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
 | 
				
			|||||||
  Power Out (dBm):        21.83
 | 
					  Power Out (dBm):        21.83
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -123,7 +131,7 @@ Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -132,7 +140,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
 | 
				
			||||||
@@ -141,14 +150,15 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
 | 
				
			|||||||
  (including att_in)
 | 
					  (including att_in)
 | 
				
			||||||
  pad att_in (dB):        0.00
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
  Power In (dBm):         -4.97
 | 
					  Power In (dBm):         -4.97
 | 
				
			||||||
  Power Out (dBm):        21.86
 | 
					  Power Out (dBm):        21.87
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -160,7 +170,7 @@ Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -169,7 +179,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
 | 
				
			||||||
@@ -181,11 +192,12 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -197,7 +209,7 @@ Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
 | 
				
			|||||||
  Power Out (dBm):        21.82
 | 
					  Power Out (dBm):        21.82
 | 
				
			||||||
  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
 | 
					  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
 | 
				
			||||||
@@ -206,7 +218,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
 | 
				
			||||||
@@ -218,21 +231,24 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
 | 
				
			|||||||
  Power Out (dBm):        21.84
 | 
					  Power Out (dBm):        21.84
 | 
				
			||||||
  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
 | 
					  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.25
 | 
				
			||||||
  GSNR (signal bw, dB):      15.24
 | 
					  GSNR (signal bw, dB):      15.23
 | 
				
			||||||
  OSNR ASE (0.1nm, dB):      21.84
 | 
					  OSNR ASE (0.1nm, dB):      21.84
 | 
				
			||||||
  OSNR ASE (signal bw, dB):  17.82
 | 
					  OSNR ASE (signal bw, dB):  17.82
 | 
				
			||||||
  CD (ps/nm):                8350.42
 | 
					  CD (ps/nm):                8350.42
 | 
				
			||||||
  PMD (ps):                  0.89
 | 
					  PMD (ps):                  7.99
 | 
				
			||||||
 | 
					  PDL (dB):                  3.74
 | 
				
			||||||
 | 
					  Latency (ms):              2.45
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Transmission result for input power = 2.00 dBm:
 | 
					Transmission result for input power = 2.00 dBm:
 | 
				
			||||||
  Final GSNR (0.1 nm): [1;36;40m19.27 dB[0m
 | 
					  Final GSNR (0.1 nm): [1;36;40m19.25 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(No source node specified: picked trx_Stockholm)
 | 
					(No source node specified: picked trx_Stockholm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,48 +106,13 @@
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
[1;34;40mComputing all paths with constraints[0m
 | 
					[1;34;40mComputing all paths with constraints[0m
 | 
				
			||||||
[1;34;40mPropagating on selected path[0m
 | 
					[1;34;40mPropagating on selected path[0m
 | 
				
			||||||
request 0
 | 
					 | 
				
			||||||
Computing path from trx Lorient_KMA to trx Vannes_KBE
 | 
					 | 
				
			||||||
with path constraint: ['trx Lorient_KMA', 'trx Vannes_KBE']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 1
 | 
					 | 
				
			||||||
Computing path from trx Brest_KLA to trx Vannes_KBE
 | 
					 | 
				
			||||||
with path constraint: ['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 3
 | 
					 | 
				
			||||||
Computing path from trx Lannion_CAS to trx Rennes_STA
 | 
					 | 
				
			||||||
with path constraint: ['trx Lannion_CAS', 'trx Rennes_STA']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Rennes_STA']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 4
 | 
					 | 
				
			||||||
Computing path from trx Rennes_STA to trx Lannion_CAS
 | 
					 | 
				
			||||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Vannes_KBE', 'roadm Lorient_KMA', 'roadm Lannion_CAS']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 5
 | 
					 | 
				
			||||||
Computing path from trx Rennes_STA to trx Lannion_CAS
 | 
					 | 
				
			||||||
with path constraint: ['trx Rennes_STA', 'trx Lannion_CAS']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Rennes_STA', 'roadm Lannion_CAS']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 7 | 6
 | 
					 | 
				
			||||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
 | 
					 | 
				
			||||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
request 7b
 | 
					 | 
				
			||||||
Computing path from trx Lannion_CAS to trx Lorient_KMA
 | 
					 | 
				
			||||||
with path constraint: ['trx Lannion_CAS', 'trx Lorient_KMA']
 | 
					 | 
				
			||||||
Computed path (roadms):['roadm Lannion_CAS', 'roadm Lorient_KMA']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[1;34;40mResult summary[0m
 | 
					[1;34;40mResult summary[0m
 | 
				
			||||||
req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason 
 | 
					req id   demand                                GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason 
 | 
				
			||||||
0       trx Lorient_KMA to trx Vannes_KBE :             24.83                    28.92                      14                     mode 1                   100.0                      1                     (-284,4)        
 | 
					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.74                    21.82                      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.19                    26.28                      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.3                    27.53                      17                     mode 2                    20.0                      1                   ([-274],[6])      
 | 
				
			||||||
7 | 6   trx Lannion_CAS to trx Lorient_KMA :            19.52                    23.61                      14                     mode 1                   700.0                      7                    (-224,28)        
 | 
					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])      
 | 
				
			||||||
[1;33;40mResult summary shows mean GSNR and OSNR (average over all channels)[0m
 | 
					[1;33;40mResult summary shows mean GSNR and OSNR (average over all channels)[0m
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								tests/invocation/path_requests_run_CD_PMD_PDL_missing
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								tests/invocation/path_requests_run_CD_PMD_PDL_missing
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					[1;34;40mList of disjunctions[0m
 | 
				
			||||||
 | 
					[]
 | 
				
			||||||
 | 
					[1;34;40mAggregating similar requests[0m
 | 
				
			||||||
 | 
					[1;34;40mThe following services have been requested:[0m
 | 
				
			||||||
 | 
					[PathRequest 0
 | 
				
			||||||
 | 
						source: 	trx Abilene
 | 
				
			||||||
 | 
						destination:	trx Albany
 | 
				
			||||||
 | 
						trx type:	Voyager
 | 
				
			||||||
 | 
						trx mode:	mode 3
 | 
				
			||||||
 | 
						baud_rate:	44.0 Gbaud
 | 
				
			||||||
 | 
						bit_rate:	300.0 Gb/s
 | 
				
			||||||
 | 
						spacing:	62.50000000000001 GHz
 | 
				
			||||||
 | 
						power:  	0.0 dBm
 | 
				
			||||||
 | 
						nb channels: 	76
 | 
				
			||||||
 | 
						path_bandwidth: 	100.0 Gbit/s
 | 
				
			||||||
 | 
						nodes-list:	[]
 | 
				
			||||||
 | 
						loose-list:	[]
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					[1;34;40mComputing all paths with constraints[0m
 | 
				
			||||||
 | 
					[1;34;40mPropagating on selected path[0m
 | 
				
			||||||
 | 
					[1;34;40mResult summary[0m
 | 
				
			||||||
 | 
					req id   demand                       GSNR@bandwidth A-Z (Z-A)   GSNR@0.1nm A-Z (Z-A)        Receiver minOSNR               mode                    Gbit/s              nb of tsp pairs      N,M or blocking reason 
 | 
				
			||||||
 | 
					0       trx Abilene to trx Albany :             9.04                     14.5                      -                      mode 3                   100.0                      -                MODE_NOT_FEASIBLE    
 | 
				
			||||||
 | 
					[1;33;40mResult summary shows mean GSNR and OSNR (average over all channels)[0m
 | 
				
			||||||
							
								
								
									
										154
									
								
								tests/invocation/power_sweep_example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								tests/invocation/power_sweep_example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
				
			|||||||
 | 
					There are 95 channels propagating
 | 
				
			||||||
 | 
					Power mode is set to True
 | 
				
			||||||
 | 
					=> it can be modified in eqpt_config.json - Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are 4 fiber spans over 200 km between trx Brest_KLA and trx Rennes_STA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now propagating between trx Brest_KLA and trx Rennes_STA:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-3.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          23.73
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.65
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      23.99
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  19.91
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-2.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.01
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.93
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      24.37
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  20.29
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-2.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.25
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.17
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      24.74
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  20.66
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-1.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.44
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.36
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      25.10
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  21.01
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-1.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.57
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.49
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      25.44
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  21.36
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-0.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.63
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.55
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      25.77
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  21.69
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m-0.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.60
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.52
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.09
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.00
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m0.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.42
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.34
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.29
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.20
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m1.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.16
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      20.08
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.47
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.39
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m1.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.02
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.93
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.55
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.47
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m2.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.02
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.93
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.55
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.47
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m2.50 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.02
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.93
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.55
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.47
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m3.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver trx Rennes_STA
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          24.02
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      19.93
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      26.55
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  22.47
 | 
				
			||||||
 | 
					  CD (ps/nm):                3340.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.57
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.98
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(Invalid source node 'brest' replaced with trx Brest_KLA)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(Invalid destination node 'rennes' replaced with trx Rennes_STA)
 | 
				
			||||||
							
								
								
									
										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
 | 
				
			||||||
 | 
					  Latency (ms):              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
 | 
				
			||||||
 | 
					  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
 | 
				
			||||||
 | 
					  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.53
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      23.89
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  19.81
 | 
				
			||||||
 | 
					  CD (ps/nm):                2171.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.46
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Transmission result for input power = 0.00 dBm:
 | 
				
			||||||
 | 
					  Final GSNR (0.1 nm): [1;36;40m23.61 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(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
 | 
				
			||||||
 | 
					  Latency (ms):              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
 | 
				
			||||||
 | 
					  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
 | 
				
			||||||
 | 
					  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.66, mode_2: 23.81
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      mode_1: 19.58, mode_2: 16.72
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      mode_1: 23.91, mode_2: 23.87
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  mode_1: 19.83, mode_2: 16.78
 | 
				
			||||||
 | 
					  CD (ps/nm):                2171.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.46
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Transmission result for input power = 0.00 dBm:
 | 
				
			||||||
 | 
					  Final GSNR (0.1 nm): [1;36;40m23.72 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The GSNR per channel at the end of the line is:
 | 
				
			||||||
 | 
					Ch. #   Channel frequency (THz)       Channel power (dBm)    OSNR ASE (signal bw, dB)     SNR NLI (signal bw, dB)        GSNR (signal bw, dB)
 | 
				
			||||||
 | 
					    1                 191.40000                    -20.04                       19.85                       33.52                       19.66
 | 
				
			||||||
 | 
					    2                 191.45000                    -20.04                       19.85                       32.93                       19.64
 | 
				
			||||||
 | 
					    3                 191.50000                    -20.04                       19.84                       32.67                       19.62
 | 
				
			||||||
 | 
					    4                 191.55000                    -20.04                       19.84                       32.50                       19.61
 | 
				
			||||||
 | 
					    5                 191.60000                    -20.04                       19.84                       32.39                       19.61
 | 
				
			||||||
 | 
					    6                 191.65000                    -20.04                       19.84                       32.30                       19.60
 | 
				
			||||||
 | 
					    7                 191.70000                    -20.04                       19.84                       32.22                       19.60
 | 
				
			||||||
 | 
					    8                 191.75000                    -20.04                       19.84                       32.16                       19.59
 | 
				
			||||||
 | 
					    9                 191.80000                    -20.04                       19.84                       32.11                       19.59
 | 
				
			||||||
 | 
					   10                 191.85000                    -20.04                       19.84                       32.07                       19.59
 | 
				
			||||||
 | 
					   11                 191.90000                    -20.04                       19.84                       32.04                       19.58
 | 
				
			||||||
 | 
					   12                 191.95000                    -20.04                       19.84                       32.00                       19.58
 | 
				
			||||||
 | 
					   13                 192.00000                    -20.04                       19.83                       31.98                       19.58
 | 
				
			||||||
 | 
					   14                 192.05000                    -20.04                       19.83                       31.95                       19.57
 | 
				
			||||||
 | 
					   15                 192.10000                    -20.04                       19.83                       31.93                       19.57
 | 
				
			||||||
 | 
					   16                 192.15000                    -20.04                       19.83                       31.91                       19.57
 | 
				
			||||||
 | 
					   17                 192.20000                    -20.04                       19.83                       31.90                       19.57
 | 
				
			||||||
 | 
					   18                 192.25000                    -20.04                       19.83                       31.88                       19.57
 | 
				
			||||||
 | 
					   19                 192.30000                    -20.04                       19.83                       31.87                       19.56
 | 
				
			||||||
 | 
					   20                 192.35000                    -20.04                       19.83                       31.87                       19.56
 | 
				
			||||||
 | 
					   21                 192.40000                    -20.04                       19.83                       31.86                       19.56
 | 
				
			||||||
 | 
					   22                 192.45000                    -20.04                       19.82                       31.86                       19.56
 | 
				
			||||||
 | 
					   23                 192.50000                    -20.04                       19.82                       31.86                       19.56
 | 
				
			||||||
 | 
					   24                 192.55000                    -20.04                       19.82                       31.86                       19.56
 | 
				
			||||||
 | 
					   25                 192.60000                    -20.04                       19.82                       31.87                       19.56
 | 
				
			||||||
 | 
					   26                 192.65000                    -20.04                       19.82                       31.88                       19.56
 | 
				
			||||||
 | 
					   27                 192.70000                    -20.04                       19.82                       31.89                       19.56
 | 
				
			||||||
 | 
					   28                 192.75000                    -20.04                       19.82                       31.91                       19.56
 | 
				
			||||||
 | 
					   29                 192.80000                    -20.04                       19.82                       31.93                       19.56
 | 
				
			||||||
 | 
					   30                 192.85000                    -20.04                       19.82                       31.97                       19.56
 | 
				
			||||||
 | 
					   31                 192.90000                    -20.04                       19.82                       32.01                       19.56
 | 
				
			||||||
 | 
					   32                 192.95000                    -20.04                       19.81                       32.07                       19.56
 | 
				
			||||||
 | 
					   33                 193.00000                    -20.04                       19.81                       32.16                       19.57
 | 
				
			||||||
 | 
					   34                 193.05000                    -20.04                       19.81                       32.31                       19.57
 | 
				
			||||||
 | 
					   35                 193.10000                    -20.04                       19.81                       32.65                       19.59
 | 
				
			||||||
 | 
					   36                 193.16250                    -20.09                       16.80                       33.73                       16.71
 | 
				
			||||||
 | 
					   37                 193.23750                    -20.09                       16.80                       34.22                       16.72
 | 
				
			||||||
 | 
					   38                 193.31250                    -20.09                       16.80                       34.47                       16.72
 | 
				
			||||||
 | 
					   39                 193.38750                    -20.09                       16.79                       34.63                       16.72
 | 
				
			||||||
 | 
					   40                 193.46250                    -20.09                       16.79                       34.75                       16.72
 | 
				
			||||||
 | 
					   41                 193.53750                    -20.09                       16.79                       34.84                       16.72
 | 
				
			||||||
 | 
					   42                 193.61250                    -20.09                       16.79                       34.92                       16.72
 | 
				
			||||||
 | 
					   43                 193.68750                    -20.09                       16.79                       34.99                       16.72
 | 
				
			||||||
 | 
					   44                 193.76250                    -20.09                       16.79                       35.04                       16.72
 | 
				
			||||||
 | 
					   45                 193.83750                    -20.09                       16.78                       35.10                       16.72
 | 
				
			||||||
 | 
					   46                 193.91250                    -20.09                       16.78                       35.15                       16.72
 | 
				
			||||||
 | 
					   47                 193.98750                    -20.09                       16.78                       35.19                       16.72
 | 
				
			||||||
 | 
					   48                 194.06250                    -20.09                       16.78                       35.24                       16.72
 | 
				
			||||||
 | 
					   49                 194.13750                    -20.09                       16.78                       35.28                       16.72
 | 
				
			||||||
 | 
					   50                 194.21250                    -20.09                       16.78                       35.33                       16.72
 | 
				
			||||||
 | 
					   51                 194.28750                    -20.09                       16.78                       35.37                       16.72
 | 
				
			||||||
 | 
					   52                 194.36250                    -20.09                       16.77                       35.42                       16.72
 | 
				
			||||||
 | 
					   53                 194.43750                    -20.09                       16.77                       35.47                       16.71
 | 
				
			||||||
 | 
					   54                 194.51250                    -20.09                       16.77                       35.53                       16.71
 | 
				
			||||||
 | 
					   55                 194.58750                    -20.09                       16.77                       35.59                       16.71
 | 
				
			||||||
 | 
					   56                 194.66250                    -20.09                       16.77                       35.67                       16.71
 | 
				
			||||||
 | 
					   57                 194.73750                    -20.09                       16.77                       35.77                       16.71
 | 
				
			||||||
 | 
					   58                 194.81250                    -20.09                       16.76                       35.90                       16.71
 | 
				
			||||||
 | 
					   59                 194.88750                    -20.09                       16.76                       36.11                       16.71
 | 
				
			||||||
 | 
					   60                 194.96250                    -20.09                       16.76                       36.58                       16.72
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No source node specified: picked trx Lannion_CAS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No destination node specified: picked trx Lorient_KMA)
 | 
				
			||||||
							
								
								
									
										437
									
								
								tests/invocation/transmission_long_pow
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										437
									
								
								tests/invocation/transmission_long_pow
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,437 @@
 | 
				
			|||||||
 | 
					User input for spectrum used for propagation instead of SI
 | 
				
			||||||
 | 
					There are 60 channels propagating
 | 
				
			||||||
 | 
					Power mode is set to True
 | 
				
			||||||
 | 
					=> it can be modified in eqpt_config.json - Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now propagating between Site_A and Site_B:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver Site_A
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      mode_1: 40.00, mode_2: 40.00
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  mode_1: 35.92, mode_2: 32.91
 | 
				
			||||||
 | 
					  CD (ps/nm):                0.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.00
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.00
 | 
				
			||||||
 | 
					Roadm roadm Site A
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
				
			||||||
 | 
					Edfa booster A
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -2.22
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.79
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span1
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
				
			||||||
 | 
					Edfa Edfa1
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.80
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.80
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span2
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
				
			||||||
 | 
					Edfa Edfa2
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.81
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.81
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span3
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
				
			||||||
 | 
					Edfa Edfa3
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.82
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.82
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span4
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.96, mode_2: -15.94
 | 
				
			||||||
 | 
					Edfa Edfa4
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.83
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.84
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.07
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span5
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.95, mode_2: -15.93
 | 
				
			||||||
 | 
					Edfa Edfa5
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.84
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.85
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.05, mode_2: 0.08
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site C
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
				
			||||||
 | 
					Edfa booster C
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -2.22
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.79
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span6
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
				
			||||||
 | 
					Edfa Edfa6
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.80
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.80
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span7
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
				
			||||||
 | 
					Edfa Edfa7
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.81
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.81
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span8
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
				
			||||||
 | 
					Edfa Edfa8
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.82
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.82
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span9
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.96, mode_2: -15.94
 | 
				
			||||||
 | 
					Edfa Edfa9
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.83
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.83
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 0.07
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span10
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.95, mode_2: -15.93
 | 
				
			||||||
 | 
					Edfa Edfa10
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.84
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.85
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.05, mode_2: 0.08
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site D
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
				
			||||||
 | 
					Edfa booster D
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -2.22
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.79
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span11
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
				
			||||||
 | 
					Edfa Edfa11
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.80
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.80
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span12
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
				
			||||||
 | 
					Edfa Edfa12
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.81
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.81
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site E
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
				
			||||||
 | 
					Edfa booster E
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -2.22
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.79
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 0.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span13
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -15.98
 | 
				
			||||||
 | 
					Edfa Edfa13
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.80
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.80
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 0.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span14
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -15.97
 | 
				
			||||||
 | 
					Edfa Edfa14
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.81
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.81
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span15
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -15.96
 | 
				
			||||||
 | 
					Edfa Edfa15
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         1.82
 | 
				
			||||||
 | 
					  Power Out (dBm):        17.82
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 0.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site B
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -20.00
 | 
				
			||||||
 | 
					Transceiver Site_B
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          mode_1: 18.11, mode_2: 19.18
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      mode_1: 14.02, mode_2: 12.09
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      mode_1: 19.69, mode_2: 19.62
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  mode_1: 15.61, mode_2: 12.53
 | 
				
			||||||
 | 
					  CD (ps/nm):                20040.00
 | 
				
			||||||
 | 
					  PMD (ps):                  1.39
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              5.88
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Transmission result for input power = 0.00 dBm:
 | 
				
			||||||
 | 
					  Final GSNR (0.1 nm): [1;36;40m18.56 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No source node specified: picked Site_A)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No destination node specified: picked Site_B)
 | 
				
			||||||
							
								
								
									
										437
									
								
								tests/invocation/transmission_long_psd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										437
									
								
								tests/invocation/transmission_long_psd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,437 @@
 | 
				
			|||||||
 | 
					User input for spectrum used for propagation instead of SI
 | 
				
			||||||
 | 
					There are 60 channels propagating
 | 
				
			||||||
 | 
					Power mode is set to True
 | 
				
			||||||
 | 
					=> it can be modified in eqpt_config.json - Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are 15 fiber spans over 1200 km between Site_A and Site_B
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Now propagating between Site_A and Site_B:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Propagating with input power = [1;36;40m0.00 dBm[0m:
 | 
				
			||||||
 | 
					Transceiver Site_A
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          mode_1: 40.00, mode_2: 40.00
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      mode_1: 35.92, mode_2: 32.91
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      mode_1: 40.00, mode_2: 40.00
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  mode_1: 35.92, mode_2: 32.91
 | 
				
			||||||
 | 
					  CD (ps/nm):                0.00
 | 
				
			||||||
 | 
					  PMD (ps):                  0.00
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              0.00
 | 
				
			||||||
 | 
					Roadm roadm Site A
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
				
			||||||
 | 
					Edfa booster A
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -0.71
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.30
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span1
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
				
			||||||
 | 
					Edfa Edfa1
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.31
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.31
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span2
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
				
			||||||
 | 
					Edfa Edfa2
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.32
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.32
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span3
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.95
 | 
				
			||||||
 | 
					Edfa Edfa3
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.33
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.33
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span4
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.96, mode_2: -12.94
 | 
				
			||||||
 | 
					Edfa Edfa4
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.34
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.34
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.05, mode_2: 3.06
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span5
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.95, mode_2: -12.93
 | 
				
			||||||
 | 
					Edfa Edfa5
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.35
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.35
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.06, mode_2: 3.07
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site C
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
				
			||||||
 | 
					Edfa booster C
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -0.71
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.30
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span6
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
				
			||||||
 | 
					Edfa Edfa6
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.31
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.31
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span7
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
				
			||||||
 | 
					Edfa Edfa7
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.32
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.32
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span8
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.95
 | 
				
			||||||
 | 
					Edfa Edfa8
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.33
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.33
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span9
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.96, mode_2: -12.94
 | 
				
			||||||
 | 
					Edfa Edfa9
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.34
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.34
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.05, mode_2: 3.06
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span10
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.95, mode_2: -12.93
 | 
				
			||||||
 | 
					Edfa Edfa10
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.35
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.35
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.06, mode_2: 3.07
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site D
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
				
			||||||
 | 
					Edfa booster D
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -0.71
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.30
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span11
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
				
			||||||
 | 
					Edfa Edfa11
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.31
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.31
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span12
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
				
			||||||
 | 
					Edfa Edfa12
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.32
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.32
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site E
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
				
			||||||
 | 
					Edfa booster E
 | 
				
			||||||
 | 
					  type_variety:           std_medium_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     20.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      6.58
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         -0.71
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.30
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.01, mode_2: 3.02
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span13
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.99, mode_2: -12.98
 | 
				
			||||||
 | 
					Edfa Edfa13
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.31
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.31
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.02, mode_2: 3.03
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span14
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.98, mode_2: -12.97
 | 
				
			||||||
 | 
					Edfa Edfa14
 | 
				
			||||||
 | 
					  type_variety:           test_fixed_gain
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      9.00
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        4.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.32
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.32
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.03, mode_2: 3.04
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Fiber          Span15
 | 
				
			||||||
 | 
					  type_variety:                SSMF
 | 
				
			||||||
 | 
					  length (km):                 80.00
 | 
				
			||||||
 | 
					  pad att_in (dB):             0.00
 | 
				
			||||||
 | 
					  total loss (dB):             16.00
 | 
				
			||||||
 | 
					  (includes conn loss (dB) in: 0.00 out: 0.00)
 | 
				
			||||||
 | 
					  (conn loss out includes EOL margin defined in eqpt_config.json)
 | 
				
			||||||
 | 
					  reference pch out (dBm):     -16.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):        mode_1: -15.97, mode_2: -12.96
 | 
				
			||||||
 | 
					Edfa Edfa15
 | 
				
			||||||
 | 
					  type_variety:           test
 | 
				
			||||||
 | 
					  effective gain(dB):     16.00
 | 
				
			||||||
 | 
					  (before att_in and before output VOA)
 | 
				
			||||||
 | 
					  noise figure (dB):      8.86
 | 
				
			||||||
 | 
					  (including att_in)
 | 
				
			||||||
 | 
					  pad att_in (dB):        0.00
 | 
				
			||||||
 | 
					  Power In (dBm):         3.33
 | 
				
			||||||
 | 
					  Power Out (dBm):        19.33
 | 
				
			||||||
 | 
					  Delta_P (dB):           0.00
 | 
				
			||||||
 | 
					  target pch (dBm):       0.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):   mode_1: 0.04, mode_2: 3.05
 | 
				
			||||||
 | 
					  output VOA (dB):        0.00
 | 
				
			||||||
 | 
					Roadm roadm Site B
 | 
				
			||||||
 | 
					  effective loss (dB):     20.00
 | 
				
			||||||
 | 
					  reference pch out (dBm): -20.00
 | 
				
			||||||
 | 
					  actual pch out (dBm):    mode_1: -20.00, mode_2: -16.99
 | 
				
			||||||
 | 
					Transceiver Site_B
 | 
				
			||||||
 | 
					  GSNR (0.1nm, dB):          mode_1: 17.91, mode_2: 20.37
 | 
				
			||||||
 | 
					  GSNR (signal bw, dB):      mode_1: 13.83, mode_2: 13.28
 | 
				
			||||||
 | 
					  OSNR ASE (0.1nm, dB):      mode_1: 19.69, mode_2: 22.55
 | 
				
			||||||
 | 
					  OSNR ASE (signal bw, dB):  mode_1: 15.61, mode_2: 15.46
 | 
				
			||||||
 | 
					  CD (ps/nm):                20040.00
 | 
				
			||||||
 | 
					  PMD (ps):                  1.39
 | 
				
			||||||
 | 
					  PDL (dB):                  0.00
 | 
				
			||||||
 | 
					  Latency (ms):              5.88
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Transmission result for input power = 0.00 dBm:
 | 
				
			||||||
 | 
					  Final GSNR (0.1 nm): [1;36;40m18.94 dB[0m
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No source node specified: picked Site_A)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(No destination node specified: picked Site_B)
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user