In [1]:
%load_ext autoreload
%autoreload 2

In [2]:
import os
import sys
import numpy as np
from scipy.cluster import hierarchy
import matplotlib.pyplot as plt

In [3]:
MNM_nb_folder = os.path.join('..', '..', '..', 'side_project', 'network_builder')
sys.path.append(MNM_nb_folder)
python_lib_folder = os.path.join('..', '..', 'pylib')
sys.path.append(python_lib_folder)

In [4]:
from MNM_nb import *
import MNMAPI
from sDODE import *

In [5]:
data_folder = os.path.join('..', '..', '..', 'data', 'input_files_33net')

In [6]:
nb = MNM_network_builder()
nb.load_from_folder(data_folder)
O_dist = np.arange(3)
D_dist = np.arange(3)
usefuk_link_list = list(filter(lambda x: x.typ == 'CTM', nb.link_list))


MNM_config
MNM_pathtable

In [7]:
len(usefuk_link_list)


Out[7]:
24

In [8]:
num_observed_links = 18

In [9]:
config = dict()

config['use_link_flow'] = True
config['use_link_tt'] = False
config['link_flow_weight'] = 1
config['link_tt_weight'] = 1
config['num_data'] = 10
config['observed_links'] = list(map(lambda x: x.ID, np.random.choice(usefuk_link_list, num_observed_links)))
config['paths_list'] = list(range(nb.config.config_dict['FIXED']['num_path']))

In [10]:
num_interval = nb.config.config_dict['DTA']['max_interval']
theta = 0.01

In [11]:
sdode = SDODE(nb, config)
# true_q = sdode.init_demand_flow(init_scale = 50)
true_q_para = OD_parameter_server(sdode.demand_list, sdode.num_assign_interval)
true_q_para.construct(O_dist, D_dist)
true_q_para.initialize(mean_scale = 100, std_scale= 10, 
                        O_cov_scale = 5, D_cov_scale = 5)
true_q = np.concatenate(true_q_para.demand_mean_list)
old_f = np.zeros(num_interval * len(config['paths_list']))
num_iters = 100
P = sdode.nb.get_route_portion_matrix()
true_f = P.dot(true_q)
for i in range(num_iters):
    dta = sdode._run_simulation(true_f)
    path_cost = dta.get_path_tt(np.arange(0, sdode.num_loading_interval, sdode.ass_freq))
    sdode.assign_route_portions(path_cost, theta = theta)
    new_f = sdode.nb.get_route_portion_matrix().dot(true_q)
    true_f = np.float(i) / np.float(i+1) * true_f + np.float(1) / np.float(i+1) * new_f
#     print np.linalg.norm(true_f - old_f)
    old_f = true_f
    sdode.nb.update_demand_path(new_f)

In [12]:
assert (np.isclose(true_q.sum(), true_f.sum()))

In [13]:
dta = sdode._run_simulation(true_f)
true_P = sdode.nb.get_route_portion_matrix()
true_full_dar = sdode.get_full_dar(dta, true_f)
true_dar = true_full_dar[sdode.get_full_observed_link_index(),:]
true_x = true_dar.dot(true_f)
true_path_cost = dta.get_path_tt(np.arange(0, sdode.num_loading_interval, sdode.ass_freq))

In [ ]:


In [14]:
num_data = config['num_data']
data_dict = dict()
data_dict['link_flow'] = list()
sdode = SDODE(nb, config)
for i in range(config['num_data']):
    q_e, _ = true_q_para.forward()
    f_e = true_P.dot(q_e)
    dta = sdode._run_simulation(f_e)
    full_dar_e = sdode.get_full_dar(dta, f_e)
    dar_e = full_dar_e[sdode.get_full_observed_link_index(),:]
    x_e = dar_e.dot(f_e)
    link_df = pd.DataFrame(index = range(num_interval), columns = config['observed_links'], 
                           data = x_e.reshape((num_interval, len(config['observed_links']))) 
                               + np.random.randn(num_interval, len(config['observed_links'])) * 0.0)
    data_dict['link_flow'].append(link_df)

In [15]:
sdode.add_data(data_dict)

In [35]:
print "Start sovling"
q_para, loss_list1 = sdode.estimate_demand_cov(O_dist, D_dist, init_mean_scale = 1, 
                      init_std_scale = 0.1, init_O_cov_scale = 0.1,
                      init_D_cov_scale = 0.1, step_size = 1, theta = theta, max_epoch = 100,
                                  adagrad = True, known_path_cost = true_path_cost)


