Permalink
Browse files

Major reorganization, nearly complete

  • Loading branch information...
1 parent 7a5ff17 commit 1d5a8c0ef28162dfbecdbf530bd977eee5856221 @jstac jstac committed May 21, 2014
Showing with 907 additions and 2,096 deletions.
  1. BIN {programs → data}/gd.xls
  2. 0 programs/graph.txt → data/graph.dat
  3. +100 −0 data/graph.txt
  4. +26 −0 data/graph_out.txt
  5. 0 {programs → data}/test_pwt.csv
  6. 0 {programs → data}/test_table.csv
  7. 0 {programs → data}/us_cities.txt
  8. 0 {programs → data}/web_graph_data.txt
  9. +65 −0 examples/3dvec.py
  10. +20 −0 examples/ar1_acov.py
  11. +42 −0 examples/ar1_cycles.py
  12. +23 −0 examples/ar1_sd.py
  13. +76 −0 examples/ar1sim.py
  14. 0 {programs → examples}/beta-binomial.py
  15. +21 −0 examples/binom_df.py
  16. 0 {programs → examples}/bisection.py
  17. 0 {programs → examples}/career_vf_plot.py
  18. +31 −0 examples/cauchy_samples.py
  19. 0 {programs → examples}/clt3d.py
  20. 0 {programs → examples}/descriptor_eg.py
  21. 0 {programs → examples}/dice.py
  22. +55 −0 examples/eigenvec.py
  23. 0 {programs → examples}/gaussian_contours.py
  24. 0 {programs → examples}/ifp_savings_plots.py
  25. 0 {programs → examples}/illustrates_clt.py
  26. 0 {programs → examples}/illustrates_lln.py
  27. 0 {programs → examples}/jv_test.py
  28. 0 {programs → examples}/lin_interp_3d_plot.py
  29. +25 −0 examples/linapprox.py
  30. 0 {programs → examples}/lq_permanent_1.py
  31. 0 {programs → examples}/lqramsey_ar1.py
  32. 0 {programs → examples}/lqramsey_discrete.py
  33. +24 −0 examples/lucas_tree_price1.py
  34. 0 {programs → examples}/mc_convergence_plot.py
  35. +15 −0 examples/nds.py
  36. 0 {programs → examples}/nx_demo.py
  37. 0 {programs → examples}/odu_plot_densities.py
  38. 0 {programs → examples}/odu_vfi_plots.py
  39. 0 {programs → examples}/optgrowth_v0.py
  40. 0 {programs → examples}/paths_and_hist.py
  41. +3 −9 programs/solution_lss_ex4.py → examples/paths_and_stationarity.py
  42. +62 −0 examples/perm_inc_fig1.py
  43. 0 {programs → examples}/perm_inc_ir.py
  44. 0 {programs → examples}/plot_example_1.py
  45. 0 {programs → examples}/plot_example_2.py
  46. 0 {programs → examples}/plot_example_3.py
  47. 0 {programs → examples}/plot_example_4.py
  48. 0 {programs → examples}/plot_example_5.py
  49. 0 {programs → examples}/portfolio.txt
  50. +52 −0 examples/preim1.py
  51. +5 −0 examples/pylab_eg.py
  52. +47 −0 examples/qs.py
  53. 0 {programs → examples}/quadmap_class.py
  54. 0 {programs → examples}/rb_test.py
  55. 0 {programs → examples}/robust_monopolist.py
  56. +10 −0 examples/sine2.py
  57. +10 −0 examples/sine3.py
  58. +9 −0 examples/sine4.py
  59. +12 −0 examples/sine5.py
  60. +18 −0 examples/six_hists.py
  61. 0 {programs → examples}/subplots.py
  62. 0 {programs → examples}/temp.py
  63. 0 {programs → examples}/test_program_1.py
  64. 0 {programs → examples}/test_program_2.py
  65. 0 {programs → examples}/test_program_3.py
  66. 0 {programs → examples}/test_program_4.py
  67. 0 {programs → examples}/test_program_5.py
  68. 0 {programs → examples}/test_program_5_short.py
  69. 0 {programs → examples}/test_program_6.py
  70. +38 −0 examples/tsh_hg.py
  71. 0 {programs → examples}/us_cities.py
  72. +26 −0 examples/vecs.py
  73. +39 −0 examples/vecs2.py
  74. 0 {programs → examples}/wb_download.py
  75. +52 −0 examples/web_network.py
  76. 0 {programs → examples}/white_noise_plot.py
  77. +1 −1 {programs → examples}/yahoo_fin.py
  78. +0 −26 programs/bisection2.py
  79. +0 −33 programs/discrete_rv0.py
  80. +0 −46 programs/kalman_test.py
  81. +0 −44 programs/linapprox.py
  82. +0 −197 programs/linear_process.py
  83. +0 −40 programs/lqramsey_seasonal.py
  84. +0 −24 programs/quadmap.py
  85. +0 −46 programs/solution_career_ex1.py
  86. +0 −32 programs/solution_career_ex2.py
  87. +0 −22 programs/solution_career_ex3.py
  88. +0 −31 programs/solution_estspec_ex1.py
  89. +0 −27 programs/solution_estspec_ex2.py
  90. +0 −29 programs/solution_ifp_ex1.py
  91. +0 −19 programs/solution_ifp_ex2.py
  92. +0 −33 programs/solution_ifp_ex3.py
  93. +0 −26 programs/solution_ifp_ex4.py
  94. +0 −40 programs/solution_jv_ex1.py
  95. +0 −16 programs/solution_jv_ex2.py
  96. +0 −30 programs/solution_kalman_ex1.py
  97. +0 −34 programs/solution_kalman_ex2.py
  98. +0 −56 programs/solution_kalman_ex3.py
  99. +0 −42 programs/solution_lln_ex1.py
  100. +0 −51 programs/solution_lln_ex2.py
  101. +0 −80 programs/solution_lqc_ex1.py
  102. +0 −107 programs/solution_lqc_ex2.py
  103. +0 −68 programs/solution_lqc_ex3.py
  104. +0 −33 programs/solution_lqramsey_ex1.py
  105. +0 −23 programs/solution_lss_ex1.py
  106. +0 −29 programs/solution_lss_ex2.py
  107. +0 −51 programs/solution_lss_ex3.py
  108. +0 −32 programs/solution_mass_ex1.py
  109. +0 −19 programs/solution_mass_ex2.py
  110. +0 −33 programs/solution_mc_ex1.py
  111. +0 −37 programs/solution_mc_ex2.py
  112. +0 −50 programs/solution_odu_ex1.py
  113. +0 −64 programs/solution_odu_ex2.py
  114. +0 −26 programs/solution_og_ex1.py
  115. +0 −34 programs/solution_og_ex2.py
  116. +0 −12 programs/solution_oop_ex1.py
  117. +0 −29 programs/solution_oop_ex2.py
  118. +0 −5 programs/solution_pbe_ex1.py
  119. +0 −10 programs/solution_pbe_ex2.py
  120. +0 −17 programs/solution_pbe_ex3.py
  121. +0 −12 programs/solution_pbe_ex4.py
  122. +0 −14 programs/solution_pbe_ex5.py
  123. +0 −17 programs/solution_pbe_ex6.py
  124. +0 −39 programs/solution_pd_ex1.py
  125. +0 −42 programs/solution_ree_ex1.py
  126. +0 −35 programs/solution_ree_ex2.py
  127. +0 −29 programs/solution_ree_ex3.py
  128. +0 −23 programs/solution_ree_ex4.py
  129. +0 −79 programs/solution_shortpath.py
  130. +0 −42 programs/solution_statd_ex1.py
  131. +0 −51 programs/solution_statd_ex2.py
  132. 0 {programs → quantecon}/asset_pricing.py
  133. 0 {programs → quantecon}/career.py
  134. 0 {programs → quantecon}/compute_fp.py
  135. 0 {programs → quantecon}/discrete_rv.py
  136. 0 {programs → quantecon}/ecdf.py
  137. 0 {programs → quantecon}/estspec.py
  138. 0 {programs → quantecon}/ifp.py
  139. 0 {programs → quantecon}/jv.py
  140. 0 {programs → quantecon}/kalman.py
  141. 0 {programs → quantecon}/lae.py
  142. 0 {programs → quantecon}/linproc.py
  143. 0 {programs → quantecon}/lqcontrol.py
  144. 0 {programs → quantecon}/lqramsey.py
  145. 0 {programs → quantecon}/lss.py
  146. 0 {programs → quantecon}/lucastree.py
  147. 0 {programs → quantecon}/mc_tools.py
  148. 0 {programs → quantecon}/odu_vfi.py
  149. 0 {programs → quantecon}/optgrowth.py
  150. 0 {programs → quantecon}/quadsums.py
  151. 0 {programs → quantecon}/rank_nullspace.py
  152. 0 {programs → quantecon}/riccati.py
  153. 0 {programs → quantecon}/robustlq.py
  154. 0 {programs → quantecon}/schelling.py
  155. 0 {programs → quantecon}/tauchen.py
