Spaces:
Runtime error
Runtime error
Zai
commited on
Commit
·
06db6e9
1
Parent(s):
f0ce670
test
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- DataPreparation/1.tf_train.py +102 -0
- DataPreparation/2.data_train_converted.py +32 -0
- DataPreparation/3.rNum_train.py +20 -0
- DataPreparation/4.data_train_eNum.py +32 -0
- DataPreparation/5.data_test_converted.py +31 -0
- DataPreparation/6.cluster.py +38 -0
- DataPreparation/README.md +89 -0
- DataPreparation/config.py +1 -0
- DataPreparation/data/test.txt +2880 -0
- DataPreparation/data/train.txt +0 -0
- Dockerfile +21 -0
- Graph2plan +1 -0
- Interface/House/__init__.py +0 -0
- Interface/House/__pycache__/__init__.cpython-311.pyc +0 -0
- Interface/House/__pycache__/__init__.cpython-37.pyc +0 -0
- Interface/House/__pycache__/settings.cpython-311.pyc +0 -0
- Interface/House/__pycache__/settings.cpython-37.pyc +0 -0
- Interface/House/__pycache__/urls.cpython-311.pyc +0 -0
- Interface/House/__pycache__/urls.cpython-37.pyc +0 -0
- Interface/House/__pycache__/wsgi.cpython-37.pyc +0 -0
- Interface/House/asgi.py +16 -0
- Interface/House/settings.py +127 -0
- Interface/House/urls.py +37 -0
- Interface/House/wsgi.py +16 -0
- Interface/Houseweb/__init__.py +0 -0
- Interface/Houseweb/__pycache__/__init__.cpython-311.pyc +0 -0
- Interface/Houseweb/__pycache__/__init__.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/create.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/floorplan2.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/network.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/utils.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/utils1.cpython-37.pyc +0 -0
- Interface/Houseweb/__pycache__/views.cpython-311.pyc +0 -0
- Interface/Houseweb/__pycache__/views.cpython-37.pyc +0 -0
- Interface/Houseweb/admin.py +3 -0
- Interface/Houseweb/apps.py +5 -0
- Interface/Houseweb/migrations/__init__.py +0 -0
- Interface/Houseweb/models.py +3 -0
- Interface/Houseweb/tests.py +3 -0
- Interface/Houseweb/views.py +757 -0
- Interface/Img/data.mat.png +0 -0
- Interface/Img/data_test_converted.png +0 -0
- Interface/Img/data_train_converted.png +0 -0
- Interface/Img/interface.jpg +0 -0
- Interface/Img/paper.png +0 -0
- Interface/align_fp/align_adjacent_room3.m +121 -0
- Interface/align_fp/align_fp.m +108 -0
- Interface/align_fp/align_neighbor.m +53 -0
- Interface/align_fp/align_with_boundary.m +29 -0
- Interface/align_fp/find_close_seg.m +74 -0
DataPreparation/1.tf_train.py
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import pickle
|
3 |
+
import numpy as np
|
4 |
+
import scipy.io as sio
|
5 |
+
from config import data_path
|
6 |
+
from tqdm.auto import tqdm
|
7 |
+
|
8 |
+
def compute_tf(boundary):
|
9 |
+
'''
|
10 |
+
input: boundary points array (x,y,dir,isNew)
|
11 |
+
return: tf.x, tf.y
|
12 |
+
'''
|
13 |
+
if boundary.shape[1]>2:
|
14 |
+
boundary=boundary[:,:2]
|
15 |
+
boundary = np.concatenate((boundary,boundary[:1]))
|
16 |
+
num_point = len(boundary)-1
|
17 |
+
line_vector = boundary[1:]-boundary[:-1]
|
18 |
+
line_length = np.linalg.norm(line_vector,axis=1)
|
19 |
+
|
20 |
+
perimeter = line_length.sum()
|
21 |
+
line_vector = line_vector/perimeter
|
22 |
+
line_length = line_length/perimeter
|
23 |
+
|
24 |
+
angles = np.zeros(num_point)
|
25 |
+
for i in range(num_point):
|
26 |
+
z = np.cross(line_vector[i],line_vector[(i+1)%num_point])
|
27 |
+
sign = np.sign(z)
|
28 |
+
angles[i] = np.arccos(np.dot(line_vector[i],line_vector[(i+1)%num_point]))*sign
|
29 |
+
|
30 |
+
x = np.zeros(num_point+1)
|
31 |
+
y = np.zeros(num_point+1)
|
32 |
+
s = 0
|
33 |
+
for i in range(1,num_point+1):
|
34 |
+
x[i] = line_length[i-1]+x[i-1]
|
35 |
+
y[i-1] = angles[i-1]+s
|
36 |
+
s = y[i-1]
|
37 |
+
y[-1] = s
|
38 |
+
return x,y
|
39 |
+
|
40 |
+
def compute_tf_dist(tf1,tf2):
|
41 |
+
x = np.unique(np.concatenate((tf1['x'],tf2['x'])))
|
42 |
+
dist = 0
|
43 |
+
idx1,idx2 =0,0
|
44 |
+
for i in range(1,len(x)-1):
|
45 |
+
idx1 = idx1+(x[i]>tf1['x'][idx1+1])
|
46 |
+
idx2 = idx2+(x[i]>tf2['x'][idx2+1])
|
47 |
+
seg = x[i]-x[i-1]
|
48 |
+
d = abs(tf1['y'][idx1]-tf2['y'][idx2])
|
49 |
+
dist = dist+seg*d
|
50 |
+
seg = x[-1]-x[-2]
|
51 |
+
d = abs(tf1['y'][-1]-tf2['y'][-1])
|
52 |
+
dist = dist+seg*d
|
53 |
+
return dist
|
54 |
+
|
55 |
+
def sample_tf(x,y,ndim=1000):
|
56 |
+
'''
|
57 |
+
input: tf.x,tf.y, ndim
|
58 |
+
return: n-dim tf values
|
59 |
+
'''
|
60 |
+
t = np.linspace(0,1,ndim)
|
61 |
+
return np.piecewise(t,[t>=xx for xx in x],y)
|
62 |
+
|
63 |
+
# load data
|
64 |
+
data = sio.loadmat(data_path, squeeze_me=True, struct_as_record=False)['data']
|
65 |
+
data_dict = {d.name:d for d in data}
|
66 |
+
|
67 |
+
names_train = open('./data/train.txt').read().split('\n')
|
68 |
+
names_test = open('./data/test.txt').read().split('\n')
|
69 |
+
n_train = len(names_train)
|
70 |
+
n_test = len(names_test)
|
71 |
+
|
72 |
+
# turning function: training data
|
73 |
+
trainTF = []
|
74 |
+
tf_train = []
|
75 |
+
for i in tqdm(range(n_train)):
|
76 |
+
boundary = data_dict[names_train[i]].boundary
|
77 |
+
x,y = compute_tf(boundary)
|
78 |
+
trainTF.append({'x':x,'y':y})
|
79 |
+
pickle.dump(trainTF,open('./data/trainTF.pkl','wb'))
|
80 |
+
|
81 |
+
tf_train = []
|
82 |
+
for i in tqdm(range(n_train)):
|
83 |
+
x,y = trainTF[i]['x'],trainTF[i]['y']
|
84 |
+
tf_train.append(sample_tf(x,y))
|
85 |
+
tf_train = np.stack(tf_train,axis=0)
|
86 |
+
np.save('./data/tf_train.npy',tf_train)
|
87 |
+
|
88 |
+
# turning function: testing data
|
89 |
+
testTF = []
|
90 |
+
for i in tqdm(range(n_test)):
|
91 |
+
boundary = data_dict[names_test[i]].boundary
|
92 |
+
x,y = compute_tf(boundary)
|
93 |
+
testTF.append({'x':x,'y':y})
|
94 |
+
pickle.dump(testTF,open('./data/testTF.pkl','wb'))
|
95 |
+
|
96 |
+
# turning function distance: test-train
|
97 |
+
print('Computing turning function distance ... it will take a long time.')
|
98 |
+
D_test_train = np.zeros((n_test,n_train),dtype='float32')
|
99 |
+
for i in tqdm(range(n_test)):
|
100 |
+
for j in range(n_train):
|
101 |
+
D_test_train[i,j] = compute_tf_dist(testTF[i],trainTF[j])
|
102 |
+
np.save('./data/D_test_train.npy',D_test_train)
|
DataPreparation/2.data_train_converted.py
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
import pickle
|
3 |
+
import scipy.io as sio
|
4 |
+
from config import data_path
|
5 |
+
from tqdm.auto import tqdm
|
6 |
+
|
7 |
+
# load data
|
8 |
+
data = sio.loadmat(data_path, squeeze_me=True, struct_as_record=False)['data']
|
9 |
+
data_dict = {d.name:d for d in data}
|
10 |
+
|
11 |
+
names_train = open('./data/train.txt').read().split('\n')
|
12 |
+
n_train = len(names_train)
|
13 |
+
|
14 |
+
trainTF = pickle.load(open('./data/trainTF.pkl','rb'))
|
15 |
+
|
16 |
+
data_converted = []
|
17 |
+
|
18 |
+
for i in tqdm(range(n_train)):
|
19 |
+
d = data_dict[names_train[i]]
|
20 |
+
d_converted = {}
|
21 |
+
d_converted['name'] = d.name
|
22 |
+
d_converted['boundary'] = d.boundary
|
23 |
+
d_converted['box'] = np.concatenate([d.gtBoxNew,d.rType[:,None]],axis=-1)
|
24 |
+
d_converted['order'] = d.order
|
25 |
+
d_converted['edge'] = d.rEdge
|
26 |
+
d_converted['rBoundary'] = d.rBoundary
|
27 |
+
data_converted.append(d_converted)
|
28 |
+
|
29 |
+
sio.savemat('./data/data_train_converted.mat',{'data':data_converted,'nameList':names_train,'trainTF':trainTF})
|
30 |
+
data = sio.loadmat('./data/data_train_converted.mat', squeeze_me=True, struct_as_record=False)
|
31 |
+
pickle.dump(data,open('./data/data_train_converted.pkl','wb'))
|
32 |
+
|
DataPreparation/3.rNum_train.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
import numpy as np
|
3 |
+
import scipy.io as sio
|
4 |
+
from config import data_path
|
5 |
+
from tqdm.auto import tqdm
|
6 |
+
|
7 |
+
data = sio.loadmat(data_path, squeeze_me=True, struct_as_record=False)['data']
|
8 |
+
data_dict = {d.name:d for d in data}
|
9 |
+
|
10 |
+
names_train = open('./data/train.txt').read().split('\n')
|
11 |
+
n_train = len(names_train)
|
12 |
+
|
13 |
+
rNum = np.zeros((n_train,14),dtype='uint8')
|
14 |
+
for i in tqdm(range(n_train)):
|
15 |
+
rType = data_dict[names_train[i]].rType
|
16 |
+
for j in range(13):
|
17 |
+
rNum[i,j] = (rType==j).sum()
|
18 |
+
rNum[i,13] = rNum[i,[1,5,6,7,8]].sum()
|
19 |
+
|
20 |
+
np.save('./data/rNum_train.npy',rNum)
|
DataPreparation/4.data_train_eNum.py
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from os import rmdir
|
2 |
+
import numpy as np
|
3 |
+
import pickle
|
4 |
+
import scipy.io as sio
|
5 |
+
from tqdm.auto import tqdm
|
6 |
+
|
7 |
+
data = pickle.load(open('./data/data_train_converted.pkl','rb'))['data']
|
8 |
+
names_train = open('./data/train.txt').read().split('\n')
|
9 |
+
n_train = len(names_train)
|
10 |
+
|
11 |
+
eNum = np.zeros((n_train,25),dtype='uint8')
|
12 |
+
for i in tqdm(range(n_train)):
|
13 |
+
d = data[i]
|
14 |
+
rType = d.box[:,-1]
|
15 |
+
eType = rType[d.edge[:,:2]]
|
16 |
+
# classfication
|
17 |
+
rMap = np.array([1,2,3,4,1,2,2,2,2,5,1,6,1,10,7,8,9,10])-1 # matlab to python
|
18 |
+
edge = rMap[eType]
|
19 |
+
reorder = np.array([0,1,3,2,4,5])
|
20 |
+
edge = reorder[edge]
|
21 |
+
I = (edge[:,0]<=5)&(edge[:,0]>=1)&(edge[:,1]<=5)&(edge[:,1]>=1)
|
22 |
+
edge = edge[I,:]-1 # matlab to python
|
23 |
+
e = np.zeros((5,5),dtype='uint8')
|
24 |
+
for j in range(len(edge)):
|
25 |
+
e[edge[j,0],edge[j,1]] = e[edge[j,0],edge[j,1]]+1
|
26 |
+
if edge[j,0] != edge[j,1]:
|
27 |
+
e[edge[j,1],edge[j,0]] = e[edge[j,1],edge[j,0]]+1
|
28 |
+
|
29 |
+
eNum[i] = e.reshape(-1)
|
30 |
+
|
31 |
+
pickle.dump({'eNum':eNum},open('./data/data_train_eNum.pkl','wb'))
|
32 |
+
|
DataPreparation/5.data_test_converted.py
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
import pickle
|
3 |
+
import scipy.io as sio
|
4 |
+
from config import data_path
|
5 |
+
from tqdm.auto import tqdm
|
6 |
+
|
7 |
+
data = sio.loadmat(data_path, squeeze_me=True, struct_as_record=False)['data']
|
8 |
+
data_dict = {d.name:d for d in data}
|
9 |
+
testTF = pickle.load(open('./data/testTF.pkl','rb'))
|
10 |
+
rNum = np.load('./data/rNum_train.npy')
|
11 |
+
|
12 |
+
names_train = open('./data/train.txt').read().split('\n')
|
13 |
+
names_test = open('./data/test.txt').read().split('\n')
|
14 |
+
n_train = len(names_train)
|
15 |
+
n_test = len(names_test)
|
16 |
+
|
17 |
+
D = np.load('./data/D_test_train.npy')
|
18 |
+
data_converted = []
|
19 |
+
for i in tqdm(range(n_test)):
|
20 |
+
d = data_dict[names_test[i]]
|
21 |
+
d_converted = {}
|
22 |
+
d_converted['boundary'] = d.boundary
|
23 |
+
d_converted['tf'] = testTF[i]
|
24 |
+
topK = np.argsort(D[i])[:1000]
|
25 |
+
d_converted['topK'] = topK
|
26 |
+
d_converted['topK_rNum'] = rNum[topK]
|
27 |
+
data_converted.append(d_converted)
|
28 |
+
|
29 |
+
sio.savemat('./data/data_test_converted.mat',{'data':data_converted,'testNameList':names_test,'trainNameList':names_train})
|
30 |
+
data = sio.loadmat('./data/data_test_converted.mat', squeeze_me=True, struct_as_record=False)
|
31 |
+
pickle.dump(data,open('./data/data_test_converted.pkl','wb'))
|
DataPreparation/6.cluster.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pickle
|
2 |
+
import numpy as np
|
3 |
+
import faiss
|
4 |
+
from tqdm.auto import tqdm
|
5 |
+
|
6 |
+
def sample_tf(x,y,ndim=1000):
|
7 |
+
'''
|
8 |
+
input: tf.x,tf.y, ndim
|
9 |
+
return: n-dim tf values
|
10 |
+
'''
|
11 |
+
t = np.linspace(0,1,ndim)
|
12 |
+
return np.piecewise(t,[t>=xx for xx in x],y)
|
13 |
+
|
14 |
+
tf_train = pickle.load(open('./data/trainTF.pkl','rb'))
|
15 |
+
|
16 |
+
tf = []
|
17 |
+
for i in tqdm(range(len(tf_train))):
|
18 |
+
tf_i = tf_train[i]
|
19 |
+
tf.append(sample_tf(tf_i['x'],tf_i['y']))
|
20 |
+
|
21 |
+
d = 1000
|
22 |
+
tf = np.array(tf).astype(np.float32)
|
23 |
+
|
24 |
+
ncentroids = 1000
|
25 |
+
niter = 200
|
26 |
+
verbose = True
|
27 |
+
|
28 |
+
kmeans = faiss.Kmeans(d, ncentroids, niter=niter, verbose=verbose,gpu=True)
|
29 |
+
kmeans.train(tf)
|
30 |
+
centroids = kmeans.centroids
|
31 |
+
|
32 |
+
index = faiss.IndexFlatL2(d)
|
33 |
+
index.add(tf)
|
34 |
+
nNN = 1000
|
35 |
+
D, I = index.search (kmeans.centroids, nNN)
|
36 |
+
|
37 |
+
np.save(f'./data/centroids_train.npy',centroids)
|
38 |
+
np.save(f'./data/clusters_train.npy',I)
|
DataPreparation/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
**1. Data from RPLAN to Graph2Plan**
|
2 |
+
|
3 |
+
Please refer to https://github.com/zzilch/RPLAN-Toolbox.
|
4 |
+
You can also download the extracted data from [here](http://vcc.tech/file/upload_file/Data/G2P/Data.7z).
|
5 |
+
You can load the `Network/data/data.mat` in Matlab to chek the data structure.
|
6 |
+
|
7 |
+
![data.mat](../Interface/Img/data.mat.png)
|
8 |
+
|
9 |
+
Data fields:
|
10 |
+
|
11 |
+
- name: file name in RPLAN
|
12 |
+
- boundary: (x,y,dir,isNew)
|
13 |
+
- first two point indicate the front door.
|
14 |
+
- dir: 0(right)/1(down)/2(left)/3(up) for `dir`.
|
15 |
+
- `isNew` means the point is not a corner point (usually a point of door)
|
16 |
+
- order: room order, the larger one will cover the smaller one.
|
17 |
+
- rType: room categories
|
18 |
+
```
|
19 |
+
# index,name,type(private/public),floorTexture
|
20 |
+
room_label = [
|
21 |
+
(0, 'LivingRoom', 1, "PublicArea"),
|
22 |
+
(1, 'MasterRoom', 0, "Bedroom"),
|
23 |
+
(2, 'Kitchen', 1, "FunctionArea"),
|
24 |
+
(3, 'Bathroom', 0, "FunctionArea"),
|
25 |
+
(4, 'DiningRoom', 1, "FunctionArea"),
|
26 |
+
(5, 'ChildRoom', 0, "Bedroom"),
|
27 |
+
(6, 'StudyRoom', 0, "Bedroom"),
|
28 |
+
(7, 'SecondRoom', 0, "Bedroom"),
|
29 |
+
(8, 'GuestRoom', 0, "Bedroom"),
|
30 |
+
(9, 'Balcony', 1, "PublicArea"),
|
31 |
+
(10, 'Entrance', 1, "PublicArea"),
|
32 |
+
(11, 'Storage', 0, "PublicArea"),
|
33 |
+
(12, 'Wall-in', 0, "PublicArea"),
|
34 |
+
(13, 'External', 0, "External"),
|
35 |
+
(14, 'ExteriorWall', 0, "ExteriorWall"),
|
36 |
+
(15, 'FrontDoor', 0, "FrontDoor"),
|
37 |
+
(16, 'InteriorWall', 0, "InteriorWall"),
|
38 |
+
(17, 'InteriorDoor', 0, "InteriorDoor")
|
39 |
+
]
|
40 |
+
```
|
41 |
+
- rBoundary: (x,y), boundary points for each room
|
42 |
+
- gtBox: (y0,x0,y1,x1), min-max bounds of a room [RPLAN]
|
43 |
+
- gtBoxNew: (x0,y0,x1,y1), min-max bounds of a room [Graph2Plan]
|
44 |
+
- rEdge: (u,v,r), room indices and relative position(u relative to v)
|
45 |
+
```
|
46 |
+
edge_type = [
|
47 |
+
'left-above',
|
48 |
+
'left-below',
|
49 |
+
'left-of',
|
50 |
+
'above',
|
51 |
+
'inside',
|
52 |
+
'surrounding',
|
53 |
+
'below',
|
54 |
+
'right-of',
|
55 |
+
'right-above',
|
56 |
+
'right-below'
|
57 |
+
]
|
58 |
+
```
|
59 |
+
|
60 |
+
**2. Data from Network to GUI**
|
61 |
+
|
62 |
+
We provide scripts to create the same data as we provided in Interface. Like DeepLayout, we use 75k for training and about 3k for validation and test.
|
63 |
+
Started from the `Network/data/data.mat`:
|
64 |
+
|
65 |
+
0. Change the data path to the `data.mat` in `config.py`
|
66 |
+
1. Run `1.tf_train.py`. It will create:
|
67 |
+
- `trainTF.pkl`, `testTF.pkl`: Piecewise turning function. Each element is a dict like `{'x':[x0,...,xn],'y':[y0,...,yn]}`
|
68 |
+
- `tf_train.npy`: Sampled turning function with shape (ntrain,1000)
|
69 |
+
- `D_test_train.npy`: Truning function distance matrix with shape (ntest,ntrain)
|
70 |
+
2. Run `2.data_train_converted.py`. It will create:
|
71 |
+
- `data_train_converted.mat` & `data_train_converted.pkl`: The `.pkl` one Just a copy of the `.mat` re-dumped with pickle. The data have similar structure with `data.mat`.
|
72 |
+
- box:(x0,y0,x1,y1,room type)
|
73 |
+
![data_train_converted.mat](../Interface/Img/data_train_converted.png)
|
74 |
+
3. Run `3.rNum_train.py`. It wil create:
|
75 |
+
- `rNum_train.npy`: counts of different room type
|
76 |
+
4. Run `4.data_train_eNum.py`. It will create:
|
77 |
+
- `data_train_eNum.pkl`: A dict like {'eNum':Array with shape (ntrain,25)}. Each array is reshape from (5,5) which means adjacency matrix of 5 coarse room types.
|
78 |
+
5. Run `5.data_test_converted.py`. It will create:
|
79 |
+
- `data_train_converted.mat` & `data_train_converted.pkl`: The `.pkl` one Just a copy of the `.mat` re-dumped with pickle.
|
80 |
+
![data_test_converted.mat](../Interface/Img/data_test_converted.png)
|
81 |
+
|
82 |
+
Data fileds:
|
83 |
+
- boundary: (x,y,dir,isNew)
|
84 |
+
- tf: Piece with turning function
|
85 |
+
- topK: 1000 indices of the training data has the minimun turning function with current data.
|
86 |
+
- topK_rNum: Counts for differnt room type of each topK room
|
87 |
+
6. **[Depends on [faiss](https://github.com/facebookresearch/faiss)]** Run `6.cluster.py`. It will create:
|
88 |
+
- `centroids_train.npy`: 1000 discrete turning function cluster centroids (1000-d) of training data
|
89 |
+
- `clusters_train.npy`: 1000 nearest neighbors in training data of each centroid
|
DataPreparation/config.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
data_path = '../Network/data/data.mat'
|
DataPreparation/data/test.txt
ADDED
@@ -0,0 +1,2880 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
80598
|
2 |
+
59984
|
3 |
+
33887
|
4 |
+
34092
|
5 |
+
79214
|
6 |
+
57405
|
7 |
+
15948
|
8 |
+
80054
|
9 |
+
45590
|
10 |
+
38931
|
11 |
+
3669
|
12 |
+
37724
|
13 |
+
65752
|
14 |
+
60276
|
15 |
+
2984
|
16 |
+
80569
|
17 |
+
76155
|
18 |
+
48753
|
19 |
+
24276
|
20 |
+
7584
|
21 |
+
28372
|
22 |
+
73777
|
23 |
+
57560
|
24 |
+
17292
|
25 |
+
9556
|
26 |
+
38997
|
27 |
+
33494
|
28 |
+
22100
|
29 |
+
79282
|
30 |
+
39495
|
31 |
+
80341
|
32 |
+
55518
|
33 |
+
47396
|
34 |
+
41018
|
35 |
+
62007
|
36 |
+
34201
|
37 |
+
35453
|
38 |
+
55224
|
39 |
+
75548
|
40 |
+
78900
|
41 |
+
78527
|
42 |
+
56693
|
43 |
+
34171
|
44 |
+
68576
|
45 |
+
71577
|
46 |
+
49542
|
47 |
+
49298
|
48 |
+
12505
|
49 |
+
22946
|
50 |
+
6305
|
51 |
+
51086
|
52 |
+
49015
|
53 |
+
30845
|
54 |
+
5626
|
55 |
+
50299
|
56 |
+
41353
|
57 |
+
64436
|
58 |
+
24657
|
59 |
+
33774
|
60 |
+
40192
|
61 |
+
52774
|
62 |
+
58008
|
63 |
+
60345
|
64 |
+
32836
|
65 |
+
21207
|
66 |
+
60622
|
67 |
+
25366
|
68 |
+
68686
|
69 |
+
63879
|
70 |
+
66309
|
71 |
+
27186
|
72 |
+
14772
|
73 |
+
39276
|
74 |
+
38445
|
75 |
+
63572
|
76 |
+
54413
|
77 |
+
41517
|
78 |
+
47439
|
79 |
+
49481
|
80 |
+
67677
|
81 |
+
16557
|
82 |
+
3972
|
83 |
+
79384
|
84 |
+
15344
|
85 |
+
71566
|
86 |
+
30484
|
87 |
+
22276
|
88 |
+
18170
|
89 |
+
12214
|
90 |
+
30634
|
91 |
+
1169
|
92 |
+
26617
|
93 |
+
57520
|
94 |
+
13603
|
95 |
+
75321
|
96 |
+
62497
|
97 |
+
61479
|
98 |
+
20342
|
99 |
+
12691
|
100 |
+
80533
|
101 |
+
35072
|
102 |
+
16900
|
103 |
+
52093
|
104 |
+
4203
|
105 |
+
48247
|
106 |
+
46298
|
107 |
+
26966
|
108 |
+
48878
|
109 |
+
41244
|
110 |
+
11606
|
111 |
+
7422
|
112 |
+
34819
|
113 |
+
48698
|
114 |
+
32605
|
115 |
+
54429
|
116 |
+
30841
|
117 |
+
17175
|
118 |
+
57498
|
119 |
+
71265
|
120 |
+
77397
|
121 |
+
66111
|
122 |
+
57248
|
123 |
+
74683
|
124 |
+
67980
|
125 |
+
24269
|
126 |
+
75721
|
127 |
+
6255
|
128 |
+
6881
|
129 |
+
26692
|
130 |
+
830
|
131 |
+
35975
|
132 |
+
13073
|
133 |
+
30930
|
134 |
+
49242
|
135 |
+
49504
|
136 |
+
63284
|
137 |
+
5561
|
138 |
+
5909
|
139 |
+
70301
|
140 |
+
64523
|
141 |
+
27325
|
142 |
+
68392
|
143 |
+
29598
|
144 |
+
50565
|
145 |
+
68276
|
146 |
+
18426
|
147 |
+
36358
|
148 |
+
40864
|
149 |
+
40299
|
150 |
+
33935
|
151 |
+
77847
|
152 |
+
7544
|
153 |
+
43055
|
154 |
+
15604
|
155 |
+
79141
|
156 |
+
47835
|
157 |
+
2285
|
158 |
+
29808
|
159 |
+
78202
|
160 |
+
53409
|
161 |
+
49549
|
162 |
+
62338
|
163 |
+
62567
|
164 |
+
65617
|
165 |
+
73079
|
166 |
+
38544
|
167 |
+
53300
|
168 |
+
53474
|
169 |
+
2337
|
170 |
+
64310
|
171 |
+
23235
|
172 |
+
58666
|
173 |
+
21690
|
174 |
+
9406
|
175 |
+
69293
|
176 |
+
44389
|
177 |
+
23712
|
178 |
+
9168
|
179 |
+
20520
|
180 |
+
20352
|
181 |
+
12926
|
182 |
+
23824
|
183 |
+
73793
|
184 |
+
71245
|
185 |
+
64342
|
186 |
+
17839
|
187 |
+
24717
|
188 |
+
64830
|
189 |
+
49892
|
190 |
+
41414
|
191 |
+
34852
|
192 |
+
32725
|
193 |
+
58188
|
194 |
+
44522
|
195 |
+
39018
|
196 |
+
53937
|
197 |
+
65620
|
198 |
+
50588
|
199 |
+
19259
|
200 |
+
78801
|
201 |
+
5267
|
202 |
+
55251
|
203 |
+
48891
|
204 |
+
23839
|
205 |
+
34280
|
206 |
+
68738
|
207 |
+
44892
|
208 |
+
8355
|
209 |
+
6251
|
210 |
+
72376
|
211 |
+
17560
|
212 |
+
37714
|
213 |
+
13909
|
214 |
+
50557
|
215 |
+
9246
|
216 |
+
71545
|
217 |
+
69274
|
218 |
+
22858
|
219 |
+
36625
|
220 |
+
22941
|
221 |
+
67482
|
222 |
+
3760
|
223 |
+
56803
|
224 |
+
24250
|
225 |
+
64949
|
226 |
+
21840
|
227 |
+
30745
|
228 |
+
18820
|
229 |
+
23490
|
230 |
+
10218
|
231 |
+
35561
|
232 |
+
70554
|
233 |
+
40239
|
234 |
+
61987
|
235 |
+
77036
|
236 |
+
15162
|
237 |
+
69028
|
238 |
+
66232
|
239 |
+
5998
|
240 |
+
53577
|
241 |
+
30367
|
242 |
+
47454
|
243 |
+
29119
|
244 |
+
80124
|
245 |
+
5582
|
246 |
+
16648
|
247 |
+
30445
|
248 |
+
7906
|
249 |
+
50127
|
250 |
+
5660
|
251 |
+
50223
|
252 |
+
72333
|
253 |
+
59028
|
254 |
+
46164
|
255 |
+
19457
|
256 |
+
77489
|
257 |
+
14598
|
258 |
+
6433
|
259 |
+
68370
|
260 |
+
30789
|
261 |
+
45897
|
262 |
+
41351
|
263 |
+
78535
|
264 |
+
38055
|
265 |
+
66021
|
266 |
+
72715
|
267 |
+
38562
|
268 |
+
11963
|
269 |
+
75839
|
270 |
+
52223
|
271 |
+
38810
|
272 |
+
5358
|
273 |
+
31218
|
274 |
+
35302
|
275 |
+
64189
|
276 |
+
53439
|
277 |
+
1115
|
278 |
+
163
|
279 |
+
61794
|
280 |
+
37405
|
281 |
+
11632
|
282 |
+
6441
|
283 |
+
65615
|
284 |
+
19293
|
285 |
+
55060
|
286 |
+
33271
|
287 |
+
33556
|
288 |
+
45702
|
289 |
+
11023
|
290 |
+
66923
|
291 |
+
33573
|
292 |
+
70743
|
293 |
+
65659
|
294 |
+
8341
|
295 |
+
49116
|
296 |
+
51665
|
297 |
+
20259
|
298 |
+
59378
|
299 |
+
50527
|
300 |
+
5992
|
301 |
+
30502
|
302 |
+
69594
|
303 |
+
33040
|
304 |
+
49649
|
305 |
+
75870
|
306 |
+
57291
|
307 |
+
32302
|
308 |
+
4372
|
309 |
+
41491
|
310 |
+
77111
|
311 |
+
60146
|
312 |
+
49993
|
313 |
+
66860
|
314 |
+
6817
|
315 |
+
14616
|
316 |
+
38606
|
317 |
+
14665
|
318 |
+
11487
|
319 |
+
61656
|
320 |
+
29586
|
321 |
+
59307
|
322 |
+
45089
|
323 |
+
67118
|
324 |
+
59983
|
325 |
+
9721
|
326 |
+
33997
|
327 |
+
11518
|
328 |
+
32280
|
329 |
+
59135
|
330 |
+
63796
|
331 |
+
3275
|
332 |
+
37634
|
333 |
+
45981
|
334 |
+
79769
|
335 |
+
36119
|
336 |
+
76489
|
337 |
+
59018
|
338 |
+
37034
|
339 |
+
20491
|
340 |
+
72217
|
341 |
+
69437
|
342 |
+
10429
|
343 |
+
28838
|
344 |
+
52026
|
345 |
+
27673
|
346 |
+
61812
|
347 |
+
35446
|
348 |
+
58820
|
349 |
+
62099
|
350 |
+
45289
|
351 |
+
57930
|
352 |
+
9759
|
353 |
+
45183
|
354 |
+
78404
|
355 |
+
878
|
356 |
+
3856
|
357 |
+
55999
|
358 |
+
21825
|
359 |
+
16182
|
360 |
+
68493
|
361 |
+
77191
|
362 |
+
34223
|
363 |
+
35392
|
364 |
+
55620
|
365 |
+
29855
|
366 |
+
8512
|
367 |
+
1346
|
368 |
+
52068
|
369 |
+
4134
|
370 |
+
2739
|
371 |
+
48916
|
372 |
+
64775
|
373 |
+
58394
|
374 |
+
60278
|
375 |
+
41202
|
376 |
+
75471
|
377 |
+
45720
|
378 |
+
30572
|
379 |
+
1494
|
380 |
+
13919
|
381 |
+
48989
|
382 |
+
19207
|
383 |
+
22306
|
384 |
+
9417
|
385 |
+
33423
|
386 |
+
47560
|
387 |
+
25144
|
388 |
+
14479
|
389 |
+
57024
|
390 |
+
80162
|
391 |
+
41525
|
392 |
+
53246
|
393 |
+
20954
|
394 |
+
24279
|
395 |
+
54286
|
396 |
+
1502
|
397 |
+
12985
|
398 |
+
65391
|
399 |
+
52886
|
400 |
+
71262
|
401 |
+
72534
|
402 |
+
41808
|
403 |
+
50148
|
404 |
+
21602
|
405 |
+
29016
|
406 |
+
67047
|
407 |
+
1034
|
408 |
+
12256
|
409 |
+
15687
|
410 |
+
4497
|
411 |
+
11450
|
412 |
+
47155
|
413 |
+
69200
|
414 |
+
25673
|
415 |
+
68055
|
416 |
+
31828
|
417 |
+
65934
|
418 |
+
5193
|
419 |
+
58654
|
420 |
+
42289
|
421 |
+
55359
|
422 |
+
64182
|
423 |
+
73451
|
424 |
+
30416
|
425 |
+
52349
|
426 |
+
28525
|
427 |
+
65400
|
428 |
+
44292
|
429 |
+
41921
|
430 |
+
47755
|
431 |
+
68816
|
432 |
+
76014
|
433 |
+
80733
|
434 |
+
2612
|
435 |
+
50896
|
436 |
+
20589
|
437 |
+
72793
|
438 |
+
41927
|
439 |
+
30463
|
440 |
+
47569
|
441 |
+
44076
|
442 |
+
23135
|
443 |
+
35861
|
444 |
+
50332
|
445 |
+
55691
|
446 |
+
18364
|
447 |
+
19063
|
448 |
+
53781
|
449 |
+
45225
|
450 |
+
79878
|
451 |
+
45020
|
452 |
+
59208
|
453 |
+
69337
|
454 |
+
32962
|
455 |
+
31743
|
456 |
+
46751
|
457 |
+
7764
|
458 |
+
19664
|
459 |
+
58182
|
460 |
+
56044
|
461 |
+
68770
|
462 |
+
19711
|
463 |
+
4053
|
464 |
+
69209
|
465 |
+
75125
|
466 |
+
46258
|
467 |
+
12654
|
468 |
+
55570
|
469 |
+
78223
|
470 |
+
77751
|
471 |
+
37660
|
472 |
+
69983
|
473 |
+
78155
|
474 |
+
74020
|
475 |
+
54515
|
476 |
+
77551
|
477 |
+
43578
|
478 |
+
26826
|
479 |
+
1425
|
480 |
+
60406
|
481 |
+
80256
|
482 |
+
863
|
483 |
+
13759
|
484 |
+
28110
|
485 |
+
52189
|
486 |
+
55360
|
487 |
+
43847
|
488 |
+
65798
|
489 |
+
13195
|
490 |
+
14506
|
491 |
+
33443
|
492 |
+
18803
|
493 |
+
70805
|
494 |
+
10914
|
495 |
+
23678
|
496 |
+
48815
|
497 |
+
77442
|
498 |
+
47561
|
499 |
+
35260
|
500 |
+
31937
|
501 |
+
24721
|
502 |
+
59719
|
503 |
+
72583
|
504 |
+
9585
|
505 |
+
68052
|
506 |
+
24005
|
507 |
+
31470
|
508 |
+
27294
|
509 |
+
23845
|
510 |
+
738
|
511 |
+
29272
|
512 |
+
62482
|
513 |
+
43433
|
514 |
+
69714
|
515 |
+
74483
|
516 |
+
55871
|
517 |
+
75053
|
518 |
+
50282
|
519 |
+
72951
|
520 |
+
4422
|
521 |
+
75029
|
522 |
+
76419
|
523 |
+
7467
|
524 |
+
58524
|
525 |
+
9019
|
526 |
+
32868
|
527 |
+
65883
|
528 |
+
58730
|
529 |
+
35459
|
530 |
+
29843
|
531 |
+
21077
|
532 |
+
5438
|
533 |
+
35984
|
534 |
+
35905
|
535 |
+
59783
|
536 |
+
324
|
537 |
+
29875
|
538 |
+
13272
|
539 |
+
2849
|
540 |
+
55532
|
541 |
+
25431
|
542 |
+
61610
|
543 |
+
71035
|
544 |
+
62758
|
545 |
+
36166
|
546 |
+
57357
|
547 |
+
75678
|
548 |
+
45754
|
549 |
+
44324
|
550 |
+
11456
|
551 |
+
67397
|
552 |
+
29762
|
553 |
+
6508
|
554 |
+
2914
|
555 |
+
46273
|
556 |
+
8067
|
557 |
+
61508
|
558 |
+
65184
|
559 |
+
58772
|
560 |
+
39974
|
561 |
+
47970
|
562 |
+
50890
|
563 |
+
48349
|
564 |
+
65357
|
565 |
+
30438
|
566 |
+
65795
|
567 |
+
1310
|
568 |
+
29513
|
569 |
+
6379
|
570 |
+
18008
|
571 |
+
53109
|
572 |
+
67666
|
573 |
+
42815
|
574 |
+
11467
|
575 |
+
31982
|
576 |
+
75308
|
577 |
+
48953
|
578 |
+
39067
|
579 |
+
26443
|
580 |
+
33497
|
581 |
+
1650
|
582 |
+
29856
|
583 |
+
39772
|
584 |
+
66906
|
585 |
+
65279
|
586 |
+
59616
|
587 |
+
63165
|
588 |
+
25039
|
589 |
+
71796
|
590 |
+
11494
|
591 |
+
19245
|
592 |
+
72677
|
593 |
+
64502
|
594 |
+
32108
|
595 |
+
24895
|
596 |
+
48758
|
597 |
+
5954
|
598 |
+
66176
|
599 |
+
5550
|
600 |
+
23814
|
601 |
+
75440
|
602 |
+
784
|
603 |
+
45211
|
604 |
+
4809
|
605 |
+
1638
|
606 |
+
53375
|
607 |
+
42762
|
608 |
+
73928
|
609 |
+
48896
|
610 |
+
46987
|
611 |
+
74264
|
612 |
+
19751
|
613 |
+
22164
|
614 |
+
51157
|
615 |
+
42736
|
616 |
+
73388
|
617 |
+
47288
|
618 |
+
43873
|
619 |
+
46106
|
620 |
+
29860
|
621 |
+
65459
|
622 |
+
40576
|
623 |
+
61246
|
624 |
+
75348
|
625 |
+
57271
|
626 |
+
9034
|
627 |
+
68182
|
628 |
+
75993
|
629 |
+
66741
|
630 |
+
11375
|
631 |
+
54912
|
632 |
+
7321
|
633 |
+
7094
|
634 |
+
52840
|
635 |
+
71588
|
636 |
+
33375
|
637 |
+
75043
|
638 |
+
48443
|
639 |
+
72086
|
640 |
+
30694
|
641 |
+
31552
|
642 |
+
69725
|
643 |
+
62106
|
644 |
+
63614
|
645 |
+
80276
|
646 |
+
78653
|
647 |
+
57539
|
648 |
+
16380
|
649 |
+
24696
|
650 |
+
67190
|
651 |
+
9807
|
652 |
+
6690
|
653 |
+
61265
|
654 |
+
46309
|
655 |
+
33315
|
656 |
+
74008
|
657 |
+
75396
|
658 |
+
23084
|
659 |
+
45458
|
660 |
+
72553
|
661 |
+
68690
|
662 |
+
60394
|
663 |
+
28109
|
664 |
+
15003
|
665 |
+
53856
|
666 |
+
59173
|
667 |
+
60595
|
668 |
+
33896
|
669 |
+
21694
|
670 |
+
48206
|
671 |
+
9217
|
672 |
+
5041
|
673 |
+
7332
|
674 |
+
12508
|
675 |
+
31204
|
676 |
+
72388
|
677 |
+
2797
|
678 |
+
58172
|
679 |
+
27745
|
680 |
+
61383
|
681 |
+
48978
|
682 |
+
33960
|
683 |
+
31699
|
684 |
+
12656
|
685 |
+
59762
|
686 |
+
13138
|
687 |
+
66203
|
688 |
+
62221
|
689 |
+
61122
|
690 |
+
79726
|
691 |
+
1224
|
692 |
+
14061
|
693 |
+
72169
|
694 |
+
43111
|
695 |
+
76308
|
696 |
+
64863
|
697 |
+
44103
|
698 |
+
57358
|
699 |
+
44787
|
700 |
+
38411
|
701 |
+
27488
|
702 |
+
1243
|
703 |
+
5213
|
704 |
+
29206
|
705 |
+
36236
|
706 |
+
45123
|
707 |
+
71731
|
708 |
+
55887
|
709 |
+
44635
|
710 |
+
3892
|
711 |
+
64929
|
712 |
+
69057
|
713 |
+
46874
|
714 |
+
46466
|
715 |
+
15812
|
716 |
+
74242
|
717 |
+
78386
|
718 |
+
29387
|
719 |
+
56156
|
720 |
+
62630
|
721 |
+
23618
|
722 |
+
27569
|
723 |
+
50625
|
724 |
+
42690
|
725 |
+
60906
|
726 |
+
40196
|
727 |
+
29583
|
728 |
+
15853
|
729 |
+
15689
|
730 |
+
50511
|
731 |
+
9424
|
732 |
+
2381
|
733 |
+
40291
|
734 |
+
62179
|
735 |
+
59889
|
736 |
+
37962
|
737 |
+
27357
|
738 |
+
23920
|
739 |
+
16251
|
740 |
+
77426
|
741 |
+
56950
|
742 |
+
8336
|
743 |
+
57249
|
744 |
+
7832
|
745 |
+
38617
|
746 |
+
48715
|
747 |
+
29967
|
748 |
+
70902
|
749 |
+
71529
|
750 |
+
48289
|
751 |
+
79422
|
752 |
+
65756
|
753 |
+
4784
|
754 |
+
32057
|
755 |
+
44337
|
756 |
+
38161
|
757 |
+
6512
|
758 |
+
64166
|
759 |
+
55057
|
760 |
+
43735
|
761 |
+
10547
|
762 |
+
7833
|
763 |
+
78344
|
764 |
+
12467
|
765 |
+
15534
|
766 |
+
19023
|
767 |
+
55437
|
768 |
+
76749
|
769 |
+
4214
|
770 |
+
74597
|
771 |
+
1693
|
772 |
+
33097
|
773 |
+
19431
|
774 |
+
39422
|
775 |
+
74965
|
776 |
+
61696
|
777 |
+
18635
|
778 |
+
71223
|
779 |
+
55964
|
780 |
+
59112
|
781 |
+
4743
|
782 |
+
27983
|
783 |
+
7727
|
784 |
+
56481
|
785 |
+
49024
|
786 |
+
21612
|
787 |
+
61379
|
788 |
+
20069
|
789 |
+
41614
|
790 |
+
32258
|
791 |
+
75191
|
792 |
+
15606
|
793 |
+
6210
|
794 |
+
72514
|
795 |
+
62763
|
796 |
+
46345
|
797 |
+
12108
|
798 |
+
35204
|
799 |
+
38210
|
800 |
+
4108
|
801 |
+
60901
|
802 |
+
30289
|
803 |
+
70661
|
804 |
+
79968
|
805 |
+
51290
|
806 |
+
69412
|
807 |
+
44363
|
808 |
+
13438
|
809 |
+
65496
|
810 |
+
59423
|
811 |
+
41503
|
812 |
+
47158
|
813 |
+
3242
|
814 |
+
52684
|
815 |
+
67504
|
816 |
+
67277
|
817 |
+
3573
|
818 |
+
54121
|
819 |
+
35282
|
820 |
+
51547
|
821 |
+
65745
|
822 |
+
59918
|
823 |
+
76927
|
824 |
+
26392
|
825 |
+
60246
|
826 |
+
24824
|
827 |
+
64163
|
828 |
+
49114
|
829 |
+
79793
|
830 |
+
70098
|
831 |
+
29724
|
832 |
+
71244
|
833 |
+
29531
|
834 |
+
61464
|
835 |
+
53860
|
836 |
+
64402
|
837 |
+
39481
|
838 |
+
74135
|
839 |
+
4324
|
840 |
+
12340
|
841 |
+
6064
|
842 |
+
9634
|
843 |
+
40168
|
844 |
+
49436
|
845 |
+
19776
|
846 |
+
61612
|
847 |
+
71030
|
848 |
+
60841
|
849 |
+
48589
|
850 |
+
16502
|
851 |
+
60555
|
852 |
+
72662
|
853 |
+
57297
|
854 |
+
12430
|
855 |
+
74871
|
856 |
+
22837
|
857 |
+
12708
|
858 |
+
1107
|
859 |
+
68836
|
860 |
+
850
|
861 |
+
5989
|
862 |
+
71058
|
863 |
+
7954
|
864 |
+
62118
|
865 |
+
41682
|
866 |
+
59652
|
867 |
+
33138
|
868 |
+
67656
|
869 |
+
54009
|
870 |
+
31037
|
871 |
+
18486
|
872 |
+
4778
|
873 |
+
64817
|
874 |
+
30705
|
875 |
+
73564
|
876 |
+
21282
|
877 |
+
21109
|
878 |
+
22543
|
879 |
+
3419
|
880 |
+
16521
|
881 |
+
27380
|
882 |
+
40586
|
883 |
+
9501
|
884 |
+
26172
|
885 |
+
28360
|
886 |
+
77674
|
887 |
+
68270
|
888 |
+
37002
|
889 |
+
19914
|
890 |
+
38954
|
891 |
+
74210
|
892 |
+
1212
|
893 |
+
74508
|
894 |
+
10056
|
895 |
+
16622
|
896 |
+
42193
|
897 |
+
24936
|
898 |
+
59102
|
899 |
+
30020
|
900 |
+
36495
|
901 |
+
32713
|
902 |
+
76175
|
903 |
+
24589
|
904 |
+
52705
|
905 |
+
60987
|
906 |
+
14291
|
907 |
+
66618
|
908 |
+
76009
|
909 |
+
25971
|
910 |
+
79773
|
911 |
+
18566
|
912 |
+
78144
|
913 |
+
78351
|
914 |
+
57781
|
915 |
+
53983
|
916 |
+
49080
|
917 |
+
10161
|
918 |
+
15587
|
919 |
+
43457
|
920 |
+
62344
|
921 |
+
62867
|
922 |
+
56561
|
923 |
+
70993
|
924 |
+
56873
|
925 |
+
34953
|
926 |
+
61723
|
927 |
+
79049
|
928 |
+
10232
|
929 |
+
3989
|
930 |
+
4448
|
931 |
+
33365
|
932 |
+
22952
|
933 |
+
1208
|
934 |
+
27400
|
935 |
+
41548
|
936 |
+
10169
|
937 |
+
9603
|
938 |
+
20941
|
939 |
+
31033
|
940 |
+
26705
|
941 |
+
48739
|
942 |
+
75787
|
943 |
+
30073
|
944 |
+
42942
|
945 |
+
73120
|
946 |
+
50075
|
947 |
+
75713
|
948 |
+
22465
|
949 |
+
28234
|
950 |
+
9153
|
951 |
+
78810
|
952 |
+
7552
|
953 |
+
28793
|
954 |
+
38113
|
955 |
+
5094
|
956 |
+
46292
|
957 |
+
23181
|
958 |
+
9010
|
959 |
+
9706
|
960 |
+
47298
|
961 |
+
75343
|
962 |
+
77416
|
963 |
+
63068
|
964 |
+
33225
|
965 |
+
38682
|
966 |
+
24408
|
967 |
+
54974
|
968 |
+
15292
|
969 |
+
44170
|
970 |
+
26770
|
971 |
+
33190
|
972 |
+
45207
|
973 |
+
32708
|
974 |
+
24341
|
975 |
+
61932
|
976 |
+
527
|
977 |
+
48802
|
978 |
+
48546
|
979 |
+
76517
|
980 |
+
77129
|
981 |
+
67314
|
982 |
+
56310
|
983 |
+
6521
|
984 |
+
51449
|
985 |
+
66787
|
986 |
+
14210
|
987 |
+
315
|
988 |
+
70820
|
989 |
+
13383
|
990 |
+
53566
|
991 |
+
67370
|
992 |
+
45413
|
993 |
+
68172
|
994 |
+
50303
|
995 |
+
43362
|
996 |
+
45147
|
997 |
+
59699
|
998 |
+
23331
|
999 |
+
38713
|
1000 |
+
78611
|
1001 |
+
56576
|
1002 |
+
42342
|
1003 |
+
3051
|
1004 |
+
60867
|
1005 |
+
46805
|
1006 |
+
3790
|
1007 |
+
75614
|
1008 |
+
9592
|
1009 |
+
31809
|
1010 |
+
76432
|
1011 |
+
69968
|
1012 |
+
40881
|
1013 |
+
26923
|
1014 |
+
47225
|
1015 |
+
70091
|
1016 |
+
33372
|
1017 |
+
37465
|
1018 |
+
56848
|
1019 |
+
71469
|
1020 |
+
67890
|
1021 |
+
267
|
1022 |
+
5369
|
1023 |
+
21462
|
1024 |
+
63336
|
1025 |
+
49043
|
1026 |
+
38199
|
1027 |
+
15956
|
1028 |
+
74507
|
1029 |
+
45576
|
1030 |
+
78778
|
1031 |
+
3810
|
1032 |
+
13300
|
1033 |
+
31046
|
1034 |
+
3822
|
1035 |
+
60070
|
1036 |
+
65442
|
1037 |
+
57028
|
1038 |
+
23671
|
1039 |
+
11906
|
1040 |
+
48439
|
1041 |
+
26874
|
1042 |
+
38195
|
1043 |
+
56134
|
1044 |
+
64849
|
1045 |
+
77289
|
1046 |
+
70607
|
1047 |
+
112
|
1048 |
+
33765
|
1049 |
+
65926
|
1050 |
+
15305
|
1051 |
+
14647
|
1052 |
+
27398
|
1053 |
+
61333
|
1054 |
+
67983
|
1055 |
+
63422
|
1056 |
+
9601
|
1057 |
+
68618
|
1058 |
+
62852
|
1059 |
+
58382
|
1060 |
+
59093
|
1061 |
+
60125
|
1062 |
+
22270
|
1063 |
+
25615
|
1064 |
+
40806
|
1065 |
+
59799
|
1066 |
+
37554
|
1067 |
+
34554
|
1068 |
+
1311
|
1069 |
+
20290
|
1070 |
+
42058
|
1071 |
+
70682
|
1072 |
+
19724
|
1073 |
+
63248
|
1074 |
+
73356
|
1075 |
+
60831
|
1076 |
+
53231
|
1077 |
+
32186
|
1078 |
+
6712
|
1079 |
+
25485
|
1080 |
+
80445
|
1081 |
+
14599
|
1082 |
+
10370
|
1083 |
+
23226
|
1084 |
+
3622
|
1085 |
+
77862
|
1086 |
+
40324
|
1087 |
+
48035
|
1088 |
+
1458
|
1089 |
+
29934
|
1090 |
+
29510
|
1091 |
+
77540
|
1092 |
+
62514
|
1093 |
+
73718
|
1094 |
+
10489
|
1095 |
+
77898
|
1096 |
+
5754
|
1097 |
+
32570
|
1098 |
+
60895
|
1099 |
+
77245
|
1100 |
+
12570
|
1101 |
+
49724
|
1102 |
+
44254
|
1103 |
+
11894
|
1104 |
+
77758
|
1105 |
+
66093
|
1106 |
+
2022
|
1107 |
+
8616
|
1108 |
+
7284
|
1109 |
+
19665
|
1110 |
+
33951
|
1111 |
+
52690
|
1112 |
+
8066
|
1113 |
+
7087
|
1114 |
+
7536
|
1115 |
+
2436
|
1116 |
+
40198
|
1117 |
+
68750
|
1118 |
+
1021
|
1119 |
+
29142
|
1120 |
+
36656
|
1121 |
+
14129
|
1122 |
+
69159
|
1123 |
+
36161
|
1124 |
+
20114
|
1125 |
+
68694
|
1126 |
+
11092
|
1127 |
+
11398
|
1128 |
+
25305
|
1129 |
+
65576
|
1130 |
+
38663
|
1131 |
+
22070
|
1132 |
+
59473
|
1133 |
+
51257
|
1134 |
+
64113
|
1135 |
+
60213
|
1136 |
+
26280
|
1137 |
+
26622
|
1138 |
+
74677
|
1139 |
+
63958
|
1140 |
+
60123
|
1141 |
+
78701
|
1142 |
+
10868
|
1143 |
+
21360
|
1144 |
+
23929
|
1145 |
+
29607
|
1146 |
+
11432
|
1147 |
+
9143
|
1148 |
+
76214
|
1149 |
+
56276
|
1150 |
+
53370
|
1151 |
+
23910
|
1152 |
+
29010
|
1153 |
+
62461
|
1154 |
+
60848
|
1155 |
+
46907
|
1156 |
+
25497
|
1157 |
+
61934
|
1158 |
+
35601
|
1159 |
+
38423
|
1160 |
+
27189
|
1161 |
+
61797
|
1162 |
+
32190
|
1163 |
+
48332
|
1164 |
+
18848
|
1165 |
+
76211
|
1166 |
+
41438
|
1167 |
+
71247
|
1168 |
+
40120
|
1169 |
+
78470
|
1170 |
+
36859
|
1171 |
+
39523
|
1172 |
+
18079
|
1173 |
+
720
|
1174 |
+
32710
|
1175 |
+
53322
|
1176 |
+
44380
|
1177 |
+
2834
|
1178 |
+
55215
|
1179 |
+
72529
|
1180 |
+
39235
|
1181 |
+
50157
|
1182 |
+
74745
|
1183 |
+
6083
|
1184 |
+
45974
|
1185 |
+
60407
|
1186 |
+
34346
|
1187 |
+
75449
|
1188 |
+
5715
|
1189 |
+
5295
|
1190 |
+
49487
|
1191 |
+
52205
|
1192 |
+
78690
|
1193 |
+
61585
|
1194 |
+
77574
|
1195 |
+
27890
|
1196 |
+
41282
|
1197 |
+
20966
|
1198 |
+
61808
|
1199 |
+
44628
|
1200 |
+
60823
|
1201 |
+
13424
|
1202 |
+
66474
|
1203 |
+
58152
|
1204 |
+
32069
|
1205 |
+
44651
|
1206 |
+
74004
|
1207 |
+
24888
|
1208 |
+
17960
|
1209 |
+
49880
|
1210 |
+
19492
|
1211 |
+
56722
|
1212 |
+
27437
|
1213 |
+
20595
|
1214 |
+
15826
|
1215 |
+
58811
|
1216 |
+
35059
|
1217 |
+
71710
|
1218 |
+
54563
|
1219 |
+
7508
|
1220 |
+
68920
|
1221 |
+
39890
|
1222 |
+
4016
|
1223 |
+
26062
|
1224 |
+
50575
|
1225 |
+
67899
|
1226 |
+
31508
|
1227 |
+
64008
|
1228 |
+
28436
|
1229 |
+
33958
|
1230 |
+
73990
|
1231 |
+
25518
|
1232 |
+
41661
|
1233 |
+
59613
|
1234 |
+
21088
|
1235 |
+
44398
|
1236 |
+
27174
|
1237 |
+
13458
|
1238 |
+
12022
|
1239 |
+
55226
|
1240 |
+
70574
|
1241 |
+
71154
|
1242 |
+
7620
|
1243 |
+
77177
|
1244 |
+
80448
|
1245 |
+
62623
|
1246 |
+
66184
|
1247 |
+
40253
|
1248 |
+
65133
|
1249 |
+
66844
|
1250 |
+
30981
|
1251 |
+
30604
|
1252 |
+
73725
|
1253 |
+
14117
|
1254 |
+
35900
|
1255 |
+
69726
|
1256 |
+
37059
|
1257 |
+
32035
|
1258 |
+
37810
|
1259 |
+
9472
|
1260 |
+
62609
|
1261 |
+
57220
|
1262 |
+
51155
|
1263 |
+
49692
|
1264 |
+
11488
|
1265 |
+
63157
|
1266 |
+
43002
|
1267 |
+
6758
|
1268 |
+
19544
|
1269 |
+
25967
|
1270 |
+
28452
|
1271 |
+
52188
|
1272 |
+
18481
|
1273 |
+
27738
|
1274 |
+
19382
|
1275 |
+
63751
|
1276 |
+
38999
|
1277 |
+
73411
|
1278 |
+
73638
|
1279 |
+
74765
|
1280 |
+
26133
|
1281 |
+
27699
|
1282 |
+
56717
|
1283 |
+
62490
|
1284 |
+
30343
|
1285 |
+
13718
|
1286 |
+
30741
|
1287 |
+
55286
|
1288 |
+
594
|
1289 |
+
68718
|
1290 |
+
46302
|
1291 |
+
57656
|
1292 |
+
23612
|
1293 |
+
1149
|
1294 |
+
59908
|
1295 |
+
1923
|
1296 |
+
24355
|
1297 |
+
13515
|
1298 |
+
12729
|
1299 |
+
62861
|
1300 |
+
18694
|
1301 |
+
51409
|
1302 |
+
37031
|
1303 |
+
19504
|
1304 |
+
26580
|
1305 |
+
28736
|
1306 |
+
53170
|
1307 |
+
48339
|
1308 |
+
68788
|
1309 |
+
28489
|
1310 |
+
37047
|
1311 |
+
63590
|
1312 |
+
16509
|
1313 |
+
77013
|
1314 |
+
9384
|
1315 |
+
12628
|
1316 |
+
44655
|
1317 |
+
11262
|
1318 |
+
60499
|
1319 |
+
75075
|
1320 |
+
27105
|
1321 |
+
53057
|
1322 |
+
52870
|
1323 |
+
22121
|
1324 |
+
80589
|
1325 |
+
65678
|
1326 |
+
44216
|
1327 |
+
42936
|
1328 |
+
54616
|
1329 |
+
57578
|
1330 |
+
9311
|
1331 |
+
53142
|
1332 |
+
67518
|
1333 |
+
26398
|
1334 |
+
26440
|
1335 |
+
31155
|
1336 |
+
15896
|
1337 |
+
79153
|
1338 |
+
29709
|
1339 |
+
65117
|
1340 |
+
66669
|
1341 |
+
69634
|
1342 |
+
43460
|
1343 |
+
20694
|
1344 |
+
34046
|
1345 |
+
63457
|
1346 |
+
17016
|
1347 |
+
7096
|
1348 |
+
77383
|
1349 |
+
39903
|
1350 |
+
53855
|
1351 |
+
56861
|
1352 |
+
53331
|
1353 |
+
41590
|
1354 |
+
34752
|
1355 |
+
8937
|
1356 |
+
70011
|
1357 |
+
24498
|
1358 |
+
43936
|
1359 |
+
25788
|
1360 |
+
46649
|
1361 |
+
58415
|
1362 |
+
37247
|
1363 |
+
47380
|
1364 |
+
14186
|
1365 |
+
69972
|
1366 |
+
16768
|
1367 |
+
40171
|
1368 |
+
52732
|
1369 |
+
72560
|
1370 |
+
8469
|
1371 |
+
42676
|
1372 |
+
123
|
1373 |
+
57128
|
1374 |
+
62878
|
1375 |
+
55748
|
1376 |
+
28246
|
1377 |
+
78076
|
1378 |
+
16877
|
1379 |
+
63883
|
1380 |
+
45833
|
1381 |
+
26264
|
1382 |
+
6327
|
1383 |
+
51619
|
1384 |
+
17005
|
1385 |
+
24502
|
1386 |
+
19648
|
1387 |
+
38996
|
1388 |
+
78078
|
1389 |
+
26134
|
1390 |
+
20508
|
1391 |
+
75249
|
1392 |
+
79396
|
1393 |
+
49003
|
1394 |
+
6860
|
1395 |
+
77208
|
1396 |
+
72522
|
1397 |
+
20244
|
1398 |
+
49896
|
1399 |
+
1350
|
1400 |
+
74493
|
1401 |
+
49756
|
1402 |
+
25223
|
1403 |
+
13434
|
1404 |
+
76732
|
1405 |
+
22731
|
1406 |
+
67205
|
1407 |
+
66541
|
1408 |
+
66086
|
1409 |
+
12373
|
1410 |
+
32512
|
1411 |
+
40912
|
1412 |
+
76337
|
1413 |
+
77479
|
1414 |
+
12878
|
1415 |
+
42902
|
1416 |
+
51009
|
1417 |
+
69465
|
1418 |
+
71025
|
1419 |
+
12841
|
1420 |
+
71418
|
1421 |
+
17906
|
1422 |
+
47623
|
1423 |
+
38254
|
1424 |
+
8072
|
1425 |
+
14539
|
1426 |
+
73627
|
1427 |
+
44602
|
1428 |
+
69210
|
1429 |
+
63335
|
1430 |
+
61342
|
1431 |
+
48658
|
1432 |
+
62991
|
1433 |
+
58349
|
1434 |
+
55487
|
1435 |
+
19356
|
1436 |
+
9409
|
1437 |
+
7180
|
1438 |
+
51355
|
1439 |
+
70919
|
1440 |
+
49738
|
1441 |
+
21202
|
1442 |
+
20437
|
1443 |
+
33586
|
1444 |
+
13055
|
1445 |
+
29708
|
1446 |
+
49008
|
1447 |
+
62380
|
1448 |
+
42036
|
1449 |
+
68733
|
1450 |
+
4636
|
1451 |
+
35318
|
1452 |
+
24337
|
1453 |
+
70050
|
1454 |
+
37507
|
1455 |
+
42118
|
1456 |
+
18969
|
1457 |
+
66796
|
1458 |
+
27044
|
1459 |
+
60405
|
1460 |
+
65061
|
1461 |
+
73098
|
1462 |
+
69898
|
1463 |
+
67302
|
1464 |
+
3262
|
1465 |
+
21498
|
1466 |
+
80367
|
1467 |
+
29505
|
1468 |
+
21093
|
1469 |
+
11952
|
1470 |
+
34246
|
1471 |
+
12401
|
1472 |
+
39347
|
1473 |
+
8811
|
1474 |
+
42412
|
1475 |
+
25693
|
1476 |
+
49657
|
1477 |
+
68289
|
1478 |
+
66208
|
1479 |
+
44876
|
1480 |
+
20340
|
1481 |
+
6757
|
1482 |
+
36288
|
1483 |
+
13821
|
1484 |
+
48355
|
1485 |
+
8229
|
1486 |
+
7443
|
1487 |
+
54914
|
1488 |
+
54111
|
1489 |
+
59315
|
1490 |
+
17240
|
1491 |
+
69939
|
1492 |
+
51915
|
1493 |
+
8885
|
1494 |
+
27334
|
1495 |
+
76617
|
1496 |
+
10791
|
1497 |
+
64879
|
1498 |
+
32524
|
1499 |
+
53243
|
1500 |
+
43926
|
1501 |
+
29546
|
1502 |
+
50657
|
1503 |
+
50230
|
1504 |
+
16014
|
1505 |
+
63354
|
1506 |
+
59254
|
1507 |
+
63577
|
1508 |
+
49111
|
1509 |
+
75808
|
1510 |
+
14267
|
1511 |
+
27063
|
1512 |
+
28802
|
1513 |
+
32501
|
1514 |
+
33943
|
1515 |
+
68273
|
1516 |
+
20201
|
1517 |
+
36960
|
1518 |
+
71945
|
1519 |
+
70452
|
1520 |
+
33447
|
1521 |
+
55085
|
1522 |
+
51752
|
1523 |
+
80461
|
1524 |
+
55593
|
1525 |
+
42293
|
1526 |
+
30935
|
1527 |
+
25728
|
1528 |
+
16131
|
1529 |
+
15360
|
1530 |
+
66024
|
1531 |
+
80597
|
1532 |
+
38066
|
1533 |
+
42827
|
1534 |
+
46993
|
1535 |
+
45910
|
1536 |
+
25242
|
1537 |
+
36533
|
1538 |
+
62138
|
1539 |
+
37954
|
1540 |
+
72318
|
1541 |
+
76262
|
1542 |
+
23577
|
1543 |
+
78186
|
1544 |
+
27054
|
1545 |
+
18713
|
1546 |
+
67279
|
1547 |
+
31403
|
1548 |
+
6605
|
1549 |
+
19085
|
1550 |
+
444
|
1551 |
+
15012
|
1552 |
+
26662
|
1553 |
+
9857
|
1554 |
+
10423
|
1555 |
+
40620
|
1556 |
+
29070
|
1557 |
+
38341
|
1558 |
+
40077
|
1559 |
+
73241
|
1560 |
+
54714
|
1561 |
+
2859
|
1562 |
+
73082
|
1563 |
+
56695
|
1564 |
+
51612
|
1565 |
+
26787
|
1566 |
+
44639
|
1567 |
+
8252
|
1568 |
+
73741
|
1569 |
+
9535
|
1570 |
+
41087
|
1571 |
+
17050
|
1572 |
+
67577
|
1573 |
+
56367
|
1574 |
+
40081
|
1575 |
+
10531
|
1576 |
+
38594
|
1577 |
+
8936
|
1578 |
+
36144
|
1579 |
+
21833
|
1580 |
+
58285
|
1581 |
+
68034
|
1582 |
+
78682
|
1583 |
+
53904
|
1584 |
+
29928
|
1585 |
+
40980
|
1586 |
+
41405
|
1587 |
+
27671
|
1588 |
+
67948
|
1589 |
+
74029
|
1590 |
+
20374
|
1591 |
+
26888
|
1592 |
+
56691
|
1593 |
+
47880
|
1594 |
+
66995
|
1595 |
+
48861
|
1596 |
+
3566
|
1597 |
+
43007
|
1598 |
+
58335
|
1599 |
+
2057
|
1600 |
+
78892
|
1601 |
+
29680
|
1602 |
+
54081
|
1603 |
+
13172
|
1604 |
+
41546
|
1605 |
+
32230
|
1606 |
+
32148
|
1607 |
+
23418
|
1608 |
+
79416
|
1609 |
+
30929
|
1610 |
+
24716
|
1611 |
+
65440
|
1612 |
+
67120
|
1613 |
+
46605
|
1614 |
+
35998
|
1615 |
+
23508
|
1616 |
+
47913
|
1617 |
+
31124
|
1618 |
+
8314
|
1619 |
+
55492
|
1620 |
+
18249
|
1621 |
+
4572
|
1622 |
+
39439
|
1623 |
+
76017
|
1624 |
+
41216
|
1625 |
+
3151
|
1626 |
+
38757
|
1627 |
+
63420
|
1628 |
+
10583
|
1629 |
+
40893
|
1630 |
+
18238
|
1631 |
+
14795
|
1632 |
+
28151
|
1633 |
+
80179
|
1634 |
+
7301
|
1635 |
+
41584
|
1636 |
+
5951
|
1637 |
+
59923
|
1638 |
+
23686
|
1639 |
+
9243
|
1640 |
+
73016
|
1641 |
+
33390
|
1642 |
+
70118
|
1643 |
+
15227
|
1644 |
+
76552
|
1645 |
+
19403
|
1646 |
+
38036
|
1647 |
+
63235
|
1648 |
+
47888
|
1649 |
+
53946
|
1650 |
+
65830
|
1651 |
+
35646
|
1652 |
+
72460
|
1653 |
+
47800
|
1654 |
+
63605
|
1655 |
+
32805
|
1656 |
+
2133
|
1657 |
+
77380
|
1658 |
+
22702
|
1659 |
+
71902
|
1660 |
+
36725
|
1661 |
+
11814
|
1662 |
+
80245
|
1663 |
+
50155
|
1664 |
+
39825
|
1665 |
+
6099
|
1666 |
+
69704
|
1667 |
+
77685
|
1668 |
+
6148
|
1669 |
+
72588
|
1670 |
+
42139
|
1671 |
+
69653
|
1672 |
+
38630
|
1673 |
+
25508
|
1674 |
+
59262
|
1675 |
+
50271
|
1676 |
+
36751
|
1677 |
+
67139
|
1678 |
+
27963
|
1679 |
+
56724
|
1680 |
+
65208
|
1681 |
+
45213
|
1682 |
+
20839
|
1683 |
+
19989
|
1684 |
+
74226
|
1685 |
+
34286
|
1686 |
+
27992
|
1687 |
+
67921
|
1688 |
+
26720
|
1689 |
+
57670
|
1690 |
+
56106
|
1691 |
+
31692
|
1692 |
+
16101
|
1693 |
+
62459
|
1694 |
+
78841
|
1695 |
+
22235
|
1696 |
+
27674
|
1697 |
+
62708
|
1698 |
+
76622
|
1699 |
+
343
|
1700 |
+
1744
|
1701 |
+
30400
|
1702 |
+
11038
|
1703 |
+
21605
|
1704 |
+
59210
|
1705 |
+
35438
|
1706 |
+
26789
|
1707 |
+
41507
|
1708 |
+
67353
|
1709 |
+
28022
|
1710 |
+
54470
|
1711 |
+
75778
|
1712 |
+
47416
|
1713 |
+
5864
|
1714 |
+
77876
|
1715 |
+
32663
|
1716 |
+
54442
|
1717 |
+
69149
|
1718 |
+
67064
|
1719 |
+
8164
|
1720 |
+
64199
|
1721 |
+
2788
|
1722 |
+
53836
|
1723 |
+
53207
|
1724 |
+
65526
|
1725 |
+
11753
|
1726 |
+
49517
|
1727 |
+
14352
|
1728 |
+
25522
|
1729 |
+
61544
|
1730 |
+
3348
|
1731 |
+
75113
|
1732 |
+
26765
|
1733 |
+
63374
|
1734 |
+
57359
|
1735 |
+
11884
|
1736 |
+
41555
|
1737 |
+
15394
|
1738 |
+
56136
|
1739 |
+
64070
|
1740 |
+
6604
|
1741 |
+
79680
|
1742 |
+
75687
|
1743 |
+
6781
|
1744 |
+
51680
|
1745 |
+
42138
|
1746 |
+
2766
|
1747 |
+
14809
|
1748 |
+
77302
|
1749 |
+
35119
|
1750 |
+
71084
|
1751 |
+
65369
|
1752 |
+
3949
|
1753 |
+
72607
|
1754 |
+
69559
|
1755 |
+
6097
|
1756 |
+
70006
|
1757 |
+
989
|
1758 |
+
8334
|
1759 |
+
26195
|
1760 |
+
55193
|
1761 |
+
77351
|
1762 |
+
50947
|
1763 |
+
2108
|
1764 |
+
48939
|
1765 |
+
73162
|
1766 |
+
78465
|
1767 |
+
31551
|
1768 |
+
54231
|
1769 |
+
71947
|
1770 |
+
27482
|
1771 |
+
64097
|
1772 |
+
6166
|
1773 |
+
23571
|
1774 |
+
371
|
1775 |
+
17090
|
1776 |
+
34227
|
1777 |
+
36710
|
1778 |
+
26901
|
1779 |
+
45599
|
1780 |
+
61066
|
1781 |
+
38502
|
1782 |
+
2768
|
1783 |
+
54160
|
1784 |
+
79838
|
1785 |
+
74811
|
1786 |
+
34418
|
1787 |
+
8052
|
1788 |
+
61521
|
1789 |
+
45431
|
1790 |
+
58023
|
1791 |
+
1945
|
1792 |
+
75401
|
1793 |
+
7113
|
1794 |
+
52153
|
1795 |
+
29063
|
1796 |
+
6037
|
1797 |
+
7453
|
1798 |
+
45994
|
1799 |
+
78562
|
1800 |
+
63939
|
1801 |
+
65551
|
1802 |
+
47600
|
1803 |
+
14193
|
1804 |
+
42847
|
1805 |
+
57605
|
1806 |
+
16397
|
1807 |
+
40022
|
1808 |
+
36259
|
1809 |
+
33769
|
1810 |
+
41877
|
1811 |
+
27343
|
1812 |
+
57850
|
1813 |
+
9419
|
1814 |
+
28362
|
1815 |
+
31296
|
1816 |
+
65581
|
1817 |
+
17008
|
1818 |
+
4289
|
1819 |
+
77681
|
1820 |
+
57210
|
1821 |
+
23511
|
1822 |
+
3469
|
1823 |
+
71708
|
1824 |
+
4831
|
1825 |
+
22521
|
1826 |
+
67568
|
1827 |
+
30121
|
1828 |
+
55605
|
1829 |
+
23046
|
1830 |
+
24015
|
1831 |
+
7720
|
1832 |
+
2031
|
1833 |
+
79078
|
1834 |
+
22305
|
1835 |
+
65040
|
1836 |
+
17635
|
1837 |
+
35585
|
1838 |
+
21961
|
1839 |
+
33553
|
1840 |
+
40962
|
1841 |
+
34558
|
1842 |
+
67519
|
1843 |
+
42816
|
1844 |
+
41524
|
1845 |
+
26429
|
1846 |
+
13140
|
1847 |
+
5414
|
1848 |
+
3839
|
1849 |
+
45968
|
1850 |
+
4563
|
1851 |
+
50509
|
1852 |
+
9407
|
1853 |
+
80532
|
1854 |
+
54994
|
1855 |
+
16960
|
1856 |
+
4442
|
1857 |
+
70395
|
1858 |
+
38649
|
1859 |
+
78009
|
1860 |
+
20512
|
1861 |
+
51084
|
1862 |
+
75519
|
1863 |
+
28668
|
1864 |
+
76135
|
1865 |
+
27934
|
1866 |
+
10306
|
1867 |
+
19902
|
1868 |
+
52796
|
1869 |
+
46488
|
1870 |
+
72887
|
1871 |
+
53177
|
1872 |
+
70157
|
1873 |
+
38813
|
1874 |
+
23771
|
1875 |
+
15097
|
1876 |
+
44538
|
1877 |
+
44803
|
1878 |
+
76054
|
1879 |
+
60776
|
1880 |
+
43138
|
1881 |
+
58635
|
1882 |
+
64727
|
1883 |
+
76327
|
1884 |
+
37824
|
1885 |
+
78142
|
1886 |
+
17639
|
1887 |
+
48114
|
1888 |
+
47751
|
1889 |
+
21261
|
1890 |
+
21053
|
1891 |
+
20099
|
1892 |
+
74392
|
1893 |
+
14396
|
1894 |
+
9179
|
1895 |
+
65461
|
1896 |
+
12184
|
1897 |
+
13622
|
1898 |
+
10198
|
1899 |
+
56537
|
1900 |
+
63461
|
1901 |
+
10586
|
1902 |
+
36440
|
1903 |
+
76527
|
1904 |
+
54774
|
1905 |
+
15500
|
1906 |
+
8196
|
1907 |
+
32481
|
1908 |
+
13580
|
1909 |
+
17959
|
1910 |
+
59720
|
1911 |
+
26589
|
1912 |
+
29522
|
1913 |
+
71848
|
1914 |
+
73535
|
1915 |
+
70785
|
1916 |
+
13237
|
1917 |
+
48924
|
1918 |
+
18363
|
1919 |
+
12140
|
1920 |
+
10981
|
1921 |
+
17027
|
1922 |
+
54874
|
1923 |
+
13081
|
1924 |
+
59510
|
1925 |
+
18046
|
1926 |
+
46071
|
1927 |
+
51704
|
1928 |
+
32008
|
1929 |
+
52236
|
1930 |
+
54969
|
1931 |
+
13687
|
1932 |
+
37588
|
1933 |
+
64903
|
1934 |
+
79487
|
1935 |
+
29559
|
1936 |
+
3203
|
1937 |
+
61191
|
1938 |
+
31402
|
1939 |
+
30397
|
1940 |
+
19121
|
1941 |
+
48501
|
1942 |
+
68721
|
1943 |
+
6078
|
1944 |
+
32076
|
1945 |
+
6720
|
1946 |
+
17003
|
1947 |
+
80355
|
1948 |
+
59436
|
1949 |
+
46491
|
1950 |
+
50367
|
1951 |
+
38076
|
1952 |
+
39542
|
1953 |
+
11289
|
1954 |
+
47264
|
1955 |
+
60450
|
1956 |
+
25986
|
1957 |
+
30955
|
1958 |
+
28553
|
1959 |
+
33757
|
1960 |
+
45922
|
1961 |
+
34188
|
1962 |
+
30138
|
1963 |
+
43805
|
1964 |
+
29557
|
1965 |
+
59987
|
1966 |
+
20619
|
1967 |
+
65163
|
1968 |
+
52207
|
1969 |
+
828
|
1970 |
+
48256
|
1971 |
+
16140
|
1972 |
+
24444
|
1973 |
+
34832
|
1974 |
+
38402
|
1975 |
+
5191
|
1976 |
+
70967
|
1977 |
+
19705
|
1978 |
+
38085
|
1979 |
+
13344
|
1980 |
+
12574
|
1981 |
+
17402
|
1982 |
+
77462
|
1983 |
+
21052
|
1984 |
+
69169
|
1985 |
+
11690
|
1986 |
+
31132
|
1987 |
+
4058
|
1988 |
+
14326
|
1989 |
+
53514
|
1990 |
+
10703
|
1991 |
+
34006
|
1992 |
+
63496
|
1993 |
+
4789
|
1994 |
+
60519
|
1995 |
+
915
|
1996 |
+
27114
|
1997 |
+
11272
|
1998 |
+
28606
|
1999 |
+
71541
|
2000 |
+
12023
|
2001 |
+
31578
|
2002 |
+
13463
|
2003 |
+
34131
|
2004 |
+
33155
|
2005 |
+
27025
|
2006 |
+
73747
|
2007 |
+
75844
|
2008 |
+
52811
|
2009 |
+
47360
|
2010 |
+
79882
|
2011 |
+
74657
|
2012 |
+
43875
|
2013 |
+
76550
|
2014 |
+
68069
|
2015 |
+
10251
|
2016 |
+
62003
|
2017 |
+
49737
|
2018 |
+
6428
|
2019 |
+
32820
|
2020 |
+
79038
|
2021 |
+
9645
|
2022 |
+
30193
|
2023 |
+
44117
|
2024 |
+
66384
|
2025 |
+
51075
|
2026 |
+
19696
|
2027 |
+
37308
|
2028 |
+
42262
|
2029 |
+
73592
|
2030 |
+
39037
|
2031 |
+
54368
|
2032 |
+
52467
|
2033 |
+
57814
|
2034 |
+
25962
|
2035 |
+
77567
|
2036 |
+
46808
|
2037 |
+
19838
|
2038 |
+
35186
|
2039 |
+
50655
|
2040 |
+
40133
|
2041 |
+
45990
|
2042 |
+
79259
|
2043 |
+
33460
|
2044 |
+
18557
|
2045 |
+
37365
|
2046 |
+
61787
|
2047 |
+
66715
|
2048 |
+
9471
|
2049 |
+
27156
|
2050 |
+
15535
|
2051 |
+
53350
|
2052 |
+
34401
|
2053 |
+
69806
|
2054 |
+
6473
|
2055 |
+
27121
|
2056 |
+
23834
|
2057 |
+
24687
|
2058 |
+
19817
|
2059 |
+
22333
|
2060 |
+
73139
|
2061 |
+
11766
|
2062 |
+
10408
|
2063 |
+
59220
|
2064 |
+
4507
|
2065 |
+
31288
|
2066 |
+
31778
|
2067 |
+
20377
|
2068 |
+
39050
|
2069 |
+
18521
|
2070 |
+
9636
|
2071 |
+
69211
|
2072 |
+
71416
|
2073 |
+
22485
|
2074 |
+
37470
|
2075 |
+
44917
|
2076 |
+
62740
|
2077 |
+
62074
|
2078 |
+
25840
|
2079 |
+
62117
|
2080 |
+
26096
|
2081 |
+
3096
|
2082 |
+
75311
|
2083 |
+
6630
|
2084 |
+
25597
|
2085 |
+
35231
|
2086 |
+
28336
|
2087 |
+
48182
|
2088 |
+
28857
|
2089 |
+
76902
|
2090 |
+
51337
|
2091 |
+
44746
|
2092 |
+
23640
|
2093 |
+
31762
|
2094 |
+
46104
|
2095 |
+
66975
|
2096 |
+
4275
|
2097 |
+
58847
|
2098 |
+
71022
|
2099 |
+
59939
|
2100 |
+
46634
|
2101 |
+
50874
|
2102 |
+
41959
|
2103 |
+
21399
|
2104 |
+
64009
|
2105 |
+
26767
|
2106 |
+
48323
|
2107 |
+
19223
|
2108 |
+
76075
|
2109 |
+
20832
|
2110 |
+
17825
|
2111 |
+
62681
|
2112 |
+
25889
|
2113 |
+
71838
|
2114 |
+
26569
|
2115 |
+
36984
|
2116 |
+
29338
|
2117 |
+
18824
|
2118 |
+
73015
|
2119 |
+
56697
|
2120 |
+
5059
|
2121 |
+
16308
|
2122 |
+
63845
|
2123 |
+
43672
|
2124 |
+
64084
|
2125 |
+
70763
|
2126 |
+
26122
|
2127 |
+
14629
|
2128 |
+
66142
|
2129 |
+
29043
|
2130 |
+
29453
|
2131 |
+
45728
|
2132 |
+
36470
|
2133 |
+
50844
|
2134 |
+
38426
|
2135 |
+
5004
|
2136 |
+
49214
|
2137 |
+
2990
|
2138 |
+
1608
|
2139 |
+
52860
|
2140 |
+
44234
|
2141 |
+
68386
|
2142 |
+
13145
|
2143 |
+
60938
|
2144 |
+
79089
|
2145 |
+
38413
|
2146 |
+
9493
|
2147 |
+
77780
|
2148 |
+
18859
|
2149 |
+
3522
|
2150 |
+
35451
|
2151 |
+
62127
|
2152 |
+
27709
|
2153 |
+
10440
|
2154 |
+
70730
|
2155 |
+
80449
|
2156 |
+
79387
|
2157 |
+
5514
|
2158 |
+
24473
|
2159 |
+
30451
|
2160 |
+
76855
|
2161 |
+
730
|
2162 |
+
52102
|
2163 |
+
48199
|
2164 |
+
18695
|
2165 |
+
49561
|
2166 |
+
9043
|
2167 |
+
18400
|
2168 |
+
62827
|
2169 |
+
50292
|
2170 |
+
62136
|
2171 |
+
37387
|
2172 |
+
15731
|
2173 |
+
820
|
2174 |
+
34243
|
2175 |
+
42480
|
2176 |
+
56701
|
2177 |
+
78028
|
2178 |
+
21501
|
2179 |
+
32476
|
2180 |
+
22961
|
2181 |
+
23523
|
2182 |
+
38287
|
2183 |
+
62910
|
2184 |
+
15770
|
2185 |
+
25742
|
2186 |
+
59386
|
2187 |
+
48562
|
2188 |
+
74441
|
2189 |
+
77033
|
2190 |
+
37025
|
2191 |
+
53041
|
2192 |
+
75618
|
2193 |
+
28608
|
2194 |
+
41543
|
2195 |
+
44818
|
2196 |
+
70498
|
2197 |
+
54741
|
2198 |
+
31341
|
2199 |
+
16800
|
2200 |
+
27695
|
2201 |
+
59581
|
2202 |
+
48296
|
2203 |
+
18348
|
2204 |
+
11271
|
2205 |
+
31763
|
2206 |
+
10417
|
2207 |
+
67092
|
2208 |
+
47547
|
2209 |
+
3752
|
2210 |
+
7368
|
2211 |
+
3751
|
2212 |
+
64648
|
2213 |
+
56052
|
2214 |
+
10473
|
2215 |
+
24804
|
2216 |
+
31020
|
2217 |
+
79918
|
2218 |
+
5458
|
2219 |
+
31084
|
2220 |
+
4757
|
2221 |
+
62298
|
2222 |
+
36997
|
2223 |
+
1282
|
2224 |
+
58739
|
2225 |
+
36689
|
2226 |
+
46044
|
2227 |
+
69099
|
2228 |
+
57984
|
2229 |
+
26927
|
2230 |
+
7221
|
2231 |
+
2596
|
2232 |
+
9569
|
2233 |
+
10435
|
2234 |
+
72368
|
2235 |
+
27626
|
2236 |
+
66551
|
2237 |
+
24511
|
2238 |
+
74539
|
2239 |
+
54130
|
2240 |
+
47935
|
2241 |
+
30554
|
2242 |
+
16378
|
2243 |
+
74101
|
2244 |
+
51983
|
2245 |
+
62779
|
2246 |
+
44931
|
2247 |
+
20581
|
2248 |
+
20110
|
2249 |
+
58227
|
2250 |
+
74113
|
2251 |
+
76269
|
2252 |
+
30944
|
2253 |
+
16389
|
2254 |
+
18028
|
2255 |
+
69246
|
2256 |
+
42962
|
2257 |
+
37727
|
2258 |
+
26231
|
2259 |
+
18738
|
2260 |
+
38702
|
2261 |
+
71841
|
2262 |
+
6498
|
2263 |
+
59610
|
2264 |
+
34325
|
2265 |
+
34316
|
2266 |
+
25148
|
2267 |
+
50522
|
2268 |
+
32063
|
2269 |
+
64387
|
2270 |
+
40162
|
2271 |
+
45193
|
2272 |
+
33237
|
2273 |
+
31411
|
2274 |
+
18791
|
2275 |
+
7621
|
2276 |
+
543
|
2277 |
+
59314
|
2278 |
+
28866
|
2279 |
+
73751
|
2280 |
+
32526
|
2281 |
+
75802
|
2282 |
+
34438
|
2283 |
+
77509
|
2284 |
+
64469
|
2285 |
+
12059
|
2286 |
+
75770
|
2287 |
+
73952
|
2288 |
+
80268
|
2289 |
+
4104
|
2290 |
+
28516
|
2291 |
+
22829
|
2292 |
+
12834
|
2293 |
+
70679
|
2294 |
+
482
|
2295 |
+
80703
|
2296 |
+
79527
|
2297 |
+
14623
|
2298 |
+
12790
|
2299 |
+
12712
|
2300 |
+
49391
|
2301 |
+
60696
|
2302 |
+
274
|
2303 |
+
23521
|
2304 |
+
4906
|
2305 |
+
2462
|
2306 |
+
52002
|
2307 |
+
59476
|
2308 |
+
77362
|
2309 |
+
24413
|
2310 |
+
29604
|
2311 |
+
60288
|
2312 |
+
77427
|
2313 |
+
42782
|
2314 |
+
27877
|
2315 |
+
40557
|
2316 |
+
21221
|
2317 |
+
22427
|
2318 |
+
36941
|
2319 |
+
32738
|
2320 |
+
35359
|
2321 |
+
61552
|
2322 |
+
6214
|
2323 |
+
9941
|
2324 |
+
70443
|
2325 |
+
8160
|
2326 |
+
28302
|
2327 |
+
55709
|
2328 |
+
66854
|
2329 |
+
68563
|
2330 |
+
71988
|
2331 |
+
60514
|
2332 |
+
9782
|
2333 |
+
44481
|
2334 |
+
16195
|
2335 |
+
51651
|
2336 |
+
54559
|
2337 |
+
72733
|
2338 |
+
7996
|
2339 |
+
60711
|
2340 |
+
10657
|
2341 |
+
21535
|
2342 |
+
38944
|
2343 |
+
563
|
2344 |
+
57553
|
2345 |
+
54227
|
2346 |
+
40478
|
2347 |
+
59576
|
2348 |
+
52672
|
2349 |
+
60505
|
2350 |
+
30449
|
2351 |
+
49829
|
2352 |
+
52170
|
2353 |
+
31636
|
2354 |
+
62083
|
2355 |
+
41125
|
2356 |
+
75369
|
2357 |
+
6585
|
2358 |
+
75219
|
2359 |
+
72689
|
2360 |
+
45972
|
2361 |
+
50023
|
2362 |
+
78278
|
2363 |
+
73608
|
2364 |
+
24357
|
2365 |
+
57650
|
2366 |
+
71087
|
2367 |
+
56439
|
2368 |
+
13058
|
2369 |
+
50187
|
2370 |
+
35416
|
2371 |
+
69597
|
2372 |
+
58584
|
2373 |
+
66259
|
2374 |
+
7491
|
2375 |
+
65360
|
2376 |
+
75314
|
2377 |
+
821
|
2378 |
+
18332
|
2379 |
+
1711
|
2380 |
+
23794
|
2381 |
+
14354
|
2382 |
+
61257
|
2383 |
+
16980
|
2384 |
+
24627
|
2385 |
+
37079
|
2386 |
+
54852
|
2387 |
+
44977
|
2388 |
+
50079
|
2389 |
+
69527
|
2390 |
+
61641
|
2391 |
+
49762
|
2392 |
+
66310
|
2393 |
+
70433
|
2394 |
+
3353
|
2395 |
+
70825
|
2396 |
+
8579
|
2397 |
+
76251
|
2398 |
+
44063
|
2399 |
+
14777
|
2400 |
+
63385
|
2401 |
+
65840
|
2402 |
+
13926
|
2403 |
+
51683
|
2404 |
+
28867
|
2405 |
+
59584
|
2406 |
+
24007
|
2407 |
+
67825
|
2408 |
+
2333
|
2409 |
+
75009
|
2410 |
+
26025
|
2411 |
+
20768
|
2412 |
+
39768
|
2413 |
+
67349
|
2414 |
+
861
|
2415 |
+
68222
|
2416 |
+
35865
|
2417 |
+
46997
|
2418 |
+
46337
|
2419 |
+
51607
|
2420 |
+
15903
|
2421 |
+
9506
|
2422 |
+
69980
|
2423 |
+
64110
|
2424 |
+
7769
|
2425 |
+
50912
|
2426 |
+
38212
|
2427 |
+
52069
|
2428 |
+
41820
|
2429 |
+
38003
|
2430 |
+
67958
|
2431 |
+
42897
|
2432 |
+
31494
|
2433 |
+
17309
|
2434 |
+
32461
|
2435 |
+
36202
|
2436 |
+
16042
|
2437 |
+
60928
|
2438 |
+
26273
|
2439 |
+
60780
|
2440 |
+
1381
|
2441 |
+
58595
|
2442 |
+
54532
|
2443 |
+
58552
|
2444 |
+
57345
|
2445 |
+
5680
|
2446 |
+
64941
|
2447 |
+
61645
|
2448 |
+
80273
|
2449 |
+
43461
|
2450 |
+
12079
|
2451 |
+
1680
|
2452 |
+
51251
|
2453 |
+
80244
|
2454 |
+
77863
|
2455 |
+
17236
|
2456 |
+
24878
|
2457 |
+
45430
|
2458 |
+
16830
|
2459 |
+
67839
|
2460 |
+
1319
|
2461 |
+
71663
|
2462 |
+
12093
|
2463 |
+
35676
|
2464 |
+
16539
|
2465 |
+
53250
|
2466 |
+
2628
|
2467 |
+
39089
|
2468 |
+
35090
|
2469 |
+
53686
|
2470 |
+
46459
|
2471 |
+
17739
|
2472 |
+
9256
|
2473 |
+
22366
|
2474 |
+
54259
|
2475 |
+
39090
|
2476 |
+
20666
|
2477 |
+
25709
|
2478 |
+
34698
|
2479 |
+
13232
|
2480 |
+
6691
|
2481 |
+
54136
|
2482 |
+
1413
|
2483 |
+
79483
|
2484 |
+
10756
|
2485 |
+
74962
|
2486 |
+
79645
|
2487 |
+
13803
|
2488 |
+
16293
|
2489 |
+
45189
|
2490 |
+
64463
|
2491 |
+
27257
|
2492 |
+
45797
|
2493 |
+
28976
|
2494 |
+
2568
|
2495 |
+
11812
|
2496 |
+
43290
|
2497 |
+
43334
|
2498 |
+
62500
|
2499 |
+
22862
|
2500 |
+
73662
|
2501 |
+
60989
|
2502 |
+
71471
|
2503 |
+
49924
|
2504 |
+
12662
|
2505 |
+
60943
|
2506 |
+
25229
|
2507 |
+
21062
|
2508 |
+
13544
|
2509 |
+
63619
|
2510 |
+
2941
|
2511 |
+
9031
|
2512 |
+
6737
|
2513 |
+
19453
|
2514 |
+
16928
|
2515 |
+
78431
|
2516 |
+
28674
|
2517 |
+
5001
|
2518 |
+
37639
|
2519 |
+
36585
|
2520 |
+
23793
|
2521 |
+
71163
|
2522 |
+
75182
|
2523 |
+
22897
|
2524 |
+
62553
|
2525 |
+
28471
|
2526 |
+
13744
|
2527 |
+
6996
|
2528 |
+
26448
|
2529 |
+
14397
|
2530 |
+
21105
|
2531 |
+
15863
|
2532 |
+
74276
|
2533 |
+
3193
|
2534 |
+
23061
|
2535 |
+
29032
|
2536 |
+
29925
|
2537 |
+
397
|
2538 |
+
36538
|
2539 |
+
65359
|
2540 |
+
25197
|
2541 |
+
71693
|
2542 |
+
71195
|
2543 |
+
39006
|
2544 |
+
30237
|
2545 |
+
19295
|
2546 |
+
10210
|
2547 |
+
5289
|
2548 |
+
38800
|
2549 |
+
66970
|
2550 |
+
45351
|
2551 |
+
34496
|
2552 |
+
14567
|
2553 |
+
56284
|
2554 |
+
64862
|
2555 |
+
76287
|
2556 |
+
52452
|
2557 |
+
3720
|
2558 |
+
16709
|
2559 |
+
51260
|
2560 |
+
29176
|
2561 |
+
47673
|
2562 |
+
27993
|
2563 |
+
9339
|
2564 |
+
59514
|
2565 |
+
25042
|
2566 |
+
3646
|
2567 |
+
76958
|
2568 |
+
70058
|
2569 |
+
63553
|
2570 |
+
3974
|
2571 |
+
51359
|
2572 |
+
54768
|
2573 |
+
56514
|
2574 |
+
36525
|
2575 |
+
64585
|
2576 |
+
27027
|
2577 |
+
6948
|
2578 |
+
5464
|
2579 |
+
47226
|
2580 |
+
13217
|
2581 |
+
62960
|
2582 |
+
25701
|
2583 |
+
69692
|
2584 |
+
29942
|
2585 |
+
26502
|
2586 |
+
36651
|
2587 |
+
1591
|
2588 |
+
36023
|
2589 |
+
35774
|
2590 |
+
25901
|
2591 |
+
8171
|
2592 |
+
44558
|
2593 |
+
52
|
2594 |
+
15664
|
2595 |
+
19096
|
2596 |
+
78547
|
2597 |
+
56889
|
2598 |
+
45647
|
2599 |
+
14903
|
2600 |
+
52030
|
2601 |
+
65874
|
2602 |
+
44307
|
2603 |
+
64975
|
2604 |
+
33793
|
2605 |
+
56257
|
2606 |
+
34857
|
2607 |
+
34846
|
2608 |
+
20711
|
2609 |
+
66876
|
2610 |
+
25118
|
2611 |
+
31895
|
2612 |
+
32366
|
2613 |
+
68431
|
2614 |
+
34032
|
2615 |
+
38405
|
2616 |
+
57450
|
2617 |
+
52192
|
2618 |
+
20563
|
2619 |
+
10314
|
2620 |
+
31659
|
2621 |
+
3204
|
2622 |
+
53978
|
2623 |
+
16995
|
2624 |
+
27526
|
2625 |
+
74018
|
2626 |
+
45513
|
2627 |
+
48555
|
2628 |
+
16163
|
2629 |
+
70998
|
2630 |
+
68387
|
2631 |
+
65345
|
2632 |
+
13757
|
2633 |
+
67647
|
2634 |
+
48633
|
2635 |
+
62813
|
2636 |
+
19473
|
2637 |
+
52391
|
2638 |
+
57986
|
2639 |
+
19400
|
2640 |
+
38452
|
2641 |
+
33140
|
2642 |
+
60945
|
2643 |
+
36873
|
2644 |
+
73426
|
2645 |
+
9707
|
2646 |
+
51330
|
2647 |
+
10062
|
2648 |
+
58809
|
2649 |
+
75163
|
2650 |
+
37190
|
2651 |
+
30660
|
2652 |
+
4742
|
2653 |
+
75838
|
2654 |
+
29744
|
2655 |
+
71827
|
2656 |
+
22011
|
2657 |
+
35369
|
2658 |
+
49125
|
2659 |
+
53653
|
2660 |
+
54214
|
2661 |
+
64567
|
2662 |
+
3716
|
2663 |
+
72797
|
2664 |
+
24322
|
2665 |
+
60476
|
2666 |
+
33840
|
2667 |
+
71895
|
2668 |
+
42547
|
2669 |
+
35997
|
2670 |
+
59654
|
2671 |
+
45844
|
2672 |
+
54311
|
2673 |
+
50293
|
2674 |
+
67385
|
2675 |
+
6218
|
2676 |
+
61096
|
2677 |
+
31111
|
2678 |
+
4206
|
2679 |
+
69379
|
2680 |
+
54531
|
2681 |
+
34483
|
2682 |
+
23259
|
2683 |
+
50386
|
2684 |
+
8879
|
2685 |
+
9821
|
2686 |
+
57116
|
2687 |
+
69547
|
2688 |
+
25373
|
2689 |
+
29969
|
2690 |
+
31660
|
2691 |
+
34503
|
2692 |
+
17120
|
2693 |
+
48321
|
2694 |
+
70244
|
2695 |
+
18056
|
2696 |
+
50105
|
2697 |
+
22849
|
2698 |
+
28174
|
2699 |
+
2368
|
2700 |
+
44320
|
2701 |
+
67124
|
2702 |
+
586
|
2703 |
+
74218
|
2704 |
+
47625
|
2705 |
+
54263
|
2706 |
+
8773
|
2707 |
+
63514
|
2708 |
+
58201
|
2709 |
+
41232
|
2710 |
+
61867
|
2711 |
+
31471
|
2712 |
+
56094
|
2713 |
+
2342
|
2714 |
+
4634
|
2715 |
+
70231
|
2716 |
+
15533
|
2717 |
+
18025
|
2718 |
+
63507
|
2719 |
+
20975
|
2720 |
+
74488
|
2721 |
+
30107
|
2722 |
+
47758
|
2723 |
+
67276
|
2724 |
+
74875
|
2725 |
+
5900
|
2726 |
+
1818
|
2727 |
+
73092
|
2728 |
+
45710
|
2729 |
+
57289
|
2730 |
+
21206
|
2731 |
+
78052
|
2732 |
+
8741
|
2733 |
+
16284
|
2734 |
+
34725
|
2735 |
+
65190
|
2736 |
+
13870
|
2737 |
+
22089
|
2738 |
+
41607
|
2739 |
+
55252
|
2740 |
+
66394
|
2741 |
+
24942
|
2742 |
+
17855
|
2743 |
+
61279
|
2744 |
+
1786
|
2745 |
+
32806
|
2746 |
+
70249
|
2747 |
+
25647
|
2748 |
+
75833
|
2749 |
+
45878
|
2750 |
+
42020
|
2751 |
+
30875
|
2752 |
+
15257
|
2753 |
+
32675
|
2754 |
+
39209
|
2755 |
+
51
|
2756 |
+
58655
|
2757 |
+
12457
|
2758 |
+
44140
|
2759 |
+
16611
|
2760 |
+
8770
|
2761 |
+
25531
|
2762 |
+
8161
|
2763 |
+
55431
|
2764 |
+
68143
|
2765 |
+
56929
|
2766 |
+
22020
|
2767 |
+
45964
|
2768 |
+
18953
|
2769 |
+
19308
|
2770 |
+
59888
|
2771 |
+
28680
|
2772 |
+
41313
|
2773 |
+
68640
|
2774 |
+
78474
|
2775 |
+
22069
|
2776 |
+
60773
|
2777 |
+
19510
|
2778 |
+
80291
|
2779 |
+
27982
|
2780 |
+
12397
|
2781 |
+
41441
|
2782 |
+
3872
|
2783 |
+
1564
|
2784 |
+
18326
|
2785 |
+
36957
|
2786 |
+
12947
|
2787 |
+
6766
|
2788 |
+
16470
|
2789 |
+
33858
|
2790 |
+
54592
|
2791 |
+
74726
|
2792 |
+
65741
|
2793 |
+
28713
|
2794 |
+
8347
|
2795 |
+
31179
|
2796 |
+
50910
|
2797 |
+
4774
|
2798 |
+
8271
|
2799 |
+
5735
|
2800 |
+
52638
|
2801 |
+
55055
|
2802 |
+
35454
|
2803 |
+
73313
|
2804 |
+
28155
|
2805 |
+
712
|
2806 |
+
73736
|
2807 |
+
50228
|
2808 |
+
51345
|
2809 |
+
7831
|
2810 |
+
56832
|
2811 |
+
74072
|
2812 |
+
8138
|
2813 |
+
33189
|
2814 |
+
20661
|
2815 |
+
46398
|
2816 |
+
15151
|
2817 |
+
68620
|
2818 |
+
16777
|
2819 |
+
54030
|
2820 |
+
64353
|
2821 |
+
51392
|
2822 |
+
2488
|
2823 |
+
12001
|
2824 |
+
45499
|
2825 |
+
54651
|
2826 |
+
21743
|
2827 |
+
56531
|
2828 |
+
19129
|
2829 |
+
57675
|
2830 |
+
55539
|
2831 |
+
40631
|
2832 |
+
36491
|
2833 |
+
69192
|
2834 |
+
53735
|
2835 |
+
30160
|
2836 |
+
50485
|
2837 |
+
4971
|
2838 |
+
24202
|
2839 |
+
18604
|
2840 |
+
13403
|
2841 |
+
12164
|
2842 |
+
10524
|
2843 |
+
9518
|
2844 |
+
2877
|
2845 |
+
36107
|
2846 |
+
78102
|
2847 |
+
20653
|
2848 |
+
21157
|
2849 |
+
65081
|
2850 |
+
309
|
2851 |
+
18002
|
2852 |
+
70974
|
2853 |
+
47077
|
2854 |
+
69415
|
2855 |
+
78255
|
2856 |
+
42517
|
2857 |
+
68486
|
2858 |
+
32751
|
2859 |
+
20353
|
2860 |
+
39780
|
2861 |
+
28133
|
2862 |
+
41578
|
2863 |
+
15011
|
2864 |
+
72168
|
2865 |
+
33238
|
2866 |
+
4115
|
2867 |
+
62444
|
2868 |
+
58391
|
2869 |
+
5631
|
2870 |
+
15776
|
2871 |
+
17845
|
2872 |
+
63752
|
2873 |
+
26333
|
2874 |
+
28833
|
2875 |
+
76971
|
2876 |
+
43396
|
2877 |
+
58884
|
2878 |
+
80351
|
2879 |
+
36297
|
2880 |
+
37337
|
DataPreparation/data/train.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|
Dockerfile
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Use an official Python runtime as a parent image
|
2 |
+
FROM python:3.7
|
3 |
+
|
4 |
+
# Set the working directory to /app
|
5 |
+
WORKDIR /app
|
6 |
+
|
7 |
+
# Copy the current directory contents into the container at /app
|
8 |
+
COPY . /app
|
9 |
+
|
10 |
+
# Install any needed packages specified in requirements.txt
|
11 |
+
RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 -U
|
12 |
+
RUN pip install django opencv-python scipy pandas shapely -U
|
13 |
+
|
14 |
+
# Expose the port the app runs on
|
15 |
+
EXPOSE 8000
|
16 |
+
|
17 |
+
# Define environment variable
|
18 |
+
ENV NAME g2p_app
|
19 |
+
|
20 |
+
# Run app.py when the container launches
|
21 |
+
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
|
Graph2plan
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
Subproject commit 3c6af231f52c38afaf4a0025ceffbc2e5afa7ada
|
Interface/House/__init__.py
ADDED
File without changes
|
Interface/House/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (191 Bytes). View file
|
|
Interface/House/__pycache__/__init__.cpython-37.pyc
ADDED
Binary file (157 Bytes). View file
|
|
Interface/House/__pycache__/settings.cpython-311.pyc
ADDED
Binary file (3.1 kB). View file
|
|
Interface/House/__pycache__/settings.cpython-37.pyc
ADDED
Binary file (2.38 kB). View file
|
|
Interface/House/__pycache__/urls.cpython-311.pyc
ADDED
Binary file (1.92 kB). View file
|
|
Interface/House/__pycache__/urls.cpython-37.pyc
ADDED
Binary file (1.4 kB). View file
|
|
Interface/House/__pycache__/wsgi.cpython-37.pyc
ADDED
Binary file (536 Bytes). View file
|
|
Interface/House/asgi.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
ASGI config for House project.
|
3 |
+
|
4 |
+
It exposes the ASGI callable as a module-level variable named ``application``.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
|
8 |
+
"""
|
9 |
+
|
10 |
+
import os
|
11 |
+
|
12 |
+
from django.core.asgi import get_asgi_application
|
13 |
+
|
14 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'House.settings')
|
15 |
+
|
16 |
+
application = get_asgi_application()
|
Interface/House/settings.py
ADDED
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Django settings for House project.
|
3 |
+
|
4 |
+
Generated by 'django-admin startproject' using Django 3.0.2.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/topics/settings/
|
8 |
+
|
9 |
+
For the full list of settings and their values, see
|
10 |
+
https://docs.djangoproject.com/en/3.0/ref/settings/
|
11 |
+
"""
|
12 |
+
|
13 |
+
import os
|
14 |
+
|
15 |
+
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
16 |
+
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
17 |
+
|
18 |
+
|
19 |
+
# Quick-start development settings - unsuitable for production
|
20 |
+
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
|
21 |
+
|
22 |
+
# SECURITY WARNING: keep the secret key used in production secret!
|
23 |
+
SECRET_KEY = 'y&ol628+upm0r&=8pilr@u_w_0ji!1afp!st*y#ympn3u@!3s%'
|
24 |
+
|
25 |
+
# SECURITY WARNING: don't run with debug turned on in production!
|
26 |
+
DEBUG = True
|
27 |
+
|
28 |
+
ALLOWED_HOSTS = []
|
29 |
+
|
30 |
+
|
31 |
+
# Application definition
|
32 |
+
|
33 |
+
INSTALLED_APPS = [
|
34 |
+
'django.contrib.admin',
|
35 |
+
'django.contrib.auth',
|
36 |
+
'django.contrib.contenttypes',
|
37 |
+
'django.contrib.sessions',
|
38 |
+
'django.contrib.messages',
|
39 |
+
'django.contrib.staticfiles',
|
40 |
+
]
|
41 |
+
|
42 |
+
MIDDLEWARE = [
|
43 |
+
'django.middleware.security.SecurityMiddleware',
|
44 |
+
'django.contrib.sessions.middleware.SessionMiddleware',
|
45 |
+
'django.middleware.common.CommonMiddleware',
|
46 |
+
'django.middleware.csrf.CsrfViewMiddleware',
|
47 |
+
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
48 |
+
'django.contrib.messages.middleware.MessageMiddleware',
|
49 |
+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
50 |
+
]
|
51 |
+
|
52 |
+
ROOT_URLCONF = 'House.urls'
|
53 |
+
|
54 |
+
TEMPLATES = [
|
55 |
+
{
|
56 |
+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
57 |
+
'DIRS': [os.path.join(BASE_DIR, 'templates')]
|
58 |
+
,
|
59 |
+
'APP_DIRS': True,
|
60 |
+
'OPTIONS': {
|
61 |
+
'context_processors': [
|
62 |
+
'django.template.context_processors.debug',
|
63 |
+
'django.template.context_processors.request',
|
64 |
+
'django.contrib.auth.context_processors.auth',
|
65 |
+
'django.contrib.messages.context_processors.messages',
|
66 |
+
],
|
67 |
+
},
|
68 |
+
},
|
69 |
+
]
|
70 |
+
|
71 |
+
WSGI_APPLICATION = 'House.wsgi.application'
|
72 |
+
|
73 |
+
|
74 |
+
# Database
|
75 |
+
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
76 |
+
|
77 |
+
DATABASES = {
|
78 |
+
'default': {
|
79 |
+
'ENGINE': 'django.db.backends.sqlite3',
|
80 |
+
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
|
85 |
+
# Password validation
|
86 |
+
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
|
87 |
+
|
88 |
+
AUTH_PASSWORD_VALIDATORS = [
|
89 |
+
{
|
90 |
+
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
91 |
+
},
|
92 |
+
{
|
93 |
+
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
94 |
+
},
|
95 |
+
{
|
96 |
+
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
97 |
+
},
|
98 |
+
{
|
99 |
+
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
100 |
+
},
|
101 |
+
]
|
102 |
+
|
103 |
+
|
104 |
+
# Internationalization
|
105 |
+
# https://docs.djangoproject.com/en/3.0/topics/i18n/
|
106 |
+
|
107 |
+
LANGUAGE_CODE = 'en-us'
|
108 |
+
|
109 |
+
TIME_ZONE = 'UTC'
|
110 |
+
|
111 |
+
USE_I18N = True
|
112 |
+
|
113 |
+
USE_L10N = True
|
114 |
+
|
115 |
+
USE_TZ = True
|
116 |
+
|
117 |
+
|
118 |
+
# Static files (CSS, JavaScript, Images)
|
119 |
+
# https://docs.djangoproject.com/en/3.0/howto/static-files/
|
120 |
+
|
121 |
+
STATIC_URL = '/static/'
|
122 |
+
HERE = os.path.dirname(os.path.abspath(__file__))
|
123 |
+
HERE = os.path.join(HERE, '../')
|
124 |
+
STATICFILES_DIRS = (
|
125 |
+
os.path.join(HERE, 'static/'),
|
126 |
+
)
|
127 |
+
ALLOWED_HOSTS = ['*']
|
Interface/House/urls.py
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""House URL Configuration
|
2 |
+
|
3 |
+
The `urlpatterns` list routes URLs to views. For more information please see:
|
4 |
+
https://docs.djangoproject.com/en/3.0/topics/http/urls/
|
5 |
+
Examples:
|
6 |
+
Function views
|
7 |
+
1. Add an import: from my_app import views
|
8 |
+
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
9 |
+
Class-based views
|
10 |
+
1. Add an import: from other_app.views import Home
|
11 |
+
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
12 |
+
Including another URLconf
|
13 |
+
1. Import the include() function: from django.urls import include, path
|
14 |
+
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
15 |
+
"""
|
16 |
+
from django.contrib import admin
|
17 |
+
from django.urls import path
|
18 |
+
|
19 |
+
from Houseweb import views
|
20 |
+
|
21 |
+
urlpatterns = [
|
22 |
+
# path('admin/', admin.site.urls),
|
23 |
+
path('index/LoadTestBoundary', views.LoadTestBoundary),
|
24 |
+
path('index/NumSearch/', views.NumSearch),
|
25 |
+
path(r'index/LoadTrainHouse/', views.LoadTrainHouse),
|
26 |
+
path(r'index/TransGraph/', views.TransGraph),
|
27 |
+
path(r'index/TransGraph_net/', views.TransGraph_net),
|
28 |
+
path(r'index/Init/', views.Init),
|
29 |
+
path(r'index/AdjustGraph/', views.AdjustGraph),
|
30 |
+
path(r'index/GraphSearch/', views.GraphSearch),
|
31 |
+
path(r'index/RelBox/', views.RelBox),
|
32 |
+
path(r'index/Save_Editbox/', views.Save_Editbox),
|
33 |
+
|
34 |
+
path('home', views.home),
|
35 |
+
|
36 |
+
|
37 |
+
]
|
Interface/House/wsgi.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
WSGI config for House project.
|
3 |
+
|
4 |
+
It exposes the WSGI callable as a module-level variable named ``application``.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
|
8 |
+
"""
|
9 |
+
|
10 |
+
import os
|
11 |
+
|
12 |
+
from django.core.wsgi import get_wsgi_application
|
13 |
+
|
14 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'House.settings')
|
15 |
+
|
16 |
+
application = get_wsgi_application()
|
Interface/Houseweb/__init__.py
ADDED
File without changes
|
Interface/Houseweb/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (194 Bytes). View file
|
|
Interface/Houseweb/__pycache__/__init__.cpython-37.pyc
ADDED
Binary file (160 Bytes). View file
|
|
Interface/Houseweb/__pycache__/create.cpython-37.pyc
ADDED
Binary file (3.27 kB). View file
|
|
Interface/Houseweb/__pycache__/floorplan2.cpython-37.pyc
ADDED
Binary file (19.5 kB). View file
|
|
Interface/Houseweb/__pycache__/network.cpython-37.pyc
ADDED
Binary file (3.89 kB). View file
|
|
Interface/Houseweb/__pycache__/utils.cpython-37.pyc
ADDED
Binary file (9.39 kB). View file
|
|
Interface/Houseweb/__pycache__/utils1.cpython-37.pyc
ADDED
Binary file (7.52 kB). View file
|
|
Interface/Houseweb/__pycache__/views.cpython-311.pyc
ADDED
Binary file (54.4 kB). View file
|
|
Interface/Houseweb/__pycache__/views.cpython-37.pyc
ADDED
Binary file (23.6 kB). View file
|
|
Interface/Houseweb/admin.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.contrib import admin
|
2 |
+
|
3 |
+
# Register your models here.
|
Interface/Houseweb/apps.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from django.apps import AppConfig
|
2 |
+
|
3 |
+
|
4 |
+
class HousewebConfig(AppConfig):
|
5 |
+
name = 'Houseweb'
|
Interface/Houseweb/migrations/__init__.py
ADDED
File without changes
|
Interface/Houseweb/models.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.db import models
|
2 |
+
|
3 |
+
# Create your models here.
|
Interface/Houseweb/tests.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.test import TestCase
|
2 |
+
|
3 |
+
# Create your tests here.
|
Interface/Houseweb/views.py
ADDED
@@ -0,0 +1,757 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from django.shortcuts import render
|
2 |
+
from django.http import HttpResponse, JsonResponse
|
3 |
+
import json
|
4 |
+
import model.test as mltest
|
5 |
+
import model.utils as mdul
|
6 |
+
from model.floorplan import *
|
7 |
+
import retrieval.retrieval as rt
|
8 |
+
import time
|
9 |
+
import pickle
|
10 |
+
import scipy.io as sio
|
11 |
+
import numpy as np
|
12 |
+
from model.decorate import *
|
13 |
+
import math
|
14 |
+
import pandas as pd
|
15 |
+
import matlab.engine
|
16 |
+
|
17 |
+
global test_data, test_data_topk, testNameList, trainNameList
|
18 |
+
global train_data, trainNameList, trainTF, train_data_eNum, train_data_rNum
|
19 |
+
global engview, model
|
20 |
+
global tf_train, centroids, clusters
|
21 |
+
|
22 |
+
|
23 |
+
def home(request):
|
24 |
+
return render(request, "home.html", )
|
25 |
+
|
26 |
+
|
27 |
+
def Init(request):
|
28 |
+
start = time.clock()
|
29 |
+
getTestData()
|
30 |
+
getTrainData()
|
31 |
+
loadMatlabEng()
|
32 |
+
loadModel()
|
33 |
+
loadRetrieval()
|
34 |
+
end = time.clock()
|
35 |
+
print('Init(model+test+train+engine+retrieval) time: %s Seconds' % (end - start))
|
36 |
+
|
37 |
+
return HttpResponse(None)
|
38 |
+
|
39 |
+
|
40 |
+
def loadMatlabEng():
|
41 |
+
startengview = time.clock()
|
42 |
+
global engview
|
43 |
+
engview = matlab.engine.start_matlab()
|
44 |
+
engview.addpath(r'./align_fp/', nargout=0)
|
45 |
+
endengview = time.clock()
|
46 |
+
print(' matlab.engineview time: %s Seconds' % (endengview - startengview))
|
47 |
+
|
48 |
+
|
49 |
+
def loadRetrieval():
|
50 |
+
global tf_train, centroids, clusters
|
51 |
+
t1 = time.clock()
|
52 |
+
tf_train = np.load('./retrieval/tf_train.npy')
|
53 |
+
centroids = np.load('./retrieval/centroids_train.npy')
|
54 |
+
clusters = np.load('./retrieval/clusters_train.npy')
|
55 |
+
t2 = time.clock()
|
56 |
+
print('load tf/centroids/clusters', t2 - t1)
|
57 |
+
|
58 |
+
|
59 |
+
def getTestData():
|
60 |
+
start = time.clock()
|
61 |
+
global test_data, testNameList, trainNameList
|
62 |
+
|
63 |
+
test_data = pickle.load(open('./static/Data/data_test_converted.pkl', 'rb'))
|
64 |
+
test_data, testNameList, trainNameList = test_data['data'], list(test_data['testNameList']), list(
|
65 |
+
test_data['trainNameList'])
|
66 |
+
end = time.clock()
|
67 |
+
print('getTestData time: %s Seconds' % (end - start))
|
68 |
+
|
69 |
+
|
70 |
+
def getTrainData():
|
71 |
+
start = time.clock()
|
72 |
+
global train_data, trainNameList, trainTF, train_data_eNum, train_data_rNum
|
73 |
+
|
74 |
+
train_data = pickle.load(open('./static/Data/data_train_converted.pkl', 'rb'))
|
75 |
+
train_data, trainNameList, trainTF = train_data['data'], list(train_data['nameList']), list(train_data['trainTF'])
|
76 |
+
|
77 |
+
train_data_eNum = pickle.load(open('./static/Data/data_train_eNum.pkl', 'rb'))
|
78 |
+
train_data_eNum = train_data_eNum['eNum']
|
79 |
+
train_data_rNum = np.load('./static/Data/rNum_train.npy')
|
80 |
+
|
81 |
+
end = time.clock()
|
82 |
+
print('getTrainData time: %s Seconds' % (end - start))
|
83 |
+
|
84 |
+
|
85 |
+
def loadModel():
|
86 |
+
global model, train_data, trainNameList
|
87 |
+
start = time.clock()
|
88 |
+
model = mltest.load_model()
|
89 |
+
end = time.clock()
|
90 |
+
print('loadModel time: %s Seconds' % (end - start))
|
91 |
+
start = time.clock()
|
92 |
+
test = train_data[trainNameList.index("75119")]
|
93 |
+
mltest.test(model, FloorPlan(test, train=True))
|
94 |
+
end = time.clock()
|
95 |
+
print('test Model time: %s Seconds' % (end - start))
|
96 |
+
|
97 |
+
|
98 |
+
def LoadTestBoundary(request):
|
99 |
+
start = time.clock()
|
100 |
+
testName = request.GET.get('testName').split(".")[0]
|
101 |
+
test_index = testNameList.index(testName)
|
102 |
+
data = test_data[test_index]
|
103 |
+
data_js = {}
|
104 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
105 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
106 |
+
ex = ""
|
107 |
+
for i in range(len(data.boundary)):
|
108 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
109 |
+
data_js['exterior'] = ex
|
110 |
+
end = time.clock()
|
111 |
+
print('LoadTestBoundary time: %s Seconds' % (end - start))
|
112 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
113 |
+
|
114 |
+
|
115 |
+
def get_filter_func(mask, acc, num):
|
116 |
+
filters = [
|
117 |
+
None if not mask else (
|
118 |
+
np.equal if acc[i] else np.greater_equal
|
119 |
+
)
|
120 |
+
for i in range(len(mask))
|
121 |
+
]
|
122 |
+
|
123 |
+
def filter_func(data):
|
124 |
+
for i in range(len(filters)):
|
125 |
+
if (filters[i] is not None) and (not filters[i](data[i], num[i])): return False
|
126 |
+
return True
|
127 |
+
|
128 |
+
return filter_func
|
129 |
+
|
130 |
+
|
131 |
+
def filter_graph(graph_):
|
132 |
+
filters = graph_
|
133 |
+
|
134 |
+
def filter_graphfunc(data):
|
135 |
+
sub = data - filters
|
136 |
+
return ((sub >= 0).all())
|
137 |
+
|
138 |
+
return filter_graphfunc
|
139 |
+
|
140 |
+
|
141 |
+
def NumSearch(request):
|
142 |
+
start = time.clock()
|
143 |
+
data_new = json.loads(request.GET.get("userInfo"))
|
144 |
+
testName = data_new[0].split(".")[0]
|
145 |
+
test_index = testNameList.index(testName)
|
146 |
+
topkList = []
|
147 |
+
topkList.clear()
|
148 |
+
data = test_data[test_index]
|
149 |
+
|
150 |
+
|
151 |
+
multi_clusters=False
|
152 |
+
test_data_topk = rt.retrieval(data, 1000,multi_clusters)
|
153 |
+
|
154 |
+
if len(data_new) > 1:
|
155 |
+
roomactarr = data_new[1]
|
156 |
+
roomexaarr = data_new[2]
|
157 |
+
roomnumarr = [int(x) for x in data_new[3]]
|
158 |
+
|
159 |
+
test_num = train_data_rNum[test_data_topk]
|
160 |
+
filter_func = get_filter_func(roomactarr, roomexaarr, roomnumarr)
|
161 |
+
indices = np.where(list(map(filter_func, test_num)))
|
162 |
+
indices = list(indices)
|
163 |
+
if len(indices[0]) < 20:
|
164 |
+
topk = len(indices[0])
|
165 |
+
else:
|
166 |
+
topk = 20
|
167 |
+
topkList.clear()
|
168 |
+
for i in range(topk):
|
169 |
+
topkList.append(str(trainNameList[int(test_data_topk[indices[0][i]])]) + ".png")
|
170 |
+
end = time.clock()
|
171 |
+
print('NumberSearch time: %s Seconds' % (end - start))
|
172 |
+
return HttpResponse(json.dumps(topkList), content_type="application/json")
|
173 |
+
|
174 |
+
|
175 |
+
def FindTraindata(trainname):
|
176 |
+
start = time.clock()
|
177 |
+
train_index = trainNameList.index(trainname)
|
178 |
+
data = train_data[train_index]
|
179 |
+
data_js = {}
|
180 |
+
data_js["hsname"] = trainname
|
181 |
+
|
182 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
183 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
184 |
+
print("testboundary", data_js["door"])
|
185 |
+
ex = ""
|
186 |
+
for i in range(len(data.boundary)):
|
187 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
188 |
+
data_js['exterior'] = ex
|
189 |
+
|
190 |
+
data_js["hsedge"] = [[int(u), int(v)] for u, v in data.edge[:, [0, 1]]]
|
191 |
+
|
192 |
+
hsbox = [[[float(x1), float(y1), float(x2), float(y2)], [mdul.room_label[cate][1]]] for
|
193 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
194 |
+
external = np.asarray(data.boundary)
|
195 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
196 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
197 |
+
|
198 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
199 |
+
|
200 |
+
data_js["rmsize"] = [
|
201 |
+
[[20 * math.sqrt((float(x2) - float(x1)) * (float(y2) - float(y1)) / float(area_))], [mdul.room_label[cate][1]]]
|
202 |
+
for
|
203 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
204 |
+
|
205 |
+
|
206 |
+
box_order = data.order
|
207 |
+
data_js["hsbox"] = []
|
208 |
+
for i in range(len(box_order)):
|
209 |
+
data_js["hsbox"].append(hsbox[int(float(box_order[i])) - 1])
|
210 |
+
|
211 |
+
data_js["rmpos"] = [[int(cate), str(mdul.room_label[cate][1]), float((x1 + x2) / 2), float((y1 + y2) / 2)] for
|
212 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
213 |
+
end = time.clock()
|
214 |
+
print('find train data time: %s Seconds' % (end - start))
|
215 |
+
return data_js
|
216 |
+
|
217 |
+
|
218 |
+
def LoadTrainHouse(request):
|
219 |
+
trainname = request.GET.get("roomID").split(".")[0]
|
220 |
+
data_js = FindTraindata(trainname)
|
221 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
222 |
+
|
223 |
+
|
224 |
+
'''
|
225 |
+
transfer the graph of the training data into the graph of the test data
|
226 |
+
'''
|
227 |
+
|
228 |
+
|
229 |
+
def TransGraph(request):
|
230 |
+
start = time.clock()
|
231 |
+
userInfo = request.GET.get("userInfo")
|
232 |
+
testname = userInfo.split(',')[0]
|
233 |
+
trainname = request.GET.get("roomID")
|
234 |
+
mlresult = mltest.get_userinfo(testname, trainname)
|
235 |
+
|
236 |
+
fp_end = mlresult
|
237 |
+
|
238 |
+
sio.savemat("./static/" + userInfo.split(',')[0].split('.')[0] + ".mat", {"data": fp_end.data})
|
239 |
+
|
240 |
+
data_js = {}
|
241 |
+
# fp_end hsedge
|
242 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
243 |
+
|
244 |
+
# fp_rmsize
|
245 |
+
external = np.asarray(fp_end.data.boundary)
|
246 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
247 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
248 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
249 |
+
data_js["rmsize"] = [
|
250 |
+
[[20 * math.sqrt((float(x2) - float(x1)) * (float(y2) - float(y1)) / float(area_))], [mdul.room_label[cate][1]]]
|
251 |
+
for
|
252 |
+
x1, y1, x2, y2, cate in fp_end.data.box[:]]
|
253 |
+
# fp_end rmpos
|
254 |
+
|
255 |
+
rooms = fp_end.get_rooms(tensor=False)
|
256 |
+
|
257 |
+
|
258 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
259 |
+
|
260 |
+
# boxes_pred
|
261 |
+
data_js["rmpos"] = []
|
262 |
+
for k in range(len(center)):
|
263 |
+
node = float(rooms[k]), mdul.room_label[int(rooms[k])][1], center[k][0], center[k][1], float(k)
|
264 |
+
data_js["rmpos"].append(node)
|
265 |
+
|
266 |
+
test_index = testNameList.index(testname.split(".")[0])
|
267 |
+
data = test_data[test_index]
|
268 |
+
ex = ""
|
269 |
+
for i in range(len(data.boundary)):
|
270 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
271 |
+
data_js['exterior'] = ex
|
272 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
273 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
274 |
+
end = time.clock()
|
275 |
+
print('TransGraph time: %s Seconds' % (end - start))
|
276 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
277 |
+
|
278 |
+
|
279 |
+
def AdjustGraph(request):
|
280 |
+
start = time.clock()
|
281 |
+
# newNode index-typename-cx-cy
|
282 |
+
# oldNode index-typename-cx-cy
|
283 |
+
# newEdge u-v
|
284 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
285 |
+
testname = request.GET.get("userRoomID")
|
286 |
+
trainname = request.GET.get("adptRoomID")
|
287 |
+
s = time.clock()
|
288 |
+
mlresult = mltest.get_userinfo_adjust(testname, trainname, NewGraph)
|
289 |
+
e = time.clock()
|
290 |
+
print('get_userinfo_adjust: %s Seconds' % (e - s))
|
291 |
+
fp_end = mlresult[0]
|
292 |
+
global boxes_pred
|
293 |
+
boxes_pred = mlresult[1]
|
294 |
+
|
295 |
+
data_js = {}
|
296 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
297 |
+
|
298 |
+
rooms = fp_end.get_rooms(tensor=False)
|
299 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
300 |
+
|
301 |
+
box_order = mlresult[2]
|
302 |
+
'''
|
303 |
+
handle the information of the room boxes
|
304 |
+
boxes_pred: the prediction from net
|
305 |
+
box_order: The order in which boxes are drawn
|
306 |
+
|
307 |
+
'''
|
308 |
+
room = []
|
309 |
+
for o in range(len(box_order)):
|
310 |
+
room.append(float((rooms[int(float(box_order[o][0])) - 1])))
|
311 |
+
boxes_end = []
|
312 |
+
for i in range(len(box_order)):
|
313 |
+
tmp = []
|
314 |
+
for j in range(4):
|
315 |
+
tmp.append(float(boxes_pred[int(float(box_order[i][0])) - 1][j]))
|
316 |
+
boxes_end.append(tmp)
|
317 |
+
|
318 |
+
data_js['roomret'] = []
|
319 |
+
for k in range(len(room)):
|
320 |
+
data = boxes_end[k], [mdul.room_label[int(room[k])][1]], box_order[k][0] - 1
|
321 |
+
data_js['roomret'].append(data)
|
322 |
+
|
323 |
+
# change the box size
|
324 |
+
global relbox
|
325 |
+
relbox = data_js['roomret']
|
326 |
+
global reledge
|
327 |
+
reledge = data_js["hsedge"]
|
328 |
+
|
329 |
+
test_index = testNameList.index(testname.split(".")[0])
|
330 |
+
data = test_data[test_index]
|
331 |
+
ex = ""
|
332 |
+
for i in range(len(data.boundary)):
|
333 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
334 |
+
data_js['exterior'] = ex
|
335 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
336 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
337 |
+
|
338 |
+
external = np.asarray(data.boundary)
|
339 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
340 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
341 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
342 |
+
data_js['rmsize'] = []
|
343 |
+
for i in range(len(data_js['roomret'])):
|
344 |
+
rmsize = 20 * math.sqrt((float(data_js['roomret'][i][0][2]) - float(data_js['roomret'][i][0][0])) * (
|
345 |
+
float(data_js['roomret'][i][0][3]) - float(data_js['roomret'][i][0][1])) / float(area_)), \
|
346 |
+
data_js["roomret"][i][1][0]
|
347 |
+
data_js["rmsize"].append(rmsize)
|
348 |
+
|
349 |
+
data_js["rmpos"] = []
|
350 |
+
|
351 |
+
newGraph = NewGraph[0]
|
352 |
+
for i in range(len(data_js['roomret'])):
|
353 |
+
for k in range(len(newGraph)):
|
354 |
+
if (data_js['roomret'][i][1][0] == newGraph[k][1]):
|
355 |
+
x_center = int((data_js['roomret'][i][0][0] + data_js['roomret'][i][0][2]) / 2)
|
356 |
+
y_center = int((data_js['roomret'][i][0][1] + data_js['roomret'][i][0][3]) / 2)
|
357 |
+
x_graph = newGraph[k][2]
|
358 |
+
y_graph = newGraph[k][3]
|
359 |
+
if ((int(x_graph - 30) < x_center < int(x_graph + 30))):
|
360 |
+
node = float(rooms[k]), newGraph[k][1], x_center, y_center, float(
|
361 |
+
newGraph[k][0])
|
362 |
+
data_js["rmpos"].append(node)
|
363 |
+
newGraph.pop(k)
|
364 |
+
break
|
365 |
+
if ((int(y_graph - 30) < y_center < int(y_graph + 30))):
|
366 |
+
node = float(rooms[k]), newGraph[k][1], x_center, y_center, float(
|
367 |
+
newGraph[k][0])
|
368 |
+
data_js["rmpos"].append(node)
|
369 |
+
newGraph.pop(k)
|
370 |
+
|
371 |
+
break
|
372 |
+
|
373 |
+
fp_end.data = add_dw_fp(fp_end.data)
|
374 |
+
data_js["indoor"] = []
|
375 |
+
|
376 |
+
boundary = data.boundary
|
377 |
+
|
378 |
+
isNew = boundary[:, 3]
|
379 |
+
frontDoor = boundary[[0, 1]]
|
380 |
+
frontDoor = frontDoor[:, [0, 1]]
|
381 |
+
frontsum = frontDoor.sum(axis=1).tolist()
|
382 |
+
idx = frontsum.index(min(frontsum))
|
383 |
+
wallThickness = 3
|
384 |
+
if idx == 1:
|
385 |
+
frontDoor = frontDoor[[1, 0], :]
|
386 |
+
orient = boundary[0][2]
|
387 |
+
if orient == 0 or orient == 2:
|
388 |
+
frontDoor[0][0] = frontDoor[0][0] + wallThickness / 4
|
389 |
+
frontDoor[1][0] = frontDoor[1][0] - wallThickness / 4
|
390 |
+
if orient == 1 or orient == 3:
|
391 |
+
frontDoor[0][1] = frontDoor[0][1] + wallThickness / 4
|
392 |
+
frontDoor[1][1] = frontDoor[1][1] - wallThickness / 4
|
393 |
+
|
394 |
+
|
395 |
+
data_js["windows"] = []
|
396 |
+
for indx, x, y, w, h, r in fp_end.data.windows:
|
397 |
+
if w != 0:
|
398 |
+
tmp = [x + 2, y - 2, w - 2, 4]
|
399 |
+
data_js["windows"].append(tmp)
|
400 |
+
if h != 0:
|
401 |
+
tmp = [x - 2, y, 4, h]
|
402 |
+
data_js["windows"].append(tmp)
|
403 |
+
data_js["windowsline"] = []
|
404 |
+
for indx, x, y, w, h, r in fp_end.data.windows:
|
405 |
+
if w != 0:
|
406 |
+
tmp = [x + 2, y, w + x, y]
|
407 |
+
data_js["windowsline"].append(tmp)
|
408 |
+
if h != 0:
|
409 |
+
tmp = [x, y, x, h + y]
|
410 |
+
data_js["windowsline"].append(tmp)
|
411 |
+
|
412 |
+
sio.savemat("./static/" + testname.split(',')[0].split('.')[0] + ".mat", {"data": fp_end.data})
|
413 |
+
|
414 |
+
end = time.clock()
|
415 |
+
print('AdjustGraph time: %s Seconds' % (end - start))
|
416 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
417 |
+
|
418 |
+
|
419 |
+
def RelBox(request):
|
420 |
+
id = request.GET.get("selectRect")
|
421 |
+
print(id)
|
422 |
+
global relbox
|
423 |
+
global reledge
|
424 |
+
rdirgroup=get_dir(id,relbox,reledge)
|
425 |
+
return HttpResponse(json.dumps(rdirgroup), content_type="application/json")
|
426 |
+
|
427 |
+
def get_dir(id,relbox,reledge):
|
428 |
+
rel = []
|
429 |
+
selectindex = int(id.split("_")[1])
|
430 |
+
select = np.zeros(4).astype(int)
|
431 |
+
for i in range(len(relbox)):
|
432 |
+
a = math.ceil(relbox[i][0][0]), math.ceil(relbox[i][0][1]), math.ceil(relbox[i][0][2]), math.ceil(
|
433 |
+
relbox[i][0][3]), int(relbox[i][2])
|
434 |
+
rel.append(a)
|
435 |
+
if (selectindex == int(relbox[i][2])):
|
436 |
+
# select:x1,x0,y0,y1.relbox:x0,y0,x1,y1
|
437 |
+
select[0] = math.ceil(relbox[i][0][2])
|
438 |
+
select[1] = math.ceil(relbox[i][0][0])
|
439 |
+
select[2] = math.ceil(relbox[i][0][1])
|
440 |
+
select[3] = math.ceil(relbox[i][0][3])
|
441 |
+
rel = np.array(rel)
|
442 |
+
df = pd.DataFrame({'x0': rel[:, 0], 'y0': rel[:, 1], 'x1': rel[:, 2], 'y1': rel[:, 3], 'rindex': rel[:, 4]})
|
443 |
+
group_label = [(0, 'x1', "right"),
|
444 |
+
(1, 'x0', "left"),
|
445 |
+
(2, 'y0', "top"),
|
446 |
+
(3, 'y1', "down")]
|
447 |
+
dfgroup = []
|
448 |
+
for i in range(len(group_label)):
|
449 |
+
dfgroup.append(df.groupby(group_label[i][1], as_index=True).get_group(name=select[i]))
|
450 |
+
rdirgroup = []
|
451 |
+
for i in range(len(dfgroup)):
|
452 |
+
dir = dfgroup[i]
|
453 |
+
rdir = []
|
454 |
+
for k in range(len(dir)):
|
455 |
+
idx = (dir.loc[dir['rindex'] == (dir.iloc[[k]].values)[0][4]].index.values)[0]
|
456 |
+
rdir.append(relbox[idx][1][0].__str__() + "_" + (dir.iloc[[k]].values)[0][4].__str__())
|
457 |
+
rdirgroup.append(rdir)
|
458 |
+
reledge = np.array(reledge)
|
459 |
+
data1 = reledge[np.where((reledge[:, [0]] == selectindex))[0]]
|
460 |
+
data2 = reledge[np.where((reledge[:, [1]] == selectindex))[0]]
|
461 |
+
reledge1 = np.vstack((data1, data2))
|
462 |
+
return rdirgroup
|
463 |
+
def Save_Editbox(request):
|
464 |
+
global indxlist,boxes_pred
|
465 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
466 |
+
NewLay = json.loads(request.GET.get("NewLay"))
|
467 |
+
userRoomID = request.GET.get("userRoomID")
|
468 |
+
adptRoomID = request.GET.get("adptRoomID")
|
469 |
+
|
470 |
+
NewLay=np.array(NewLay)
|
471 |
+
NewLay=NewLay[np.argsort(NewLay[:, 1])][:,2:]
|
472 |
+
NewLay=NewLay.astype(float).tolist()
|
473 |
+
|
474 |
+
test_index = testNameList.index(userRoomID.split(".")[0])
|
475 |
+
test_ = test_data[test_index]
|
476 |
+
|
477 |
+
Boundary = test_.boundary
|
478 |
+
boundary=[[float(x),float(y),float(z),float(k)] for x,y,z,k in list(Boundary)]
|
479 |
+
test_fp =FloorPlan(test_)
|
480 |
+
|
481 |
+
train_index = trainNameList.index(adptRoomID.split(".")[0])
|
482 |
+
train_ =train_data[train_index]
|
483 |
+
train_fp =FloorPlan(train_,train=True)
|
484 |
+
fp_end = test_fp.adapt_graph(train_fp)
|
485 |
+
fp_end.adjust_graph()
|
486 |
+
newNode = NewGraph[0]
|
487 |
+
newEdge = NewGraph[1]
|
488 |
+
oldNode = NewGraph[2]
|
489 |
+
temp = []
|
490 |
+
for newindx, newrmname, newx, newy,scalesize in newNode:
|
491 |
+
for type, oldrmname, oldx, oldy, oldindx in oldNode:
|
492 |
+
if (int(newindx) == oldindx):
|
493 |
+
tmp=int(newindx), (newx - oldx), ( newy- oldy),float(scalesize)
|
494 |
+
temp.append(tmp)
|
495 |
+
newbox=[]
|
496 |
+
if mltest.adjust==True:
|
497 |
+
oldbox = []
|
498 |
+
for i in range(len(boxes_pred)):
|
499 |
+
indxtmp=[boxes_pred[i][0],boxes_pred[i][1],boxes_pred[i][2],boxes_pred[i][3],boxes_pred[i][0]]
|
500 |
+
oldbox.append(indxtmp)
|
501 |
+
if mltest.adjust==False:
|
502 |
+
indxlist=[]
|
503 |
+
oldbox=fp_end.data.box.tolist()
|
504 |
+
for i in range(len(oldbox)):
|
505 |
+
indxlist.append([oldbox[i][4]])
|
506 |
+
indxlist=np.array(indxlist)
|
507 |
+
adjust=True
|
508 |
+
oldbox=fp_end.data.box.tolist()
|
509 |
+
X=0
|
510 |
+
Y=0
|
511 |
+
for i in range(len(oldbox)):
|
512 |
+
X= X+(oldbox[i][2]-oldbox[i][0])
|
513 |
+
Y= Y+(oldbox[i][3]-oldbox[i][1])
|
514 |
+
x_ave=(X/len(oldbox))/2
|
515 |
+
y_ave=(Y/len(oldbox))/2
|
516 |
+
|
517 |
+
index_mapping = {}
|
518 |
+
# The room that already exists
|
519 |
+
# Move: Just by the distance
|
520 |
+
for newindx, tempx, tempy,scalesize in temp:
|
521 |
+
index_mapping[newindx] = len(newbox)
|
522 |
+
tmpbox=[]
|
523 |
+
scalesize = int(scalesize)
|
524 |
+
if scalesize<1:
|
525 |
+
scale = math.sqrt(scalesize)
|
526 |
+
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * (1 - scale) / 2
|
527 |
+
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (1 - scale) / 2
|
528 |
+
tmpbox = [(oldbox[newindx][0] + tempx) + scalex, (oldbox[newindx][1] + tempy)+scaley,
|
529 |
+
(oldbox[newindx][2] + tempx) - scalex, (oldbox[newindx][3] + tempy) - scaley, oldbox[newindx][4]]
|
530 |
+
if scalesize == 1:
|
531 |
+
tmpbox = [(oldbox[newindx][0] + tempx) , (oldbox[newindx][1] + tempy) ,(oldbox[newindx][2] + tempx), (oldbox[newindx][3] + tempy), oldbox[newindx][4]]
|
532 |
+
|
533 |
+
if scalesize>1:
|
534 |
+
scale=math.sqrt(scalesize)
|
535 |
+
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * ( scale-1) / 2
|
536 |
+
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (scale-1) / 2
|
537 |
+
tmpbox = [(oldbox[newindx][0] + tempx) - scalex, (oldbox[newindx][1] + tempy) - scaley,
|
538 |
+
(oldbox[newindx][2] + tempx) + scalex, (oldbox[newindx][3] + tempy) + scaley, oldbox[newindx][4]]
|
539 |
+
|
540 |
+
newbox.append(tmpbox)
|
541 |
+
|
542 |
+
# The room just added
|
543 |
+
# Move: The room node with the average size of the existing room
|
544 |
+
for newindx, newrmname, newx, newy,scalesize in newNode:
|
545 |
+
if int(newindx)>(len(oldbox)-1):
|
546 |
+
scalesize=int(scalesize)
|
547 |
+
index_mapping[int(newindx)] = (len(newbox))
|
548 |
+
tmpbox=[]
|
549 |
+
if scalesize < 1:
|
550 |
+
scale = math.sqrt(scalesize)
|
551 |
+
scalex = x_ave * (1 - scale) / 2
|
552 |
+
scaley = y_ave* (1 - scale) / 2
|
553 |
+
tmpbox = [(newx-x_ave) +scalex,(newy-y_ave) +scaley,(newx+x_ave)-scalex,(newy+y_ave)-scaley,vocab['object_name_to_idx'][newrmname]]
|
554 |
+
|
555 |
+
if scalesize == 1:
|
556 |
+
tmpbox = [(newx - x_ave), (newy - y_ave), (newx + x_ave), (newy + y_ave),vocab['object_name_to_idx'][newrmname]]
|
557 |
+
if scalesize > 1:
|
558 |
+
scale = math.sqrt(scalesize)
|
559 |
+
scalex = x_ave * (scale - 1) / 2
|
560 |
+
scaley = y_ave * (scale - 1) / 2
|
561 |
+
tmpbox = [(newx-x_ave) - scalex, (newy-y_ave) - scaley,(newx+x_ave) + scalex, (newy+y_ave) + scaley,vocab['object_name_to_idx'][newrmname]]
|
562 |
+
# tmpboxin = [(newx-x_ave) ,(newy-y_ave) ,(newx+x_ave) ,(newy+y_ave) ,vocab['object_name_to_idx'][newrmname]]
|
563 |
+
# print(tmpboxin)
|
564 |
+
# print(tmpbox)
|
565 |
+
# print(scalesize)
|
566 |
+
newbox.append(tmpbox)
|
567 |
+
|
568 |
+
fp_end.data.box=np.array(newbox)
|
569 |
+
|
570 |
+
adjust_Edge=[]
|
571 |
+
for u, v in newEdge:
|
572 |
+
tmp=[index_mapping[int(u)],index_mapping[int(v)], 0]
|
573 |
+
adjust_Edge.append(tmp)
|
574 |
+
fp_end.data.edge=np.array(adjust_Edge)
|
575 |
+
rType = fp_end.get_rooms(tensor=False)
|
576 |
+
|
577 |
+
rEdge = fp_end.get_triples(tensor=False)[:, [0, 2, 1]]
|
578 |
+
Edge = [[float(u), float(v), float(type2)] for u, v, type2 in rEdge]
|
579 |
+
Box=NewLay
|
580 |
+
boundary_mat = matlab.double(boundary)
|
581 |
+
rType_mat = matlab.double(rType.tolist())
|
582 |
+
Edge_mat = matlab.double(Edge)
|
583 |
+
Box_mat=matlab.double(Box)
|
584 |
+
fp_end.data.boundary =np.array(boundary)
|
585 |
+
fp_end.data.rType =np.array(rType).astype(int)
|
586 |
+
fp_end.data.refineBox=np.array(Box)
|
587 |
+
fp_end.data.rEdge=np.array(Edge)
|
588 |
+
|
589 |
+
box_refine = engview.align_fp(boundary_mat, Box_mat, rType_mat,Edge_mat ,18,False, nargout=3)
|
590 |
+
box_out=box_refine[0]
|
591 |
+
box_order=box_refine[1]
|
592 |
+
rBoundary=box_refine[2]
|
593 |
+
fp_end.data.newBox = np.array(box_out)
|
594 |
+
fp_end.data.order = np.array(box_order)
|
595 |
+
fp_end.data.rBoundary = [np.array(rb) for rb in rBoundary]
|
596 |
+
fp_end.data = add_dw_fp(fp_end.data)
|
597 |
+
sio.savemat("./static/" + userRoomID + ".mat", {"data": fp_end.data})
|
598 |
+
flag=1
|
599 |
+
return HttpResponse(json.dumps(flag), content_type="application/json")
|
600 |
+
|
601 |
+
|
602 |
+
def TransGraph_net(request):
|
603 |
+
userInfo = request.GET.get("userInfo")
|
604 |
+
testname = userInfo.split(',')[0]
|
605 |
+
trainname = request.GET.get("roomID")
|
606 |
+
mlresult = mltest.get_userinfo_net(testname, trainname)
|
607 |
+
|
608 |
+
fp_end = mlresult[0]
|
609 |
+
boxes_pred = mlresult[1]
|
610 |
+
|
611 |
+
data_js = {}
|
612 |
+
# fp_end hsedge
|
613 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
614 |
+
|
615 |
+
# fp_end rmpos
|
616 |
+
rooms = fp_end.get_rooms(tensor=False)
|
617 |
+
room = rooms
|
618 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
619 |
+
|
620 |
+
|
621 |
+
|
622 |
+
# boxes_pred
|
623 |
+
data_js["rmpos"] = []
|
624 |
+
for k in range(len(center)):
|
625 |
+
node = float(room[k]), mdul.room_label[int(room[k])][1], center[k][0], center[k][1]
|
626 |
+
data_js["rmpos"].append(node)
|
627 |
+
boxes_end = boxes_pred.tolist()
|
628 |
+
data_js['roomret'] = []
|
629 |
+
for k in range(len(room)):
|
630 |
+
data = boxes_end[k], [mdul.room_label[int(room[k])][1]]
|
631 |
+
data_js['roomret'].append(data)
|
632 |
+
|
633 |
+
test_index = testNameList.index(testname.split(".")[0])
|
634 |
+
data = test_data[test_index]
|
635 |
+
ex = ""
|
636 |
+
for i in range(len(data.boundary)):
|
637 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
638 |
+
data_js['exterior'] = ex
|
639 |
+
x0, x1 = np.min(data.boundary[:, 0]), np.max(data.boundary[:, 0])
|
640 |
+
y0, y1 = np.min(data.boundary[:, 1]), np.max(data.boundary[:, 1])
|
641 |
+
data_js['bbxarea'] = float((x1 - x0) * (y1 - y0))
|
642 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
643 |
+
|
644 |
+
|
645 |
+
def GraphSearch(request):
|
646 |
+
s=time.clock()
|
647 |
+
# Graph
|
648 |
+
Searchtype = ["BedRoom", "Bathroom", "Kitchen", "Balcony", "Storage"]
|
649 |
+
BedRoomlist = ["MasterRoom", "SecondRoom", "GuestRoom", "ChildRoom", "StudyRoom"]
|
650 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
651 |
+
|
652 |
+
testname = request.GET.get("userRoomID")
|
653 |
+
newNode = NewGraph[0]
|
654 |
+
newEdge = NewGraph[1]
|
655 |
+
r_Num = np.zeros((1, 14)).tolist()
|
656 |
+
r_Mask = np.zeros((1, 14)).tolist()
|
657 |
+
r_Acc = np.zeros((1, 14)).tolist()
|
658 |
+
r_Num[0][0] = 1
|
659 |
+
r_Mask[0][0] = 1
|
660 |
+
r_Acc[0][0] = 1
|
661 |
+
|
662 |
+
for indx, rmname, x, y, scalesize in newNode:
|
663 |
+
r_Num[0][mdul.vocab['object_name_to_idx'][rmname]] = r_Num[0][mdul.vocab['object_name_to_idx'][rmname]] + 1
|
664 |
+
r_Mask[0][mdul.vocab['object_name_to_idx'][rmname]] = 1
|
665 |
+
if rmname in BedRoomlist:
|
666 |
+
r_Num[0][13] = r_Num[0][13] + 1
|
667 |
+
r_Mask[0][13] = 1
|
668 |
+
|
669 |
+
test_index = testNameList.index(testname.split(".")[0])
|
670 |
+
topkList = []
|
671 |
+
topkList.clear()
|
672 |
+
data = test_data[test_index]
|
673 |
+
|
674 |
+
Numrooms = json.loads(request.GET.get("Numrooms"))
|
675 |
+
|
676 |
+
|
677 |
+
roomactarr = Numrooms[0]
|
678 |
+
roomexaarr = Numrooms[1]
|
679 |
+
roomnumarr = [int(x) for x in Numrooms[2]]
|
680 |
+
test_data_topk=np.arange(0,74995)
|
681 |
+
|
682 |
+
if np.sum(roomactarr) != 1 or np.sum(roomexaarr) != 1 or np.sum(roomnumarr) != 1:
|
683 |
+
test_num = train_data_rNum[test_data_topk]
|
684 |
+
# Number filter
|
685 |
+
|
686 |
+
filter_func = get_filter_func(roomactarr, roomexaarr, roomnumarr)
|
687 |
+
indices = np.where(list(map(filter_func, test_num)))
|
688 |
+
# print("np.where(list(map(fil", test_num)
|
689 |
+
indices = list(indices)
|
690 |
+
test_data_topk = test_data_topk[indices[0]]
|
691 |
+
|
692 |
+
test_num = train_data_eNum[test_data_topk]
|
693 |
+
# Graph filter
|
694 |
+
|
695 |
+
edgematrix = np.zeros((5, 5))
|
696 |
+
for indx1, indx2 in newEdge:
|
697 |
+
tmp1 = ""
|
698 |
+
tmp2 = ""
|
699 |
+
for indx, rmname, x, y, scalesize in newNode:
|
700 |
+
if indx1 == indx:
|
701 |
+
if rmname in BedRoomlist:
|
702 |
+
tmp1 = "BedRoom"
|
703 |
+
else:
|
704 |
+
tmp1 = rmname
|
705 |
+
for indx, rmname, x, y, scalesize in newNode:
|
706 |
+
if indx2 == indx:
|
707 |
+
if rmname in BedRoomlist:
|
708 |
+
tmp2 = "BedRoom"
|
709 |
+
else:
|
710 |
+
tmp2 = rmname
|
711 |
+
if tmp1 != "" and tmp2 != "":
|
712 |
+
edgematrix[Searchtype.index(tmp1)][Searchtype.index(tmp2)] = edgematrix[Searchtype.index(tmp1)][
|
713 |
+
Searchtype.index(tmp2)] + 1
|
714 |
+
edgematrix[Searchtype.index(tmp2)][Searchtype.index(tmp1)] = edgematrix[Searchtype.index(tmp2)][
|
715 |
+
Searchtype.index(tmp1)] + 1
|
716 |
+
edge = edgematrix.reshape((1, 25))
|
717 |
+
filter_graphfunc = filter_graph(edge)
|
718 |
+
# rNum_list
|
719 |
+
eNumData = []
|
720 |
+
|
721 |
+
indices = np.where(list(map(filter_graphfunc, test_num)))
|
722 |
+
|
723 |
+
indices = list(indices)
|
724 |
+
tf_trainsub=tf_train[test_data_topk[indices[0]]]
|
725 |
+
re_data = train_data[test_data_topk[indices[0]]]
|
726 |
+
test_data_tftopk=retrieve_bf(tf_trainsub, data, k=20)
|
727 |
+
re_data=re_data[test_data_tftopk]
|
728 |
+
if len(re_data) < 20:
|
729 |
+
topk = len(re_data)
|
730 |
+
else:
|
731 |
+
topk = 20
|
732 |
+
topkList = []
|
733 |
+
for i in range(topk):
|
734 |
+
topkList.append(str(re_data[i].name) + ".png")
|
735 |
+
|
736 |
+
e=time.clock()
|
737 |
+
print('Graph Search time: %s Seconds' % (e - s))
|
738 |
+
|
739 |
+
print("topkList", topkList)
|
740 |
+
return HttpResponse(json.dumps(topkList), content_type="application/json")
|
741 |
+
|
742 |
+
|
743 |
+
def retrieve_bf(tf_trainsub, datum, k=20):
|
744 |
+
# compute tf for the data boundary
|
745 |
+
x, y = rt.compute_tf(datum.boundary)
|
746 |
+
y_sampled = rt.sample_tf(x, y, 1000)
|
747 |
+
dist = np.linalg.norm(y_sampled - tf_trainsub, axis=1)
|
748 |
+
if k > np.log2(len(tf_trainsub)):
|
749 |
+
index = np.argsort(dist)[:k]
|
750 |
+
else:
|
751 |
+
index = np.argpartition(dist, k)[:k]
|
752 |
+
index = index[np.argsort(dist[index])]
|
753 |
+
return index
|
754 |
+
|
755 |
+
|
756 |
+
if __name__ == "__main__":
|
757 |
+
pass
|
Interface/Img/data.mat.png
ADDED
![]() |
Interface/Img/data_test_converted.png
ADDED
![]() |
Interface/Img/data_train_converted.png
ADDED
![]() |
Interface/Img/interface.jpg
ADDED
![]() |
Interface/Img/paper.png
ADDED
![]() |
Interface/align_fp/align_adjacent_room3.m
ADDED
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [newBox, constraint] = align_adjacent_room3(box, tempBox, updated, type, threshold)
|
2 |
+
% position of box1 relative to box2
|
3 |
+
% 0 left-above
|
4 |
+
% 1 left-below
|
5 |
+
% 2 left-of
|
6 |
+
% 3 above
|
7 |
+
% 4 inside
|
8 |
+
% 5 surrounding
|
9 |
+
% 6 below
|
10 |
+
% 7 right-of
|
11 |
+
% 8 right-above
|
12 |
+
% 9 right-below
|
13 |
+
|
14 |
+
|
15 |
+
newBox = box;
|
16 |
+
constraint = zeros(4, 2);
|
17 |
+
idx = 1;
|
18 |
+
|
19 |
+
if type == 0
|
20 |
+
alignV(true);
|
21 |
+
alignH(true);
|
22 |
+
elseif type == 1
|
23 |
+
alignV(true);
|
24 |
+
alignH(false);
|
25 |
+
elseif type == 2
|
26 |
+
align([2,1], [1,3], threshold);
|
27 |
+
align([2,2], [1,2], threshold/2);
|
28 |
+
align([2,4], [1,4], threshold/2);
|
29 |
+
elseif type == 3
|
30 |
+
align([2,2], [1,4], threshold);
|
31 |
+
align([2,1], [1,1], threshold/2);
|
32 |
+
align([2,3], [1,3], threshold/2);
|
33 |
+
elseif type == 4
|
34 |
+
align([2,1], [1,1], true);
|
35 |
+
align([2,2], [1,2], true);
|
36 |
+
align([2,3], [1,3], true);
|
37 |
+
align([2,4], [1,4], true);
|
38 |
+
elseif type == 5
|
39 |
+
align([1,1], [2,1], true);
|
40 |
+
align([1,2], [2,2], true);
|
41 |
+
align([1,3], [2,3], true);
|
42 |
+
align([1,4], [2,4], true);
|
43 |
+
elseif type == 6
|
44 |
+
align([2,4], [1,2], threshold);
|
45 |
+
align([2,1], [1,1], threshold/2);
|
46 |
+
align([2,3], [1,3], threshold/2);
|
47 |
+
elseif type == 7
|
48 |
+
align([2,3], [1,1], threshold);
|
49 |
+
align([2,2], [1,2], threshold/2);
|
50 |
+
align([2,4], [1,4], threshold/2);
|
51 |
+
elseif type == 8
|
52 |
+
alignV(false);
|
53 |
+
alignH(true);
|
54 |
+
elseif type == 9
|
55 |
+
alignV(false);
|
56 |
+
alignH(false);
|
57 |
+
end
|
58 |
+
|
59 |
+
constraint = constraint(1:idx-1, :);
|
60 |
+
|
61 |
+
function alignV(isLeft)
|
62 |
+
if isLeft
|
63 |
+
idx1 = 1;
|
64 |
+
idx2 = 3;
|
65 |
+
else
|
66 |
+
idx1 = 3;
|
67 |
+
idx2 = 1;
|
68 |
+
end
|
69 |
+
|
70 |
+
if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2))
|
71 |
+
align([2,idx1], [1,idx2], threshold/2)
|
72 |
+
else
|
73 |
+
align([2,idx2], [1,idx2], threshold/2)
|
74 |
+
end
|
75 |
+
end
|
76 |
+
|
77 |
+
function alignH(isAbove)
|
78 |
+
if isAbove
|
79 |
+
idx1 = 2;
|
80 |
+
idx2 = 4;
|
81 |
+
else
|
82 |
+
idx1 = 4;
|
83 |
+
idx2 = 2;
|
84 |
+
end
|
85 |
+
|
86 |
+
if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2))
|
87 |
+
align([2,idx1], [1,idx2], threshold/2)
|
88 |
+
else
|
89 |
+
align([2,idx2], [1,idx2], threshold/2)
|
90 |
+
end
|
91 |
+
end
|
92 |
+
|
93 |
+
function align(idx1, idx2, threshold, attach)
|
94 |
+
if nargin < 4
|
95 |
+
attach = false;
|
96 |
+
end
|
97 |
+
if abs(tempBox(idx1(1),idx1(2))- tempBox(idx2(1), idx2(2))) <= threshold
|
98 |
+
if updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2))
|
99 |
+
newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2));
|
100 |
+
elseif updated(idx2(1), idx2(2)) && ~updated(idx1(1), idx1(2))
|
101 |
+
newBox(idx1(1), idx1(2)) = newBox(idx2(1),idx2(2));
|
102 |
+
elseif ~updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2))
|
103 |
+
if attach
|
104 |
+
newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2));
|
105 |
+
else
|
106 |
+
y = (newBox(idx1(1),idx1(2)) + newBox(idx2(1), idx2(2)))/2;
|
107 |
+
newBox(idx1(1),idx1(2)) = y;
|
108 |
+
newBox(idx2(1), idx2(2)) = y;
|
109 |
+
end
|
110 |
+
end
|
111 |
+
|
112 |
+
if idx1(1) == 1
|
113 |
+
constraint(idx, :) = [idx1(2) idx2(2)];
|
114 |
+
else
|
115 |
+
constraint(idx, :) = [idx2(2) idx1(2)];
|
116 |
+
end
|
117 |
+
idx = idx + 1;
|
118 |
+
end
|
119 |
+
end
|
120 |
+
|
121 |
+
end
|
Interface/align_fp/align_fp.m
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [newBox, order, rBoundary] = align_fp(boundary, rBox, rType, rEdge, fp, threshold, drawResult)
|
2 |
+
% align the neighboring rooms first and then align with the boundary
|
3 |
+
|
4 |
+
if nargin < 7
|
5 |
+
drawResult =false;
|
6 |
+
end
|
7 |
+
|
8 |
+
% pre-processing:
|
9 |
+
% move the edge relation w.r.t. living room to the end
|
10 |
+
livingIdx = find(rType==0);
|
11 |
+
idx = rEdge(:,1) == livingIdx-1 | rEdge(:,2) == livingIdx-1;
|
12 |
+
% a = rEdge(~idx, :);
|
13 |
+
% b = rEdge(idx, :);
|
14 |
+
% rEdge = [a; b];
|
15 |
+
rEdge = rEdge(~idx, :);
|
16 |
+
entranceBox = get_entrance_space(boundary(1:2, 1:2), boundary(1,3), threshold);
|
17 |
+
|
18 |
+
if drawResult
|
19 |
+
clf
|
20 |
+
subplot(2,2,1)
|
21 |
+
plot_fp(rBox, boundary, rType, entranceBox);
|
22 |
+
title('original');
|
23 |
+
end
|
24 |
+
|
25 |
+
%% option #1: use greedy method: align with boundary first and then neighbor
|
26 |
+
% 1. align with boundary after the neighbors have been aligned
|
27 |
+
[~, newBox, updated] = align_with_boundary(rBox, boundary, threshold, rType);
|
28 |
+
|
29 |
+
if drawResult
|
30 |
+
subplot(2,2,2)
|
31 |
+
plot_fp(newBox, boundary, rType, entranceBox);
|
32 |
+
title('Align with boundary');
|
33 |
+
end
|
34 |
+
|
35 |
+
|
36 |
+
% 2. for each adjacent pair of room,
|
37 |
+
[~, newBox, ~] = align_neighbor(newBox, rEdge, updated, threshold+6);
|
38 |
+
if drawResult
|
39 |
+
subplot(2,2,3)
|
40 |
+
plot_fp(newBox, boundary, rType, entranceBox);
|
41 |
+
title('Align with neighbors');
|
42 |
+
end
|
43 |
+
|
44 |
+
% 3. regularize fp, include crop using boundary, gap filling
|
45 |
+
[newBox, order] = regularize_fp(newBox, boundary, rType);
|
46 |
+
|
47 |
+
% 4. generate the room polygons
|
48 |
+
[newBox, rBoundary] = get_room_boundary(newBox, boundary, order);
|
49 |
+
|
50 |
+
if drawResult
|
51 |
+
subplot(2,2,4)
|
52 |
+
plot_fp(newBox(order,:), boundary, rType(order), entranceBox);
|
53 |
+
title('Regularize fp');
|
54 |
+
end
|
55 |
+
|
56 |
+
% %% option #2: use optimization to align neighbors, and then align the boundary
|
57 |
+
% % 1. get the constraint from the adjacent rooms, and optimize
|
58 |
+
% %[constraint1, ~, ~] = align_with_boundary(rBox, boundary, threshold, rNode);
|
59 |
+
% [constraint2, ~, ~] = align_neighbor(rBox, rEdge, [], threshold+2);
|
60 |
+
% newBox = optimize_fp(rBox, [], constraint2);
|
61 |
+
% if drawResult
|
62 |
+
% subplot(3,4,6)
|
63 |
+
% plot_fp(newBox, boundary, rNode, entranceBox);
|
64 |
+
% title('Optimize the neighboring');
|
65 |
+
% end
|
66 |
+
%
|
67 |
+
% % 2. align with boundary after the neighbors have been aligned
|
68 |
+
% [constraint1, newBox2, ~] = align_with_boundary(newBox, boundary, threshold, rNode);
|
69 |
+
% if drawResult
|
70 |
+
% subplot(3,4,7)
|
71 |
+
% plot_fp(newBox2, boundary, rNode, entranceBox);
|
72 |
+
% title('Align with boundary w/o optimization');
|
73 |
+
% end
|
74 |
+
%
|
75 |
+
% % 3. regularize fp, include crop using boundary, gap filling
|
76 |
+
% [newBox2, order] = regularize_fp(newBox2, boundary, rNode);
|
77 |
+
% if drawResult
|
78 |
+
% subplot(3,4,8)
|
79 |
+
% plot_fp(newBox2(order,:), boundary, rNode(order,:), entranceBox);
|
80 |
+
% title('Regularize fp');
|
81 |
+
% end
|
82 |
+
%
|
83 |
+
%
|
84 |
+
%
|
85 |
+
% newBox = optimize_fp(newBox, constraint1, constraint2);
|
86 |
+
% if drawResult
|
87 |
+
% subplot(3,4,11)
|
88 |
+
% plot_fp(newBox, boundary, rNode, entranceBox);
|
89 |
+
% title('Align with boundary with optimization');
|
90 |
+
% end
|
91 |
+
%
|
92 |
+
% % 3. regularize fp, include crop using boundary, gap filling
|
93 |
+
% [newBox, order] = regularize_fp(newBox, boundary, rNode);
|
94 |
+
% if drawResult
|
95 |
+
% subplot(3,4,12)
|
96 |
+
% plot_fp(newBox(order,:), boundary, rNode(order,:), entranceBox);
|
97 |
+
% title('Regularize fp');
|
98 |
+
% if ~isempty(figName)
|
99 |
+
% saveas(gcf, figName);
|
100 |
+
% end
|
101 |
+
% end
|
102 |
+
%
|
103 |
+
|
104 |
+
|
105 |
+
|
106 |
+
%%
|
107 |
+
end
|
108 |
+
|
Interface/align_fp/align_neighbor.m
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [constraint, box, updated] = align_neighbor(box, rEdge, updated, threshold)
|
2 |
+
|
3 |
+
if isempty(updated)
|
4 |
+
updated = false(size(box));
|
5 |
+
end
|
6 |
+
|
7 |
+
tempBox = box;
|
8 |
+
constraint = zeros(size(rEdge, 1)*3, 2);
|
9 |
+
iBegin = 1;
|
10 |
+
checked = false(size(rEdge, 1), 1);
|
11 |
+
updatedCount = get_updated_count(updated, rEdge);
|
12 |
+
for i = 1:size(rEdge, 1)
|
13 |
+
I = find(~checked);
|
14 |
+
[~, t] = maxk(updatedCount(I), 1);
|
15 |
+
checked(I(t)) = true;
|
16 |
+
idx = rEdge(I(t),1:2)+1;
|
17 |
+
[b, c] = align_adjacent_room3(box(idx, :), tempBox(idx, :), updated(idx,:), rEdge(I(t),3), threshold);
|
18 |
+
for j = 1:length(idx)
|
19 |
+
|
20 |
+
updated(idx(j), c(:,j)) = true;
|
21 |
+
|
22 |
+
c(:, j) = (c(:,j)-1)*size(box,1) + double(idx(j));
|
23 |
+
|
24 |
+
if b(j, 1) == b(j, 3)
|
25 |
+
b(j, [1 3]) = box(idx(j), [1 3]);
|
26 |
+
updated(idx(j), c(:,j)) = false;
|
27 |
+
end
|
28 |
+
if b(j, 2) == b(j, 4)
|
29 |
+
b(j, [2 4]) = box(idx(j), [2 4]);
|
30 |
+
updated(idx(j), c(:,j)) = false;
|
31 |
+
end
|
32 |
+
|
33 |
+
end
|
34 |
+
box(idx, :) = b;
|
35 |
+
|
36 |
+
|
37 |
+
cNum = size(c, 1);
|
38 |
+
|
39 |
+
constraint(iBegin:iBegin+cNum-1, :) = c;
|
40 |
+
iBegin = iBegin+cNum;
|
41 |
+
|
42 |
+
updatedCount = get_updated_count(updated, rEdge);
|
43 |
+
end
|
44 |
+
constraint = constraint(1:iBegin-1, :);
|
45 |
+
|
46 |
+
function updatedCount = get_updated_count(updated, rEdge)
|
47 |
+
updatedCount = zeros(size(rEdge, 1), 1);
|
48 |
+
for k = 1:size(rEdge, 1)
|
49 |
+
index = rEdge(k,1:2)+1;
|
50 |
+
updatedCount(k) = sum(sum(updated(index,:)));
|
51 |
+
end
|
52 |
+
end
|
53 |
+
end
|
Interface/align_fp/align_with_boundary.m
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [constraint, box, updated] = align_with_boundary(box, boundary, threshold, rType)
|
2 |
+
tempBox = box;
|
3 |
+
updated = false(size(box));
|
4 |
+
closedSeg = zeros(size(box));
|
5 |
+
distSeg = zeros(size(box));
|
6 |
+
for i = 1:length(box)
|
7 |
+
[closedSeg(i,:), distSeg(i,:)] = find_close_seg(box(i,:), boundary);
|
8 |
+
end
|
9 |
+
|
10 |
+
|
11 |
+
box(distSeg <= threshold) = closedSeg(distSeg <= threshold);
|
12 |
+
updated(distSeg <= threshold) = true;
|
13 |
+
idx = find(distSeg <= threshold);
|
14 |
+
constraint = [idx closedSeg(idx)];
|
15 |
+
|
16 |
+
|
17 |
+
% check if any room box blocks the door
|
18 |
+
entranceBox = get_entrance_space(boundary(1:2, 1:2), boundary(1,3), threshold);
|
19 |
+
entrancePoly = polyshape(entranceBox([1 1 3 3]), entranceBox([2 4 4 2]));
|
20 |
+
for i = 1:length(box)
|
21 |
+
if rType(i) ~= 10 && rType(i) ~= 0
|
22 |
+
roomPoly = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
23 |
+
if overlaps(entrancePoly, roomPoly)
|
24 |
+
box(i,:) = shrink_box(roomPoly, entrancePoly, boundary(1,3));
|
25 |
+
updated(i, box(i,:)==tempBox(i,:)) = false;
|
26 |
+
updated(i, box(i,:)~=tempBox(i,:)) = true;
|
27 |
+
end
|
28 |
+
end
|
29 |
+
end
|
Interface/align_fp/find_close_seg.m
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [closedSeg, distSeg, idx] = find_close_seg(box, boundary)
|
2 |
+
|
3 |
+
% need to carefully select the closed wall seg for each box
|
4 |
+
% cannot introduce a hole inside the boundary
|
5 |
+
|
6 |
+
isNew = boundary(:,4);
|
7 |
+
boundary = double(boundary(~isNew, :));
|
8 |
+
|
9 |
+
% get the ordered horizontal and vertical segments on the boundary
|
10 |
+
bSeg = [boundary(:, 1:2), boundary([2:end 1], 1:2), boundary(:,3)];
|
11 |
+
vSeg = bSeg(mod(boundary(:,3), 2)==1, :);
|
12 |
+
vSeg(vSeg(:,5)==3, [2 4]) = vSeg(vSeg(:,5)==3, [4 2]);
|
13 |
+
[~, I] = sort(vSeg(:,1));
|
14 |
+
vSeg = vSeg(I,:);
|
15 |
+
|
16 |
+
hSeg = bSeg(mod(boundary(:,3), 2)==0, :);
|
17 |
+
hSeg(hSeg(:,5)==2, [1 3]) = hSeg(hSeg(:,5)==2, [3 1]);
|
18 |
+
[~, I] = sort(hSeg(:,2));
|
19 |
+
hSeg = hSeg(I,:);
|
20 |
+
|
21 |
+
closedSeg = ones(1,4)*256;
|
22 |
+
distSeg = ones(1,4)*256;
|
23 |
+
idx = zeros(1, 4);
|
24 |
+
|
25 |
+
% check vertial seg
|
26 |
+
for i = 1:size(vSeg,1)
|
27 |
+
seg = vSeg(i, :);
|
28 |
+
vdist = 0;
|
29 |
+
if seg(4) <= box(2)
|
30 |
+
vdist = box(2) - seg(4);
|
31 |
+
elseif seg(2) >= box(4)
|
32 |
+
vdist = seg(2) - box(4);
|
33 |
+
end
|
34 |
+
|
35 |
+
hdist = box([1 3]) - seg(1);
|
36 |
+
dist1 = norm(double([hdist(1), vdist]));
|
37 |
+
dist3 = norm(double([hdist(2), vdist]));
|
38 |
+
|
39 |
+
if dist1 < distSeg(1) && dist1 <= dist3 && hdist(1) > 0
|
40 |
+
distSeg(1) = dist1;
|
41 |
+
idx(1) = i;
|
42 |
+
closedSeg(1) = seg(1);
|
43 |
+
elseif dist3 < distSeg(3) && hdist(2) < 0
|
44 |
+
distSeg(3) = dist3;
|
45 |
+
idx(3) = i;
|
46 |
+
closedSeg(3) = seg(3);
|
47 |
+
end
|
48 |
+
end
|
49 |
+
|
50 |
+
% check horizontal seg
|
51 |
+
for i = 1:size(hSeg,1)
|
52 |
+
|
53 |
+
seg = hSeg(i, :);
|
54 |
+
hdist = 0;
|
55 |
+
if seg(3) <= box(1)
|
56 |
+
hdist = box(1) - seg(3);
|
57 |
+
elseif seg(1) >= box(3)
|
58 |
+
hdist = seg(1) - box(3);
|
59 |
+
end
|
60 |
+
|
61 |
+
vdist = box([2 4]) - seg(2);
|
62 |
+
dist2 = norm(double([vdist(1), hdist]));
|
63 |
+
dist4 = norm(double([vdist(2), hdist]));
|
64 |
+
|
65 |
+
if dist2 <= dist4 && dist2 < distSeg(2) && vdist(1) > 0
|
66 |
+
distSeg(2) = dist2;
|
67 |
+
idx(2) = i;
|
68 |
+
closedSeg(2) = seg(2);
|
69 |
+
elseif dist4 < distSeg(4) && vdist(2) < 0
|
70 |
+
distSeg(4) = dist4;
|
71 |
+
idx(4) = i;
|
72 |
+
closedSeg(4) = seg(4);
|
73 |
+
end
|
74 |
+
end
|