Start sovling
Epoch: 0 Loss: 696.197649618859
Epoch: 1 Loss: 633.1334877689294
Epoch: 2 Loss: 591.7481060617214
Epoch: 3 Loss: 542.2927678124782
Epoch: 4 Loss: 532.3493434629761
Epoch: 5 Loss: 495.8298299022932
Epoch: 6 Loss: 477.1167567199197
Epoch: 7 Loss: 453.37536011137564
Epoch: 8 Loss: 443.8990768824289
Epoch: 9 Loss: 437.57990860282945
Epoch: 10 Loss: 395.5014700273324
Epoch: 11 Loss: 390.7967780560429
Epoch: 12 Loss: 373.2028270695885
Epoch: 13 Loss: 362.08762320009794
Epoch: 14 Loss: 348.54197594714435
Epoch: 15 Loss: 346.53542562086113
Epoch: 16 Loss: 327.1058032314065
Epoch: 17 Loss: 319.19689236959505
Epoch: 18 Loss: 307.73114796108047
Epoch: 19 Loss: 311.0996159845828
Epoch: 20 Loss: 310.84922595143973
Epoch: 21 Loss: 287.166155027481
Epoch: 22 Loss: 279.9178775616917
Epoch: 23 Loss: 268.4549590484201
Epoch: 24 Loss: 279.1964002653981
Epoch: 25 Loss: 263.5921860925731
Epoch: 26 Loss: 255.16180806419396
Epoch: 27 Loss: 248.49851338017038
Epoch: 28 Loss: 258.50578455667477
Epoch: 29 Loss: 250.17587122086542
Epoch: 30 Loss: 237.39657512898157
Epoch: 31 Loss: 231.8732624307956
Epoch: 32 Loss: 241.09237893922136
Epoch: 33 Loss: 224.34351601516042
Epoch: 34 Loss: 221.16102680272184
Epoch: 35 Loss: 222.50709798608335
Epoch: 36 Loss: 220.4220586801426
Epoch: 37 Loss: 216.81969818140277
Epoch: 38 Loss: 216.5493620671588
Epoch: 39 Loss: 210.78156335023147
Epoch: 40 Loss: 211.49671449047827
Epoch: 41 Loss: 209.59139778775028
Epoch: 42 Loss: 200.63326205744525
Epoch: 43 Loss: 205.5384913143827
Epoch: 44 Loss: 198.8222062928241
Epoch: 45 Loss: 197.4489828228133
Epoch: 46 Loss: 199.05845158197013
Epoch: 47 Loss: 197.80085896365767
Epoch: 48 Loss: 188.3630931779568
Epoch: 49 Loss: 189.5425931726986
Epoch: 50 Loss: 180.80012794544717
Epoch: 51 Loss: 187.34981571521035
Epoch: 52 Loss: 182.90426031705732
Epoch: 53 Loss: 179.52834192816346
Epoch: 54 Loss: 178.3408790363374
Epoch: 55 Loss: 179.92926669646096
Epoch: 56 Loss: 176.72371971900526
Epoch: 57 Loss: 176.8862018196876
Epoch: 58 Loss: 174.1019616980738
Epoch: 59 Loss: 173.50848809323085
Epoch: 60 Loss: 174.011437476628
Epoch: 61 Loss: 173.825579162539
Epoch: 62 Loss: 169.05834256444388
Epoch: 63 Loss: 172.5591356293714
Epoch: 64 Loss: 170.11180094128616
Epoch: 65 Loss: 171.06576924197282
Epoch: 66 Loss: 168.61127216428744
Epoch: 67 Loss: 167.13894628171172
Epoch: 68 Loss: 169.26651177442812
Epoch: 69 Loss: 168.62093692062115
Epoch: 70 Loss: 165.61105925331117
Epoch: 71 Loss: 163.9743077311006
Epoch: 72 Loss: 164.80628313305482
Epoch: 73 Loss: 162.43989964415795
Epoch: 74 Loss: 165.86920087368088
Epoch: 75 Loss: 164.46158855261586
Epoch: 76 Loss: 163.51835169709256
Epoch: 77 Loss: 162.92355098161391
Epoch: 78 Loss: 161.08795442639678
Epoch: 79 Loss: 161.93670894034665
Epoch: 80 Loss: 155.7496747322719
Epoch: 81 Loss: 160.3835758727218
Epoch: 82 Loss: 158.78714580951652
Epoch: 83 Loss: 161.04641407207782
Epoch: 84 Loss: 157.03319558605253
Epoch: 85 Loss: 156.83647693042798
Epoch: 86 Loss: 157.7479750761379
Epoch: 87 Loss: 156.45494951313682
Epoch: 88 Loss: 156.70346677179833
Epoch: 89 Loss: 156.2995937548814
Epoch: 90 Loss: 155.12147411776223
Epoch: 91 Loss: 153.0943112741951
Epoch: 92 Loss: 154.01467657476098
Epoch: 93 Loss: 152.6544237194018
Epoch: 94 Loss: 156.64539752290239
Epoch: 95 Loss: 156.47617550869984
Epoch: 96 Loss: 155.1640230729338
Epoch: 97 Loss: 155.11290819224826
Epoch: 98 Loss: 156.03701652481624
Epoch: 99 Loss: 155.15062002112595

