mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2025-11-01 10:38:10 +00:00
Merge branch 'fix-make-example-network-bidi' into develop
This commit is contained in:
@@ -1,25 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from networkx import DiGraph
|
|
||||||
from logging import getLogger
|
|
||||||
|
|
||||||
logger = getLogger('gnpy.core')
|
|
||||||
|
|
||||||
from . import elements
|
from . import elements
|
||||||
|
from .execute import *
|
||||||
def network_from_json(json_data):
|
from .network import *
|
||||||
# NOTE|dutc: we could use the following, but it would tie our data format
|
|
||||||
# too closely to the graph library
|
|
||||||
# from networkx import node_link_graph
|
|
||||||
g = DiGraph()
|
|
||||||
|
|
||||||
nodes = {}
|
|
||||||
for el in json_data['elements']:
|
|
||||||
el = getattr(elements, el['type'])(el['id'], **el['metadata'])
|
|
||||||
g.add_node(el)
|
|
||||||
nodes[el.id] = el
|
|
||||||
|
|
||||||
for cx in json_data['connections']:
|
|
||||||
from_node, to_node = nodes[cx['from_node']], nodes[cx['to_node']]
|
|
||||||
g.add_edge(from_node, to_node)
|
|
||||||
|
|
||||||
return g
|
|
||||||
|
|||||||
2
core/execute.py
Normal file
2
core/execute.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
23
core/network.py
Normal file
23
core/network.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from networkx import DiGraph
|
||||||
|
|
||||||
|
from . import elements
|
||||||
|
|
||||||
|
def network_from_json(json_data):
|
||||||
|
# NOTE|dutc: we could use the following, but it would tie our data format
|
||||||
|
# too closely to the graph library
|
||||||
|
# from networkx import node_link_graph
|
||||||
|
g = DiGraph()
|
||||||
|
|
||||||
|
nodes = {}
|
||||||
|
for el in json_data['elements']:
|
||||||
|
el = getattr(elements, el['type'])(el['id'], **el['metadata'])
|
||||||
|
g.add_node(el)
|
||||||
|
nodes[el.id] = el
|
||||||
|
|
||||||
|
for cx in json_data['connections']:
|
||||||
|
from_node, to_node = nodes[cx['from_node']], nodes[cx['to_node']]
|
||||||
|
g.add_edge(from_node, to_node)
|
||||||
|
|
||||||
|
return g
|
||||||
11
examples/Makefile
Normal file
11
examples/Makefile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
REGIONS = europe asia conus
|
||||||
|
TARGETS = $(foreach region,$(REGIONS),coronet.$(region).json)
|
||||||
|
|
||||||
|
all: $(TARGETS)
|
||||||
|
|
||||||
|
$(TARGETS): convert.py CORONET_Global_Topology.xls
|
||||||
|
python $< -f $(subst .json,,$(subst coronet.,,$@)) > $@
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
-rm $(TARGETS) -f
|
||||||
@@ -7,6 +7,7 @@ except ModuleNotFoundError:
|
|||||||
exit('Required: `pip install xlrd`')
|
exit('Required: `pip install xlrd`')
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from collections import namedtuple, Counter
|
from collections import namedtuple, Counter
|
||||||
|
from itertools import chain
|
||||||
from json import dumps
|
from json import dumps
|
||||||
|
|
||||||
Node = namedtuple('Node', 'city state country region latitude longitude')
|
Node = namedtuple('Node', 'city state country region latitude longitude')
|
||||||
@@ -68,7 +69,7 @@ if __name__ == '__main__':
|
|||||||
nodes, links = parse_excel(args)
|
nodes, links = parse_excel(args)
|
||||||
|
|
||||||
if args.filter_region:
|
if args.filter_region:
|
||||||
nodes = [n for n in nodes if n.region in args.filter_region]
|
nodes = [n for n in nodes if n.region.lower() in args.filter_region]
|
||||||
cities = {n.city for n in nodes}
|
cities = {n.city for n in nodes}
|
||||||
links = [lnk for lnk in links if lnk.from_city in cities and
|
links = [lnk for lnk in links if lnk.from_city in cities and
|
||||||
lnk.to_city in cities]
|
lnk.to_city in cities]
|
||||||
@@ -92,12 +93,21 @@ if __name__ == '__main__':
|
|||||||
'type': 'Fiber'}
|
'type': 'Fiber'}
|
||||||
for x in links],
|
for x in links],
|
||||||
'connections':
|
'connections':
|
||||||
|
list(chain.from_iterable(zip( # put bidi next to each other
|
||||||
[{'from_node': x.from_city,
|
[{'from_node': x.from_city,
|
||||||
'to_node': f'fiber ({x.from_city} → {x.to_city})'}
|
'to_node': f'fiber ({x.from_city} → {x.to_city})'}
|
||||||
for x in links] +
|
for x in links],
|
||||||
|
[{'from_node': f'fiber ({x.from_city} → {x.to_city})',
|
||||||
|
'to_node': x.from_city}
|
||||||
|
for x in links])))
|
||||||
|
+
|
||||||
|
list(chain.from_iterable(zip(
|
||||||
[{'from_node': f'fiber ({x.from_city} → {x.to_city})',
|
[{'from_node': f'fiber ({x.from_city} → {x.to_city})',
|
||||||
'to_node': x.to_city}
|
'to_node': x.to_city}
|
||||||
for x in links]
|
for x in links],
|
||||||
|
[{'from_node': x.to_city,
|
||||||
|
'to_node': f'fiber ({x.from_city} → {x.to_city})'}
|
||||||
|
for x in links])))
|
||||||
}
|
}
|
||||||
|
|
||||||
print(dumps(data, indent=2))
|
print(dumps(data, indent=2))
|
||||||
|
|||||||
@@ -266,113 +266,225 @@
|
|||||||
"from_node": "Bangkok",
|
"from_node": "Bangkok",
|
||||||
"to_node": "fiber (Bangkok \u2192 Delhi)"
|
"to_node": "fiber (Bangkok \u2192 Delhi)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Bangkok \u2192 Delhi)",
|
||||||
|
"to_node": "Bangkok"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Bangkok",
|
"from_node": "Bangkok",
|
||||||
"to_node": "fiber (Bangkok \u2192 Hong_Kong)"
|
"to_node": "fiber (Bangkok \u2192 Hong_Kong)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Bangkok \u2192 Hong_Kong)",
|
||||||
|
"to_node": "Bangkok"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Beijing",
|
"from_node": "Beijing",
|
||||||
"to_node": "fiber (Beijing \u2192 Seoul)"
|
"to_node": "fiber (Beijing \u2192 Seoul)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Beijing \u2192 Seoul)",
|
||||||
|
"to_node": "Beijing"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Beijing",
|
"from_node": "Beijing",
|
||||||
"to_node": "fiber (Beijing \u2192 Shanghai)"
|
"to_node": "fiber (Beijing \u2192 Shanghai)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Beijing \u2192 Shanghai)",
|
||||||
|
"to_node": "Beijing"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Delhi",
|
"from_node": "Delhi",
|
||||||
"to_node": "fiber (Delhi \u2192 Mumbai)"
|
"to_node": "fiber (Delhi \u2192 Mumbai)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Delhi \u2192 Mumbai)",
|
||||||
|
"to_node": "Delhi"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Hong_Kong",
|
"from_node": "Hong_Kong",
|
||||||
"to_node": "fiber (Hong_Kong \u2192 Shanghai)"
|
"to_node": "fiber (Hong_Kong \u2192 Shanghai)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Hong_Kong \u2192 Shanghai)",
|
||||||
|
"to_node": "Hong_Kong"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Hong_Kong",
|
"from_node": "Hong_Kong",
|
||||||
"to_node": "fiber (Hong_Kong \u2192 Sydney)"
|
"to_node": "fiber (Hong_Kong \u2192 Sydney)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Hong_Kong \u2192 Sydney)",
|
||||||
|
"to_node": "Hong_Kong"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Hong_Kong",
|
"from_node": "Hong_Kong",
|
||||||
"to_node": "fiber (Hong_Kong \u2192 Taipei)"
|
"to_node": "fiber (Hong_Kong \u2192 Taipei)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Hong_Kong \u2192 Taipei)",
|
||||||
|
"to_node": "Hong_Kong"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Honolulu",
|
"from_node": "Honolulu",
|
||||||
"to_node": "fiber (Honolulu \u2192 Sydney)"
|
"to_node": "fiber (Honolulu \u2192 Sydney)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Honolulu \u2192 Sydney)",
|
||||||
|
"to_node": "Honolulu"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Honolulu",
|
"from_node": "Honolulu",
|
||||||
"to_node": "fiber (Honolulu \u2192 Taipei)"
|
"to_node": "fiber (Honolulu \u2192 Taipei)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Honolulu \u2192 Taipei)",
|
||||||
|
"to_node": "Honolulu"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Mumbai",
|
"from_node": "Mumbai",
|
||||||
"to_node": "fiber (Mumbai \u2192 Singapore)"
|
"to_node": "fiber (Mumbai \u2192 Singapore)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Mumbai \u2192 Singapore)",
|
||||||
|
"to_node": "Mumbai"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Seoul",
|
"from_node": "Seoul",
|
||||||
"to_node": "fiber (Seoul \u2192 Tokyo)"
|
"to_node": "fiber (Seoul \u2192 Tokyo)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Seoul \u2192 Tokyo)",
|
||||||
|
"to_node": "Seoul"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Singapore",
|
"from_node": "Singapore",
|
||||||
"to_node": "fiber (Singapore \u2192 Sydney)"
|
"to_node": "fiber (Singapore \u2192 Sydney)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Singapore \u2192 Sydney)",
|
||||||
|
"to_node": "Singapore"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Taipei",
|
"from_node": "Taipei",
|
||||||
"to_node": "fiber (Taipei \u2192 Tokyo)"
|
"to_node": "fiber (Taipei \u2192 Tokyo)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Taipei \u2192 Tokyo)",
|
||||||
|
"to_node": "Taipei"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Bangkok \u2192 Delhi)",
|
"from_node": "fiber (Bangkok \u2192 Delhi)",
|
||||||
"to_node": "Delhi"
|
"to_node": "Delhi"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Delhi",
|
||||||
|
"to_node": "fiber (Bangkok \u2192 Delhi)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Bangkok \u2192 Hong_Kong)",
|
"from_node": "fiber (Bangkok \u2192 Hong_Kong)",
|
||||||
"to_node": "Hong_Kong"
|
"to_node": "Hong_Kong"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Hong_Kong",
|
||||||
|
"to_node": "fiber (Bangkok \u2192 Hong_Kong)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Beijing \u2192 Seoul)",
|
"from_node": "fiber (Beijing \u2192 Seoul)",
|
||||||
"to_node": "Seoul"
|
"to_node": "Seoul"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Seoul",
|
||||||
|
"to_node": "fiber (Beijing \u2192 Seoul)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Beijing \u2192 Shanghai)",
|
"from_node": "fiber (Beijing \u2192 Shanghai)",
|
||||||
"to_node": "Shanghai"
|
"to_node": "Shanghai"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Shanghai",
|
||||||
|
"to_node": "fiber (Beijing \u2192 Shanghai)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Delhi \u2192 Mumbai)",
|
"from_node": "fiber (Delhi \u2192 Mumbai)",
|
||||||
"to_node": "Mumbai"
|
"to_node": "Mumbai"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Mumbai",
|
||||||
|
"to_node": "fiber (Delhi \u2192 Mumbai)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Hong_Kong \u2192 Shanghai)",
|
"from_node": "fiber (Hong_Kong \u2192 Shanghai)",
|
||||||
"to_node": "Shanghai"
|
"to_node": "Shanghai"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Shanghai",
|
||||||
|
"to_node": "fiber (Hong_Kong \u2192 Shanghai)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Hong_Kong \u2192 Sydney)",
|
"from_node": "fiber (Hong_Kong \u2192 Sydney)",
|
||||||
"to_node": "Sydney"
|
"to_node": "Sydney"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Sydney",
|
||||||
|
"to_node": "fiber (Hong_Kong \u2192 Sydney)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Hong_Kong \u2192 Taipei)",
|
"from_node": "fiber (Hong_Kong \u2192 Taipei)",
|
||||||
"to_node": "Taipei"
|
"to_node": "Taipei"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Taipei",
|
||||||
|
"to_node": "fiber (Hong_Kong \u2192 Taipei)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Honolulu \u2192 Sydney)",
|
"from_node": "fiber (Honolulu \u2192 Sydney)",
|
||||||
"to_node": "Sydney"
|
"to_node": "Sydney"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Sydney",
|
||||||
|
"to_node": "fiber (Honolulu \u2192 Sydney)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Honolulu \u2192 Taipei)",
|
"from_node": "fiber (Honolulu \u2192 Taipei)",
|
||||||
"to_node": "Taipei"
|
"to_node": "Taipei"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Taipei",
|
||||||
|
"to_node": "fiber (Honolulu \u2192 Taipei)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Mumbai \u2192 Singapore)",
|
"from_node": "fiber (Mumbai \u2192 Singapore)",
|
||||||
"to_node": "Singapore"
|
"to_node": "Singapore"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Singapore",
|
||||||
|
"to_node": "fiber (Mumbai \u2192 Singapore)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Seoul \u2192 Tokyo)",
|
"from_node": "fiber (Seoul \u2192 Tokyo)",
|
||||||
"to_node": "Tokyo"
|
"to_node": "Tokyo"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Tokyo",
|
||||||
|
"to_node": "fiber (Seoul \u2192 Tokyo)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Singapore \u2192 Sydney)",
|
"from_node": "fiber (Singapore \u2192 Sydney)",
|
||||||
"to_node": "Sydney"
|
"to_node": "Sydney"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Sydney",
|
||||||
|
"to_node": "fiber (Singapore \u2192 Sydney)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Taipei \u2192 Tokyo)",
|
"from_node": "fiber (Taipei \u2192 Tokyo)",
|
||||||
"to_node": "Tokyo"
|
"to_node": "Tokyo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Tokyo",
|
||||||
|
"to_node": "fiber (Taipei \u2192 Tokyo)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -286,121 +286,241 @@
|
|||||||
"from_node": "Amsterdam",
|
"from_node": "Amsterdam",
|
||||||
"to_node": "fiber (Amsterdam \u2192 Berlin)"
|
"to_node": "fiber (Amsterdam \u2192 Berlin)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Amsterdam \u2192 Berlin)",
|
||||||
|
"to_node": "Amsterdam"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Amsterdam",
|
"from_node": "Amsterdam",
|
||||||
"to_node": "fiber (Amsterdam \u2192 Brussels)"
|
"to_node": "fiber (Amsterdam \u2192 Brussels)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Amsterdam \u2192 Brussels)",
|
||||||
|
"to_node": "Amsterdam"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Amsterdam",
|
"from_node": "Amsterdam",
|
||||||
"to_node": "fiber (Amsterdam \u2192 Frankfurt)"
|
"to_node": "fiber (Amsterdam \u2192 Frankfurt)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Amsterdam \u2192 Frankfurt)",
|
||||||
|
"to_node": "Amsterdam"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Berlin",
|
"from_node": "Berlin",
|
||||||
"to_node": "fiber (Berlin \u2192 Warsaw)"
|
"to_node": "fiber (Berlin \u2192 Warsaw)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Berlin \u2192 Warsaw)",
|
||||||
|
"to_node": "Berlin"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Brussels",
|
"from_node": "Brussels",
|
||||||
"to_node": "fiber (Brussels \u2192 London)"
|
"to_node": "fiber (Brussels \u2192 London)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Brussels \u2192 London)",
|
||||||
|
"to_node": "Brussels"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Bucharest",
|
"from_node": "Bucharest",
|
||||||
"to_node": "fiber (Bucharest \u2192 Istanbul)"
|
"to_node": "fiber (Bucharest \u2192 Istanbul)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Bucharest \u2192 Istanbul)",
|
||||||
|
"to_node": "Bucharest"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Bucharest",
|
"from_node": "Bucharest",
|
||||||
"to_node": "fiber (Bucharest \u2192 Warsaw)"
|
"to_node": "fiber (Bucharest \u2192 Warsaw)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Bucharest \u2192 Warsaw)",
|
||||||
|
"to_node": "Bucharest"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Frankfurt",
|
"from_node": "Frankfurt",
|
||||||
"to_node": "fiber (Frankfurt \u2192 Vienna)"
|
"to_node": "fiber (Frankfurt \u2192 Vienna)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Frankfurt \u2192 Vienna)",
|
||||||
|
"to_node": "Frankfurt"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Istanbul",
|
"from_node": "Istanbul",
|
||||||
"to_node": "fiber (Istanbul \u2192 Rome)"
|
"to_node": "fiber (Istanbul \u2192 Rome)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Istanbul \u2192 Rome)",
|
||||||
|
"to_node": "Istanbul"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "London",
|
"from_node": "London",
|
||||||
"to_node": "fiber (London \u2192 Paris)"
|
"to_node": "fiber (London \u2192 Paris)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (London \u2192 Paris)",
|
||||||
|
"to_node": "London"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Madrid",
|
"from_node": "Madrid",
|
||||||
"to_node": "fiber (Madrid \u2192 Paris)"
|
"to_node": "fiber (Madrid \u2192 Paris)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Madrid \u2192 Paris)",
|
||||||
|
"to_node": "Madrid"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Madrid",
|
"from_node": "Madrid",
|
||||||
"to_node": "fiber (Madrid \u2192 Zurich)"
|
"to_node": "fiber (Madrid \u2192 Zurich)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Madrid \u2192 Zurich)",
|
||||||
|
"to_node": "Madrid"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Rome",
|
"from_node": "Rome",
|
||||||
"to_node": "fiber (Rome \u2192 Vienna)"
|
"to_node": "fiber (Rome \u2192 Vienna)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Rome \u2192 Vienna)",
|
||||||
|
"to_node": "Rome"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Rome",
|
"from_node": "Rome",
|
||||||
"to_node": "fiber (Rome \u2192 Zurich)"
|
"to_node": "fiber (Rome \u2192 Zurich)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Rome \u2192 Zurich)",
|
||||||
|
"to_node": "Rome"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "Vienna",
|
"from_node": "Vienna",
|
||||||
"to_node": "fiber (Vienna \u2192 Warsaw)"
|
"to_node": "fiber (Vienna \u2192 Warsaw)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "fiber (Vienna \u2192 Warsaw)",
|
||||||
|
"to_node": "Vienna"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Amsterdam \u2192 Berlin)",
|
"from_node": "fiber (Amsterdam \u2192 Berlin)",
|
||||||
"to_node": "Berlin"
|
"to_node": "Berlin"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Berlin",
|
||||||
|
"to_node": "fiber (Amsterdam \u2192 Berlin)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Amsterdam \u2192 Brussels)",
|
"from_node": "fiber (Amsterdam \u2192 Brussels)",
|
||||||
"to_node": "Brussels"
|
"to_node": "Brussels"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Brussels",
|
||||||
|
"to_node": "fiber (Amsterdam \u2192 Brussels)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Amsterdam \u2192 Frankfurt)",
|
"from_node": "fiber (Amsterdam \u2192 Frankfurt)",
|
||||||
"to_node": "Frankfurt"
|
"to_node": "Frankfurt"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Frankfurt",
|
||||||
|
"to_node": "fiber (Amsterdam \u2192 Frankfurt)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Berlin \u2192 Warsaw)",
|
"from_node": "fiber (Berlin \u2192 Warsaw)",
|
||||||
"to_node": "Warsaw"
|
"to_node": "Warsaw"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Warsaw",
|
||||||
|
"to_node": "fiber (Berlin \u2192 Warsaw)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Brussels \u2192 London)",
|
"from_node": "fiber (Brussels \u2192 London)",
|
||||||
"to_node": "London"
|
"to_node": "London"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "London",
|
||||||
|
"to_node": "fiber (Brussels \u2192 London)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Bucharest \u2192 Istanbul)",
|
"from_node": "fiber (Bucharest \u2192 Istanbul)",
|
||||||
"to_node": "Istanbul"
|
"to_node": "Istanbul"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Istanbul",
|
||||||
|
"to_node": "fiber (Bucharest \u2192 Istanbul)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Bucharest \u2192 Warsaw)",
|
"from_node": "fiber (Bucharest \u2192 Warsaw)",
|
||||||
"to_node": "Warsaw"
|
"to_node": "Warsaw"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Warsaw",
|
||||||
|
"to_node": "fiber (Bucharest \u2192 Warsaw)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Frankfurt \u2192 Vienna)",
|
"from_node": "fiber (Frankfurt \u2192 Vienna)",
|
||||||
"to_node": "Vienna"
|
"to_node": "Vienna"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Vienna",
|
||||||
|
"to_node": "fiber (Frankfurt \u2192 Vienna)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Istanbul \u2192 Rome)",
|
"from_node": "fiber (Istanbul \u2192 Rome)",
|
||||||
"to_node": "Rome"
|
"to_node": "Rome"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Rome",
|
||||||
|
"to_node": "fiber (Istanbul \u2192 Rome)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (London \u2192 Paris)",
|
"from_node": "fiber (London \u2192 Paris)",
|
||||||
"to_node": "Paris"
|
"to_node": "Paris"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Paris",
|
||||||
|
"to_node": "fiber (London \u2192 Paris)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Madrid \u2192 Paris)",
|
"from_node": "fiber (Madrid \u2192 Paris)",
|
||||||
"to_node": "Paris"
|
"to_node": "Paris"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Paris",
|
||||||
|
"to_node": "fiber (Madrid \u2192 Paris)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Madrid \u2192 Zurich)",
|
"from_node": "fiber (Madrid \u2192 Zurich)",
|
||||||
"to_node": "Zurich"
|
"to_node": "Zurich"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Zurich",
|
||||||
|
"to_node": "fiber (Madrid \u2192 Zurich)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Rome \u2192 Vienna)",
|
"from_node": "fiber (Rome \u2192 Vienna)",
|
||||||
"to_node": "Vienna"
|
"to_node": "Vienna"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Vienna",
|
||||||
|
"to_node": "fiber (Rome \u2192 Vienna)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Rome \u2192 Zurich)",
|
"from_node": "fiber (Rome \u2192 Zurich)",
|
||||||
"to_node": "Zurich"
|
"to_node": "Zurich"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Zurich",
|
||||||
|
"to_node": "fiber (Rome \u2192 Zurich)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"from_node": "fiber (Vienna \u2192 Warsaw)",
|
"from_node": "fiber (Vienna \u2192 Warsaw)",
|
||||||
"to_node": "Warsaw"
|
"to_node": "Warsaw"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_node": "Warsaw",
|
||||||
|
"to_node": "fiber (Vienna \u2192 Warsaw)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user