Skip to content

Commit 3a03861

Browse files
committed
Use github url to fetch the graph file data
1 parent 3744659 commit 3a03861

File tree

1 file changed

+39
-126
lines changed

1 file changed

+39
-126
lines changed

lectures/short_path.md

Lines changed: 39 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ jupytext:
33
text_representation:
44
extension: .md
55
format_name: myst
6+
format_version: 0.13
7+
jupytext_version: 1.16.7
68
kernelspec:
7-
display_name: Python 3
9+
display_name: Python 3 (ipykernel)
810
language: python
911
name: python3
1012
---
@@ -44,7 +46,7 @@ Dynamic programming is an extremely powerful optimization technique that we appl
4446

4547
The only scientific library we'll need in what follows is NumPy:
4648

47-
```{code-cell} python3
49+
```{code-cell} ipython3
4850
import numpy as np
4951
```
5052

@@ -195,7 +197,7 @@ $$
195197

196198
For example, for the simple graph above, we set
197199

198-
```{code-cell} python3
200+
```{code-cell} ipython3
199201
from numpy import inf
200202
201203
Q = np.array([[inf, 1, 5, 3, inf, inf, inf],
@@ -216,7 +218,7 @@ For the sequence of approximations $\{J_n\}$ of the cost-to-go functions, we can
216218

217219
Let's try with this example and see how we go:
218220

219-
```{code-cell} python3
221+
```{code-cell} ipython3
220222
nodes = range(7) # Nodes = 0, 1, ..., 6
221223
J = np.zeros_like(nodes, dtype=int) # Initial guess
222224
next_J = np.empty_like(nodes, dtype=int) # Stores updated guess
@@ -249,7 +251,7 @@ But, importantly, we now have a methodology for tackling large graphs.
249251
:label: short_path_ex1
250252
```
251253

252-
The text below describes a weighted directed graph.
254+
The file data below describes a weighted directed graph.
253255

254256
The line `node0, node1 0.04, node8 11.11, node14 72.21` means that from node0 we can go to
255257