In [36]:
q_ee = np.concatenate(q_para.demand_mean_list)
P_ee = sdode.nb.get_route_portion_matrix()
f_ee = P_ee.dot(q_ee)
dta = sdode._run_simulation(f_ee)
full_dar_ee = sdode.get_full_dar(dta, f_ee)
dar_ee = full_dar_ee[sdode.get_full_observed_link_index(),:]
x_ee = dar_ee.dot(f_ee)

In [18]:
print "Start sovling"
q_e, loss_list2 = sdode.estimate_demand(init_scale = 0.1, step_size = 1, 
                      max_epoch = 100, adagrad = False,
                      theta = theta)


Start sovling
Epoch: 0 Loss: 733.7366294700763
Epoch: 1 Loss: 641.059297838323
Epoch: 2 Loss: 543.2696960177087
Epoch: 3 Loss: 448.45536581925927
Epoch: 4 Loss: 368.86893723134165
Epoch: 5 Loss: 311.89131345635326
Epoch: 6 Loss: 278.06212088296013
Epoch: 7 Loss: 253.9484380988255
Epoch: 8 Loss: 242.71914195364533
Epoch: 9 Loss: 227.7371181579029
Epoch: 10 Loss: 225.3571249910292
Epoch: 11 Loss: 215.58415645199162
Epoch: 12 Loss: 211.8904596339749
Epoch: 13 Loss: 210.23675663962308
Epoch: 14 Loss: 199.55884593938976
Epoch: 15 Loss: 189.58762024036122
Epoch: 16 Loss: 206.90858996534843
Epoch: 17 Loss: 199.79004324880597
Epoch: 18 Loss: 195.3626736442692
Epoch: 19 Loss: 196.13860679379687
Epoch: 20 Loss: 194.52372644707594
Epoch: 21 Loss: 199.2277903923478
Epoch: 22 Loss: 196.63124349224753
Epoch: 23 Loss: 201.84733434862582
Epoch: 24 Loss: 196.7815360882819
Epoch: 25 Loss: 198.11238457234015
Epoch: 26 Loss: 197.56593041639536
Epoch: 27 Loss: 196.64861211839246
Epoch: 28 Loss: 196.46853504061727
Epoch: 29 Loss: 193.15957670782012
Epoch: 30 Loss: 200.953856265799
Epoch: 31 Loss: 192.99404541284537
Epoch: 32 Loss: 194.85399693290287
Epoch: 33 Loss: 196.3113724978667
Epoch: 34 Loss: 190.8926608156836
Epoch: 35 Loss: 200.589739696659
Epoch: 36 Loss: 200.9643143561006
Epoch: 37 Loss: 190.59304951902337
Epoch: 38 Loss: 199.59461232278014
Epoch: 39 Loss: 194.47868109419701
Epoch: 40 Loss: 196.6830385578001
Epoch: 41 Loss: 196.74512007755453
Epoch: 42 Loss: 203.21962298137655
Epoch: 43 Loss: 197.93854300586742
Epoch: 44 Loss: 183.47884452434522
Epoch: 45 Loss: 201.25592725564633
Epoch: 46 Loss: 197.46529514292914
Epoch: 47 Loss: 192.03188177566884
Epoch: 48 Loss: 191.13136720712436
Epoch: 49 Loss: 194.17638773022986
Epoch: 50 Loss: 189.94562230242767
Epoch: 51 Loss: 196.51639051743464
Epoch: 52 Loss: 195.3136160291239
Epoch: 53 Loss: 190.17968882263892
Epoch: 54 Loss: 187.39933164992505
Epoch: 55 Loss: 205.84941581423686
Epoch: 56 Loss: 189.1876876422839
Epoch: 57 Loss: 203.97066537722833
Epoch: 58 Loss: 198.0381422926678
Epoch: 59 Loss: 197.1459797346484
Epoch: 60 Loss: 205.40372131981843
Epoch: 61 Loss: 202.6442693318019
Epoch: 62 Loss: 197.00535232243953
Epoch: 63 Loss: 208.65718362039442
Epoch: 64 Loss: 201.36008134029993
Epoch: 65 Loss: 188.59801144646417
Epoch: 66 Loss: 202.72747131861098
Epoch: 67 Loss: 197.67824840880945
Epoch: 68 Loss: 193.41080606818565
Epoch: 69 Loss: 197.8261379501564
Epoch: 70 Loss: 205.05113854598227
Epoch: 71 Loss: 194.26505322681152
Epoch: 72 Loss: 194.45768474620314
Epoch: 73 Loss: 200.82678574590207
Epoch: 74 Loss: 193.52009909927833
Epoch: 75 Loss: 202.13309840873194
Epoch: 76 Loss: 199.86530514273394
Epoch: 77 Loss: 186.29747184983293
Epoch: 78 Loss: 201.76130725092762
Epoch: 79 Loss: 203.28597156560755
Epoch: 80 Loss: 197.88213268114092
Epoch: 81 Loss: 202.72949056476253
Epoch: 82 Loss: 200.31705227625335
Epoch: 83 Loss: 201.68203315450666
Epoch: 84 Loss: 199.7744842816557
Epoch: 85 Loss: 196.6682071453624
Epoch: 86 Loss: 206.08023432208103
Epoch: 87 Loss: 203.9442320217198
Epoch: 88 Loss: 194.9872641823643
Epoch: 89 Loss: 196.89278497416075
Epoch: 90 Loss: 197.7521232595752
Epoch: 91 Loss: 202.0010003141089
Epoch: 92 Loss: 199.78838692504354
Epoch: 93 Loss: 192.94071348052665
Epoch: 94 Loss: 197.5754023373732
Epoch: 95 Loss: 196.7576807167514
Epoch: 96 Loss: 189.81745741722028
Epoch: 97 Loss: 199.61030591159835
Epoch: 98 Loss: 201.1277601333892
Epoch: 99 Loss: 199.19509053972322