File renamed without changes.
File renamed without changes.
View
@@ -0,0 +1,100 @@
+node0, node1 0.04, node8 11.11, node14 72.21
+node1, node46 1247.25, node6 20.59, node13 64.94
+node2, node66 54.18, node31 166.80, node45 1561.45
+node3, node20 133.65, node6 2.06, node11 42.43
+node4, node75 3706.67, node5 0.73, node7 1.02
+node5, node45 1382.97, node7 3.33, node11 34.54
+node6, node31 63.17, node9 0.72, node10 13.10
+node7, node50 478.14, node9 3.15, node10 5.85
+node8, node69 577.91, node11 7.45, node12 3.18
+node9, node70 2454.28, node13 4.42, node20 16.53
+node10, node89 5352.79, node12 1.87, node16 25.16
+node11, node94 4961.32, node18 37.55, node20 65.08
+node12, node84 3914.62, node24 34.32, node28 170.04
+node13, node60 2135.95, node38 236.33, node40 475.33
+node14, node67 1878.96, node16 2.70, node24 38.65
+node15, node91 3597.11, node17 1.01, node18 2.57
+node16, node36 392.92, node19 3.49, node38 278.71
+node17, node76 783.29, node22 24.78, node23 26.45
+node18, node91 3363.17, node23 16.23, node28 55.84
+node19, node26 20.09, node20 0.24, node28 70.54
+node20, node98 3523.33, node24 9.81, node33 145.80
+node21, node56 626.04, node28 36.65, node31 27.06
+node22, node72 1447.22, node39 136.32, node40 124.22
+node23, node52 336.73, node26 2.66, node33 22.37
+node24, node66 875.19, node26 1.80, node28 14.25
+node25, node70 1343.63, node32 36.58, node35 45.55
+node26, node47 135.78, node27 0.01, node42 122.00
+node27, node65 480.55, node35 48.10, node43 246.24
+node28, node82 2538.18, node34 21.79, node36 15.52
+node29, node64 635.52, node32 4.22, node33 12.61
+node30, node98 2616.03, node33 5.61, node35 13.95
+node31, node98 3350.98, node36 20.44, node44 125.88
+node32, node97 2613.92, node34 3.33, node35 1.46
+node33, node81 1854.73, node41 3.23, node47 111.54
+node34, node73 1075.38, node42 51.52, node48 129.45
+node35, node52 17.57, node41 2.09, node50 78.81
+node36, node71 1171.60, node54 101.08, node57 260.46
+node37, node75 269.97, node38 0.36, node46 80.49
+node38, node93 2767.85, node40 1.79, node42 8.78
+node39, node50 39.88, node40 0.95, node41 1.34
+node40, node75 548.68, node47 28.57, node54 53.46
+node41, node53 18.23, node46 0.28, node54 162.24
+node42, node59 141.86, node47 10.08, node72 437.49
+node43, node98 2984.83, node54 95.06, node60 116.23
+node44, node91 807.39, node46 1.56, node47 2.14
+node45, node58 79.93, node47 3.68, node49 15.51
+node46, node52 22.68, node57 27.50, node67 65.48
+node47, node50 2.82, node56 49.31, node61 172.64
+node48, node99 2564.12, node59 34.52, node60 66.44
+node49, node78 53.79, node50 0.51, node56 10.89
+node50, node85 251.76, node53 1.38, node55 20.10
+node51, node98 2110.67, node59 23.67, node60 73.79
+node52, node94 1471.80, node64 102.41, node66 123.03
+node53, node72 22.85, node56 4.33, node67 88.35
+node54, node88 967.59, node59 24.30, node73 238.61
+node55, node84 86.09, node57 2.13, node64 60.80
+node56, node76 197.03, node57 0.02, node61 11.06
+node57, node86 701.09, node58 0.46, node60 7.01
+node58, node83 556.70, node64 29.85, node65 34.32
+node59, node90 820.66, node60 0.72, node71 0.67
+node60, node76 48.03, node65 4.76, node67 1.63
+node61, node98 1057.59, node63 0.95, node64 4.88
+node62, node91 132.23, node64 2.94, node76 38.43
+node63, node66 4.43, node72 70.08, node75 56.34
+node64, node80 47.73, node65 0.30, node76 11.98
+node65, node94 594.93, node66 0.64, node73 33.23
+node66, node98 395.63, node68 2.66, node73 37.53
+node67, node82 153.53, node68 0.09, node70 0.98
+node68, node94 232.10, node70 3.35, node71 1.66
+node69, node99 247.80, node70 0.06, node73 8.99
+node70, node76 27.18, node72 1.50, node73 8.37
+node71, node89 104.50, node74 8.86, node91 284.64
+node72, node76 15.32, node84 102.77, node92 133.06
+node73, node83 52.22, node76 1.40, node90 243.00
+node74, node81 1.07, node76 0.52, node78 8.08
+node75, node92 68.53, node76 0.81, node77 1.19
+node76, node85 13.18, node77 0.45, node78 2.36
+node77, node80 8.94, node78 0.98, node86 64.32
+node78, node98 355.90, node81 2.59
+node79, node81 0.09, node85 1.45, node91 22.35
+node80, node92 121.87, node88 28.78, node98 264.34
+node81, node94 99.78, node89 39.52, node92 99.89
+node82, node91 47.44, node88 28.05, node93 11.99
+node83, node94 114.95, node86 8.75, node88 5.78
+node84, node89 19.14, node94 30.41, node98 121.05
+node85, node97 94.51, node87 2.66, node89 4.90
+node86, node97 85.09
+node87, node88 0.21, node91 11.14, node92 21.23
+node88, node93 1.31, node91 6.83, node98 6.12
+node89, node97 36.97, node99 82.12
+node90, node96 23.53, node94 10.47, node99 50.99
+node91, node97 22.17
+node92, node96 10.83, node97 11.24, node99 34.68
+node93, node94 0.19, node97 6.71, node99 32.77
+node94, node98 5.91, node96 2.03
+node95, node98 6.17, node99 0.27
+node96, node98 3.32, node97 0.43, node99 5.87
+node97, node98 0.30
+node98, node99 0.33
+node99,
View
@@ -0,0 +1,26 @@
+node0
+node8
+node11
+node18
+node23
+node33
+node41
+node53
+node56
+node57
+node60
+node67
+node70
+node73
+node76
+node85
+node87
+node88
+node93
+node94
+node96
+node97
+node98
+node99
+
+Cost: 160.55
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
View
@@ -0,0 +1,65 @@
+"""
+QE by Tom Sargent and John Stachurski.
+Illustrates the span of two vectors in R^3.
+"""
+import numpy as np
+import matplotlib.pyplot as plt
+from matplotlib import cm
+from mpl_toolkits.mplot3d import Axes3D
+from scipy.interpolate import interp2d
+
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+
+x_min, x_max = -5, 5
+y_min, y_max = -5, 5
+
+alpha, beta = 0.2, 0.1
+
+ax.set_xlim((x_min, x_max))
+ax.set_ylim((x_min, x_max))
+ax.set_zlim((x_min, x_max))
+
+# Axes
+ax.set_xticks((0,))
+ax.set_yticks((0,))
+ax.set_zticks((0,))
+gs = 3
+z = np.linspace(x_min, x_max, gs)
+x = np.zeros(gs)
+y = np.zeros(gs)
+ax.plot(x, y, z, 'k-', lw=2, alpha=0.5)
+ax.plot(z, x, y, 'k-', lw=2, alpha=0.5)
+ax.plot(y, z, x, 'k-', lw=2, alpha=0.5)
+
+
+# Fixed linear function, to generate a plane
+def f(x, y):
+ return alpha * x + beta * y
+
+# Vector locations, by coordinate
+x_coords = np.array((3, 3))
+y_coords = np.array((4, -4))
+z = f(x_coords, y_coords)
+for i in (0, 1):
+ ax.text(x_coords[i], y_coords[i], z[i], r'$a_{}$'.format(i+1), fontsize=14)
+
+# Lines to vectors
+for i in (0, 1):
+ x = (0, x_coords[i])
+ y = (0, y_coords[i])
+ z = (0, f(x_coords[i], y_coords[i]))
+ ax.plot(x, y, z, 'b-', lw=1.5, alpha=0.6)
+
+
+# Draw the plane
+grid_size = 20
+xr2 = np.linspace(x_min, x_max, grid_size)
+yr2 = np.linspace(y_min, y_max, grid_size)
+x2, y2 = np.meshgrid(xr2, yr2)
+z2 = f(x2, y2)
+ax.plot_surface(x2, y2, z2, rstride=1, cstride=1, cmap=cm.jet,
+ linewidth=0, antialiased=True, alpha=0.2)
+plt.show()
+
+
View
@@ -0,0 +1,20 @@
+"""
+Plots autocovariance function for AR(1) X' = phi X + epsilon
+"""
+import numpy as np
+import matplotlib.pyplot as plt
+num_rows, num_cols = 2, 1
+fig, axes = plt.subplots(num_rows, num_cols, figsize=(10, 8))
+plt.subplots_adjust(hspace=0.4)
+# Autocovariance when phi = 0.8
+temp = r'autocovariance, $\phi = {0:.2}$'
+for i, phi in enumerate((0.8, -0.8)):
+ ax = axes[i]
+ times = range(16)
+ acov = [phi**k / (1 - phi**2) for k in times]
+ ax.plot(times, acov, 'bo-', alpha=0.6, label=temp.format(phi))
+ ax.legend(loc='upper right')
+ ax.set_xlabel('time')
+ ax.set_xlim((0, 15))
+ ax.hlines(0, 0, 15, linestyle='--', alpha=0.5)
+plt.show()
@@ -0,0 +1,42 @@
+"""
+Helps to illustrate the spectral density for AR(1) X' = phi X + epsilon
+"""
+import numpy as np
+import matplotlib.pyplot as plt
+
+phi = -0.8
+times = range(16)
+y1 = [phi**k / (1 - phi**2) for k in times]
+y2 = [np.cos(np.pi * k) for k in times]
+y3 = [a * b for a, b in zip(y1, y2)]
+
+num_rows, num_cols = 3, 1
+fig, axes = plt.subplots(num_rows, num_cols, figsize=(10, 8))
+plt.subplots_adjust(hspace=0.25)
+
+# Autocovariance when phi = -0.8
+ax = axes[0]
+ax.plot(times, y1, 'bo-', alpha=0.6, label=r'$\gamma(k)$')
+ax.legend(loc='upper right')
+ax.set_xlim(0, 15)
+ax.set_yticks((-2, 0, 2))
+ax.hlines(0, 0, 15, linestyle='--', alpha=0.5)
+
+# Cycles at frequence pi
+ax = axes[1]
+ax.plot(times, y2, 'bo-', alpha=0.6, label=r'$\cos(\pi k)$')
+ax.legend(loc='upper right')
+ax.set_xlim(0, 15)
+ax.set_yticks((-1, 0, 1))
+ax.hlines(0, 0, 15, linestyle='--', alpha=0.5)
+
+# Product
+ax = axes[2]
+ax.stem(times, y3, label=r'$\gamma(k) \cos(\pi k)$')
+ax.legend(loc='upper right')
+ax.set_xlim((0, 15))
+ax.set_ylim(-3, 3)
+ax.set_yticks((-1, 0, 1, 2, 3))
+ax.hlines(0, 0, 15, linestyle='--', alpha=0.5)
+
+plt.show()
View
@@ -0,0 +1,23 @@
+"""
+Plots spectral density for AR(1) X' = phi X + epsilon
+"""
+import numpy as np
+import matplotlib.pyplot as plt
+
+def ar1_sd(phi, omega):
+ return 1 / (1 - 2 * phi * np.cos(omega) + phi**2)
+
+omegas = np.linspace(0, np.pi, 180)
+num_rows, num_cols = 2, 1
+fig, axes = plt.subplots(num_rows, num_cols, figsize=(10, 8))
+plt.subplots_adjust(hspace=0.4)
+# Autocovariance when phi = 0.8
+temp = r'spectral density, $\phi = {0:.2}$'
+for i, phi in enumerate((0.8, -0.8)):
+ ax = axes[i]
+ sd = ar1_sd(phi, omegas)
+ ax.plot(omegas, sd, 'b-', alpha=0.6, lw=2, label=temp.format(phi))
+ ax.legend(loc='upper center')
+ ax.set_xlabel('frequency')
+ ax.set_xlim((0, np.pi))
+plt.show()
View
@@ -0,0 +1,76 @@
+"""
+Origin: QE by Thomas J. Sargent and John Stachurski
+Filename: ar1sim.py
+LastModified: Thu May 15 09:26:01 EST 2014
+
+"""
+
+import numpy as np
+from scipy.stats import norm
+
+def proto1(a, b, sigma, T, num_reps, phi=norm.rvs):
+ X = np.zeros((num_reps, T+1))
+ for i in range(num_reps):
+ W = phi(size=T+1)
+ for t in range(1, T+1):
+ X[i, t] = a * X[i,t-1] + b + W[t]
+ return X
+
+
+def proto2(a, b, sigma, T, num_reps, x0=None, phi=norm.rvs):
+ """
+ More efficient, eliminates one loop.
+ """
+ if not x0 == None:
+ x0.shape = (num_reps, 1)
+ X[:, 0] = x0
+ W = phi(size=(num_reps, T+1))
+ X = np.zeros((num_reps, T+1))
+ for t in range(1, T+1):
+ X[:, t] = a * X[:,t-1] + b + W[:, t]
+ return X
+
+def ols_estimates(X):
+ num_reps, ts_length = X.shape
+ estimates = np.empty(num_reps)
+ for i in range(num_reps):
+ X_row = X[i,:].flatten()
+ x = X_row[:-1] # All but last one
+ y = X_row[1:] # All but first one
+ estimates[i] = np.dot(x, y) / np.dot(x, x)
+ return estimates
+
+def ope_estimates(X):
+ num_reps, ts_length = X.shape
+ estimates = np.empty(num_reps)
+ for i in range(num_reps):
+ x = X[i,:].flatten()
+ s2 = x.var()
+ estimates[i] = np.sqrt(1 - 1 / s2)
+ return estimates
+
+theta = 0.8
+num_reps = 100000
+n = 1000
+X_obs = proto2(theta, 0, 1, n, num_reps)
+
+if 0:
+ theta_hats = ols_estimates(X_obs)
+ r = np.sqrt(n) * (theta_hats - theta)
+ print "OLS Expected: {}".format(1 - theta**2)
+ print "OLS Realized: {}".format(r.var())
+
+if 0:
+ theta_hats = ope_estimates(X_obs)
+ r = np.sqrt(n) * (theta_hats - theta)
+ e = (1 - theta**2) * (1 + (1 - theta**2) / (2 * theta**2))
+ print "OPE Expected: {}".format(e)
+ print "OPE Realized: {}".format(r.var())
+
+s2_hats = X_obs.var(axis=1)
+r = np.sqrt(n) * (s2_hats - 1 / (1 - theta**2))
+e = 2 * (1 + theta**2) / (1 - theta**2)**3
+print "Expected: {}".format(e)
+print "Realized: {}".format(r.var())
+
+
File renamed without changes.
View
@@ -0,0 +1,21 @@
+import numpy as np
+import matplotlib.pyplot as plt
+from scipy.stats import binom
+
+fig, axes = plt.subplots(2, 2)
+plt.subplots_adjust(hspace=0.4)
+axes = axes.flatten()
+ns = [1, 2, 4, 8]
+dom = range(9)
+
+for ax, n in zip(axes, ns):
+ b = binom(n, 0.5)
+ ax.bar(dom, b.pmf(dom), alpha=0.6, align='center')
+ ax.set_xlim(-0.5, 8.5)
+ ax.set_ylim(0, 0.55)
+ ax.set_xticks(range(9))
+ ax.set_yticks((0, 0.2, 0.4))
+ ax.set_title(r'$n = {}$'.format(n))
+
+fig.show()
+
File renamed without changes.
File renamed without changes.
Oops, something went wrong.

0 comments on commit 1d5a8c0

Please sign in to comment.