@@ -268,108 +270,16 @@ You will be dealing with floating point numbers now, rather than
268270
integers, so consider replacing `np.equal()` with `np.allclose()`.
269271
```
270272

271-
```{code-cell} python3
272-
%%file graph.txt
273-
node0, node1 0.04, node8 11.11, node14 72.21
274-
node1, node46 1247.25, node6 20.59, node13 64.94
275-
node2, node66 54.18, node31 166.80, node45 1561.45
276-
node3, node20 133.65, node6 2.06, node11 42.43
277-
node4, node75 3706.67, node5 0.73, node7 1.02
278-
node5, node45 1382.97, node7 3.33, node11 34.54
279-
node6, node31 63.17, node9 0.72, node10 13.10
280-
node7, node50 478.14, node9 3.15, node10 5.85
281-
node8, node69 577.91, node11 7.45, node12 3.18
282-
node9, node70 2454.28, node13 4.42, node20 16.53
283-
node10, node89 5352.79, node12 1.87, node16 25.16
284-
node11, node94 4961.32, node18 37.55, node20 65.08
285-
node12, node84 3914.62, node24 34.32, node28 170.04
286-
node13, node60 2135.95, node38 236.33, node40 475.33
287-
node14, node67 1878.96, node16 2.70, node24 38.65
288-
node15, node91 3597.11, node17 1.01, node18 2.57
289-
node16, node36 392.92, node19 3.49, node38 278.71
290-
node17, node76 783.29, node22 24.78, node23 26.45
291-
node18, node91 3363.17, node23 16.23, node28 55.84
292-
node19, node26 20.09, node20 0.24, node28 70.54
293-
node20, node98 3523.33, node24 9.81, node33 145.80
294-
node21, node56 626.04, node28 36.65, node31 27.06
295-
node22, node72 1447.22, node39 136.32, node40 124.22
296-
node23, node52 336.73, node26 2.66, node33 22.37
297-
node24, node66 875.19, node26 1.80, node28 14.25
298-
node25, node70 1343.63, node32 36.58, node35 45.55
299-
node26, node47 135.78, node27 0.01, node42 122.00
300-
node27, node65 480.55, node35 48.10, node43 246.24
301-
node28, node82 2538.18, node34 21.79, node36 15.52
302-
node29, node64 635.52, node32 4.22, node33 12.61
303-
node30, node98 2616.03, node33 5.61, node35 13.95
304-
node31, node98 3350.98, node36 20.44, node44 125.88
305-
node32, node97 2613.92, node34 3.33, node35 1.46
306-
node33, node81 1854.73, node41 3.23, node47 111.54
307-
node34, node73 1075.38, node42 51.52, node48 129.45
308-
node35, node52 17.57, node41 2.09, node50 78.81
309-
node36, node71 1171.60, node54 101.08, node57 260.46
310-
node37, node75 269.97, node38 0.36, node46 80.49
311-
node38, node93 2767.85, node40 1.79, node42 8.78
312-
node39, node50 39.88, node40 0.95, node41 1.34
313-
node40, node75 548.68, node47 28.57, node54 53.46
314-
node41, node53 18.23, node46 0.28, node54 162.24
315-
node42, node59 141.86, node47 10.08, node72 437.49
316-
node43, node98 2984.83, node54 95.06, node60 116.23
317-
node44, node91 807.39, node46 1.56, node47 2.14
318-
node45, node58 79.93, node47 3.68, node49 15.51
319-
node46, node52 22.68, node57 27.50, node67 65.48
320-
node47, node50 2.82, node56 49.31, node61 172.64
321-
node48, node99 2564.12, node59 34.52, node60 66.44
322-
node49, node78 53.79, node50 0.51, node56 10.89
323-
node50, node85 251.76, node53 1.38, node55 20.10
324-
node51, node98 2110.67, node59 23.67, node60 73.79
325-
node52, node94 1471.80, node64 102.41, node66 123.03
326-
node53, node72 22.85, node56 4.33, node67 88.35
327-
node54, node88 967.59, node59 24.30, node73 238.61
328-
node55, node84 86.09, node57 2.13, node64 60.80
329-
node56, node76 197.03, node57 0.02, node61 11.06
330-
node57, node86 701.09, node58 0.46, node60 7.01
331-
node58, node83 556.70, node64 29.85, node65 34.32
332-
node59, node90 820.66, node60 0.72, node71 0.67
333-
node60, node76 48.03, node65 4.76, node67 1.63
334-
node61, node98 1057.59, node63 0.95, node64 4.88
335-
node62, node91 132.23, node64 2.94, node76 38.43
336-
node63, node66 4.43, node72 70.08, node75 56.34
337-
node64, node80 47.73, node65 0.30, node76 11.98
338-
node65, node94 594.93, node66 0.64, node73 33.23
339-
node66, node98 395.63, node68 2.66, node73 37.53
340-
node67, node82 153.53, node68 0.09, node70 0.98
341-
node68, node94 232.10, node70 3.35, node71 1.66
342-
node69, node99 247.80, node70 0.06, node73 8.99
343-
node70, node76 27.18, node72 1.50, node73 8.37
344-
node71, node89 104.50, node74 8.86, node91 284.64
345-
node72, node76 15.32, node84 102.77, node92 133.06
346-
node73, node83 52.22, node76 1.40, node90 243.00
347-
node74, node81 1.07, node76 0.52, node78 8.08
348-
node75, node92 68.53, node76 0.81, node77 1.19
349-
node76, node85 13.18, node77 0.45, node78 2.36
350-
node77, node80 8.94, node78 0.98, node86 64.32
351-
node78, node98 355.90, node81 2.59
352-
node79, node81 0.09, node85 1.45, node91 22.35
353-
node80, node92 121.87, node88 28.78, node98 264.34
354-
node81, node94 99.78, node89 39.52, node92 99.89
355-
node82, node91 47.44, node88 28.05, node93 11.99
356-
node83, node94 114.95, node86 8.75, node88 5.78
357-
node84, node89 19.14, node94 30.41, node98 121.05
358-
node85, node97 94.51, node87 2.66, node89 4.90
359-
node86, node97 85.09
360-
node87, node88 0.21, node91 11.14, node92 21.23
361-
node88, node93 1.31, node91 6.83, node98 6.12
362-
node89, node97 36.97, node99 82.12
363-
node90, node96 23.53, node94 10.47, node99 50.99
364-
node91, node97 22.17
365-
node92, node96 10.83, node97 11.24, node99 34.68
366-
node93, node94 0.19, node97 6.71, node99 32.77
367-
node94, node98 5.91, node96 2.03
368-
node95, node98 6.17, node99 0.27
369-
node96, node98 3.32, node97 0.43, node99 5.87
370-
node97, node98 0.30
371-
node98, node99 0.33
372-
node99,
273+
```{code-cell} ipython3
274+
import requests
275+
276+
file_url = "https://raw.githubusercontent.com/QuantEcon/lecture-python-intro/main/lectures/graph.txt"
277+
graph_file_response = requests.get(file_url)
278+
```
279+
280+
```{code-cell} ipython3
281+
graph_file_data = str(graph_file_response.content, 'utf-8')
282+
print(graph_file_data)
373283
```
374284

375285
```{exercise-end}
@@ -381,27 +291,30 @@ node99,
381291

382292
First let's write a function that reads in the graph data above and builds a distance matrix.
383293

384-
```{code-cell} python3
294+
```{code-cell} ipython3
385295
num_nodes = 100
386296
destination_node = 99
387297
388-
def map_graph_to_distance_matrix(in_file):
298+
def map_graph_to_distance_matrix(in_file_data):
389299
390300
# First let's set of the distance matrix Q with inf everywhere
391301
Q = np.full((num_nodes, num_nodes), np.inf)
392302
393303
# Now we read in the data and modify Q
394-
with open(in_file) as infile:
395-
for line in infile:
396-
elements = line.split(',')
397-
node = elements.pop(0)
398-
node = int(node[4:]) # convert node description to integer
399-
if node != destination_node:
400-
for element in elements:
401-
destination, cost = element.split()
402-
destination = int(destination[4:])
403-
Q[node, destination] = float(cost)
404-
Q[destination_node, destination_node] = 0
304+
lines = in_file_data.split('\n')
305+
for line_ in lines:
306+
line = line_.strip()
307+
if line == '':
308+
continue
309+
elements = line.split(',')
310+
node = elements.pop(0)
311+
node = int(node[4:]) # convert node description to integer
312+
if node != destination_node:
313+
for element in elements:
314+
destination, cost = element.split()
315+
destination = int(destination[4:])
316+
Q[node, destination] = float(cost)
317+
Q[destination_node, destination_node] = 0
405318
return Q
406319
```
407320

@@ -414,7 +327,7 @@ We'll use the algorithm described above.
414327

415328
The minimization step is vectorized to make it faster.
416329

417-
```{code-cell} python3
330+
```{code-cell} ipython3
418331
def bellman(J, Q):
419332
return np.min(Q + J, axis=1)
420333
@@ -442,7 +355,7 @@ dealing with floating point numbers now.
442355
Finally, here's a function that uses the cost-to-go function to obtain the
443356
optimal path (and its cost).
444357

445-
```{code-cell} python3
358+
```{code-cell} ipython3
446359
def print_best_path(J, Q):
447360
sum_costs = 0
448361
current_node = 0
@@ -459,17 +372,17 @@ def print_best_path(J, Q):
459372

460373
Okay, now we have the necessary functions, let's call them to do the job we were assigned.
461374

462-
```{code-cell} python3
463-
Q = map_graph_to_distance_matrix('graph.txt')
375+
```{code-cell} ipython3
376+
Q = map_graph_to_distance_matrix(graph_file_data)
464377
J = compute_cost_to_go(Q)
465378
print_best_path(J, Q)
466379
```
467380

468381
The total cost of the path should agree with $J[0]$ so let's check this.
469382

470-
```{code-cell} python3
383+
```{code-cell} ipython3
471384
J[0]
472385
```
473386

474387
```{solution-end}
475-
```
388+
```

0 commit comments

Comments
 (0)