In [19]:
P_e = sdode.nb.get_route_portion_matrix()
f_e = P_e.dot(q_e)
dta = sdode._run_simulation(f_e)
full_dar_e = sdode.get_full_dar(dta, f_e)
dar_e = full_dar_e[sdode.get_full_observed_link_index(),:]
x_e = dar_e.dot(f_e)

In [20]:
plt.figure(figsize = (16,9), dpi = 300)
plt.scatter(x_e, true_x)
plt.plot(range(100), range(100))
plt.show()



In [21]:
plt.figure(figsize = (16,9), dpi = 300)
plt.scatter(x_ee, true_x)
plt.plot(range(100), range(100))
plt.show()



In [22]:
plt.style.use('seaborn-poster')

In [37]:
fig, axes = plt.subplots(1,2,  figsize=(16, 9), dpi=300)
# plt.figure(num=None, figsize=(16, 9), dpi=300, facecolor='w', edgecolor='k')
axes[0].scatter(x_e, true_x, label = "Proposed direct solution", color = 'teal', marker = '*', s = 100)
axes[0].plot(range(350), range(350), label = "Convex optimization solution", color = 'gray')
axes[1].scatter(x_ee, true_x, label = "Proposed closed-form method", color = 'tomato', 
                marker = "^", s = 100)
axes[1].plot(range(350), range(350), label = "Convex optimization solution", color = 'gray')
# axes[1].plot(time_list2, gap_rec2, label = "Quadratic solver method", color = 'tomato')
# plt.ylabel("Equilibrium Gap")
# plt.xlabel("Iterations")
# plt.legend()
# plt.xlim([1, 100])
# axes[1].legend(loc='center left', bbox_to_anchor=(1, 0.5))
# axes[0].set_title('Path flow rate (vehs/15-min)')
# axes[1].set_title('Path choice probablity')
axes[0].set_ylabel('Estimated link flow')
axes[0].set_xlabel('True link flow')
axes[1].set_ylabel('Estimated link flow')
axes[1].set_xlabel('True observed link flow')
axes[0].set_xlim([0, 100])
axes[0].set_ylim([0, 100])
axes[1].set_xlim([0, 100])
axes[1].set_ylim([0, 100])

axes[0].set_title('Standard DODE')
axes[1].set_title('Structured DODE')

plt.show()



In [38]:
np.linalg.norm(x_ee - true_x)


Out[38]:
142.24865552967432

In [39]:
np.linalg.norm(x_e - true_x)


Out[39]:
204.20450533717386

In [40]:
from sklearn.metrics import r2_score
from scipy import stats
def r2(predictions, targets):
    y_bar = np.mean(targets)
    # diff = np.minimum(np.abs(predictions - targets), targets)
    diff = predictions - targets
    ss_e = np.sum(diff ** 2)
    ss_t = np.sum((targets) ** 2)
    return 1 - ss_e / ss_t

def rsquared(x, y):
    slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
    return r_value**2

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

def rmsn(predictions, targets):
    return np.sqrt(np.sum((predictions - targets) ** 2) * len(predictions)) / np.sum(targets)

In [41]:
rmsn(x_ee, true_x)


Out[41]:
0.23316058017321756

In [42]:
rmsn(x_e, true_x)


Out[42]:
0.3347127659035623

In [ ]: