├── Table-1.sh ├── Table-2.sh ├── README.md ├── test.py ├── code ├── autoencoder.py └── main.py └── data ├── ChicagoSketch_node.tntp ├── Anaheim_flow.tntp └── anaheim_nodes.geojson /Table-1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for Dataset in An Ch 4 | do 5 | for CP_or_CQR in CQR CP 6 | do 7 | for SCORE in cqr qr cqr_new 8 | do 9 | for DiGAE_or_GAE_or_LGNN in GAE DiGAE LGNN 10 | do 11 | python3 code/main.py --Conditional False --SCORE $SCORE --GNNCONV GraphConv --CP_or_CQR $CP_or_CQR --DiGAE_or_GAE_or_LGNN $DiGAE_or_GAE_or_LGNN --SEEDNUM 1 --Dataset $Dataset 12 | done 13 | done 14 | done 15 | done 16 | -------------------------------------------------------------------------------- /Table-2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for Dataset in An Ch 4 | do 5 | for Weighted in False True CP_or_CQR in CQR CP 6 | do 7 | for CP_or_CQR in CP CQR 8 | do 9 | for SCORE in cqr qr cqr_new 10 | do 11 | for DiGAE_or_GAE_or_LGNN in GAE DiGAE LGNN 12 | do 13 | for GNNCONV in GraphConv SAGEConv GCNConv GATConv 14 | do 15 | python3 code/main.py --Conditional True --SCORE $SCORE --GNNCONV GraphConv --CP_or_CQR $CP_or_CQR --DiGAE_or_GAE_or_LGNN $DiGAE_or_GAE_or_LGNN --SEEDNUM 1 --Weighted $Weighted --Dataset $Dataset 16 | done 17 | done 18 | done 19 | done 20 | done 21 | done 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Conformal Load Forecasting on Graphs 2 | This repository contains the official source code for the paper: 3 | **"Conformal Load Prediction with Transductive Graph Autoencoders"** 4 | Published in *Machine Learning, Volume 114, Article 54, 2025*. 5 | DOI: [10.1007/s10994-024-06713-w](https://doi.org/10.1007/s10994-024-06713-w). 6 | 7 | ## Overview 8 | This repository implements the methods described in the paper for conformal load prediction on graph-structured data using transductive graph autoencoders. The approach leverages conformal prediction techniques to provide uncertainty estimates for edge weight predictions in graphs, with applications in transportation systems and other domains. 9 | 10 | ## How to Run 11 | To reproduce the results from Table 1 in the paper, run the following command: 12 | ```bash 13 | sh Table-1.sh 14 | ``` 15 | 16 | To reproduce the results from Table 2 in the paper, run the following command: 17 | ```bash 18 | sh Table-2.sh 19 | ``` 20 | 21 | ## Acknowledgement 22 | We acknowledge several GitHub resources that we used in our research. 23 | - For providing the datasets: https://github.com/bstabler/TransportationNetworks/tree/master; 24 | - For providing the data preprocessing code: https://github.com/000Justin000/ssl_edge; 25 | - For providing the conformal quantile regression code: https://github.com/snap-stanford/conformalized-gnn. 26 | 27 | We sincerely appreciate their efforts. 28 | 29 | ## Citation 30 | If you find this repository or our work helpful, please consider citing our paper: 31 | ``` 32 | @article{luo2025conformal, 33 | title={Conformal load prediction with transductive graph autoencoders}, 34 | author={Luo, Rui and Colombo, Nicolo}, 35 | journal={Machine Learning}, 36 | volume={114}, 37 | number={3}, 38 | pages={1--22}, 39 | year={2025}, 40 | publisher={Springer} 41 | } 42 | ``` 43 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import autoencoder 3 | from autoencoder import VGAE, GAE, EdgeDecoder, DirectedEdgeDecoder, InnerProductDecoder, DirectedInnerProductDecoder 4 | from sklearn.preprocessing import StandardScaler, MinMaxScaler 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | import numpy as np 8 | import networkx as nx 9 | import copy 10 | import torch 11 | from torch_geometric.utils.convert import from_networkx 12 | from torch_geometric.utils import train_test_split_edges 13 | from scipy.stats import ranksums 14 | from torch_geometric.nn import GraphConv, SAGEConv, GATConv, GCNConv 15 | import torch.nn.functional as F 16 | from torch_geometric.transforms import LineGraph, RandomNodeSplit, RandomLinkSplit 17 | from torch_geometric import seed_everything 18 | import geopandas as gpd 19 | 20 | parser = argparse.ArgumentParser(description='Description of your program') 21 | parser.add_argument('--SCORE', type=str, default='cqr', help='SCORE option: qr, cqr, cqr_new') 22 | parser.add_argument('--GNNCONV', type=str, default='GraphConv', help='GNNCONV option: GraphConv, SAGEConv, GCNConv, GATConv ') 23 | parser.add_argument('--CP_or_CQR', type=str, help='CP_or_CQR option: CP CQR') 24 | parser.add_argument('--Dataset', type=str, help='Description of Dataset option: An, Chicago') 25 | parser.add_argument('--DiGAE_or_GAE_or_LGNN', type=str, help='DiGAE_or_GAE_or_LGNN option: Digae, GAE, LGNN') 26 | parser.add_argument('--SEEDNUM', type=int, help='Loop number!: Recommand: 10/20') 27 | parser.add_argument('--Weighted', type=str, help='Containing weighted edge or not: False, True') 28 | parser.add_argument('--Conditional', type=str, help='Conditioal model or not-Using the worest cov result to do the calculation: True, False') 29 | 30 | def main(): 31 | # 解析命令行参数 32 | args = parser.parse_args() 33 | # 获取可选项的值 34 | SCORE = args.SCORE 35 | print(SCORE) 36 | GNNCONV = args.GNNCONV 37 | #print(GNNCONV) 38 | # 获取其他可选项的值 39 | CP_or_CQR = args.CP_or_CQR 40 | print(CP_or_CQR) 41 | Dataset = args.Dataset 42 | DiGAE_or_GAE_or_LGNN = args.DiGAE_or_GAE_or_LGNN 43 | print(DiGAE_or_GAE_or_LGNN) 44 | SEEDNUM = args.SEEDNUM 45 | Weighted = args.Weighted 46 | Conditional = args.Conditional 47 | 48 | # 执行其他函数 49 | function_model(DiGAE_or_GAE_or_LGNN, CP_or_CQR, SCORE, SEEDNUM, GNNCONV, Weighted, Conditional, Dataset) 50 | #function2() 51 | 52 | if __name__ == '__main__': 53 | main() 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /code/autoencoder.py: -------------------------------------------------------------------------------- 1 | from typing import Optional, Tuple 2 | 3 | import torch 4 | from torch import Tensor 5 | from torch.nn import Module 6 | 7 | from torch_geometric.nn.inits import reset 8 | from torch_geometric.utils import negative_sampling 9 | 10 | EPS = 1e-15 11 | MAX_LOGSTD = 10 12 | 13 | 14 | class InnerProductDecoder(torch.nn.Module): 15 | r"""The inner product decoder from the `"Variational Graph Auto-Encoders" 16 | `_ paper 17 | 18 | .. math:: 19 | \sigma(\mathbf{Z}\mathbf{Z}^{\top}) 20 | 21 | where :math:`\mathbf{Z} \in \mathbb{R}^{N \times d}` denotes the latent 22 | space produced by the encoder.""" 23 | def forward(self, z: Tensor, edge_index: Tensor, 24 | sigmoid: bool = True) -> Tensor: 25 | r"""Decodes the latent variables :obj:`z` into edge probabilities for 26 | the given node-pairs :obj:`edge_index`. 27 | 28 | Args: 29 | z (torch.Tensor): The latent space :math:`\mathbf{Z}`. 30 | sigmoid (bool, optional): If set to :obj:`False`, does not apply 31 | the logistic sigmoid function to the output. 32 | (default: :obj:`True`) 33 | """ 34 | value = (z[edge_index[0]] * z[edge_index[1]]).sum(dim=1) 35 | return torch.sigmoid(value) if sigmoid else value 36 | 37 | def forward_all(self, z: Tensor, sigmoid: bool = True) -> Tensor: 38 | r"""Decodes the latent variables :obj:`z` into a probabilistic dense 39 | adjacency matrix. 40 | 41 | Args: 42 | z (torch.Tensor): The latent space :math:`\mathbf{Z}`. 43 | sigmoid (bool, optional): If set to :obj:`False`, does not apply 44 | the logistic sigmoid function to the output. 45 | (default: :obj:`True`) 46 | """ 47 | adj = torch.matmul(z, z.t()) 48 | return torch.sigmoid(adj) if sigmoid else adj 49 | 50 | 51 | class DirectedInnerProductDecoder(torch.nn.Module): 52 | r"""The inner product decoder from the `"Variational Graph Auto-Encoders" 53 | `_ paper 54 | 55 | .. math:: 56 | \sigma(\mathbf{Z}\mathbf{Z}^{\top}) 57 | 58 | where :math:`\mathbf{Z} \in \mathbb{R}^{N \times d}` denotes the latent 59 | space produced by the encoder.""" 60 | def forward(self, z1: Tensor, z2: Tensor, edge_index: Tensor, 61 | sigmoid: bool = False) -> Tensor: 62 | r"""Decodes the latent variables :obj:`z` into edge probabilities for 63 | the given node-pairs :obj:`edge_index`. 64 | 65 | Args: 66 | z (torch.Tensor): The latent space :math:`\mathbf{Z}`. 67 | sigmoid (bool, optional): If set to :obj:`False`, does not apply 68 | the logistic sigmoid function to the output. 69 | (default: :obj:`True`) 70 | """ 71 | value = (z1[edge_index[0]] * z2[edge_index[1]]).sum(dim=1) 72 | return torch.sigmoid(value) if sigmoid else value 73 | 74 | def forward_all(self, z1: Tensor, z2: Tensor, sigmoid: bool = True) -> Tensor: 75 | r"""Decodes the latent variables :obj:`z` into a probabilistic dense 76 | adjacency matrix. 77 | 78 | Args: 79 | z (torch.Tensor): The latent space :math:`\mathbf{Z}`. 80 | sigmoid (bool, optional): If set to :obj:`False`, does not apply 81 | the logistic sigmoid function to the output. 82 | (default: :obj:`True`) 83 | """ 84 | adj = torch.matmul(z1, z2.t()) 85 | return torch.sigmoid(adj) if sigmoid else adj 86 | 87 | 88 | class EdgeDecoder(torch.nn.Module): 89 | """ 90 | Edge Decoder module to infer the predictions. 91 | 92 | Args: 93 | hidden_channels (int): The number of hidden channels. 94 | num_heads_GAT (int): The number of attention heads in GAT layer. 95 | """ 96 | 97 | def __init__(self, hidden_channels=8, out_channels=1): 98 | 99 | super().__init__() 100 | 101 | self.lin1 = torch.nn.Linear(2 * hidden_channels, hidden_channels) 102 | self.lin2 = torch.nn.Linear(hidden_channels, out_channels) 103 | 104 | def forward(self, z, edge_index, sigmoid=False): 105 | """ 106 | Forward pass of the EdgeDecoder module. 107 | 108 | Args: 109 | z_dict (dict): node type as keys and temporal node embeddings 110 | for each node as values. 111 | edge_label_index (torch.Tensor): see previous section. 112 | 113 | Returns: 114 | torch.Tensor: Predicted edge labels. 115 | """ 116 | row, col = edge_index 117 | 118 | z = torch.cat([z[row], z[col]], dim=-1) 119 | z = self.lin1(z) 120 | z = z.relu() # torch.nn.functional.leaky_relu(z, negative_slope=0.1) 121 | z = self.lin2(z) 122 | return torch.sigmoid(z) if sigmoid else z 123 | 124 | 125 | class DirectedEdgeDecoder(torch.nn.Module): 126 | """ 127 | Edge Decoder module to infer the predictions. 128 | 129 | Args: 130 | hidden_channels (int): The number of hidden channels. 131 | num_heads_GAT (int): The number of attention heads in GAT layer. 132 | """ 133 | 134 | def __init__(self, in_channels, hidden_channels=8, out_channels=1): 135 | 136 | super().__init__() 137 | 138 | self.lin1 = torch.nn.Linear(2 * in_channels, hidden_channels) 139 | self.lin2 = torch.nn.Linear(hidden_channels, out_channels) 140 | 141 | def forward(self, z1, z2, edge_index, sigmoid=False): 142 | """ 143 | Forward pass of the EdgeDecoder module. 144 | 145 | Args: 146 | z_dict (dict): node type as keys and temporal node embeddings 147 | for each node as values. 148 | edge_label_index (torch.Tensor): see previous section. 149 | 150 | Returns: 151 | torch.Tensor: Predicted edge labels. 152 | """ 153 | row, col = edge_index 154 | 155 | z = torch.cat([z1[row], z2[col]], dim=-1) 156 | z = self.lin1(z) 157 | z = z.relu() # torch.nn.functional.leaky_relu(z, negative_slope=0.1) 158 | z = self.lin2(z) 159 | return torch.sigmoid(z) if sigmoid else z 160 | 161 | 162 | class GAE(torch.nn.Module): 163 | r"""The Graph Auto-Encoder model from the 164 | `"Variational Graph Auto-Encoders" `_ 165 | paper based on user-defined encoder and decoder models. 166 | 167 | Args: 168 | encoder (torch.nn.Module): The encoder module. 169 | decoder (torch.nn.Module, optional): The decoder module. If set to 170 | :obj:`None`, will default to the 171 | :class:`torch_geometric.nn.models.InnerProductDecoder`. 172 | (default: :obj:`None`) 173 | """ 174 | def __init__(self, encoder: Module, decoder: Optional[Module] = None): 175 | super().__init__() 176 | self.encoder = encoder 177 | self.decoder = EdgeDecoder() if decoder is None else decoder 178 | # self.decoder = InnerProductDecoder() if decoder is None else decoder 179 | GAE.reset_parameters(self) 180 | 181 | def reset_parameters(self): 182 | r"""Resets all learnable parameters of the module.""" 183 | reset(self.encoder) 184 | reset(self.decoder) 185 | 186 | def forward(self, *args, **kwargs) -> Tensor: # pragma: no cover 187 | r"""Alias for :meth:`encode`.""" 188 | return self.encoder(*args, **kwargs) 189 | 190 | def encode(self, *args, **kwargs) -> Tensor: 191 | r"""Runs the encoder and computes node-wise latent variables.""" 192 | return self.encoder(*args, **kwargs) 193 | 194 | def decode(self, *args, **kwargs) -> Tensor: 195 | r"""Runs the decoder and computes edge probabilities.""" 196 | return self.decoder(*args, **kwargs) 197 | 198 | def recon_loss(self, z: Tensor, pos_edge_index: Tensor, pos_edge_weight: Tensor, 199 | neg_edge_index: Optional[Tensor] = None, return_all = False) -> Tensor: 200 | r"""Given latent variables :obj:`z`, computes the binary cross 201 | entropy loss for positive edges :obj:`pos_edge_index` and negative 202 | sampled edges. 203 | 204 | Args: 205 | z (torch.Tensor): The latent space :math:`\mathbf{Z}`. 206 | pos_edge_index (torch.Tensor): The positive edges to train against. 207 | neg_edge_index (torch.Tensor, optional): The negative edges to 208 | train against. If not given, uses negative sampling to 209 | calculate negative edges. (default: :obj:`None`) 210 | """ 211 | edge_weight_pred = self.decoder(z, pos_edge_index, sigmoid=False) 212 | if return_all: 213 | return (edge_weight_pred - pos_edge_weight) ** 2 214 | return torch.nn.functional.mse_loss(edge_weight_pred, pos_edge_weight) 215 | 216 | # pos_loss = -torch.log( 217 | # self.decoder(z, pos_edge_index, sigmoid=True) + EPS).mean() 218 | 219 | # if neg_edge_index is None: 220 | # neg_edge_index = negative_sampling(pos_edge_index, z.size(0)) 221 | # neg_loss = -torch.log(1 - 222 | # self.decoder(z, neg_edge_index, sigmoid=True) + 223 | # EPS).mean() 224 | 225 | # return pos_loss + neg_loss 226 | 227 | 228 | class VGAE(torch.nn.Module): 229 | def __init__(self, encoder: Module, decoder: Optional[Module] = None): 230 | super().__init__() 231 | self.encoder = encoder 232 | self.decoder = InnerProductDecoder() if decoder is None else decoder 233 | VGAE.reset_parameters(self) 234 | 235 | def reset_parameters(self): 236 | r"""Resets all learnable parameters of the module.""" 237 | reset(self.encoder) 238 | reset(self.decoder) 239 | 240 | def reparametrize(self, mu: Tensor, logstd: Tensor) -> Tensor: 241 | if self.training: 242 | return mu + torch.randn_like(logstd) * torch.exp(logstd) 243 | else: 244 | return mu 245 | 246 | def forward(self, *args, **kwargs) -> Tensor: 247 | """""" 248 | self.mu1, self.mu2, self.mu3, self.logstd = self.encoder(*args, **kwargs) 249 | self.logstd = self.logstd.clamp(max=10) 250 | z1 = self.reparametrize(self.mu1, self.logstd) 251 | z2 = self.reparametrize(self.mu2, self.logstd) 252 | z3 = self.reparametrize(self.mu3, self.logstd) 253 | return torch.cat([z1, z2, z3], dim=-1) 254 | 255 | def kl_loss(self, mu: Optional[Tensor] = None, 256 | logstd: Optional[Tensor] = None) -> Tensor: 257 | r"""Computes the KL loss, either for the passed arguments :obj:`mu` 258 | and :obj:`logstd`, or based on latent variables from last encoding. 259 | 260 | Args: 261 | mu (torch.Tensor, optional): The latent space for :math:`\mu`. If 262 | set to :obj:`None`, uses the last computation of :math:`\mu`. 263 | (default: :obj:`None`) 264 | logstd (torch.Tensor, optional): The latent space for 265 | :math:`\log\sigma`. If set to :obj:`None`, uses the last 266 | computation of :math:`\log\sigma^2`. (default: :obj:`None`) 267 | """ 268 | mu1, mu2, mu3, logstd = self.mu1, self.mu2, self.mu3, self.logstd 269 | return -0.5 * torch.mean( 270 | torch.sum(1 + 2 * logstd - mu1**2 - logstd.exp()**2, dim=1))\ 271 | -0.5 * torch.mean( 272 | torch.sum(1 + 2 * logstd - mu2**2 - logstd.exp()**2, dim=1))\ 273 | -0.5 * torch.mean( 274 | torch.sum(1 + 2 * logstd - mu3**2 - logstd.exp()**2, dim=1)) 275 | -------------------------------------------------------------------------------- /data/ChicagoSketch_node.tntp: -------------------------------------------------------------------------------- 1 | node X Y ; 2 | 1 690309 1976022 ; 3 | 2 683649 1973025 ; 4 | 3 693306 1963368 ; 5 | 4 686313 1958373 ; 6 | 5 696636 1946718 ; 7 | 6 671328 1968030 ; 8 | 7 676323 1957041 ; 9 | 8 655677 1967031 ; 10 | 9 649350 1952712 ; 11 | 10 665667 1949049 ; 12 | 11 666333 1933398 ; 13 | 12 676323 1935396 ; 14 | 13 677988 1924407 ; 15 | 14 679653 1945719 ; 16 | 15 688977 1936062 ; 17 | 16 692307 1925739 ; 18 | 17 700965 1935396 ; 19 | 18 702963 1927404 ; 20 | 19 704295 1919412 ; 21 | 20 678654 1912752 ; 22 | 21 691641 1917747 ; 23 | 22 705294 1911087 ; 24 | 23 693972 1906425 ; 25 | 24 679653 1904760 ; 26 | 25 664002 1893771 ; 27 | 26 680652 1891107 ; 28 | 27 694971 1889775 ; 29 | 28 707625 1900098 ; 30 | 29 710955 1884447 ; 31 | 30 680319 1878120 ; 32 | 31 696303 1873791 ; 33 | 32 689643 1861803 ; 34 | 33 705627 1851147 ; 35 | 34 705960 1865133 ; 36 | 35 722610 1876122 ; 37 | 36 723609 1856142 ; 38 | 37 625374 1965033 ; 39 | 38 550449 2013984 ; 40 | 39 590076 2021310 ; 41 | 40 573426 2021310 ; 42 | 41 590076 2005326 ; 43 | 42 573759 2005326 ; 44 | 43 622377 2020977 ; 45 | 44 606060 2021310 ; 46 | 45 622377 2005326 ; 47 | 46 605727 2004660 ; 48 | 47 654345 2021310 ; 49 | 48 638361 2021310 ; 50 | 49 654012 2005326 ; 51 | 50 638361 2005326 ; 52 | 51 667998 2020311 ; 53 | 52 683982 2001330 ; 54 | 53 670329 2004660 ; 55 | 54 551448 1990341 ; 56 | 55 534798 1989675 ; 57 | 56 551448 1976022 ; 58 | 57 534798 1976022 ; 59 | 58 582750 1991340 ; 60 | 59 567099 1990674 ; 61 | 60 582750 1977687 ; 62 | 61 567099 1977021 ; 63 | 62 613386 1991673 ; 64 | 63 598068 1991340 ; 65 | 64 613386 1978020 ; 66 | 65 598401 1977687 ; 67 | 66 644688 1992006 ; 68 | 67 629037 1992006 ; 69 | 68 644688 1979352 ; 70 | 69 629370 1979019 ; 71 | 70 677655 1991673 ; 72 | 71 660672 1992339 ; 73 | 72 676989 1981350 ; 74 | 73 661005 1981350 ; 75 | 74 687978 1992006 ; 76 | 75 687978 1984347 ; 77 | 76 635697 1963035 ; 78 | 77 629037 1946718 ; 79 | 78 645021 1945053 ; 80 | 79 650016 1958706 ; 81 | 80 646020 1930401 ; 82 | 81 629370 1930068 ; 83 | 82 646020 1914750 ; 84 | 83 630369 1913751 ; 85 | 84 657342 1930734 ; 86 | 85 663003 1914750 ; 87 | 86 647019 1898433 ; 88 | 87 631035 1897767 ; 89 | 88 647019 1882116 ; 90 | 89 631035 1881450 ; 91 | 90 662337 1902762 ; 92 | 91 663003 1882116 ; 93 | 92 608058 1847151 ; 94 | 93 647685 1866132 ; 95 | 94 631701 1865466 ; 96 | 95 648018 1849482 ; 97 | 96 632367 1849482 ; 98 | 97 679320 1869129 ; 99 | 98 663669 1866465 ; 100 | 99 680652 1847151 ; 101 | 100 664002 1850148 ; 102 | 101 694305 1846152 ; 103 | 102 648351 1833165 ; 104 | 103 633033 1832832 ; 105 | 104 649350 1817181 ; 106 | 105 632700 1816848 ; 107 | 106 681318 1834164 ; 108 | 107 664668 1834164 ; 109 | 108 681651 1817847 ; 110 | 109 665334 1817181 ; 111 | 110 714285 1834164 ; 112 | 111 697968 1834830 ; 113 | 112 714618 1817514 ; 114 | 113 698301 1817514 ; 115 | 114 726939 1834164 ; 116 | 115 727272 1817847 ; 117 | 116 681984 1801197 ; 118 | 117 666333 1801197 ; 119 | 118 682650 1784880 ; 120 | 119 666666 1784880 ; 121 | 120 714618 1801197 ; 122 | 121 698301 1801197 ; 123 | 122 714951 1785213 ; 124 | 123 698634 1785213 ; 125 | 124 727605 1794537 ; 126 | 125 550782 1960371 ; 127 | 126 535131 1959372 ; 128 | 127 551448 1944054 ; 129 | 128 534798 1943055 ; 130 | 129 582084 1960704 ; 131 | 130 567099 1960038 ; 132 | 131 582750 1945386 ; 133 | 132 567099 1944387 ; 134 | 133 610056 1961703 ; 135 | 134 598068 1961703 ; 136 | 135 613386 1945386 ; 137 | 136 597402 1945053 ; 138 | 137 550782 1927071 ; 139 | 138 534798 1927071 ; 140 | 139 550449 1911753 ; 141 | 140 535131 1911087 ; 142 | 141 582417 1928736 ; 143 | 142 567099 1928070 ; 144 | 143 582417 1912752 ; 145 | 144 567099 1911753 ; 146 | 145 613386 1929735 ; 147 | 146 598401 1928736 ; 148 | 147 614385 1913085 ; 149 | 148 598068 1912752 ; 150 | 149 550782 1895103 ; 151 | 150 534465 1895103 ; 152 | 151 551115 1879119 ; 153 | 152 534798 1878453 ; 154 | 153 582750 1895769 ; 155 | 154 567099 1895769 ; 156 | 155 583083 1880118 ; 157 | 156 567432 1879119 ; 158 | 157 614385 1896435 ; 159 | 158 598734 1896435 ; 160 | 159 615051 1881450 ; 161 | 160 599067 1880784 ; 162 | 161 606726 1864800 ; 163 | 162 453879 2013651 ; 164 | 163 485847 2013651 ; 165 | 164 525807 2021310 ; 166 | 165 509823 2021976 ; 167 | 166 526140 2005659 ; 168 | 167 509490 2005326 ; 169 | 168 448551 1982349 ; 170 | 169 479520 1982349 ; 171 | 170 518814 1989675 ; 172 | 171 503163 1989009 ; 173 | 172 518481 1975356 ; 174 | 173 503163 1975356 ; 175 | 174 448884 1950714 ; 176 | 175 479520 1951380 ; 177 | 176 519480 1958706 ; 178 | 177 503163 1959039 ; 179 | 178 518814 1943055 ; 180 | 179 503496 1942056 ; 181 | 180 448551 1918413 ; 182 | 181 479853 1919412 ; 183 | 182 518814 1926738 ; 184 | 183 503496 1926072 ; 185 | 184 519147 1910754 ; 186 | 185 502830 1910421 ; 187 | 186 448551 1886445 ; 188 | 187 480186 1887444 ; 189 | 188 519147 1894437 ; 190 | 189 503829 1894104 ; 191 | 190 519147 1878453 ; 192 | 191 503829 1877454 ; 193 | 192 554778 2142189 ; 194 | 193 589410 2148849 ; 195 | 194 572760 2148183 ; 196 | 195 589743 2134197 ; 197 | 196 574092 2133864 ; 198 | 197 614385 2141856 ; 199 | 198 643023 2148516 ; 200 | 199 642690 2133864 ; 201 | 200 555777 2110554 ; 202 | 201 590076 2117547 ; 203 | 202 573426 2117547 ; 204 | 203 590076 2102229 ; 205 | 204 573426 2101896 ; 206 | 205 623043 2116881 ; 207 | 206 606393 2117547 ; 208 | 207 622377 2101896 ; 209 | 208 605727 2102229 ; 210 | 209 643023 2117880 ; 211 | 210 640359 2102229 ; 212 | 211 555111 2078253 ; 213 | 212 589743 2085912 ; 214 | 213 573759 2085912 ; 215 | 214 589743 2068929 ; 216 | 215 573759 2069928 ; 217 | 216 622044 2085579 ; 218 | 217 606060 2085246 ; 219 | 218 622377 2070594 ; 220 | 219 605727 2069595 ; 221 | 220 638361 2085579 ; 222 | 221 640359 2068929 ; 223 | 222 555111 2046285 ; 224 | 223 589410 2053611 ; 225 | 224 573759 2053944 ; 226 | 225 590076 2037960 ; 227 | 226 573759 2036961 ; 228 | 227 622710 2053611 ; 229 | 228 606060 2053944 ; 230 | 229 622377 2038293 ; 231 | 230 606060 2038293 ; 232 | 231 642357 2052945 ; 233 | 232 654345 2038293 ; 234 | 233 638361 2037294 ; 235 | 234 421245 2141856 ; 236 | 235 453546 2141523 ; 237 | 236 485181 2140857 ; 238 | 237 517815 2141190 ; 239 | 238 539127 2142189 ; 240 | 239 421245 2110554 ; 241 | 240 453213 2110554 ; 242 | 241 485181 2110554 ; 243 | 242 525807 2117214 ; 244 | 243 509823 2117547 ; 245 | 244 525807 2102229 ; 246 | 245 509823 2101896 ; 247 | 246 539127 2110554 ; 248 | 247 421578 2078919 ; 249 | 248 453213 2078586 ; 250 | 249 485514 2078253 ; 251 | 250 525807 2085912 ; 252 | 251 509157 2085246 ; 253 | 252 526140 2069928 ; 254 | 253 509490 2068596 ; 255 | 254 539127 2078919 ; 256 | 255 421245 2046951 ; 257 | 256 453546 2046951 ; 258 | 257 485514 2046951 ; 259 | 258 525474 2053611 ; 260 | 259 509823 2053278 ; 261 | 260 525807 2036961 ; 262 | 261 509490 2036961 ; 263 | 262 539127 2046285 ; 264 | 263 551115 1862802 ; 265 | 264 535131 1862802 ; 266 | 265 551115 1846485 ; 267 | 266 535464 1846485 ; 268 | 267 583749 1864134 ; 269 | 268 567099 1863135 ; 270 | 269 584082 1847484 ; 271 | 270 568098 1847151 ; 272 | 271 551781 1830501 ; 273 | 272 536130 1829502 ; 274 | 273 551781 1814184 ; 275 | 274 536796 1814184 ; 276 | 275 584748 1831500 ; 277 | 276 568431 1831167 ; 278 | 277 584748 1815516 ; 279 | 278 568764 1814850 ; 280 | 279 616383 1832832 ; 281 | 280 600732 1832499 ; 282 | 281 616716 1816182 ; 283 | 282 600732 1815516 ; 284 | 283 553113 1798200 ; 285 | 284 537129 1797534 ; 286 | 285 553446 1782549 ; 287 | 286 537129 1781883 ; 288 | 287 585081 1799532 ; 289 | 288 569097 1798200 ; 290 | 289 585747 1782882 ; 291 | 290 569763 1782882 ; 292 | 291 617049 1800531 ; 293 | 292 601731 1799865 ; 294 | 293 617715 1784214 ; 295 | 294 601731 1783881 ; 296 | 295 649683 1800864 ; 297 | 296 633699 1800864 ; 298 | 297 650682 1784880 ; 299 | 298 633699 1784880 ; 300 | 299 546453 1758906 ; 301 | 300 578088 1760238 ; 302 | 301 611055 1760571 ; 303 | 302 643689 1760904 ; 304 | 303 675657 1761570 ; 305 | 304 714951 1768896 ; 306 | 305 699300 1769229 ; 307 | 306 715284 1753578 ; 308 | 307 698967 1753578 ; 309 | 308 727938 1762236 ; 310 | 309 547452 1726938 ; 311 | 310 579087 1727937 ; 312 | 311 611721 1728936 ; 313 | 312 644022 1729935 ; 314 | 313 676656 1730268 ; 315 | 314 707958 1730268 ; 316 | 315 727938 1730934 ; 317 | 316 548118 1694637 ; 318 | 317 580419 1695636 ; 319 | 318 448551 1852479 ; 320 | 319 479187 1855476 ; 321 | 320 511821 1853811 ; 322 | 321 449217 1819512 ; 323 | 322 480852 1821843 ; 324 | 323 513486 1820844 ; 325 | 324 449883 1787544 ; 326 | 325 481851 1787877 ; 327 | 326 514152 1788876 ; 328 | 327 450549 1755576 ; 329 | 328 482184 1755576 ; 330 | 329 513819 1757907 ; 331 | 330 452547 1723608 ; 332 | 331 484182 1721610 ; 333 | 332 515151 1726605 ; 334 | 333 452214 1689975 ; 335 | 334 484182 1690308 ; 336 | 335 516150 1692639 ; 337 | 336 452214 1657674 ; 338 | 337 483849 1658340 ; 339 | 338 516816 1659339 ; 340 | 339 612720 1694970 ; 341 | 340 646686 1694970 ; 342 | 341 677988 1694970 ; 343 | 342 713952 1696635 ; 344 | 343 549117 1660338 ; 345 | 344 581085 1661004 ; 346 | 345 612720 1648017 ; 347 | 346 636696 1665666 ; 348 | 347 678654 1663335 ; 349 | 348 714618 1665000 ; 350 | 349 546453 1621377 ; 351 | 350 580752 1623375 ; 352 | 351 637695 1642356 ; 353 | 352 660672 1634364 ; 354 | 353 622377 1616715 ; 355 | 354 680319 1618047 ; 356 | 355 715284 1626372 ; 357 | 356 744921 1828170 ; 358 | 357 777888 1820844 ; 359 | 358 804861 1807191 ; 360 | 359 748584 1779552 ; 361 | 360 790875 1779219 ; 362 | 361 746253 1748583 ; 363 | 362 776889 1749582 ; 364 | 363 808524 1749582 ; 365 | 364 747918 1699965 ; 366 | 365 773559 1700964 ; 367 | 366 802197 1713951 ; 368 | 367 410256 1933398 ; 369 | 368 383616 2091240 ; 370 | 369 402264 2173158 ; 371 | 370 434232 2173158 ; 372 | 371 465867 2173158 ; 373 | 372 499167 2172825 ; 374 | 373 531801 2172825 ; 375 | 374 563103 2172825 ; 376 | 375 595737 2173158 ; 377 | 376 631035 2173158 ; 378 | 377 611721 2226438 ; 379 | 378 519480 2217780 ; 380 | 379 353646 2061270 ; 381 | 380 384282 1933065 ; 382 | 381 406260 1733598 ; 383 | 382 390276 1642356 ; 384 | 383 451215 1620378 ; 385 | 384 621711 1586079 ; 386 | 385 801531 1656009 ; 387 | 386 839493 1780218 ; 388 | 387 822843 1820178 ; 389 | 388 453879 2026305 ; 390 | 389 394605 2078253 ; 391 | 390 393606 2052612 ; 392 | 391 485181 2011320 ; 393 | 392 507825 2000997 ; 394 | 393 521811 1996335 ; 395 | 394 538794 1996002 ; 396 | 395 551115 1996335 ; 397 | 396 569430 1995669 ; 398 | 397 580086 1995336 ; 399 | 398 591741 1993005 ; 400 | 399 594738 1991340 ; 401 | 400 591075 2003661 ; 402 | 401 597735 2021310 ; 403 | 402 594072 2028636 ; 404 | 403 591741 1977687 ; 405 | 404 593406 1961370 ; 406 | 405 593739 1956375 ; 407 | 406 589077 1945386 ; 408 | 407 588744 1928736 ; 409 | 408 590409 1912752 ; 410 | 409 586413 1903095 ; 411 | 410 567099 1900098 ; 412 | 411 550782 1899432 ; 413 | 412 534798 1898100 ; 414 | 413 519147 1897101 ; 415 | 414 503829 1896435 ; 416 | 415 480186 1899765 ; 417 | 416 448551 1911087 ; 418 | 417 419580 1920744 ; 419 | 418 611388 2173158 ; 420 | 419 609057 2143188 ; 421 | 420 613053 2117214 ; 422 | 421 618381 2101896 ; 423 | 422 625374 2085579 ; 424 | 423 624708 2070261 ; 425 | 424 627705 2053611 ; 426 | 425 632700 2037627 ; 427 | 426 633699 2029302 ; 428 | 427 638361 2026971 ; 429 | 428 656010 2025639 ; 430 | 429 654345 2028969 ; 431 | 430 653013 2031966 ; 432 | 431 658341 2020977 ; 433 | 432 665667 2004993 ; 434 | 433 666000 1992006 ; 435 | 434 663336 1981350 ; 436 | 435 668331 1968030 ; 437 | 436 669663 1958373 ; 438 | 437 656343 1965366 ; 439 | 438 635697 1967364 ; 440 | 439 635697 1979352 ; 441 | 440 635697 1992006 ; 442 | 441 635364 2005326 ; 443 | 442 634032 1621377 ; 444 | 443 643356 1640691 ; 445 | 444 641358 1665333 ; 446 | 445 641691 1694970 ; 447 | 446 654345 1729935 ; 448 | 447 667665 1761570 ; 449 | 448 671328 1784880 ; 450 | 449 671328 1801197 ; 451 | 450 671328 1811187 ; 452 | 451 674658 1817514 ; 453 | 452 681318 1826172 ; 454 | 453 649683 1806525 ; 455 | 454 601731 1792872 ; 456 | 455 585414 1791540 ; 457 | 456 569430 1791207 ; 458 | 457 553113 1785213 ; 459 | 458 545454 1781217 ; 460 | 459 538461 1778553 ; 461 | 460 513819 1766232 ; 462 | 461 482850 1745919 ; 463 | 462 451548 1741257 ; 464 | 463 484515 1644687 ; 465 | 464 502164 1659006 ; 466 | 465 527472 1693305 ; 467 | 466 547452 1719279 ; 468 | 467 546786 1750581 ; 469 | 468 548118 1797867 ; 470 | 469 553113 1814517 ; 471 | 470 554778 1830501 ; 472 | 471 570096 1847151 ; 473 | 472 583749 1857807 ; 474 | 473 589410 1864134 ; 475 | 474 589743 1880451 ; 476 | 475 604062 1870461 ; 477 | 476 611388 1874457 ; 478 | 477 626706 1884780 ; 479 | 478 624375 1897101 ; 480 | 479 622044 1913418 ; 481 | 480 621045 1919745 ; 482 | 481 614052 1920744 ; 483 | 482 611388 1920744 ; 484 | 483 614385 1914750 ; 485 | 484 629703 1924407 ; 486 | 485 646020 1924740 ; 487 | 486 621711 1930068 ; 488 | 487 608391 1945386 ; 489 | 488 597735 1953045 ; 490 | 489 659340 1924740 ; 491 | 490 664668 1924407 ; 492 | 491 677655 1926072 ; 493 | 492 691974 1927404 ; 494 | 493 697302 1926405 ; 495 | 494 692640 1935729 ; 496 | 495 682650 1945719 ; 497 | 496 673659 1955043 ; 498 | 497 697968 1918746 ; 499 | 498 698967 1915749 ; 500 | 499 692640 1913085 ; 501 | 500 679320 1908090 ; 502 | 501 662670 1901097 ; 503 | 502 647019 1893438 ; 504 | 503 631035 1884780 ; 505 | 504 631035 1882782 ; 506 | 505 647352 1876122 ; 507 | 506 654345 1866132 ; 508 | 507 667998 1852146 ; 509 | 508 688644 1819512 ; 510 | 509 698301 1815849 ; 511 | 510 714618 1816182 ; 512 | 511 715950 1816182 ; 513 | 512 727272 1816182 ; 514 | 513 745920 1814517 ; 515 | 514 772560 1813185 ; 516 | 515 794538 1813851 ; 517 | 516 788877 1785546 ; 518 | 517 788544 1749582 ; 519 | 518 795537 1710954 ; 520 | 519 717282 1786878 ; 521 | 520 717948 1783215 ; 522 | 521 716283 1800531 ; 523 | 522 716616 1839492 ; 524 | 523 703629 1867797 ; 525 | 524 693306 1850148 ; 526 | 525 689643 1834497 ; 527 | 526 734265 1845819 ; 528 | 527 757908 1828503 ; 529 | 528 708624 1885113 ; 530 | 529 702963 1889442 ; 531 | 530 703629 1879119 ; 532 | 531 701631 1895436 ; 533 | 532 701631 1903095 ; 534 | 533 701964 1909755 ; 535 | 534 792873 1821843 ; 536 | 535 621378 1931400 ; 537 | 536 628038 1974024 ; 538 | 537 613386 1980684 ; 539 | 538 584082 1895769 ; 540 | 539 598068 1910754 ; 541 | 540 628038 1964367 ; 542 | 541 732267 1844487 ; 543 | 542 758241 1825173 ; 544 | 543 777888 1827837 ; 545 | 544 794538 1812186 ; 546 | 545 703296 1867797 ; 547 | 546 750249 1844487 ; 548 | 547 693639 1979352 ; 549 | 548 686979 1976355 ; 550 | 549 696636 1966698 ; 551 | 550 689643 1961703 ; 552 | 551 699966 1950048 ; 553 | 552 674658 1971360 ; 554 | 553 679653 1960371 ; 555 | 554 659007 1970361 ; 556 | 555 652680 1956042 ; 557 | 556 668997 1952379 ; 558 | 557 669663 1936728 ; 559 | 558 679653 1938726 ; 560 | 559 681318 1927737 ; 561 | 560 682983 1949049 ; 562 | 561 692307 1939392 ; 563 | 562 695637 1929069 ; 564 | 563 704295 1938726 ; 565 | 564 706293 1930734 ; 566 | 565 707625 1922742 ; 567 | 566 681984 1916082 ; 568 | 567 694971 1921077 ; 569 | 568 708624 1914417 ; 570 | 569 697302 1909755 ; 571 | 570 682983 1908090 ; 572 | 571 667332 1897101 ; 573 | 572 683982 1894437 ; 574 | 573 698301 1893105 ; 575 | 574 710955 1903428 ; 576 | 575 714285 1887777 ; 577 | 576 683649 1881450 ; 578 | 577 699633 1877121 ; 579 | 578 692973 1865133 ; 580 | 579 708957 1854477 ; 581 | 580 709290 1868463 ; 582 | 581 725940 1879452 ; 583 | 582 726939 1859472 ; 584 | 583 628704 1968363 ; 585 | 584 553779 2017314 ; 586 | 585 593406 2024640 ; 587 | 586 576756 2024640 ; 588 | 587 593406 2008656 ; 589 | 588 577089 2008656 ; 590 | 589 625707 2024307 ; 591 | 590 609390 2024640 ; 592 | 591 625707 2008656 ; 593 | 592 609057 2007990 ; 594 | 593 657675 2024640 ; 595 | 594 641691 2024640 ; 596 | 595 657342 2008656 ; 597 | 596 641691 2008656 ; 598 | 597 671328 2023641 ; 599 | 598 687312 2004660 ; 600 | 599 673659 2007990 ; 601 | 600 554778 1993671 ; 602 | 601 538128 1993005 ; 603 | 602 554778 1979352 ; 604 | 603 538128 1979352 ; 605 | 604 586080 1994670 ; 606 | 605 570429 1994004 ; 607 | 606 586080 1981017 ; 608 | 607 570429 1980351 ; 609 | 608 616716 1995003 ; 610 | 609 601398 1994670 ; 611 | 610 616716 1981350 ; 612 | 611 601731 1981017 ; 613 | 612 648018 1995336 ; 614 | 613 632367 1995336 ; 615 | 614 648018 1982682 ; 616 | 615 632700 1982349 ; 617 | 616 680985 1995003 ; 618 | 617 664002 1995669 ; 619 | 618 680319 1984680 ; 620 | 619 664335 1984680 ; 621 | 620 691308 1995336 ; 622 | 621 691308 1987677 ; 623 | 622 639027 1966365 ; 624 | 623 632367 1950048 ; 625 | 624 648351 1948383 ; 626 | 625 653346 1962036 ; 627 | 626 649350 1933731 ; 628 | 627 632700 1933398 ; 629 | 628 649350 1918080 ; 630 | 629 633699 1917081 ; 631 | 630 660672 1934064 ; 632 | 631 666333 1918080 ; 633 | 632 650349 1901763 ; 634 | 633 634365 1901097 ; 635 | 634 650349 1885446 ; 636 | 635 634365 1884780 ; 637 | 636 665667 1906092 ; 638 | 637 666333 1885446 ; 639 | 638 611388 1850481 ; 640 | 639 651015 1869462 ; 641 | 640 635031 1868796 ; 642 | 641 651348 1852812 ; 643 | 642 635697 1852812 ; 644 | 643 682650 1872459 ; 645 | 644 666999 1869795 ; 646 | 645 683982 1850481 ; 647 | 646 667332 1853478 ; 648 | 647 697635 1849482 ; 649 | 648 651681 1836495 ; 650 | 649 636363 1836162 ; 651 | 650 652680 1820511 ; 652 | 651 636030 1820178 ; 653 | 652 684648 1837494 ; 654 | 653 667998 1837494 ; 655 | 654 684981 1821177 ; 656 | 655 668664 1820511 ; 657 | 656 717615 1837494 ; 658 | 657 701298 1838160 ; 659 | 658 717948 1820844 ; 660 | 659 701631 1820844 ; 661 | 660 730269 1837494 ; 662 | 661 730602 1821177 ; 663 | 662 685314 1804527 ; 664 | 663 669663 1804527 ; 665 | 664 685980 1788210 ; 666 | 665 669996 1788210 ; 667 | 666 717948 1804527 ; 668 | 667 701631 1804527 ; 669 | 668 718281 1788543 ; 670 | 669 701964 1788543 ; 671 | 670 730935 1797867 ; 672 | 671 554112 1963701 ; 673 | 672 538461 1962702 ; 674 | 673 554778 1947384 ; 675 | 674 538128 1946385 ; 676 | 675 585414 1964034 ; 677 | 676 570429 1963368 ; 678 | 677 586080 1948716 ; 679 | 678 570429 1947717 ; 680 | 679 613386 1965033 ; 681 | 680 601398 1965033 ; 682 | 681 616716 1948716 ; 683 | 682 600732 1948383 ; 684 | 683 554112 1930401 ; 685 | 684 538128 1930401 ; 686 | 685 553779 1915083 ; 687 | 686 538461 1914417 ; 688 | 687 585747 1932066 ; 689 | 688 570429 1931400 ; 690 | 689 585747 1916082 ; 691 | 690 570429 1915083 ; 692 | 691 616716 1933065 ; 693 | 692 601731 1932066 ; 694 | 693 617715 1916415 ; 695 | 694 601398 1916082 ; 696 | 695 554112 1898433 ; 697 | 696 537795 1898433 ; 698 | 697 554445 1882449 ; 699 | 698 538128 1881783 ; 700 | 699 586080 1899099 ; 701 | 700 570429 1899099 ; 702 | 701 586413 1883448 ; 703 | 702 570762 1882449 ; 704 | 703 617715 1899765 ; 705 | 704 602064 1899765 ; 706 | 705 618381 1884780 ; 707 | 706 602397 1884114 ; 708 | 707 610056 1868130 ; 709 | 708 457209 2016981 ; 710 | 709 489177 2016981 ; 711 | 710 529137 2024640 ; 712 | 711 513153 2025306 ; 713 | 712 529470 2008989 ; 714 | 713 512820 2008656 ; 715 | 714 451881 1985679 ; 716 | 715 482850 1985679 ; 717 | 716 522144 1993005 ; 718 | 717 506493 1992339 ; 719 | 718 521811 1978686 ; 720 | 719 506493 1978686 ; 721 | 720 452214 1954044 ; 722 | 721 482850 1954710 ; 723 | 722 522810 1962036 ; 724 | 723 506493 1962369 ; 725 | 724 522144 1946385 ; 726 | 725 506826 1945386 ; 727 | 726 451881 1921743 ; 728 | 727 483183 1922742 ; 729 | 728 522144 1930068 ; 730 | 729 506826 1929402 ; 731 | 730 522477 1914084 ; 732 | 731 506160 1913751 ; 733 | 732 451881 1889775 ; 734 | 733 483516 1890774 ; 735 | 734 522477 1897767 ; 736 | 735 507159 1897434 ; 737 | 736 522477 1881783 ; 738 | 737 507159 1880784 ; 739 | 738 558108 2145519 ; 740 | 739 592740 2152179 ; 741 | 740 576090 2151513 ; 742 | 741 593073 2137527 ; 743 | 742 577422 2137194 ; 744 | 743 617715 2145186 ; 745 | 744 646353 2151846 ; 746 | 745 646020 2137194 ; 747 | 746 559107 2113884 ; 748 | 747 593406 2120877 ; 749 | 748 576756 2120877 ; 750 | 749 593406 2105559 ; 751 | 750 576756 2105226 ; 752 | 751 626373 2120211 ; 753 | 752 609723 2120877 ; 754 | 753 625707 2105226 ; 755 | 754 609057 2105559 ; 756 | 755 646353 2121210 ; 757 | 756 643689 2105559 ; 758 | 757 558441 2081583 ; 759 | 758 593073 2089242 ; 760 | 759 577089 2089242 ; 761 | 760 593073 2072259 ; 762 | 761 577089 2073258 ; 763 | 762 625374 2088909 ; 764 | 763 609390 2088576 ; 765 | 764 625707 2073924 ; 766 | 765 609057 2072925 ; 767 | 766 641691 2088909 ; 768 | 767 643689 2072259 ; 769 | 768 558441 2049615 ; 770 | 769 592740 2056941 ; 771 | 770 577089 2057274 ; 772 | 771 593406 2041290 ; 773 | 772 577089 2040291 ; 774 | 773 626040 2056941 ; 775 | 774 609390 2057274 ; 776 | 775 625707 2041623 ; 777 | 776 609390 2041623 ; 778 | 777 645687 2056275 ; 779 | 778 657675 2041623 ; 780 | 779 641691 2040624 ; 781 | 780 424575 2145186 ; 782 | 781 456876 2144853 ; 783 | 782 488511 2144187 ; 784 | 783 521145 2144520 ; 785 | 784 542457 2145519 ; 786 | 785 424575 2113884 ; 787 | 786 456543 2113884 ; 788 | 787 488511 2113884 ; 789 | 788 529137 2120544 ; 790 | 789 513153 2120877 ; 791 | 790 529137 2105559 ; 792 | 791 513153 2105226 ; 793 | 792 542457 2113884 ; 794 | 793 424908 2082249 ; 795 | 794 456543 2081916 ; 796 | 795 488844 2081583 ; 797 | 796 529137 2089242 ; 798 | 797 512487 2088576 ; 799 | 798 529470 2073258 ; 800 | 799 512820 2071926 ; 801 | 800 542457 2082249 ; 802 | 801 424575 2050281 ; 803 | 802 456876 2050281 ; 804 | 803 488844 2050281 ; 805 | 804 528804 2056941 ; 806 | 805 513153 2056608 ; 807 | 806 529137 2040291 ; 808 | 807 512820 2040291 ; 809 | 808 542457 2049615 ; 810 | 809 554445 1866132 ; 811 | 810 538461 1866132 ; 812 | 811 554445 1849815 ; 813 | 812 538794 1849815 ; 814 | 813 587079 1867464 ; 815 | 814 570429 1866465 ; 816 | 815 587412 1850814 ; 817 | 816 571428 1850481 ; 818 | 817 555111 1833831 ; 819 | 818 539460 1832832 ; 820 | 819 555111 1817514 ; 821 | 820 540126 1817514 ; 822 | 821 588078 1834830 ; 823 | 822 571761 1834497 ; 824 | 823 588078 1818846 ; 825 | 824 572094 1818180 ; 826 | 825 619713 1836162 ; 827 | 826 604062 1835829 ; 828 | 827 620046 1819512 ; 829 | 828 604062 1818846 ; 830 | 829 556443 1801530 ; 831 | 830 540459 1800864 ; 832 | 831 556776 1785879 ; 833 | 832 540459 1785213 ; 834 | 833 588411 1802862 ; 835 | 834 572427 1801530 ; 836 | 835 589077 1786212 ; 837 | 836 573093 1786212 ; 838 | 837 620379 1803861 ; 839 | 838 605061 1803195 ; 840 | 839 621045 1787544 ; 841 | 840 605061 1787211 ; 842 | 841 653013 1804194 ; 843 | 842 637029 1804194 ; 844 | 843 654012 1788210 ; 845 | 844 637029 1788210 ; 846 | 845 549783 1762236 ; 847 | 846 581418 1763568 ; 848 | 847 614385 1763901 ; 849 | 848 647019 1764234 ; 850 | 849 678987 1764900 ; 851 | 850 718281 1772226 ; 852 | 851 702630 1772559 ; 853 | 852 718614 1756908 ; 854 | 853 702297 1756908 ; 855 | 854 731268 1765566 ; 856 | 855 550782 1730268 ; 857 | 856 582417 1731267 ; 858 | 857 615051 1732266 ; 859 | 858 647352 1733265 ; 860 | 859 679986 1733598 ; 861 | 860 711288 1733598 ; 862 | 861 731268 1734264 ; 863 | 862 551448 1697967 ; 864 | 863 583749 1698966 ; 865 | 864 451881 1855809 ; 866 | 865 482517 1858806 ; 867 | 866 515151 1857141 ; 868 | 867 452547 1822842 ; 869 | 868 484182 1825173 ; 870 | 869 516816 1824174 ; 871 | 870 453213 1790874 ; 872 | 871 485181 1791207 ; 873 | 872 517482 1792206 ; 874 | 873 453879 1758906 ; 875 | 874 485514 1758906 ; 876 | 875 517149 1761237 ; 877 | 876 455877 1726938 ; 878 | 877 487512 1724940 ; 879 | 878 518481 1729935 ; 880 | 879 455544 1693305 ; 881 | 880 487512 1693638 ; 882 | 881 519480 1695969 ; 883 | 882 455544 1661004 ; 884 | 883 487179 1661670 ; 885 | 884 520146 1662669 ; 886 | 885 616050 1698300 ; 887 | 886 650016 1698300 ; 888 | 887 681318 1698300 ; 889 | 888 717282 1699965 ; 890 | 889 552447 1663668 ; 891 | 890 584415 1664334 ; 892 | 891 616050 1651347 ; 893 | 892 640026 1668996 ; 894 | 893 681984 1666665 ; 895 | 894 717948 1668330 ; 896 | 895 549783 1624707 ; 897 | 896 584082 1626705 ; 898 | 897 641025 1645686 ; 899 | 898 664002 1637694 ; 900 | 899 625707 1620045 ; 901 | 900 683649 1621377 ; 902 | 901 718614 1629702 ; 903 | 902 748251 1831500 ; 904 | 903 781218 1824174 ; 905 | 904 808191 1810521 ; 906 | 905 751914 1782882 ; 907 | 906 794205 1782549 ; 908 | 907 749583 1751913 ; 909 | 908 780219 1752912 ; 910 | 909 811854 1752912 ; 911 | 910 751248 1703295 ; 912 | 911 776889 1704294 ; 913 | 912 805527 1717281 ; 914 | 913 413586 1936728 ; 915 | 914 386946 2094570 ; 916 | 915 405594 2176488 ; 917 | 916 437562 2176488 ; 918 | 917 469197 2176488 ; 919 | 918 502497 2176155 ; 920 | 919 535131 2176155 ; 921 | 920 566433 2176155 ; 922 | 921 599067 2176488 ; 923 | 922 634365 2176488 ; 924 | 923 615051 2229768 ; 925 | 924 522810 2221110 ; 926 | 925 356976 2064600 ; 927 | 926 387612 1936395 ; 928 | 927 409590 1736928 ; 929 | 928 393606 1645686 ; 930 | 929 454545 1623708 ; 931 | 930 625041 1589409 ; 932 | 931 804861 1659339 ; 933 | 932 842823 1783548 ; 934 | 933 826173 1823508 ; 935 | -------------------------------------------------------------------------------- /data/Anaheim_flow.tntp: -------------------------------------------------------------------------------- 1 | From To Volume Cost 2 | 1 117 7074.9000000000015 1.1529198689124767 3 | 2 87 9662.5000000000073 1.3077728285644104 4 | 3 74 7668.9999999999927 1.1766938339006712 5 | 4 233 12173.799999999996 1.6380226412299237 6 | 5 165 2586.7999999999956 1.0915747901668154 7 | 6 213 6576.5999999999913 1.1370960748889003 8 | 7 253 7137.1000000000204 1.1551455588519783 9 | 8 411 722.1000000000422 1.0000479629182888 10 | 9 379 1187.0329436508764 1.0003502412611545 11 | 9 395 1050.4670563491454 1.0002148057823903 12 | 10 338 69.200000000018917 1.0000000040452055 13 | 10 362 80.100000000013097 1.0000000072618334 14 | 11 309 485.80000000003929 1.0000098253099972 15 | 12 275 488.20000000001164 1.0000100209136558 16 | 13 262 37 1.0000000003306155 17 | 14 257 125.20000000004075 1.0000000433444538 18 | 15 254 407.10000000004948 1.0000048452995249 19 | 16 263 249 1.0000006781310156 20 | 17 276 648.30000000002474 1.0000311616400124 21 | 18 322 2185.8000000000175 1.0040267800310838 22 | 18 348 683.00000000000728 1.0000383883136466 23 | 19 364 746.90000000000873 1.0000548992052627 24 | 19 380 291.09999999999127 1.0000012667328744 25 | 20 397 503.60000000003492 1.0000113464265341 26 | 21 412 1396.5000000000073 1.0006709342770499 27 | 21 413 1245.3000000000247 1.0004242405451269 28 | 22 414 619.79999999999563 1.0000260328974375 29 | 22 415 904.6000000000131 1.0001181251990681 30 | 23 416 1522.5000000000073 1.000947862681671 31 | 24 266 203.10000000002037 0.14906832450950355 32 | 24 267 172.80000000001019 0.14906832379098708 33 | 25 268 4694.900000000016 0.14949934538902687 34 | 25 269 3859.3000000000247 0.14926512458968666 35 | 26 273 2660 0.14911273711276107 36 | 26 274 315 0.14906833173447206 37 | 27 302 314.20000000001892 0.14906833164607838 38 | 27 303 233.50000000000728 0.14906832563719341 39 | 28 303 1486.400000000016 0.1490726534919031 40 | 28 304 596.80000000000291 0.14906843554072333 41 | 29 308 718.30000000001019 0.14906855916629155 42 | 29 337 426.50000000000728 0.14906835235422281 43 | 30 340 1804.7000000000116 0.14907773353940684 44 | 30 341 1130.8000000000175 0.14906977356650042 45 | 31 329 1563.5000000000073 0.14907362434400573 46 | 31 330 2075.3000000000029 0.14908477876166237 47 | 32 332 1395.1999999999971 0.14907168455572237 48 | 32 333 662.70000000001164 0.14906849410485268 49 | 33 337 803.09999999999854 0.14906869203958054 50 | 33 361 980.09999999999854 0.1490691416080312 51 | 34 369 3909.6999999999971 0.14927560814585769 52 | 34 385 1412.5000000000146 0.14907185441103918 53 | 35 373 1529.1999999999971 0.14907317422705557 54 | 35 389 435.30000000000291 0.14906835485290987 55 | 36 378 615.60000000002037 0.14906845040570899 56 | 36 394 317.20000000001164 0.14906833198105093 57 | 37 401 222.90000000003056 0.14906832518995261 58 | 37 402 114.69999999999709 0.1490683231535494 59 | 38 406 350.10000000000582 0.14906833632793567 60 | 38 407 1161.6999999999825 0.14906993873600075 61 | 39 266 18.30000000000291 1.4598484850288822 62 | 39 267 24.19999999999709 1.4598484850883253 63 | 40 268 34.099999999998545 1.320075758314871 64 | 40 269 13.30000000000291 1.3200757580072866 65 | 41 273 342.5 1.0000024274960007 66 | 41 274 55.30000000000291 1.0000000016497448 67 | 42 302 387.80567665808485 1.0000039899997415 68 | 42 303 252.20000000001164 1.0000007136685336 69 | 43 303 5.6000000000058208 1.5401515150002671 70 | 43 304 12.099999999998545 1.540151515005824 71 | 44 308 229.20000000001164 1.0000004868270183 72 | 44 337 32.200000000004366 3.0000000005689329 73 | 45 340 0 1 74 | 45 341 0 1 75 | 46 329 320 1.0000018497631911 76 | 46 330 736.30000000000291 1.0000518484074876 77 | 47 332 143.10000000000582 0.92007582606100258 78 | 47 333 0 0.94015151500000005 79 | 48 337 107.20000000000437 1.0000000232967512 80 | 48 361 17.400000000001455 1.0000000000161702 81 | 49 369 81.80000000000291 1.0000000078982239 82 | 49 385 95.5 1.0000000146733645 83 | 50 373 288.60000000000582 1.0000012237748588 84 | 50 389 275 1.0000010088973821 85 | 51 378 20.80000000000291 1.0000000000330194 86 | 51 394 0 1 87 | 52 401 2771.5587485227734 1.010409085472723 88 | 52 402 956.13126642720454 1.0001474301477873 89 | 53 406 1892.6874961027133 1.0823689396893252 90 | 53 407 923.30000000000291 1.0599843574308685 91 | 54 56 1861.3000000000102 0.33342480021914256 92 | 54 230 481.70000000001892 0.33333374330475629 93 | 55 59 2691.3533459623068 0.33373316987555529 94 | 56 102 4415.8000000000102 0.33623092708691049 95 | 57 54 2343.0000000000291 0.33356299498836356 96 | 57 235 1287.7999999999956 0.33335429311442305 97 | 58 137 2256.7312664271958 0.33353099325443764 98 | 58 145 3788.2999999999956 0.33490289119248484 99 | 59 146 3371.2533459623228 0.33431771922581027 100 | 60 102 985.40000000000146 0.33334051838756251 101 | 60 230 2013.2000000000262 0.33345851666235088 102 | 61 136 3020.3022480553773 0.33396749700765166 103 | 62 2 13602.200000000026 1.9438866766534952 104 | 63 62 13602.200000000026 3.1740234017048219 105 | 64 63 6620.4551872567099 0.60369368693684666 106 | 64 189 162.10000000002765 0.33333334584612306 107 | 65 64 6782.5551872567376 0.39025773239551548 108 | 66 65 6782.5551872567376 0.25609220432705448 109 | 67 66 5550.2551872567346 0.28705445680684949 110 | 67 260 0 0.5 111 | 68 67 5550.2551872567346 1.8486741950138019 112 | 69 68 5445.1551872567143 0.28599139835150678 113 | 69 258 735.5 0.50209074925754504 114 | 70 69 6180.6551872567143 1.5212239747925691 115 | 71 70 6023.8551872566968 0.29265050611252535 116 | 71 255 2419.4471844827494 0.74481376180053671 117 | 72 71 8443.3023717394462 0.34994671942431743 118 | 73 72 2232.5 0.4694645612389603 119 | 73 141 5436.4999999999927 0.34958573618522315 120 | 74 73 7668.9999999999927 1.3009940004528107 121 | 75 3 5676.6000000000349 1.1163455956739801 122 | 76 75 5676.6000000000349 1.1536594344696778 123 | 77 76 1761.8000000000102 0.46906664824255767 124 | 77 141 3073.8920752866106 0.33499442803212964 125 | 78 77 4835.6920752866208 0.28093503669764469 126 | 79 78 4565.0920752865859 0.27922320859419447 127 | 79 256 1227.2000000000044 0.51620438784917733 128 | 80 79 5792.2920752865903 1.495029164787792 129 | 81 80 4571.2920752865757 0.27925918314404952 130 | 81 259 56.599999999998545 0.50000007332244989 131 | 82 81 4627.8920752865743 1.8006304747669271 132 | 83 82 4627.8920752865743 0.279594427313473 133 | 83 261 942.09999999999854 0.50562806699028928 134 | 84 83 5569.9920752865728 0.24134272190080364 135 | 85 84 5569.9920752865728 0.36778106395962246 136 | 86 85 4999.2920752865684 0.56423890870097326 137 | 86 189 4663.2079247134388 0.34213123539610857 138 | 87 86 9662.5000000000073 1.62101107726858 139 | 88 1 8328.0000000000146 1.2103789311293136 140 | 89 88 8328.0000000000146 1.3832330073586763 141 | 90 89 7777.3000000000175 0.32828521225575702 142 | 90 293 726.50000000004366 0.50199027788569628 143 | 91 90 8503.8000000000611 0.29589047778580652 144 | 92 91 8503.8000000000611 0.40848360735324102 145 | 93 92 4198.4469515390592 0.35508242734843348 146 | 93 183 1837.2000000000116 0.3335452987856492 147 | 93 195 684.24481274330174 0.33333741136483036 148 | 94 93 6719.8917642823726 0.77728015714954257 149 | 95 94 4821.7448127433308 0.28083945913710362 150 | 95 290 0 0.5 151 | 96 95 4821.7448127433308 1.2805853821555078 152 | 97 96 3992.4448127433207 0.27648065988781378 153 | 97 288 1925.0999999999985 0.59812607306112942 154 | 98 97 5917.5448127433192 0.66419097472140431 155 | 99 98 5917.5448127433192 0.29127311831919267 156 | 99 283 0 0.5 157 | 100 99 5917.5448127433192 0.41947742274961575 158 | 101 100 5401.2000000000116 0.28556467229990495 159 | 101 278 0 0.5 160 | 102 101 5401.2000000000116 0.81104693699359087 161 | 103 59 679.90000000001601 0.33333496147138192 162 | 103 61 3020.3022480553773 0.33396749700765166 163 | 103 237 2831.8000000000029 0.33382339415112894 164 | 104 103 6532.0022480553962 0.85294191881907411 165 | 105 104 6532.0022480553962 0.30031563948850198 166 | 105 279 287.80000000000291 0.50004901560882309 167 | 106 105 6819.8022480553991 0.44000935053986029 168 | 107 106 6284.5178918675301 0.29635011667404854 169 | 107 284 0 0.5 170 | 108 107 6284.5178918675301 0.67576806946131562 171 | 109 108 4138.7079247134607 0.27707908814353999 172 | 109 289 811.79999999999563 0.50310289751007498 173 | 110 109 4950.5079247134563 1.2847548609183557 174 | 111 110 4950.5079247134563 0.28175384889741067 175 | 111 291 187.80000000000291 0.50000888696755652 176 | 112 111 5138.3079247134592 0.72500433719502377 177 | 113 112 3492.6000000000276 0.35192812926413225 178 | 113 183 1668.2000000000044 0.33347742255019197 179 | 113 195 2688.2000000000044 0.33430493035804237 180 | 114 113 7849.0000000000364 0.3831753346629872 181 | 115 114 7849.0000000000364 0.27755809733417941 182 | 116 115 6819.4000000000015 0.30552213642489345 183 | 116 294 255.5 0.50003044632373161 184 | 117 116 7074.9000000000015 1.2429520937433511 185 | 118 5 4644.2000000000044 1.1020562452704585 186 | 119 118 4644.2000000000044 1.1187733250860805 187 | 120 119 3210.5000000000073 0.27423121657239063 188 | 120 400 3562.0312664272133 1.6501703080343431 189 | 121 120 6772.5312664272205 0.60925349253781369 190 | 122 121 6772.5312664272205 0.69464129301774669 191 | 123 122 6732.8312664272235 0.30388271116994114 192 | 123 382 0 0.5 193 | 124 123 6732.8312664272235 0.96022332415629119 194 | 125 124 6732.8312664272235 0.30388271116994114 195 | 125 366 885.80000000000291 0.50439859470180248 196 | 126 125 7618.6312664272264 1.0234095166422341 197 | 127 126 6981.3312664272235 0.30876088489871034 198 | 127 350 0 0.5 199 | 128 127 6981.3312664272235 0.70406838186826526 200 | 129 128 6981.3312664272235 0.35811584421964215 201 | 130 129 6155.4312664272293 0.29445923545248087 202 | 130 324 1491.8222969140552 0.53538666367806831 203 | 131 130 7647.2535633412845 1.0258575573555504 204 | 132 131 7310.2535633412772 0.36659292173150093 205 | 132 314 1008.2777030859652 0.50738400354376889 206 | 133 132 8318.5312664272424 0.59411392944459251 207 | 134 133 8318.5312664272424 0.44231389537893923 208 | 135 134 7965.8255897691488 0.33388260636681449 209 | 135 298 499.5 0.50044474719042964 210 | 136 135 8465.3255897691488 0.1963706199395 211 | 137 136 5445.0233417137715 0.66341037532850855 212 | 138 60 2998.6000000000276 0.33394946549296017 213 | 138 137 3188.2920752865757 0.13169282232843094 214 | 138 236 2512.0000000000073 0.33363677696632316 215 | 139 138 8698.8920752866106 1.4389772651047352 216 | 140 139 8436.692075286599 0.3497048291955101 217 | 140 265 73.700000000004366 0.50000021078572432 218 | 141 140 8510.3920752866034 1.2124265832878689 219 | 142 72 6210.8023717394462 0.36101746165763038 220 | 142 76 3914.8000000000247 0.33770330180491326 221 | 143 142 10125.602371739471 1.4881000668517028 222 | 144 143 10069.402371739474 0.42904647924310524 223 | 144 264 311.40000000003783 0.500067180878075 224 | 145 144 10380.802371739512 1.4738848630468337 225 | 146 145 6592.5023717395161 0.13264241693966491 226 | 147 57 3630.8000000000247 0.33465770281339247 227 | 147 146 3221.2490257771933 0.76790833187562524 228 | 148 147 6852.049025777218 0.25721816501841382 229 | 149 148 6335.4490257771977 0.29712895173082582 230 | 149 297 112.40000000001601 0.5000011403455914 231 | 150 149 6447.8490257772137 0.38270239081641877 232 | 151 150 6447.8490257772137 0.25113429082830596 233 | 152 151 5208.949025777205 0.64718880235908738 234 | 152 310 222.20000000001164 0.50001741596171745 235 | 153 152 5431.1490257772166 0.7317436869031152 236 | 154 153 3628.9490257771977 0.27525358858379201 237 | 154 323 334.69999999999709 0.50008965904164038 238 | 155 154 3963.6490257771948 0.32054770187124798 239 | 156 155 3963.6490257771948 0.63020808883747803 240 | 157 156 3963.6490257771948 0.2763703245179846 241 | 157 349 578.20000000001892 0.50079851594433211 242 | 158 157 4541.8490257772137 0.88188098592840558 243 | 159 158 3203.7000000000626 0.27421756391107055 244 | 159 365 0 0.5 245 | 160 159 3203.7000000000626 0.866485953567384 246 | 161 160 3203.7000000000626 0.27421756391107055 247 | 161 381 191.50000000001455 0.50000960829561092 248 | 162 161 3395.2000000000771 0.62625462317579794 249 | 163 162 3395.2000000000771 0.54927315756055917 250 | 164 163 1832.0999999999985 0.27278606001051181 251 | 164 399 754.69999999999709 0.50231776095755432 252 | 165 164 2586.7999999999956 1.0931838350869516 253 | 166 6 6522.2000000000189 1.1355720176199173 254 | 167 166 6522.2000000000189 1.2005989411736266 255 | 168 167 5835.9000000000233 0.29026450315344071 256 | 168 409 2133.5874961027585 0.64805158902579008 257 | 169 168 7969.4874961027817 0.94859738306910257 258 | 170 169 4449.1874961027497 0.35666321924182476 259 | 171 170 3488.3874961027395 0.066009936310845146 260 | 171 216 1695.4000000000087 0.3334870524186927 261 | 172 171 5183.7874961027483 0.29498918440946992 262 | 172 393 373.41250389728521 0.50013890781137471 263 | 173 172 5557.2000000000335 0.5283569350795434 264 | 174 173 5557.2000000000335 0.24123007055763032 265 | 175 174 5557.2000000000335 0.28712686452191299 266 | 175 377 870.00000000001455 0.50409306134259291 267 | 176 175 6427.200000000048 0.89574054302549044 268 | 177 176 5863.6000000000349 0.29060199596927855 269 | 177 360 0 0.5 270 | 178 177 5863.6000000000349 0.8718059879078357 271 | 179 178 5418.6000000000276 0.28573235509104095 272 | 179 336 852.10000000002037 0.50376646125440738 273 | 180 179 6270.700000000048 2.0729943735525951 274 | 181 180 6000.3000000000466 0.29233895280250027 275 | 181 307 756.69999999998981 0.5023424276124121 276 | 182 181 6757.0000000000364 0.17038098728296991 277 | 183 182 6757.0000000000364 0.43828722198069148 278 | 184 92 1559.153048460983 0.33344328294359804 279 | 184 112 1632.107924713433 0.33346535171833491 280 | 184 183 3251.6000000000204 0.39505602807248136 281 | 185 184 6442.8609731744364 0.8127384298253798 282 | 186 185 6442.8609731744364 0.4303665053015493 283 | 187 186 4630.9079247134578 0.27961263917054502 284 | 187 272 194.40000000000873 0.50001020366719995 285 | 188 187 4825.3079247134665 0.92131836686925139 286 | 189 188 4825.3079247134665 0.79769574070905847 287 | 190 63 6981.7448127433163 0.37754082757253354 288 | 190 85 570.70000000000437 0.33333530665622335 289 | 191 190 7552.4448127433207 0.91487228716357849 290 | 192 191 7552.4448127433207 1.0566543087647118 291 | 193 192 6804.1448127433177 0.30522866292925377 292 | 193 271 2664.1999999999971 0.85994698390282964 293 | 194 193 9468.3448127433148 0.56872887126561922 294 | 195 194 9468.3448127433148 1.074032955945087 295 | 196 92 2746.2000000000189 0.33439153522272425 296 | 196 112 13.599999999998545 0.33333333300063656 297 | 196 195 6095.9000000000087 0.42286643189380807 298 | 197 196 8855.7000000000262 0.52738162402932098 299 | 198 197 8855.7000000000262 0.20501579163302716 300 | 199 198 8481.5000000000218 0.35135565083777559 301 | 199 306 244.60000000000582 0.50002557390536628 302 | 200 199 8726.1000000000276 2.5258766356875491 303 | 201 200 7816.6000000000276 0.3294190214307402 304 | 201 335 836.60000000000582 0.50349979562534442 305 | 202 201 8653.2000000000335 1.0737841458589035 306 | 203 202 8653.2000000000335 0.35792804861963445 307 | 203 359 452.70000000000437 0.50030006353475465 308 | 204 203 9105.9000000000378 1.1316946230429672 309 | 205 204 7432.0000000000291 0.3190376242215196 310 | 205 376 0 0.5 311 | 206 205 7432.0000000000291 0.26803994370099204 312 | 207 206 7432.0000000000291 0.58707756792251176 313 | 208 207 6805.0000000000073 0.3175011141767381 314 | 209 208 3954.9999999999927 0.066362905962072963 315 | 209 392 647.64252276431944 0.50125693455638909 316 | 210 209 4602.6425227643122 0.35777215984523736 317 | 210 250 3293.4000000000087 0.3355221927881098 318 | 211 210 7896.0425227643209 0.94225931246734229 319 | 212 211 5499.5425227643063 0.28653389897742793 320 | 212 408 1077.0574772356849 0.50961450131668373 321 | 213 212 6576.5999999999913 1.2043197841154794 322 | 214 7 4983.6000000000204 1.1058366016885117 323 | 215 214 4983.6000000000204 1.1058366016885117 324 | 216 215 3779.7000000000189 0.39443828678549808 325 | 217 169 3520.300000000032 0.33619065194498554 326 | 217 216 2084.3000000000102 0.58906033699004745 327 | 218 217 5604.6000000000422 0.28995705705130126 328 | 218 392 469.80000000001746 0.50034803529807503 329 | 219 218 6074.4000000000597 0.79836729711774768 330 | 220 219 5393.5000000000582 0.51135745902675567 331 | 220 363 0 0.5 332 | 221 220 5393.5000000000582 1.1894481855844252 333 | 222 221 5393.5000000000582 0.32230887964716037 334 | 223 222 5210.2000000000626 0.43240174887155886 335 | 223 346 617.90000000000146 0.50104146342789901 336 | 224 223 5828.100000000064 0.99606497450810683 337 | 225 224 4465.4000000000451 0.62729467701616748 338 | 225 330 1387.400000000016 0.52647146662593813 339 | 226 225 5852.8000000000611 0.96299514365152028 340 | 227 226 5766.1000000000568 0.40252854400591359 341 | 227 311 144.66873357279837 0.50000312946401215 342 | 228 227 5910.7687335728551 1.1208887875885627 343 | 229 228 5840.8687335728464 0.48128929550587407 344 | 229 277 228.30000000000291 0.50001940863036121 345 | 230 229 6069.1687335728493 0.12371385081910481 346 | 231 56 2554.5 0.33365783964487922 347 | 231 230 3574.2687335728042 0.29560531869064471 348 | 232 58 6045.0312664271914 0.3435097330652499 349 | 232 231 6128.7687335728042 0.32639081967654882 350 | 233 232 12173.799999999996 1.6380226412299237 351 | 234 4 10223.900000000009 1.3628519821272893 352 | 235 234 10223.900000000009 1.3628519821272893 353 | 236 235 8936.1000000000131 0.13748475322498668 354 | 237 236 6424.1000000000058 0.260485414995412 355 | 238 55 2691.3533459623068 0.33373316987555529 356 | 238 61 0 0.33333333300000001 357 | 238 237 3592.3000000000029 0.22990959179686957 358 | 239 238 6283.6533459623097 0.23720109660671287 359 | 240 239 5567.4000000000306 0.47911204357073722 360 | 240 299 469.10000000002037 0.5003459656450342 361 | 241 240 6036.5000000000509 0.96630568961560492 362 | 242 241 5357.5000000000509 0.63335272912980212 363 | 242 317 411.20000000000437 0.50020426015960784 364 | 243 242 5768.7000000000553 0.96157992598796294 365 | 244 243 5402.4000000000524 0.40025220618200752 366 | 244 339 1872.6999999999898 0.58787069976057182 367 | 245 244 7275.1000000000422 1.1139277201378215 368 | 246 245 6033.2000000000335 0.64047410081422163 369 | 246 347 0 0.5 370 | 247 246 6033.2000000000335 1.2022188267948455 371 | 248 247 5541.6670563491571 0.40107162043003908 372 | 248 374 464.29999999999563 0.50033202132443677 373 | 249 248 6005.9670563491527 0.92086068286670975 374 | 250 249 5689.5000000000146 0.36838737572538549 375 | 251 250 2396.1000000000058 0.054564012483863611 376 | 251 391 1891 0.59135605942901948 377 | 252 208 2850.0000000000146 0.33456082722680591 378 | 252 251 4287.1000000000058 0.52737910283975575 379 | 253 252 7137.1000000000204 1.1551455588519783 380 | 254 15 3703.3000000000393 1.033179649993472 381 | 254 255 407.10000000004948 2.0000096905990499 382 | 255 70 156.80000000001746 0.50000431872426077 383 | 255 254 3703.3000000000393 2.066359299986944 384 | 255 256 250.30000000003201 0.50000034620203992 385 | 256 78 270.60000000003492 0.50003830737666766 386 | 256 255 1283.8528155172899 0.50023963330387455 387 | 256 266 9.5 1.920075758002759 388 | 257 14 37 1.0000000003306155 389 | 257 258 125.20000000004075 2.0000000866889076 390 | 258 68 105.10000000002037 0.50000087173023067 391 | 258 257 37 2.0000000006612311 392 | 258 259 793.90000000002328 0.50003503881676004 393 | 259 80 1221.0000000000146 0.51587939305613506 394 | 259 258 75.30000000000291 0.5000000028357382 395 | 259 267 799.30000000001019 1.9202140107682832 396 | 260 66 1232.3000000000029 0.51647544057024208 397 | 260 261 0 0.5 398 | 261 82 0 0.5 399 | 261 260 1232.3000000000029 0.5002034005008672 400 | 261 269 942.09999999999854 1.8601069381324784 401 | 262 13 592.80000000000291 1.0000217845703872 402 | 262 273 37 2.0000000006612311 403 | 263 16 241.50000000002183 1.0000006000462971 404 | 263 264 249 2.0000013562620311 405 | 264 143 56.19999999999709 0.50000007127159951 406 | 264 263 241.50000000002183 2.0000012000925942 407 | 264 265 322.90000000002328 0.50000095886707019 408 | 265 139 262.20000000001164 0.5000337677397787 409 | 265 264 60.200000000004366 0.50000000115843635 410 | 265 266 188.10000000002037 1.000000220836778 411 | 266 24 340.30000000003201 0.14906833489713095 412 | 266 39 24.19999999999709 1.4598484850883253 413 | 266 256 86.4528155172884 1.9200757769213079 414 | 266 265 113.90000000000873 1.0000000296900629 415 | 266 277 76.700000000011642 3.579924263856042 416 | 267 24 306.80000000000291 0.14906833085987911 417 | 267 39 18.30000000000291 1.4598484850288822 418 | 267 259 1245.1000000000058 1.92088980881737 419 | 267 268 1412.2000000000044 1.0007016185267923 420 | 267 281 921.3843561878748 1.6403600425910869 421 | 268 25 4077.2999999999956 0.14931350304086155 422 | 268 40 13.30000000000291 1.3200757580072866 423 | 268 267 2330.8843561878748 1.0052071384869339 424 | 268 287 2534.7156438121456 1.7326008457102438 425 | 269 25 4303.3999999999942 0.14937258050977933 426 | 269 40 34.099999999998545 1.320075758314871 427 | 269 261 1232.3000000000029 1.8606050732267723 428 | 269 270 550.55304846098443 1.0000162073834273 429 | 269 290 2089.7469515390403 2.5084106784537887 430 | 270 269 3178.0999999999913 1.0179964337923006 431 | 270 271 550.55304846098443 0.57993364105454892 432 | 271 192 748.30000000000291 0.50224013516674781 433 | 271 270 3178.0999999999913 0.59036081022570319 434 | 271 272 550.55304846098443 0.50000810369171367 435 | 272 186 1811.9530484609786 0.57701210653998103 436 | 272 271 1262.1999999999971 0.50022387156097703 437 | 272 273 454.00000000001455 2.2799413287729116 438 | 273 26 302.30000000001019 0.1490683304087857 439 | 273 41 55.30000000000291 1.0000000016497448 440 | 273 262 592.80000000000291 2.0000435691407743 441 | 273 272 2783.1999999999971 0.28288726070825904 442 | 273 292 56.400000000001455 2.0000000035699541 443 | 274 26 378.80000000003201 0.14906834126561611 444 | 274 41 342.5 1.0000024274960007 445 | 274 275 501.60000000003492 2.000022334504747 446 | 274 293 615.00000000000728 1.4201115947153029 447 | 275 12 501.60000000003492 1.0000111672523735 448 | 275 274 488.20000000001164 2.0000200418273115 449 | 276 17 1184.0000000000291 1.0003466754031849 450 | 276 296 648.30000000002474 2.0000623232800248 451 | 277 228 69.900000000008731 0.50000017056108337 452 | 277 266 222.55281551729422 3.579925791253292 453 | 277 299 235.10000000000582 0.72007614606540338 454 | 278 100 516.34481274330756 0.50050784422315187 455 | 278 279 0 0.5 456 | 279 104 0 0.5 457 | 279 278 516.34481274330756 0.50000626968176731 458 | 279 280 287.80000000000291 0.42007626640170448 459 | 280 279 516.34481274330756 0.42008102548264165 460 | 280 300 287.80000000000291 0.42007626640170448 461 | 281 267 576.59999999999854 1.6401834964935342 462 | 281 282 921.3843561878748 0.57999797311818713 463 | 282 281 576.59999999999854 0.57993555000613628 464 | 282 283 921.3843561878748 0.35989423585719038 465 | 283 98 0 0.5 466 | 283 282 576.59999999999854 0.35985550172491299 467 | 283 284 921.3843561878748 0.50006356961206933 468 | 284 106 535.28435618786898 0.50058655595432655 469 | 284 283 576.59999999999854 0.50000974955461186 470 | 284 285 386.10000000000582 0.27992533937721115 471 | 285 284 576.59999999999854 0.27992970027336911 472 | 285 286 386.10000000000582 0.57992651545671403 473 | 286 285 576.59999999999854 0.57993555000613628 474 | 286 302 386.10000000000582 0.42007740480829536 475 | 287 268 2815 1.739129373267452 476 | 287 288 2534.7156438121456 0.72531913869705544 477 | 288 96 829.30000000001019 0.50337923118589611 478 | 288 287 2815 0.72805217787135712 479 | 288 289 2687.0156438121412 0.50459797921490812 480 | 289 108 2145.8099671540695 0.65147336586222349 481 | 289 288 1871.5000000000073 0.50108204556644698 482 | 289 303 1698.5 1.2218670452004707 483 | 290 94 1898.1469515390418 0.59274501378843281 484 | 290 269 217.30000000000291 2.5000009833205916 485 | 290 291 191.59999999999854 0.50000011886889983 486 | 291 110 0 0.5 487 | 291 290 217.30000000000291 0.50000019666411832 488 | 291 304 379.40000000000146 1.2799289203185591 489 | 292 273 296.5 2.0000027267480185 490 | 292 305 56.400000000001455 1.859848488319787 491 | 293 89 550.69999999999709 0.50065710012363429 492 | 293 274 979.40000000005966 1.4203062565152158 493 | 293 294 335.20000000001164 0.50000111353087673 494 | 294 115 1029.6000000000349 0.50802870273920109 495 | 294 293 523.80000000001746 0.50000663969607495 496 | 294 295 310.70000000000437 0.27992470217364657 497 | 295 294 1273.4000000000451 0.28005408427394507 498 | 295 308 310.70000000000437 0.72007694174844927 499 | 296 276 1184.0000000000291 2.0006933508063698 500 | 296 297 610.40000000002328 0.4200860453126557 501 | 296 310 37.900000000001455 1.5799242425750548 502 | 297 148 516.60000000002037 0.50050884891207503 503 | 297 296 894.00000000001455 0.42012309425705452 504 | 297 298 206.20000000001892 0.50000015945600085 505 | 298 134 352.70567665809358 0.5001105658581616 506 | 298 297 894.00000000001455 0.50005634252411979 507 | 298 299 124.40000000001601 1.140151563168188 508 | 299 239 716.25334596227913 0.50188034655209302 509 | 299 277 222.55281551729422 0.72007606962104642 510 | 299 298 665.40567665810522 1.1401909448200194 511 | 299 300 185.20000000001892 1.0000002075296479 512 | 299 315 222.44225269302842 1.9200765872848329 513 | 300 280 516.34481274330756 0.42008102548264165 514 | 300 299 455.44792935112491 1.0000075905133341 515 | 300 301 185.20000000001892 0.50000010376482396 516 | 300 316 239.6577473069774 1.9200768753789239 517 | 301 300 407.3056766580994 0.5000024275493965 518 | 301 302 185.20000000001892 0.50000010376482396 519 | 302 27 207.30000000001019 0.14906832463829328 520 | 302 42 252.20000000001164 1.0000007136685336 521 | 302 286 576.59999999999854 0.4200839491030875 522 | 302 301 407.3056766580994 0.5000024275493965 523 | 302 311 668.30000000001019 1.1401916353425987 524 | 303 27 144.40000000000873 0.14906832338571208 525 | 303 28 840.80000000001019 0.14906876636893066 526 | 303 42 387.80567665808485 1.0000039899997415 527 | 303 43 12.099999999998545 1.540151515005824 528 | 303 289 2216.9943233419399 1.2252752551231487 529 | 303 319 1669.1999999999971 2.143082369406065 530 | 304 28 438.40000000000873 0.14906835577001395 531 | 304 43 5.6000000000058208 1.5401515150002671 532 | 304 291 217.30000000000291 1.2799247454303453 533 | 304 305 737.69999999999709 0.92012382631978318 534 | 304 312 251 0.27992443799798955 535 | 305 292 296.5 1.8598510206690857 536 | 305 304 248.70000000001164 0.92007637893043737 537 | 305 306 558.5 0.7200881171077862 538 | 305 321 0 3.2799242419999999 539 | 306 198 374.20000000000437 0.5001400833037366 540 | 306 305 296.70000000001164 0.72007674238411135 541 | 306 307 194.29999999999563 0.50000012571219998 542 | 307 180 270.40000000000146 0.50003819425049401 543 | 307 306 62.100000000005821 0.5000000013117547 544 | 307 308 856.09999999999127 0.50004737881696326 545 | 308 29 1019.8999999999942 0.14906928289739144 546 | 308 44 32.200000000004366 1.0000000001896443 547 | 308 295 1273.4000000000451 0.72040976363367937 548 | 308 307 237.6000000000131 0.50000028110719996 549 | 308 309 37 2.0000000006612311 550 | 309 11 37 1.0000000003306155 551 | 309 308 485.80000000003929 2.0000196506199943 552 | 310 151 1238.9000000000087 0.51683124550451365 553 | 310 296 290.00000000001455 1.5799262132625631 554 | 310 313 37.900000000001455 0.27992424210188577 555 | 311 226 86.700000000004366 0.50000040368966669 556 | 311 302 838.40000000000146 1.1402508915388965 557 | 311 317 726.26873357280419 0.72011109940422735 558 | 312 304 413 0.27992567866971607 559 | 312 320 251 2.7200776625488032 560 | 313 310 1306.7000000000116 0.28006820811827604 561 | 313 314 0 0.77992424199999999 562 | 313 325 1046.1777030859666 1.7204392422807064 563 | 314 131 337.00000000000728 0.50009214904664634 564 | 314 313 1008.2777030859652 0.27997527808876332 565 | 314 315 0 1.6401515149999999 566 | 315 299 727.8061614795588 1.9201707960454237 567 | 315 314 337.00000000000728 1.7200796716627469 568 | 315 316 0 2.5799242420000001 569 | 315 327 336.50570108256215 1.0799266847510902 570 | 316 300 516.34481274330756 1.9200998345279436 571 | 316 315 451.06344838954101 1.0000073024192435 572 | 316 317 471.59999999999854 0.859855987972175 573 | 316 328 398.29429891744803 1.0799290363073311 574 | 317 241 679 0.50151862428327187 575 | 317 311 838.40000000000146 0.72013852039221893 576 | 317 316 609.70000000001164 1.0000243770416779 577 | 317 318 0 1.1401515149999999 578 | 317 329 453.56873357279983 1.0799323047268432 579 | 318 317 0 1.1401515149999999 580 | 318 319 0 1 581 | 319 303 1595.0999999999985 2.1425955780247787 582 | 319 318 0 0.859848485 583 | 319 320 890.20000000000437 1.000110781331206 584 | 319 330 1635.1999999999971 0.86093296529172425 585 | 320 312 413 2.7200897183859927 586 | 320 319 10.200000000004366 2.5799242420049269 587 | 320 321 722.40000000000146 1.7201583950383734 588 | 320 332 273.40000000000146 0.7200764677222995 589 | 321 305 12.900000000001455 3.2799242420160231 590 | 321 320 10.200000000004366 1.6401515150031318 591 | 321 333 0 0.72007575800000001 592 | 321 334 722.40000000000146 0.27993769030901794 593 | 322 18 1626.7000000000189 1.0012352250386076 594 | 322 323 2185.8000000000175 2.0080535600621676 595 | 323 153 1802.2000000000189 0.57536733943679608 596 | 323 322 1626.7000000000189 2.0024704500772152 597 | 323 324 718.29999999999563 0.50002348062701063 598 | 324 129 825.89999999999418 0.50332415378599993 599 | 324 323 1626.7000000000189 0.50061761251930381 600 | 324 325 776.22229691403481 0.57996138114812035 601 | 325 313 1306.7000000000116 1.7209603996024947 602 | 325 324 1018.6999999999971 0.58003441437404446 603 | 325 326 437.49999999999272 0.8598540421277362 604 | 325 340 1379.1000000000058 0.36007810987465472 605 | 326 325 774.39999999999418 0.85990303559945058 606 | 326 327 437.49999999999272 1.5799344529162014 607 | 327 315 727.8061614795588 1.0799776950414948 608 | 327 326 774.39999999999418 1.5800244757225581 609 | 327 328 786.58588456565485 1.0000675306320264 610 | 327 341 381.89816688701103 1.0000037523774277 611 | 328 316 987.9448127433061 1.0801057267974896 612 | 328 327 819.79246580444305 1.0000796768049411 613 | 328 329 923.11010490336048 1.0001280944283515 614 | 328 342 447.51778247898619 1.0000070755044412 615 | 329 31 1191.0999999999985 0.14907010861301556 616 | 329 46 736.30000000000291 1.0000518484074876 617 | 329 317 971.60000000000582 1.0800940114472191 618 | 329 328 869.01594936598121 1.0001006067706475 619 | 329 343 723.15278420682444 1.0000482432403384 620 | 330 31 3156.4999999999854 0.14915639089561203 621 | 330 46 320 1.0000018497631911 622 | 330 224 1362.7000000000189 0.52463611749423333 623 | 330 319 2441.0999999999985 0.86523465966807367 624 | 330 331 392.5 0.4200775167434127 625 | 330 339 628.30000000000291 0.6401691131589603 626 | 331 330 962.60000000000582 0.42013938292286707 627 | 331 332 392.5 1.9200837968371072 628 | 332 32 803.59999999999854 0.14906869295947683 629 | 332 47 0 0.92007575799999997 630 | 332 320 267.59999999999854 0.7200764093866393 631 | 332 331 962.60000000000582 1.9203665738104228 632 | 332 345 350.89999999999418 0.72007768387405691 633 | 333 32 591.40000000000873 0.14906843152248381 634 | 333 47 143.10000000000582 0.94015158454607184 635 | 333 321 12.900000000001455 0.72007575800351775 636 | 333 334 649.80000000001019 0.42008896982058885 637 | 333 358 0 2.0799242420000001 638 | 334 321 10.200000000004366 0.77992424200148935 639 | 334 333 734.50000000001455 0.4200973260578631 640 | 334 335 1372.2000000000116 0.28009931790928005 641 | 335 200 909.5 0.50488857245724073 642 | 335 334 744.70000000001892 0.27993942935505006 643 | 335 336 1516.1000000000131 0.50046601255259371 644 | 336 178 445.00000000000728 0.50028016332751057 645 | 336 335 961.50000000001455 0.50007538472908142 646 | 336 337 1981.5000000000291 0.50135976084340761 647 | 337 29 842 0.14906876890548065 648 | 337 33 577.30000000001019 0.14906842153730368 649 | 337 44 229.20000000001164 3.0000014604810548 650 | 337 48 17.400000000001455 1.0000000000161702 651 | 337 336 1019.8000000000175 0.50009539953429072 652 | 337 338 734.00000000002183 2.0001024071913212 653 | 338 10 734.00000000002183 1.0000512035956606 654 | 338 337 69.200000000018917 2.000000008090411 655 | 339 243 366.30000000000291 0.50012862308375472 656 | 339 330 1504.2999999999811 0.64072979319853551 657 | 339 344 875.10000000000582 0.42011921648424716 658 | 340 30 1379.0000000000073 0.14907153112667992 659 | 340 45 0 1 660 | 340 325 1545.2000000000116 0.36021037342819473 661 | 340 351 270.59999999999854 1.7200773849528384 662 | 341 30 1298.0000000000218 0.14907084121736375 663 | 341 45 0 1 664 | 341 327 1076.8920460452209 1.0002372492765583 665 | 341 342 599.21411543435534 1.0000227428224544 666 | 341 353 413.30570108255779 2.0000102951291501 667 | 342 328 1124.4690330810117 1.0002820370861303 668 | 342 341 811.10753419556568 1.0000763536779278 669 | 342 343 411.48989509664534 1.0000050576982933 670 | 342 354 398.29429891744803 2.0000088789697363 671 | 343 329 1230.9898950966453 1.0004050738161885 672 | 343 342 761.88405063402752 1.0000594390347501 673 | 343 344 74.30000000000291 2.0000000107523026 674 | 343 355 613.36873357280274 2.0000499381847532 675 | 344 339 244.69999999999709 0.42007602369275793 676 | 344 343 652.10000000000582 2.0000637974053497 677 | 344 356 336.30000000000291 2.0000045128789519 678 | 345 332 180.49999999999272 0.72007589283518492 679 | 345 346 350.89999999999418 0.64015322711317912 680 | 346 222 183.29999999999563 0.5000080653107084 681 | 346 345 180.49999999999272 0.64015163486925952 682 | 346 347 785.5 1.0799967680904956 683 | 347 245 1241.9000000000087 0.51699486626121494 684 | 347 346 180.49999999999272 1.0799244442173128 685 | 347 357 785.5 0.27994304129176295 686 | 348 18 523.50000000001455 1.0000132489958429 687 | 348 349 683.00000000000728 2.0000767766272931 688 | 349 156 0 0.5 689 | 349 348 523.50000000001455 2.0000264979916857 690 | 349 350 765.80000000001019 0.50003033525654683 691 | 350 126 637.30000000000291 0.50117854702766829 692 | 350 349 28.099999999998545 0.50000000005499357 693 | 350 351 188.00000000000728 0.85984867448269253 694 | 351 340 11 1.7200757580044426 695 | 351 350 87.599999999998545 0.85984849393212059 696 | 351 352 116.60000000000582 0.72007578147948736 697 | 351 367 342 2.0000048267037038 698 | 352 351 87.599999999998545 0.72007576548015917 699 | 352 353 116.60000000000582 1.4200758043043653 700 | 353 341 1063.6061614795617 2.0004515123081248 701 | 353 352 87.599999999998545 1.420075772751771 702 | 353 354 587.32411298276566 1.0000209907301538 703 | 353 369 688.13923715051351 2.0000791136646612 704 | 354 342 936.74481274330174 2.0002716635695417 705 | 354 353 362.43353606795426 1.0000030438954028 706 | 354 355 513.21180779861606 1.0000122377838845 707 | 354 370 263.96076284949231 2.0000017127884067 708 | 355 343 893.80000000000291 2.0002251684906804 709 | 355 354 228.09999999999854 1.0000004775483633 710 | 355 356 312.23248188481375 2.000003353192918 711 | 355 371 574.96873357280128 2.0000385587663074 712 | 356 344 283.69999999999709 2.0000022855122777 713 | 356 355 189.69999999999709 2.0000004568940883 714 | 356 357 347.11465460631007 2.0000051219815815 715 | 356 372 362.0853453936943 2.0000060644302819 716 | 357 347 1422.4000000000015 0.28012637801758877 717 | 357 356 189.69999999999709 2.0000004568940883 718 | 357 358 287.30000000000291 2.0000024037468016 719 | 357 373 691.41465460631298 2.0000806307197068 720 | 358 333 0 2.0799242420000001 721 | 358 357 408.69999999999709 2.0000098438449894 722 | 358 359 287.30000000000291 0.72007662343990009 723 | 358 363 0 1.7200757579999999 724 | 359 202 0 0.5 725 | 359 358 408.69999999999709 0.72007930215707117 726 | 359 360 740.00000000000728 0.50002644923425177 727 | 360 176 563.6000000000131 0.50072086705970942 728 | 360 359 408.69999999999709 0.50000246096124734 729 | 360 361 740.00000000000728 0.50002644923425177 730 | 361 33 458.90000000000873 0.14906836234292772 731 | 361 48 107.20000000000437 1.0000000232967512 732 | 361 360 972.30000000001019 0.50007882924500924 733 | 361 362 425.40000000000146 2.0000115541009493 734 | 361 378 71.700000000004366 2.0000000093244417 735 | 362 10 425.40000000000146 1.0000057770504747 736 | 362 361 80.100000000013097 2.0000000145236667 737 | 363 358 0 1.7200757579999999 738 | 363 375 0 0.27992424199999999 739 | 364 19 1110.7000000000044 1.0002684746638204 740 | 364 365 746.90000000000873 2.0001097984105254 741 | 365 158 1338.1490257771511 0.52290810536398047 742 | 365 364 1110.7000000000044 2.0005369493276408 743 | 365 366 85.200000000004366 0.50000000464776972 744 | 366 124 0 0.5 745 | 366 365 1787.1490257771511 0.50089976542152692 746 | 366 367 200.30000000000291 0.85984872915293387 747 | 367 351 11 2.0000000000051656 748 | 367 366 1016.4490257771467 0.86001039756987574 749 | 367 368 282.80000000000291 0.72007657047878648 750 | 367 384 259.5 2.2799260658372642 751 | 368 367 1016.4490257771467 0.72021135086143651 752 | 368 369 282.80000000000291 1.4200773603056127 753 | 369 34 1355.4000000000015 0.14907131708668242 754 | 369 49 95.5 1.0000000146733645 755 | 369 353 1534.3302744623215 2.001955337065453 756 | 369 368 1016.4490257771467 1.4203431633852592 757 | 369 370 1782.5206997605419 1.0017809615656135 758 | 370 354 862.63250755915215 2.0001953662299927 759 | 370 369 821.76076284949522 1.0000804447716569 760 | 370 371 919.88819220138976 1.0001263154276383 761 | 370 386 0 2 762 | 371 355 692.8206740862006 2.0000812885862391 763 | 371 370 557.80000000000291 1.0000170777345785 764 | 371 372 689.36751811519207 2.0000796800284761 765 | 371 387 574.96873357280128 2.0000385587663074 766 | 372 356 344.36751811518479 2.0000049617506801 767 | 372 371 557.80000000000291 2.000034155469157 768 | 372 373 689.38534539369721 2.0000796882710064 769 | 372 388 301.40000000000146 2.0000029115161762 770 | 373 35 851.80000000001019 0.1490687900302243 771 | 373 50 275 1.0000010088973821 772 | 373 357 1049.5000000000073 2.0004280317523104 773 | 373 372 557.80000000000291 2.000034155469157 774 | 373 374 1288.3000000000029 1.420765832152324 775 | 374 247 491.5329436508764 0.50041704389221586 776 | 374 373 823.80000000001019 1.4201911338421194 777 | 374 375 1288.3000000000029 0.58020605142281123 778 | 375 219 680.90000000000146 0.50153569361888106 779 | 375 363 0 0.27992424199999999 780 | 375 374 851.03294365089096 0.57997790475576538 781 | 375 376 607.40000000000146 0.7200930479429527 782 | 375 390 0 2 783 | 376 204 1673.9000000000087 0.5560904960012033 784 | 376 375 851.03294365089096 0.72014238954725318 785 | 376 377 0 0.5 786 | 377 174 0 0.5 787 | 377 376 1917.5329436508982 0.50119249772710872 788 | 377 378 545.10000000000582 0.50000778737255458 789 | 378 36 400.00000000000728 0.14906834571090338 790 | 378 51 0 1 791 | 378 361 217.90000000000873 2.0000007953808607 792 | 378 377 1592.6329436508895 0.50056747796621825 793 | 378 379 229.70000000000437 2.0000009821779869 794 | 379 9 229.70000000000437 1.0000004910889935 795 | 379 378 1187.0329436508764 2.0007004825223089 796 | 380 19 191.50000000001455 1.000000237241867 797 | 380 381 291.09999999999127 2.0000025334657487 798 | 381 160 0 0.5 799 | 381 380 191.50000000001455 2.0000004744837341 800 | 381 382 291.09999999999127 0.50000063336643719 801 | 382 122 39.69999999999709 0.50000001774734004 802 | 382 381 0 0.5 803 | 382 383 251.39999999999418 0.5799246506472463 804 | 383 382 0 0.57992424200000003 805 | 383 384 251.39999999999418 0.42007605400901171 806 | 384 367 11 2.2799242420058885 807 | 384 383 0 0.42007575800000002 808 | 384 385 270.49999999999272 2.0000018889275166 809 | 384 401 2490.9412514772266 2.0135831393119301 810 | 385 34 314.49999999999272 0.14906833167914699 811 | 385 49 81.80000000000291 1.0000000078982239 812 | 385 384 2128.2412514772295 2.0072381843952343 813 | 385 386 689.52019826131436 1.0000398753208062 814 | 385 402 307.45830829423357 2.0000031527617179 815 | 386 370 0 2 816 | 386 385 1548.7995597714544 1.0010150725553293 817 | 386 387 713.00000000000728 1.0000455904983152 818 | 386 403 40.000440228548541 2.0000000009032446 819 | 387 371 462.30000000000291 2.0000161154259595 820 | 387 386 1588.8000000000029 1.0011240694491361 821 | 387 388 1045.572597964092 2.0004216605655376 822 | 387 404 955.40618139084108 2.0002939668797177 823 | 388 372 283.69999999999709 2.0000022855122777 824 | 388 387 1969.2374478180427 2.0053056495323038 825 | 388 389 926.0707452282295 2.0002594913439182 826 | 388 405 457.52925477179815 2.0000154604342835 827 | 389 35 274 0.14906832800030731 828 | 389 50 288.60000000000582 1.0000012237748588 829 | 389 388 1878.6374478180442 2.0043945874973756 830 | 389 390 965.20000000004075 2.0003062072494346 831 | 389 406 811.84580130744143 2.0001532640900934 832 | 390 375 0 2 833 | 390 389 1864.2125038972881 2.0042611603950102 834 | 390 391 965.20000000004075 0.72018600420862089 835 | 390 407 182.70000000000437 2.5799247490810284 836 | 391 249 316.46705634913815 0.50007166139740611 837 | 391 390 2046.9125038972925 0.72230568951782714 838 | 391 392 1731.5000000000437 0.42074184939473613 839 | 392 207 627.00000000002183 0.50110418388946776 840 | 392 391 1238.6795602464335 0.42025021151507475 841 | 392 393 2221.9425227643587 0.42188199660858994 842 | 393 170 960.80000000001019 0.5060884006066424 843 | 393 392 1238.6795602464335 0.42025021151507475 844 | 393 394 1574.5425227643573 0.14030347580725758 845 | 394 36 564.70000000002619 0.14906841321226671 846 | 394 51 20.80000000000291 1.0000000000330194 847 | 394 393 1178.6670563491571 0.14019923260054915 848 | 394 395 603.10000000002037 2.0000466770638194 849 | 394 396 610.84252276431653 0.5799384851002708 850 | 395 9 603.10000000002037 1.0000233385319097 851 | 395 394 1050.4670563491454 2.0004296115647806 852 | 396 215 1203.9000000000015 0.51500834833220843 853 | 396 394 35.900000000008731 0.57992424216992822 854 | 396 410 2 2.0000000000000058 855 | 397 20 6087.0999999999913 1.2421909806447951 856 | 397 398 503.60000000003492 2.0000226928530682 857 | 398 397 6087.0999999999913 2.4843819612895901 858 | 398 399 503.60000000003492 0.57993082206780722 859 | 399 163 1563.1000000000786 0.54264992731028083 860 | 399 398 6087.0999999999913 0.7203766628696695 861 | 399 400 737.30000000000291 0.50002606532592064 862 | 400 119 1433.6999999999971 0.53018591772125445 863 | 400 399 7129.2000000000407 0.72785020192435101 864 | 400 401 1205.2312664272104 0.14020368196555116 865 | 401 37 132.40000000000873 0.14906832327261288 866 | 401 52 956.13126642720454 1.0001474301477873 867 | 401 384 133.29999999999563 2.0000001113952859 868 | 401 400 5468.800000000032 0.16226627245879258 869 | 402 37 96.400000000016007 0.14906832307661302 870 | 402 52 2771.5587485227734 1.010409085472723 871 | 402 385 194.22019826131145 2.0000005020232003 872 | 402 403 691.67980173869728 1.0000403772367745 873 | 402 412 570.93126642720017 2.0000374870723774 874 | 403 386 23.479801738692913 2.000000000107232 875 | 403 402 1550.0004402285558 1.0010182244138037 876 | 403 404 668.20000000000437 1.0000351675493018 877 | 404 387 794.87259796408762 2.0001408433407444 878 | 404 403 1510.0000000000073 1.0009171154482577 879 | 404 405 1118.6274020359415 2.0005524437060376 880 | 404 413 1488.9687335728086 2.0017341574592975 881 | 405 388 410.92740203592984 2.0000100602002444 882 | 405 404 2043.5625521819748 2.0061531564610773 883 | 405 406 1030.129254771804 2.0003972949997286 884 | 405 414 509.40000000000146 2.0000237564737815 885 | 406 38 616.10000000000582 0.14906845082013723 886 | 406 53 923.30000000000291 1.0800626881401709 887 | 406 389 717.70000000001164 2.0000936090850407 888 | 406 405 1798.0625521819748 2.0036877833582274 889 | 406 415 934.19999999998254 2.0002687235123 890 | 407 38 1693.6000000000276 0.14907562157078488 891 | 407 53 1892.6874961027133 1.0622477358377402 892 | 407 390 0 2.5799242420000001 893 | 407 408 3154.1999999999825 1.0987809736052372 894 | 407 416 387.90000000003783 2.0000079877660002 895 | 408 211 2396.5000000000146 0.73565734273941796 896 | 408 407 3338.1874961027643 1.1035808467748724 897 | 408 409 1219.7574772356747 0.50019524511663394 898 | 409 167 686.29999999999563 0.5015849925985878 899 | 409 408 2723.1874961027861 0.50485061048548741 900 | 409 410 594.25747723568202 0.22008059957925921 901 | 410 396 630.95747723569366 2.0000559173499384 902 | 410 409 650.40000000003056 0.22008270521207246 903 | 410 411 37 2.0000000006612311 904 | 411 8 37 1.0000000003306155 905 | 411 410 722.1000000000422 2.0000959258365776 906 | 412 21 570.93126642720017 1.0000187435361887 907 | 412 402 1396.5000000000073 2.0013418685540998 908 | 413 21 1488.9687335728086 1.0008670787296488 909 | 413 404 1245.3000000000247 2.0008484810902538 910 | 414 22 509.40000000000146 1.0000118782368907 911 | 414 405 619.79999999999563 2.000052065794875 912 | 415 22 934.19999999998254 1.00013436175615 913 | 415 406 904.6000000000131 2.0002362503981361 914 | 416 23 387.90000000003783 1.0000039938830001 915 | 416 407 1522.5000000000073 2.001895725363342 916 | -------------------------------------------------------------------------------- /code/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import argparse 3 | from autoencoder import VGAE, GAE, EdgeDecoder, DirectedEdgeDecoder, InnerProductDecoder, DirectedInnerProductDecoder 4 | from sklearn.preprocessing import StandardScaler, MinMaxScaler 5 | import matplotlib.pyplot as plt 6 | import pandas as pd 7 | import numpy as np 8 | import networkx as nx 9 | import copy 10 | import torch 11 | from torch_geometric.utils.convert import from_networkx 12 | from torch_geometric.utils import train_test_split_edges 13 | from scipy.stats import ranksums 14 | from torch_geometric.nn import GraphConv, SAGEConv, GATConv, GCNConv 15 | import torch.nn.functional as F 16 | from torch_geometric.transforms import LineGraph, RandomNodeSplit, RandomLinkSplit 17 | from torch_geometric import seed_everything 18 | import geopandas as gpd 19 | 20 | global nodefile, nodes, nodes_df, node, node_rename, flowfile, colname, flow, scaler 21 | global df, df1, df2, edge_name_to_y, edge_name_to_x, G, airport, G_line_graph, airport_line_graph, data 22 | global edge_array, edge_index_train, edge_index_val, edge_index_calib_test, edge_weight_train, edge_weight_val, edge_weight_calib_test, edge_index_train, edge_index_val, edge_index_calib_test 23 | global edge_tensor, edge_weight_gae_training 24 | seed_everything(42) 25 | np.random.seed(0) 26 | A = np.random.seed(1) 27 | 28 | def Dataset_An(): 29 | global nodefile, nodes, nodes_df, node, node_rename, flowfile, colname, flow, scaler 30 | global df, df1, df2, edge_name_to_y, edge_name_to_x, G, airport, G_line_graph, airport_line_graph, data 31 | global edge_array, edge_index_train, edge_index_val, edge_index_calib_test, edge_weight_train, edge_weight_val, edge_weight_calib_test, edge_index_train, edge_index_val, edge_index_calib_test 32 | global edge_tensor, edge_weight_gae_training 33 | nodefile = os.path.join(os.path.dirname(__file__), '..', 'data', 'anaheim_nodes.geojson') 34 | nodes = gpd.read_file(nodefile) 35 | nodes_df = pd.DataFrame(nodes) 36 | nodes_df[['X', 'Y']] = nodes_df['geometry'].astype(str).str.split('(').str[-1].str.split(')').str[0].str.split(' ', expand=True).astype(np.float32) 37 | node = nodes_df.rename(columns={'id': 'node'}) 38 | 39 | node_rename = {node: id for id, node in enumerate(range(1, 417))} 40 | node['node'] = node['node'].map(node_rename) 41 | 42 | flowfile = os.path.join(os.path.dirname(__file__), '..', 'data', 'Anaheim_flow.tntp') 43 | colname = 'Volume ' 44 | flow = pd.read_csv(flowfile, sep='\t', usecols=['From ', 'To ', colname]) 45 | 46 | flow['From '] = flow['From '].map(node_rename) 47 | flow['To '] = flow['To '].map(node_rename) 48 | flow = flow[(flow['From '].notna()) & (flow['To '].notna())] 49 | flow.drop(flow[flow[colname] <= 0].index, inplace=True) 50 | flow[colname] = np.log(flow[colname]) 51 | 52 | scaler = StandardScaler() 53 | node[['X', 'Y']] = scaler.fit_transform(node[['X', 'Y']].values) 54 | #minmax = MinMaxScaler() 55 | #flow[[colname]] = minmax.fit_transform(flow[[colname]].values) 56 | 57 | df = flow.rename(columns={'From ': 's', 'To ': 'r', colname: 'w'}) 58 | df1 = pd.merge(df, node, how='left', left_on='s', right_on='node')[['s', 'r', 'w', 'X', 'Y']].rename(columns={'X': 'X1', 'Y': 'Y1'}) 59 | df2 = pd.merge(df1, node, how='left', left_on='r', right_on='node')[['s', 'r', 'w', 'X1', 'Y1', 'X', 'Y']].rename(columns={'X': 'X2', 'Y': 'Y2'}) 60 | df2['feat'] = df2[['X1', 'Y1', 'X2', 'Y2']].values.tolist() 61 | 62 | edge_name_to_y = {(s, r): w for s, r, w in df2[['s', 'r', 'w']].values} 63 | edge_name_to_x = {(s, r): feat for s, r, feat in df2[['s', 'r', 'feat']].values} 64 | 65 | device = torch.device('cpu') 66 | 67 | G = nx.from_pandas_edgelist(df2, source='s', target='r', edge_attr='w', create_using=nx.DiGraph()) 68 | airport = from_networkx(G) 69 | airport.x = torch.from_numpy(node[['X', 'Y']].values).to(torch.float32) 70 | print(airport) 71 | 72 | G_line_graph = nx.line_graph(G, create_using=nx.DiGraph()) 73 | airport_line_graph = from_networkx(G_line_graph) 74 | airport_line_graph.x = torch.from_numpy(np.vstack([edge_name_to_x[e] for e in G_line_graph.nodes])).to(torch.float32) 75 | airport_line_graph.y = torch.from_numpy(np.vstack([edge_name_to_y[e] for e in G_line_graph.nodes])).to(torch.float32) 76 | print(airport_line_graph) 77 | 78 | split = RandomNodeSplit(num_val=0.1, num_test=0.4) 79 | data = split(airport_line_graph) 80 | data = data.to(device) 81 | 82 | edge_array = np.array(list(dict(G_line_graph.nodes).keys())) 83 | edge_index_train = edge_array[data.train_mask.detach().numpy()] 84 | edge_index_val = edge_array[data.val_mask.detach().numpy()] 85 | edge_index_calib_test = edge_array[data.test_mask.detach().numpy()] 86 | 87 | edge_weight_train = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_train])).to(device) 88 | edge_weight_val = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_val])).to(device) 89 | edge_weight_calib_test = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_calib_test])).to(device) 90 | 91 | edge_index_train = torch.LongTensor(edge_index_train).T.to(device) 92 | edge_index_val = torch.LongTensor(edge_index_val).T.to(device) 93 | edge_index_calib_test = torch.LongTensor(edge_index_calib_test).T.to(device) 94 | edge_tensor = torch.LongTensor(edge_array).T.to(device) 95 | edge_weight_gae_training = [edge_name_to_y[tuple(edge)] if train else 1.0 for edge, train in zip(edge_array, data.train_mask.detach().numpy())] 96 | edge_weight_gae_training = torch.Tensor(edge_weight_gae_training).to(device) # torch.ones(edge_array.shape[0]).to(device) 97 | 98 | def Dataset_Ch(): 99 | global nodefile, nodes, nodes_df, node, node_rename, flowfile, colname, flow, scaler 100 | global df, df1, df2, edge_name_to_y, edge_name_to_x, G, airport, G_line_graph, airport_line_graph, data 101 | global edge_array, edge_index_train, edge_index_val, edge_index_calib_test, edge_weight_train, edge_weight_val, edge_weight_calib_test, edge_index_train, edge_index_val, edge_index_calib_test 102 | global edge_tensor, edge_weight_gae_training 103 | nodefile = os.path.join(os.path.dirname(__file__), '..', 'data', 'anaheim_nodes.geojson') 104 | nodes = gpd.read_file(nodefile) 105 | nodes_df = pd.DataFrame(nodes) 106 | nodes_df[['X', 'Y']] = nodes_df['geometry'].astype(str).str.split('(').str[-1].str.split(')').str[0].str.split(' ', expand=True).astype(np.float32) 107 | node = nodes_df.rename(columns={'id': 'node'}) 108 | 109 | node_rename = {node: id for id, node in enumerate(range(1, 417))} 110 | node['node'] = node['node'].map(node_rename) 111 | flowfile = os.path.join(os.path.dirname(__file__), '..', 'data', 'Anaheim_flow.tntp') 112 | colname = 'Volume ' 113 | flow = pd.read_csv(flowfile, sep='\t', usecols=['From ', 'To ', colname]) 114 | 115 | flow['From '] = flow['From '].map(node_rename) 116 | flow['To '] = flow['To '].map(node_rename) 117 | flow = flow[(flow['From '].notna()) & (flow['To '].notna())] 118 | flow.drop(flow[flow[colname] <= 0].index, inplace=True) 119 | flow[colname] = np.log(flow[colname]) 120 | 121 | scaler = StandardScaler() 122 | node[['X', 'Y']] = scaler.fit_transform(node[['X', 'Y']].values) 123 | #minmax = MinMaxScaler() 124 | #flow[[colname]] = minmax.fit_transform(flow[[colname]].values) 125 | 126 | df = flow.rename(columns={'From ': 's', 'To ': 'r', colname: 'w'}) 127 | df1 = pd.merge(df, node, how='left', left_on='s', right_on='node')[['s', 'r', 'w', 'X', 'Y']].rename(columns={'X': 'X1', 'Y': 'Y1'}) 128 | df2 = pd.merge(df1, node, how='left', left_on='r', right_on='node')[['s', 'r', 'w', 'X1', 'Y1', 'X', 'Y']].rename(columns={'X': 'X2', 'Y': 'Y2'}) 129 | df2['feat'] = df2[['X1', 'Y1', 'X2', 'Y2']].values.tolist() 130 | 131 | edge_name_to_y = {(s, r): w for s, r, w in df2[['s', 'r', 'w']].values} 132 | edge_name_to_x = {(s, r): feat for s, r, feat in df2[['s', 'r', 'feat']].values} 133 | 134 | 135 | node_rename = {node: id for id, node in enumerate(range(388, 934))} 136 | nodefile = os.path.join(os.path.dirname(__file__), '..', 'data', 'ChicagoSketch_node.tntp') 137 | node = pd.read_csv(nodefile, sep='\t', usecols=['node', 'X', 'Y']) 138 | flowfile = '..\data\ChicagoSketch_flow.tntp' 139 | flowfile = os.path.join(os.path.dirname(__file__), '..', 'data', 'ChicagoSketch_flow.tntp') 140 | #flowfile = '..\data\Anaheim_flow.tntp' 141 | colname = 'Volume ' 142 | flow = pd.read_csv(flowfile, sep='\t', usecols=['From ', 'To ', colname]) 143 | 144 | node['node'] = node['node'].map(node_rename) 145 | node = node[node['node'].notna()] 146 | 147 | flow['From '] = flow['From '].map(node_rename) 148 | flow['To '] = flow['To '].map(node_rename) 149 | flow = flow[(flow['From '].notna()) & (flow['To '].notna())] 150 | flow.drop(flow[flow[colname] <= 0].index, inplace=True) 151 | flow[colname] = np.log(flow[colname]) 152 | 153 | scaler = StandardScaler() 154 | node[['X', 'Y']] = scaler.fit_transform(node[['X', 'Y']].values) 155 | # minmax = MinMaxScaler() 156 | # flow[[colname]] = minmax.fit_transform(flow[[colname]].values) 157 | 158 | df = flow.rename(columns={'From ': 's', 'To ': 'r', colname: 'w'}) 159 | df1 = pd.merge(df, node, how='left', left_on='s', right_on='node')[['s', 'r', 'w', 'X', 'Y']].rename(columns={'X': 'X1', 'Y': 'Y1'}) 160 | df2 = pd.merge(df1, node, how='left', left_on='r', right_on='node')[['s', 'r', 'w', 'X1', 'Y1', 'X', 'Y']].rename(columns={'X': 'X2', 'Y': 'Y2'}) 161 | df2['feat'] = df2[['X1', 'Y1', 'X2', 'Y2']].values.tolist() 162 | 163 | edge_name_to_y = {(s, r): w for s, r, w in df2[['s', 'r', 'w']].values} 164 | edge_name_to_x = {(s, r): feat for s, r, feat in df2[['s', 'r', 'feat']].values} 165 | 166 | 167 | 168 | device = torch.device('cpu') 169 | 170 | G = nx.from_pandas_edgelist(df2, source='s', target='r', edge_attr='w', create_using=nx.DiGraph()) 171 | airport = from_networkx(G) 172 | airport.x = torch.from_numpy(node[['X', 'Y']].values).to(torch.float32) 173 | print(airport) 174 | 175 | G_line_graph = nx.line_graph(G, create_using=nx.DiGraph()) 176 | airport_line_graph = from_networkx(G_line_graph) 177 | airport_line_graph.x = torch.from_numpy(np.vstack([edge_name_to_x[e] for e in G_line_graph.nodes])).to(torch.float32) 178 | airport_line_graph.y = torch.from_numpy(np.vstack([edge_name_to_y[e] for e in G_line_graph.nodes])).to(torch.float32) 179 | print(airport_line_graph) 180 | 181 | split = RandomNodeSplit(num_val=0.1, num_test=0.4) 182 | data = split(airport_line_graph) 183 | data = data.to(device) 184 | 185 | edge_array = np.array(list(dict(G_line_graph.nodes).keys())) 186 | edge_index_train = edge_array[data.train_mask.detach().numpy()] 187 | edge_index_val = edge_array[data.val_mask.detach().numpy()] 188 | edge_index_calib_test = edge_array[data.test_mask.detach().numpy()] 189 | 190 | edge_weight_train = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_train])).to(device) 191 | edge_weight_val = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_val])).to(device) 192 | edge_weight_calib_test = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_calib_test])).to(device) 193 | 194 | edge_index_train = torch.LongTensor(edge_index_train).T.to(device) 195 | edge_index_val = torch.LongTensor(edge_index_val).T.to(device) 196 | edge_index_calib_test = torch.LongTensor(edge_index_calib_test).T.to(device) 197 | edge_tensor = torch.LongTensor(edge_array).T.to(device) 198 | edge_weight_gae_training = [edge_name_to_y[tuple(edge)] if train else 1.0 for edge, train in zip(edge_array, data.train_mask.detach().numpy())] 199 | edge_weight_gae_training = torch.Tensor(edge_weight_gae_training).to(device) # torch.ones(edge_array.shape[0]).to(device) 200 | # w_min, w_max = edge_weight_gae_training.min(), edge_weight_gae_training.max() 201 | # edge 202 | 203 | class GNN(torch.nn.Module): 204 | def __init__(self, in_channels, hidden_channels, out_channels, gconv=SAGEConv, edge_weight=False): 205 | super().__init__() 206 | if gconv == 'SAGEConv': 207 | gconv = SAGEConv 208 | elif gconv == 'GraphConv': 209 | gconv = GraphConv 210 | elif gconv == 'GCNConv': 211 | gconv = GCNConv 212 | elif gconv == 'GATConv': 213 | gconv = GATConv 214 | self.conv1 = gconv(in_channels, hidden_channels) 215 | self.conv2 = gconv(hidden_channels, out_channels) 216 | self.gconv = gconv 217 | self.edge_weighted = edge_weight 218 | 219 | def forward(self, x, edge_index, edge_weight=None): 220 | if self.gconv not in [GCNConv, GraphConv]: 221 | edge_weight = None 222 | if edge_weight is not None: 223 | if self.edge_weighted =='True': 224 | edge_weight = (edge_weight).sigmoid() 225 | else: 226 | edge_weight = None 227 | x = self.conv1(x, edge_index, edge_weight) 228 | x = x.relu() 229 | x = F.dropout(x, p=0.5, training=self.training) 230 | x = self.conv2(x, edge_index, edge_weight) 231 | return x 232 | 233 | 234 | class DirectedGNN(torch.nn.Module): 235 | def __init__(self, in_channels, hidden_channels, out_channels, gconv=SAGEConv, edge_weight=False): 236 | super().__init__() 237 | if gconv == 'SAGEConv': 238 | gconv = SAGEConv 239 | elif gconv == 'GraphConv': 240 | gconv = GraphConv 241 | elif gconv == 'GCNConv': 242 | gconv = GCNConv 243 | elif gconv == 'GATConv': 244 | gconv = GATConv 245 | self.layers = [in_channels, hidden_channels, out_channels] 246 | self.num_layers = len(self.layers) - 1 247 | self.source = torch.nn.ModuleList() 248 | self.target = torch.nn.ModuleList() 249 | self.gconv = gconv 250 | self.edge_weighted = edge_weight 251 | for n_in, n_out in zip(self.layers[:-1], self.layers[1:]): 252 | self.source.append(gconv(n_in, n_out)) 253 | self.target.append(gconv(n_in, n_out)) 254 | 255 | def forward(self, s, t, edge_index, edge_weight=None): 256 | if self.gconv not in [GCNConv, GraphConv]: 257 | edge_weight = None 258 | if edge_weight is not None: 259 | if self.edge_weighted == 'True': 260 | edge_weight = (edge_weight).sigmoid() 261 | else: 262 | edge_weight = None 263 | for layer_id, (layer_s, layer_t) in enumerate(zip(self.source, self.target)): 264 | s_new = layer_s(t, edge_index, edge_weight) 265 | t_new = layer_t(s, torch.flip(edge_index, [0]), edge_weight) 266 | if layer_id < self.num_layers - 1: 267 | s_new = s_new.relu() 268 | t_new = t_new.relu() 269 | s_new = F.dropout(s_new, p=0.5, training=self.training) 270 | t_new = F.dropout(t_new, p=0.5, training=self.training) 271 | s = s_new 272 | t = t_new 273 | 274 | return s, t 275 | 276 | def cqr_new(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n, alpha): 277 | cal_scores = np.maximum(cal_labels-cal_upper, cal_lower-cal_labels) 278 | cal_scores = cal_scores / np.abs(cal_upper - cal_lower) 279 | qhat = np.quantile(cal_scores, np.ceil((n+1)*(1-alpha))/n, method='higher') 280 | prediction_sets = [val_lower - qhat * np.abs(val_upper - val_lower), val_upper + qhat * np.abs(val_upper - val_lower)] 281 | cov = ((val_labels >= prediction_sets[0]) & (val_labels <= prediction_sets[1])).mean() 282 | eff = np.mean(prediction_sets[1] - prediction_sets[0]) 283 | return prediction_sets, cov, eff 284 | 285 | def cqr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n, alpha): 286 | cal_scores = np.maximum(cal_labels-cal_upper, cal_lower-cal_labels) 287 | qhat = np.quantile(cal_scores, np.ceil((n+1)*(1-alpha))/n, method='higher') 288 | prediction_sets = [val_lower - qhat, val_upper + qhat] 289 | cov = ((val_labels >= prediction_sets[0]) & (val_labels <= prediction_sets[1])).mean() 290 | eff = np.mean(val_upper + qhat - (val_lower - qhat)) 291 | return prediction_sets, cov, eff 292 | 293 | def qr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n, alpha): 294 | prediction_sets = [val_lower, val_upper] 295 | cov = ((val_labels >= prediction_sets[0]) & (val_labels <= prediction_sets[1])).mean() 296 | eff = np.mean(val_upper - val_lower) 297 | return prediction_sets, cov, eff 298 | 299 | def worst_slice_coverage(x, edge_index_calib_test, idx, val_labels, prediction_sets): 300 | if torch.is_tensor(x): 301 | x = x.detach().numpy() 302 | if torch.is_tensor(edge_index_calib_test): 303 | edge_index_calib_test = edge_index_calib_test.detach().numpy() 304 | xtest = np.hstack([x[edge_index_calib_test[0, ~idx]], x[edge_index_calib_test[1, ~idx]]]) 305 | ntest = xtest.shape[0] 306 | nfeat = xtest.shape[1] 307 | xtest_test = xtest[:ntest//4] 308 | unitvec = np.random.randn(nfeat, 1000) 309 | unitvec = unitvec / np.sqrt((unitvec**2).sum(axis=0)) 310 | # ab_range = np.quantile((xtest_test @ unitvec).flatten(), np.linspace(0, 1, 11)) 311 | values = (xtest_test @ unitvec).flatten() 312 | ab_range = np.linspace(values.min(), values.max(), 10) 313 | 314 | ws_cov_min = None 315 | for delta in np.linspace(0.1, 0.5, 5): 316 | ws_cov = 1 317 | ws_a = None 318 | ws_b = None 319 | ws_vec = None 320 | for vec in unitvec.T: 321 | value_vec = xtest_test @ vec.reshape(-1, 1) 322 | for a, b in zip(ab_range[:-1], ab_range[1:]): 323 | contained = np.bitwise_and(value_vec > a, value_vec < b).flatten() 324 | if contained.mean() > delta: 325 | conditional_cov = ((val_labels[:ntest//4][contained] >= prediction_sets[0][:ntest//4][contained]) & (val_labels[:ntest//4][contained] <= prediction_sets[1][:ntest//4][contained])).mean() 326 | if conditional_cov < ws_cov: 327 | #print(f"Worst-Slice coverage = {conditional_cov:.4f}") 328 | ws_cov = conditional_cov 329 | ws_a = a 330 | ws_b = b 331 | ws_vec = vec 332 | if ws_vec is None: 333 | return None 334 | xtest_true = xtest[ntest//4:] 335 | value_vec = xtest_true @ ws_vec.reshape(-1, 1) 336 | contained = np.bitwise_and(value_vec > ws_a, value_vec < ws_b).flatten() 337 | ws_cov_true = ((val_labels[ntest//4:][contained] >= prediction_sets[0][ntest//4:][contained]) & (val_labels[ntest//4:][contained] <= prediction_sets[1][ntest//4:][contained])).mean() 338 | if ws_cov_min is not None and ws_cov_true < ws_cov_min: 339 | ws_cov_min = ws_cov_true 340 | elif ws_cov_min is None and ~np.isnan(ws_cov_true): 341 | ws_cov_min = ws_cov_true 342 | return ws_cov_min 343 | 344 | EPOCHS = 5001 345 | ALPHA = 0.05 346 | LR = 0.01 347 | WD = 5e-4 348 | HIDDEN = 8 349 | OUT = 2 350 | 351 | SCORE = 'cqr' 352 | #GNNCONV = GraphConv 353 | 354 | def build_gae(gconv, CQR_or_CP='CQR'): 355 | if CQR_or_CP == 'CQR': 356 | encoder = GNN(in_channels=airport.x.shape[-1], hidden_channels=8, out_channels=3*OUT, gconv=gconv) 357 | else: 358 | encoder = GNN(in_channels=airport.x.shape[-1], hidden_channels=8, out_channels=OUT, gconv=gconv) 359 | decoder = InnerProductDecoder() 360 | model = GAE(encoder, decoder).to(device) 361 | return model 362 | 363 | 364 | def train_gae_directed(model, optimizer, x, edge_index_train, edge_weight, alpha=ALPHA, val=False, edge_index_val=None, sigmoid=False): 365 | if val: 366 | model.eval() 367 | else: 368 | model.train() 369 | Z_source, Z_target = model(x, x, edge_tensor, edge_weight_gae_training) 370 | out_dim = Z_source.shape[-1] // 3 371 | z_mid_source = Z_source[:, :out_dim]; z_lower_source = Z_source[:, out_dim:2*out_dim]; z_upper_source = Z_source[:, 2*out_dim:] 372 | z_mid_target = Z_target[:, :out_dim]; z_lower_target = Z_target[:, out_dim:2*out_dim]; z_upper_target = Z_target[:, 2*out_dim:] 373 | if val: 374 | out = model.decoder(z_mid_source, z_mid_target, edge_index_val, sigmoid=sigmoid) 375 | lower = model.decoder(z_lower_source, z_lower_target, edge_index_val, sigmoid=sigmoid) 376 | upper = model.decoder(z_upper_source, z_upper_target, edge_index_val, sigmoid=sigmoid) 377 | else: 378 | out = model.decoder(z_mid_source, z_mid_target, edge_index_train, sigmoid=sigmoid) 379 | lower = model.decoder(z_lower_source, z_lower_target, edge_index_train, sigmoid=sigmoid) 380 | upper = model.decoder(z_upper_source, z_upper_target, edge_index_train, sigmoid=sigmoid) 381 | 382 | label = edge_weight 383 | mse_loss = F.mse_loss(out, label) 384 | low_bound = alpha / 2; upp_bound = 1 - alpha / 2 385 | low_loss = torch.mean(torch.max((low_bound - 1) * (label - lower), low_bound * (label - lower))) 386 | upp_loss = torch.mean(torch.max((upp_bound - 1) * (label - upper), upp_bound * (label - upper))) 387 | loss = low_loss + upp_loss # mse_loss + 388 | 389 | if not val: 390 | optimizer.zero_grad() 391 | loss.backward() 392 | optimizer.step() 393 | 394 | return float(loss) 395 | 396 | def run_conformal_regression_gae(labels, lower, upper, alpha, return_prediction_sets=False, return_conditional_coverage=False, score='cqr', x=None, edge_index_calib_test=None): 397 | num_runs = 100 398 | if torch.is_tensor(labels): 399 | labels = labels.detach().numpy() 400 | if torch.is_tensor(upper): 401 | upper = upper.detach().numpy() 402 | if torch.is_tensor(lower): 403 | lower = lower.detach().numpy() 404 | 405 | n_test_calib = labels.shape[0] 406 | n_calib = n_test_calib // 2 407 | idx = np.array([1] * n_calib + [0] * (n_test_calib-n_calib)) > 0 408 | 409 | cov_all = [] 410 | eff_all = [] 411 | if return_conditional_coverage: 412 | ws_cov_all = [] 413 | if return_prediction_sets: 414 | pred_set_all = [] 415 | val_labels_all = [] 416 | idx_all = [] 417 | for k in range(num_runs): 418 | np.random.seed(k) 419 | np.random.shuffle(idx) 420 | if return_prediction_sets: 421 | idx_all.append(idx) 422 | cal_labels, val_labels = labels[idx], labels[~idx] 423 | cal_upper, val_upper = upper[idx], upper[~idx] 424 | cal_lower, val_lower = lower[idx], lower[~idx] 425 | if score == 'cqr': 426 | prediction_sets, cov, eff = cqr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 427 | elif score == 'qr': 428 | prediction_sets, cov, eff = qr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 429 | elif score == 'cqr_new': 430 | prediction_sets, cov, eff = cqr_new(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 431 | if return_conditional_coverage: 432 | ws_cov = worst_slice_coverage(x, edge_index_calib_test, idx, val_labels, prediction_sets) 433 | if ws_cov is not None: 434 | ws_cov_all.append(ws_cov) 435 | cov_all.append(cov) 436 | eff_all.append(eff) 437 | if return_prediction_sets: 438 | pred_set_all.append(prediction_sets) 439 | val_labels_all.append(val_labels) 440 | 441 | if return_prediction_sets: 442 | if return_conditional_coverage: 443 | return cov_all, eff_all, ws_cov_all, pred_set_all, val_labels_all, idx_all 444 | return cov_all, eff_all, pred_set_all, val_labels_all, idx_all 445 | else: 446 | return np.mean(cov_all), np.mean(eff_all) 447 | 448 | def test_gae_directed(best_model, x, train_edge_index, calib_test_edge_index, calib_test_edge_weight, alpha=ALPHA, return_prediction_sets=False, score='cqr', conditional=True, sigmoid=False): 449 | best_model = best_model.cpu() 450 | best_model.eval() 451 | Z_source, Z_target = best_model(x.cpu(), x.cpu(), edge_tensor.cpu(), edge_weight_gae_training.cpu()) 452 | out_dim = Z_source.shape[-1] // 3 453 | z_mid_source = Z_source[:, :out_dim]; z_lower_source = Z_source[:, out_dim:2*out_dim]; z_upper_source = Z_source[:, 2*out_dim:] 454 | z_mid_target = Z_target[:, :out_dim]; z_lower_target = Z_target[:, out_dim:2*out_dim]; z_upper_target = Z_target[:, 2*out_dim:] 455 | 456 | out = best_model.decoder(z_mid_source, z_mid_target, calib_test_edge_index.cpu(), sigmoid=sigmoid) 457 | lower = best_model.decoder(z_lower_source, z_lower_target, calib_test_edge_index.cpu(), sigmoid=sigmoid) 458 | upper = best_model.decoder(z_upper_source, z_upper_target, calib_test_edge_index.cpu(), sigmoid=sigmoid) 459 | if conditional: 460 | return run_conformal_regression_gae(calib_test_edge_weight.cpu(), lower, upper, alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index, score=score) 461 | 462 | return run_conformal_regression_gae(calib_test_edge_weight.cpu(), lower, upper, alpha, return_prediction_sets=return_prediction_sets, score=score) 463 | 464 | def test_gae_directed_basegae(best_model_train, x, train_edge_index, calib_test_edge_index, calib_test_edge_weight, alpha=ALPHA, return_prediction_sets=False, sigmoid=False, conditional=False): 465 | best_model_train = best_model_train.cpu() 466 | best_model_train.eval() 467 | Z_source, Z_target = best_model_train(x.cpu(), x.cpu(), edge_tensor.cpu(), edge_weight_gae_training.cpu()) 468 | out = best_model_train.decoder(Z_source, Z_target, calib_test_edge_index.cpu(), sigmoid=sigmoid) 469 | 470 | if conditional: 471 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index) 472 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets) 473 | 474 | 475 | def train_gae_basegae(model, optimizer, x, edge_index_train, edge_weight, alpha=ALPHA, val=False, edge_index_val=None, sigmoid=False): 476 | if val: 477 | model.eval() 478 | else: 479 | model.train() 480 | Z = model(x, edge_tensor, edge_weight_gae_training) 481 | if val: 482 | out = model.decoder(Z, edge_index_val, sigmoid=sigmoid) 483 | else: 484 | out = model.decoder(Z, edge_index_train, sigmoid=sigmoid) 485 | 486 | label = edge_weight 487 | mse_loss = F.mse_loss(out, label) 488 | loss = mse_loss 489 | 490 | if not val: 491 | optimizer.zero_grad() 492 | loss.backward() 493 | optimizer.step() 494 | 495 | return float(loss) 496 | 497 | def test_gae_basegae(best_model_train, x, train_edge_index, calib_test_edge_index, calib_test_edge_weight, alpha=ALPHA, return_prediction_sets=False, sigmoid=False, conditional=False): 498 | best_model_train = best_model_train.cpu() 499 | best_model_train.eval() 500 | Z = best_model_train(x.cpu(), edge_tensor.cpu(), edge_weight_gae_training.cpu()) 501 | out = best_model_train.decoder(Z, calib_test_edge_index.cpu(), sigmoid=sigmoid) 502 | 503 | if conditional: 504 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index) 505 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets) 506 | 507 | def train_gae(model, optimizer, x, edge_index_train, edge_weight, alpha=ALPHA, val=False, edge_index_val=None, sigmoid=False): 508 | if val: 509 | model.eval() 510 | else: 511 | model.train() 512 | Z = model(x, edge_tensor, edge_weight_gae_training) 513 | out_dim = Z.shape[-1] // 3 514 | z_mid = Z[:, :out_dim]; z_lower = Z[:, out_dim:2*out_dim]; z_upper = Z[:, 2*out_dim:] 515 | if val: 516 | out = model.decoder(z_mid, edge_index_val, sigmoid=sigmoid) 517 | lower = model.decoder(z_lower, edge_index_val, sigmoid=sigmoid) 518 | upper = model.decoder(z_upper, edge_index_val, sigmoid=sigmoid) 519 | else: 520 | out = model.decoder(z_mid, edge_index_train, sigmoid=sigmoid) 521 | lower = model.decoder(z_lower, edge_index_train, sigmoid=sigmoid) 522 | upper = model.decoder(z_upper, edge_index_train, sigmoid=sigmoid) 523 | 524 | label = edge_weight 525 | mse_loss = F.mse_loss(out, label) 526 | low_bound = alpha / 2; upp_bound = 1 - alpha / 2 527 | low_loss = torch.mean(torch.max((low_bound - 1) * (label - lower), low_bound * (label - lower))) 528 | upp_loss = torch.mean(torch.max((upp_bound - 1) * (label - upper), upp_bound * (label - upper))) 529 | loss = low_loss + upp_loss # mse_loss + 530 | 531 | if not val: 532 | optimizer.zero_grad() 533 | loss.backward() 534 | optimizer.step() 535 | 536 | return float(loss) 537 | 538 | def test_gae(best_model, x, train_edge_index, calib_test_edge_index, calib_test_edge_weight, alpha=ALPHA, return_prediction_sets=False, score='cqr', conditional=True, sigmoid=False): 539 | best_model = best_model.cpu() 540 | best_model.eval() 541 | Z = best_model(x.cpu(), edge_tensor.cpu(), edge_weight_gae_training.cpu()) 542 | out_dim = Z.shape[-1] // 3 543 | z_mid = Z[:, :out_dim]; z_lower = Z[:, out_dim:2*out_dim]; z_upper = Z[:, 2*out_dim:] 544 | model=best_model 545 | out = model.decoder(z_mid, calib_test_edge_index.cpu(), sigmoid=sigmoid) 546 | lower = model.decoder(z_lower, calib_test_edge_index.cpu(), sigmoid=sigmoid) 547 | upper = model.decoder(z_upper, calib_test_edge_index.cpu(), sigmoid=sigmoid) 548 | if conditional: 549 | return run_conformal_regression_gae(calib_test_edge_weight.cpu(), lower, upper, alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index,score=score) 550 | 551 | return run_conformal_regression_gae(calib_test_edge_weight.cpu(), lower, upper, alpha, return_prediction_sets=return_prediction_sets, score=score) 552 | 553 | 554 | def train_gae_for_loop(model, optimizer, x, edge_index_train_or_val, edge_weight_train_or_val, edge_index_all, edge_weight_filled_all=None,alpha=ALPHA, val=False): 555 | """ 556 | x: all the node features, n*2 557 | edge_index_train_or_val: only the edge indices of the training (validation) edges, 2*m_train 558 | edge_weight_train_or_val: only the edge weights of the training (validation) edges, m_train 559 | edge_index_all: all the edge indices, 2*m 560 | edge_weight_filled_all: all the edge weights (with the weights of remaining edges appended with 1), m 561 | alpha: self-defined error rate, ALPHA=0.05 562 | val: validation or training 563 | """ 564 | 565 | if val: 566 | model.eval() 567 | else: 568 | model.train() 569 | Z = model(x, edge_index_all, edge_weight_filled_all) 570 | out_dim = Z.shape[-1] // 3 571 | z_mid = Z[:, :out_dim]; z_lower = Z[:, out_dim:2*out_dim]; z_upper = Z[:, 2*out_dim:] 572 | out = model.decoder(z_mid, edge_index_train_or_val) 573 | lower = model.decoder(z_lower, edge_index_train_or_val) 574 | upper = model.decoder(z_upper, edge_index_train_or_val) 575 | 576 | label = edge_weight_train_or_val 577 | low_bound = alpha / 2; upp_bound = 1 - alpha / 2 578 | low_loss = torch.mean(torch.max((low_bound - 1) * (label - lower), low_bound * (label - lower))) 579 | upp_loss = torch.mean(torch.max((upp_bound - 1) * (label - upper), upp_bound * (label - upper))) 580 | loss = low_loss + upp_loss 581 | 582 | if not val: 583 | optimizer.zero_grad() 584 | loss.backward() 585 | optimizer.step() 586 | # cov_all, eff_all, ws_cov_all, pred_set_all, val_labels_all, idx_all = test_gae_directed(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, 587 | # return_prediction_sets=True, score='cqr_new', sigmoid=use_sigmoid, conditional=True) 588 | #cov_all, eff_all, pred_set_all, val_labels_all, idx_all = test_gae_directed(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, _prediction_sets=True, score=SCORE, sigmoid=use_sigmoid, conditional=False) 589 | 590 | return float(loss) 591 | 592 | 593 | def train_baselinegraph(model, optimizer, alpha=ALPHA, val=False): 594 | if val: 595 | model.eval() 596 | else: 597 | model.train() 598 | mask = data.val_mask if val else data.train_mask 599 | out = model(data.x, data.edge_index) 600 | label = data.y[mask] 601 | mse_loss = F.mse_loss(out[mask], data.y[mask]) 602 | loss = mse_loss 603 | 604 | if not val: 605 | optimizer.zero_grad() 606 | loss.backward() 607 | optimizer.step() 608 | 609 | return float(loss) 610 | 611 | 612 | def cqr_baselinegraph(cal_y, val_y, cal_yhat, val_yhat, n, alpha): 613 | cal_scores = np.abs(cal_y - cal_yhat) 614 | qhat = np.quantile(cal_scores, np.ceil((n+1)*(1-alpha))/n, method='higher') 615 | prediction_sets = [val_yhat - qhat, val_yhat + qhat] 616 | cov = ((val_y >= prediction_sets[0]) & (val_y <= prediction_sets[1])).mean() 617 | eff = np.mean(2 * qhat) # np.mean(neg_qhat + pos_qhat) 618 | return prediction_sets, cov, eff 619 | 620 | def run_conformal_regression_baselinegraph(pred, true, n_test_calib, alpha, return_prediction_sets=False, return_conditional_coverage=False, x=None, edge_index_calib_test=None): 621 | num_runs = 100 622 | n_calib = n_test_calib // 2 623 | try: 624 | pred = pred.detach().cpu().numpy() 625 | except: 626 | pass 627 | 628 | smx = pred[true.test_mask] 629 | labels = true.y[true.test_mask].detach().cpu().numpy().reshape(-1) 630 | idx = np.array([1] * n_calib + [0] * (labels.shape[0]-n_calib)) > 0 631 | 632 | cov_all = [] 633 | eff_all = [] 634 | if return_conditional_coverage: 635 | ws_cov_all = [] 636 | if return_prediction_sets: 637 | pred_set_all = [] 638 | val_labels_all = [] 639 | idx_all = [] 640 | for k in range(num_runs): 641 | np.random.seed(k) 642 | np.random.shuffle(idx) 643 | if return_prediction_sets: 644 | idx_all.append(idx) 645 | cal_labels, val_labels = labels[idx], labels[~idx] 646 | cal_predict, val_predict = smx[idx], smx[~idx] 647 | prediction_sets, cov, eff = cqr_baselinegraph(cal_labels, val_labels, cal_predict, val_predict, n_test_calib, alpha) 648 | if return_conditional_coverage: 649 | ws_cov = worst_slice_coverage(x, edge_index_calib_test, idx, val_labels, prediction_sets) 650 | if ws_cov is not None: 651 | ws_cov_all.append(ws_cov) 652 | cov_all.append(cov) 653 | eff_all.append(eff) 654 | if return_prediction_sets: 655 | pred_set_all.append(prediction_sets) 656 | val_labels_all.append(val_labels) 657 | 658 | if return_prediction_sets: 659 | if return_conditional_coverage: 660 | return cov_all, eff_all, ws_cov_all, pred_set_all, val_labels_all, idx_all 661 | return cov_all, eff_all, pred_set_all, val_labels_all, idx_all 662 | else: 663 | return np.mean(cov_all), np.mean(eff_all) 664 | 665 | 666 | def test_baselinegraph(best_model_train, alpha=ALPHA, return_prediction_sets=False, conditional=True, x=None, calib_test_edge_index=None): 667 | best_model_train = best_model_train.cpu() 668 | best_model_train.eval() 669 | out = best_model_train(data.cpu().x, data.cpu().edge_index) 670 | if conditional: 671 | return run_conformal_regression_baselinegraph(out, data.cpu(), int(data.test_mask.sum()), alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index) 672 | return run_conformal_regression_baselinegraph(out, data.cpu(), int(data.test_mask.sum()), alpha, return_prediction_sets=return_prediction_sets) 673 | 674 | def train_gae_directed_basegae(model, optimizer, x, edge_index_train, edge_weight, alpha=ALPHA, val=False, edge_index_val=None, sigmoid=False): 675 | if val: 676 | model.eval() 677 | else: 678 | model.train() 679 | Z_source, Z_target = model(x, x, edge_tensor, edge_weight_gae_training) 680 | if val: 681 | out = model.decoder(Z_source, Z_target, edge_index_val, sigmoid=sigmoid) 682 | else: 683 | out = model.decoder(Z_source, Z_target, edge_index_train, sigmoid=sigmoid) 684 | 685 | label = edge_weight 686 | mse_loss = F.mse_loss(out, label) 687 | loss = mse_loss 688 | 689 | if not val: 690 | optimizer.zero_grad() 691 | loss.backward() 692 | optimizer.step() 693 | 694 | return float(loss) 695 | 696 | def cqr_basegae(cal_y, val_y, cal_yhat, val_yhat, n, alpha): 697 | cal_scores = np.abs(cal_y - cal_yhat) 698 | qhat = np.quantile(cal_scores, np.ceil((n+1)*(1-alpha))/n, method='higher') 699 | prediction_sets = [val_yhat - qhat, val_yhat + qhat] 700 | cov = ((val_y >= prediction_sets[0]) & (val_y <= prediction_sets[1])).mean() 701 | eff = np.mean(2 * qhat) 702 | return prediction_sets, cov, eff 703 | 704 | def run_conformal_regression_basegae(labels, out, alpha, return_prediction_sets=False, num_runs=100, return_conditional_coverage=False, x=None, edge_index_calib_test=None): 705 | if torch.is_tensor(labels): 706 | labels = labels.detach().numpy() 707 | if torch.is_tensor(out): 708 | out = out.detach().numpy() 709 | 710 | n_test_calib = labels.shape[0] 711 | n_calib = n_test_calib // 2 712 | idx = np.array([1] * n_calib + [0] * (n_test_calib-n_calib)) > 0 713 | 714 | cov_all = [] 715 | eff_all = [] 716 | if return_conditional_coverage: 717 | ws_cov_all = [] 718 | if return_prediction_sets: 719 | pred_set_all = [] 720 | val_labels_all = [] 721 | idx_all = [] 722 | for k in range(num_runs): 723 | np.random.seed(k) 724 | np.random.shuffle(idx) 725 | if return_prediction_sets: 726 | idx_all.append(idx) 727 | cal_labels, val_labels = labels[idx], labels[~idx] 728 | cal_predict, val_predict = out[idx], out[~idx] 729 | prediction_sets, cov, eff = cqr_basegae(cal_labels, val_labels, cal_predict, val_predict, n_test_calib, alpha) 730 | if return_conditional_coverage: 731 | ws_cov = worst_slice_coverage(x, edge_index_calib_test, idx, val_labels, prediction_sets) 732 | if ws_cov is not None: 733 | ws_cov_all.append(ws_cov) 734 | cov_all.append(cov) 735 | eff_all.append(eff) 736 | if return_prediction_sets: 737 | pred_set_all.append(prediction_sets) 738 | val_labels_all.append(val_labels) 739 | 740 | if return_prediction_sets: 741 | if return_conditional_coverage: 742 | return cov_all, eff_all, ws_cov_all, pred_set_all, val_labels_all, idx_all 743 | return cov_all, eff_all, pred_set_all, val_labels_all, idx_all 744 | else: 745 | return np.mean(cov_all), np.mean(eff_all) # coverage and efficiency averaged over multiple runs 746 | 747 | def test_gae_directed_basegae(best_model_train, x, train_edge_index, calib_test_edge_index, calib_test_edge_weight, alpha=ALPHA, return_prediction_sets=False, sigmoid=False, conditional=False): 748 | best_model_train = best_model_train.cpu() 749 | best_model_train.eval() 750 | Z_source, Z_target = best_model_train(x.cpu(), x.cpu(), edge_tensor.cpu(), edge_weight_gae_training.cpu()) 751 | out = best_model_train.decoder(Z_source, Z_target, calib_test_edge_index.cpu(), sigmoid=sigmoid) 752 | 753 | if conditional: 754 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index) 755 | return run_conformal_regression_basegae(calib_test_edge_weight.cpu(), out, alpha, return_prediction_sets=return_prediction_sets) 756 | 757 | def train_gae_basegae(model, optimizer, x, edge_index_train, edge_weight, alpha=ALPHA, val=False, edge_index_val=None, sigmoid=False): 758 | if val: 759 | model.eval() 760 | else: 761 | model.train() 762 | Z = model(x, edge_tensor, edge_weight_gae_training) 763 | if val: 764 | out = model.decoder(Z, edge_index_val, sigmoid=sigmoid) 765 | else: 766 | out = model.decoder(Z, edge_index_train, sigmoid=sigmoid) 767 | 768 | label = edge_weight 769 | mse_loss = F.mse_loss(out, label) 770 | loss = mse_loss 771 | 772 | if not val: 773 | optimizer.zero_grad() 774 | loss.backward() 775 | optimizer.step() 776 | 777 | return float(loss) 778 | 779 | 780 | def train_linegraph(model, optimizer, alpha=ALPHA, val=False): 781 | if val: 782 | model.eval() 783 | else: 784 | model.train() 785 | mask = data.val_mask if val else data.train_mask 786 | out = model(data.x, data.edge_index) 787 | label = data.y[mask] 788 | mse_loss = F.mse_loss(out[:, 0][mask], data.y[mask]) 789 | low_bound = alpha / 2 790 | upp_bound = 1 - alpha / 2 791 | lower = out[:, 1][mask].reshape(-1,1) 792 | upper = out[:, 2][mask].reshape(-1,1) 793 | low_loss = torch.mean(torch.max((low_bound - 1) * (label - lower), low_bound * (label - lower))) 794 | upp_loss = torch.mean(torch.max((upp_bound - 1) * (label - upper), upp_bound * (label - upper))) 795 | loss = mse_loss + low_loss + upp_loss 796 | 797 | if not val: 798 | optimizer.zero_grad() 799 | loss.backward() 800 | optimizer.step() 801 | 802 | return float(loss) 803 | 804 | 805 | def run_conformal_regression_linegraph(pred, data, n_test_calib, alpha, return_prediction_sets=False, return_conditional_coverage=False, score='cqr', x=None, edge_index_calib_test=None): 806 | num_runs = 100 807 | n_calib = n_test_calib // 2 808 | try: 809 | pred = pred.detach().cpu().numpy() 810 | except: 811 | pass 812 | 813 | smx = pred[data.test_mask] 814 | labels = data.y[data.test_mask].detach().cpu().numpy().reshape(-1) 815 | upper, lower = smx[:, 2], smx[:, 1] 816 | idx = np.array([1] * n_calib + [0] * (labels.shape[0]-n_calib)) > 0 817 | 818 | cov_all = [] 819 | eff_all = [] 820 | if return_conditional_coverage: 821 | ws_cov_all = [] 822 | if return_prediction_sets: 823 | pred_set_all = [] 824 | val_labels_all = [] 825 | idx_all = [] 826 | for k in range(num_runs): 827 | np.random.seed(k) 828 | np.random.shuffle(idx) 829 | if return_prediction_sets: 830 | idx_all.append(idx) 831 | cal_labels, val_labels = labels[idx], labels[~idx] 832 | cal_upper, val_upper = upper[idx], upper[~idx] 833 | cal_lower, val_lower = lower[idx], lower[~idx] 834 | if score == 'cqr': 835 | prediction_sets, cov, eff = cqr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 836 | elif score == 'qr': 837 | prediction_sets, cov, eff = qr(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 838 | elif score == 'cqr_new': 839 | prediction_sets, cov, eff = cqr_new(cal_labels, cal_lower, cal_upper, val_labels, val_lower, val_upper, n_test_calib, alpha) 840 | if return_conditional_coverage: 841 | ws_cov = worst_slice_coverage(x, edge_index_calib_test, idx, val_labels, prediction_sets) 842 | if ws_cov is not None: 843 | ws_cov_all.append(ws_cov) 844 | cov_all.append(cov) 845 | eff_all.append(eff) 846 | if return_prediction_sets: 847 | pred_set_all.append(prediction_sets) 848 | val_labels_all.append(val_labels) 849 | 850 | if return_prediction_sets: 851 | if return_conditional_coverage: 852 | return cov_all, eff_all, ws_cov_all, pred_set_all, val_labels_all, idx_all 853 | return cov_all, eff_all, pred_set_all, val_labels_all, idx_all 854 | else: 855 | return np.mean(cov_all), np.mean(eff_all) 856 | 857 | 858 | def test_linegraph(best_model_train, alpha=ALPHA, return_prediction_sets=False, score='cqr', conditional=True, x=None, calib_test_edge_index=None): 859 | best_model_train = best_model_train.cpu() 860 | best_model_train.eval() 861 | out = best_model_train(data.cpu().x, data.cpu().edge_index) 862 | if conditional: 863 | return run_conformal_regression_linegraph(out, data.cpu(), int(data.test_mask.sum()), alpha, return_prediction_sets=return_prediction_sets, return_conditional_coverage=True, x=x, edge_index_calib_test=calib_test_edge_index, score=score) 864 | return run_conformal_regression_linegraph(out, data.cpu(), int(data.test_mask.sum()), alpha, return_prediction_sets=return_prediction_sets, score=score) 865 | 866 | cov_all_f=[] 867 | ineff_all_f=[] 868 | 869 | #optimizer = torch.optim.Adam(model.parameters(), lr=LR, weight_decay=WD) 870 | def function_model(DiGAE_or_GAE_or_LGNN, CP_or_CQR, SCORE, SEEDNUM, GNNCONV, Weighted, Conditional, Dataset): 871 | if Dataset == "An": 872 | Dataset_An() 873 | elif Dataset == "Ch": 874 | Dataset_Ch() 875 | 876 | for kk in range(SEEDNUM): 877 | seed_everything(kk) 878 | 879 | split = RandomNodeSplit(num_val=0.1, num_test=0.4) 880 | data = split(airport_line_graph) 881 | device = torch.device('cpu') 882 | 883 | data = data.to(device) 884 | edge_index_train = edge_array[data.train_mask.detach().numpy()] 885 | edge_index_val = edge_array[data.val_mask.detach().numpy()] 886 | edge_index_calib_test = edge_array[data.test_mask.detach().numpy()] 887 | edge_weight_train = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_train])).to(device) 888 | edge_weight_val = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_val])).to(device) 889 | edge_weight_calib_test = torch.Tensor(np.stack([edge_name_to_y[tuple(edge)] for edge in edge_index_calib_test])).to(device) 890 | edge_index_train = torch.LongTensor(edge_index_train).T.to(device) 891 | edge_index_val = torch.LongTensor(edge_index_val).T.to(device) 892 | edge_index_calib_test = torch.LongTensor(edge_index_calib_test).T.to(device) 893 | edge_weight_gae_training = [edge_name_to_y[tuple(edge)] if train else np.mean(list(edge_name_to_y.values())) for edge, train in zip(edge_array, data.train_mask.detach().numpy())] 894 | edge_weight_gae_training = torch.Tensor(edge_weight_gae_training).to(device) 895 | 896 | 897 | if DiGAE_or_GAE_or_LGNN == 'DiGAE': 898 | if CP_or_CQR == 'CQR': 899 | out_channels_f=3*OUT 900 | elif CP_or_CQR == 'CP': 901 | out_channels_f=OUT 902 | encoder = DirectedGNN(in_channels=airport.x.shape[-1], hidden_channels=HIDDEN, out_channels=out_channels_f, gconv=GNNCONV, edge_weight=Weighted) 903 | decoder = DirectedInnerProductDecoder() 904 | model = GAE(encoder, decoder).to(device) 905 | elif DiGAE_or_GAE_or_LGNN == 'GAE': 906 | if CP_or_CQR == 'CQR': 907 | out_channels_f=3*OUT 908 | elif CP_or_CQR == 'CP': 909 | out_channels_f=OUT 910 | encoder = GNN(in_channels=airport.x.shape[-1], hidden_channels=HIDDEN, out_channels=out_channels_f, gconv=GNNCONV, edge_weight=Weighted) 911 | decoder = InnerProductDecoder() 912 | model = GAE(encoder, decoder).to(device) 913 | elif DiGAE_or_GAE_or_LGNN == 'LGNN': 914 | if CP_or_CQR == 'CQR': 915 | out_channels_f=3 916 | elif CP_or_CQR == 'CP': 917 | out_channels_f=1 918 | model = GNN(in_channels=data.num_features, hidden_channels=32, out_channels=out_channels_f, gconv=GNNCONV, edge_weight=Weighted).to(device) 919 | 920 | #print(model) 921 | x = airport.x.to(device) 922 | 923 | optimizer = torch.optim.Adam(model.parameters(), lr=LR, weight_decay=WD) 924 | best_val_loss = float('inf') 925 | best_model = None 926 | use_sigmoid = False 927 | for epoch in range(1, EPOCHS): 928 | if DiGAE_or_GAE_or_LGNN == 'DiGAE': 929 | if CP_or_CQR == 'CQR': 930 | loss = train_gae_directed(model, optimizer, x, edge_index_train, edge_weight_train, sigmoid=use_sigmoid) 931 | elif CP_or_CQR == 'CP': 932 | loss = train_gae_directed_basegae(model, optimizer, x, edge_index_train, edge_weight_train, sigmoid=use_sigmoid) 933 | elif DiGAE_or_GAE_or_LGNN == 'GAE': 934 | if CP_or_CQR == 'CQR': 935 | loss = train_gae(model, optimizer, x, edge_index_train, edge_weight_train, sigmoid=use_sigmoid) 936 | elif CP_or_CQR == 'CP': 937 | loss = train_gae_basegae(model, optimizer, x, edge_index_train, edge_weight_train, sigmoid=use_sigmoid) 938 | elif DiGAE_or_GAE_or_LGNN == 'LGNN': 939 | if CP_or_CQR == 'CQR': 940 | loss = train_linegraph(model, optimizer) 941 | elif CP_or_CQR == 'CP': 942 | loss = train_baselinegraph(model, optimizer) 943 | #if epoch % 100 == 1: 944 | # print(f'Step: {epoch:03d}, Loss: {loss:.4f}') 945 | if DiGAE_or_GAE_or_LGNN == 'DiGAE': 946 | if CP_or_CQR == 'CQR': 947 | val_loss = train_gae_directed(model, optimizer, x, edge_index_train, edge_weight_val, val=True, edge_index_val=edge_index_val, sigmoid=use_sigmoid) 948 | elif CP_or_CQR == 'CP': 949 | val_loss = train_gae_directed_basegae(model, optimizer, x, edge_index_train, edge_weight_val, val=True, edge_index_val=edge_index_val, sigmoid=use_sigmoid) 950 | elif DiGAE_or_GAE_or_LGNN == 'GAE': 951 | if CP_or_CQR == 'CQR': 952 | val_loss = train_gae(model, optimizer, x, edge_index_train, edge_weight_val, val=True, edge_index_val=edge_index_val, sigmoid=use_sigmoid) 953 | elif CP_or_CQR == 'CP': 954 | val_loss = train_gae_basegae(model, optimizer, x, edge_index_train, edge_weight_val, val=True, edge_index_val=edge_index_val, sigmoid=use_sigmoid) 955 | elif DiGAE_or_GAE_or_LGNN == 'LGNN': 956 | if CP_or_CQR == 'CQR': 957 | val_loss = train_linegraph(model, optimizer, val=True) 958 | elif CP_or_CQR == 'CP': 959 | val_loss = train_baselinegraph(model, optimizer, val=True) 960 | if val_loss < best_val_loss: 961 | best_val_loss = val_loss 962 | best_model = copy.deepcopy(model) 963 | #print(f'Step: {epoch:03d}, Best validation loss: {val_loss:.4f}') 964 | if DiGAE_or_GAE_or_LGNN == 'DiGAE': 965 | if CP_or_CQR != 'CP': 966 | if Conditional == 'False': 967 | cov_all, eff_all, pred_set_all, val_labels_all, idx_all = test_gae_directed(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, score=SCORE, sigmoid=use_sigmoid, conditional=False) 968 | elif Conditional =='True': 969 | cov_all_o, eff_all, cov_all, pred_set_all, val_labels_all, idx_all = test_gae_directed(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, score=SCORE, sigmoid=use_sigmoid, conditional=True) 970 | 971 | cov_all_f.extend(cov_all) 972 | ineff_all_f.extend(eff_all) 973 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 974 | elif CP_or_CQR == 'CP': 975 | if Conditional =='False': 976 | cov_all_basegae, eff_all_basegae, pred_set_all_basegae, val_labels_all_basegae, idx_all_basegae = test_gae_directed_basegae(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, sigmoid=use_sigmoid, conditional=False) 977 | else: 978 | cov_all_basegae_o, eff_all_basegae, cov_all_basegae, pred_set_all_basegae, val_labels_all_basegae, idx_all_basegae = test_gae_directed_basegae(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, sigmoid=use_sigmoid, conditional=True) 979 | cov_all_f.extend(cov_all_basegae) 980 | ineff_all_f.extend(eff_all_basegae) 981 | #print(f"{np.mean(cov_all_basegae):.4f}+/-{np.std(cov_all_basegae):.4f}, {np.mean(eff_all_basegae):.4f}+/-{np.std(eff_all_basegae):.4f}") 982 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 983 | elif DiGAE_or_GAE_or_LGNN == 'GAE': 984 | if CP_or_CQR != 'CP': 985 | cov_all, eff_all, pred_set_all, val_labels_all, idx_all = test_gae(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, score=SCORE, sigmoid=use_sigmoid, conditional=False) 986 | #print(f"{np.mean(cov_all):.4f}+/-{np.std(cov_all):.4f}, {np.mean(eff_all):.4f}+/-{np.std(eff_all):.4f}") 987 | cov_all_f.extend(cov_all) 988 | ineff_all_f.extend(eff_all) 989 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 990 | elif CP_or_CQR == 'CP': 991 | if Conditional == 'True': 992 | cov_all_basegae_o, eff_all_basegae, cov_all_basegae, pred_set_all_basegae, val_labels_all_basegae, idx_all_basegae = test_gae_basegae(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, sigmoid=use_sigmoid, conditional=True) 993 | else: 994 | cov_all_basegae, eff_all_basegae, pred_set_all_basegae, val_labels_all_basegae, idx_all_basegae = test_gae_basegae(best_model, x, edge_index_train, edge_index_calib_test, edge_weight_calib_test, return_prediction_sets=True, sigmoid=use_sigmoid, conditional=False) 995 | #print(f"{np.mean(cov_all_basegae):.4f}+/-{np.std(cov_all_basegae):.4f}, {np.mean(eff_all_basegae):.4f}+/-{np.std(eff_all_basegae):.4f}") 996 | cov_all_f.extend(cov_all_basegae) 997 | ineff_all_f.extend(eff_all_basegae) 998 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 999 | elif DiGAE_or_GAE_or_LGNN == 'LGNN': 1000 | if CP_or_CQR != 'CP': 1001 | if Conditional =='True': 1002 | cov_all_linegraph_o, eff_all_linegraph, cov_all_linegraph, pred_set_all_linegraph, val_labels_all_linegraph, idx_all_linegraph = test_linegraph(best_model, x=data.x, calib_test_edge_index=edge_index_calib_test, return_prediction_sets=True, score=SCORE, conditional=True) 1003 | else: 1004 | cov_all_linegraph, eff_all_linegraph, pred_set_all_linegraph, val_labels_all_linegraph, idx_all_linegraph = test_linegraph(best_model, x=data.x, calib_test_edge_index=edge_index_calib_test, return_prediction_sets=True, score=SCORE, conditional=False) 1005 | cov_all_f.extend(cov_all_linegraph) 1006 | ineff_all_f.extend(eff_all_linegraph) 1007 | #print(f"{np.mean(cov_all_linegraph):.4f}+/-{np.std(cov_all_linegraph):.4f}, {np.mean(eff_all_linegraph):.4f}+/-{np.std(eff_all_linegraph):.4f}") 1008 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 1009 | elif CP_or_CQR == 'CP': 1010 | if Conditional == 'True': 1011 | cov_all_baselinegraph_o, eff_all_baselinegraph, cov_all_baselinegraph, pred_set_all_baselinegraph, val_labels_all_baselinegraph, idx_all_baselinegraph = test_baselinegraph(best_model, x=data.x, calib_test_edge_index=edge_index_calib_test, return_prediction_sets=True, conditional=True) 1012 | else: 1013 | cov_all_baselinegraph, eff_all_baselinegraph, pred_set_all_baselinegraph, val_labels_all_baselinegraph, idx_all_baselinegraph = test_baselinegraph(best_model, x=data.x, calib_test_edge_index=edge_index_calib_test, return_prediction_sets=True, conditional=False) 1014 | #print(f"{np.mean(cov_all_baselinegraph):.4f}+/-{np.std(cov_all_baselinegraph):.4f}, {np.mean(eff_all_baselinegraph):.4f}+/-{np.std(eff_all_baselinegraph):.4f}") 1015 | cov_all_f.extend(cov_all_baselinegraph) 1016 | ineff_all_f.extend(eff_all_baselinegraph) 1017 | print(f"{np.mean(cov_all_f):.4f}+/-{np.std(cov_all_f):.4f}, {np.mean(ineff_all_f):.4f}+/-{np.std(ineff_all_f):.4f}") 1018 | 1019 | 1020 | parser = argparse.ArgumentParser(description='Description of your program') 1021 | parser.add_argument('--SCORE', type=str, default='cqr', help='SCORE option: qr, cqr, cqr_new') 1022 | parser.add_argument('--GNNCONV', type=str, default='GraphConv', help='GNNCONV option: GraphConv, SAGEConv, GCNConv, GATConv ') 1023 | parser.add_argument('--CP_or_CQR', type=str, help='CP_or_CQR option: CP CQR') 1024 | parser.add_argument('--Dataset', type=str, help='Description of Dataset option: An, Chicago') 1025 | parser.add_argument('--DiGAE_or_GAE_or_LGNN', type=str, help='DiGAE_or_GAE_or_LGNN option: Digae, GAE, LGNN') 1026 | parser.add_argument('--SEEDNUM', type=int, help='Loop number!: Recommand: 10/20') 1027 | parser.add_argument('--Weighted', type=str, help='Containing weighted edge or not: False, True') 1028 | parser.add_argument('--Conditional', type=str, help='Conditioal model or not-Using the worest cov result to do the calculation: True, False') 1029 | 1030 | def main(): 1031 | # 解析命令行参数 1032 | args = parser.parse_args() 1033 | # 获取可选项的值 1034 | SCORE = args.SCORE 1035 | print(SCORE) 1036 | GNNCONV = args.GNNCONV 1037 | #print(GNNCONV) 1038 | # 获取其他可选项的值 1039 | CP_or_CQR = args.CP_or_CQR 1040 | print(CP_or_CQR) 1041 | Dataset = args.Dataset 1042 | DiGAE_or_GAE_or_LGNN = args.DiGAE_or_GAE_or_LGNN 1043 | print(DiGAE_or_GAE_or_LGNN) 1044 | SEEDNUM = args.SEEDNUM 1045 | Weighted = args.Weighted 1046 | Conditional = args.Conditional 1047 | 1048 | # 执行其他函数 1049 | function_model(DiGAE_or_GAE_or_LGNN, CP_or_CQR, SCORE, SEEDNUM, GNNCONV, Weighted, Conditional, Dataset) 1050 | #function2() 1051 | 1052 | if __name__ == '__main__': 1053 | main() 1054 | 1055 | 1056 | 1057 | -------------------------------------------------------------------------------- /data/anaheim_nodes.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "name": "anaheim_nodes", 4 | "features": [ 5 | { "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "Point", "coordinates": [ -117.880141713707729, 33.871155530597115 ] } }, 6 | { "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Point", "coordinates": [ -117.81516143364999, 33.850172603179388 ] } }, 7 | { "type": "Feature", "properties": { "id": 3 }, "geometry": { "type": "Point", "coordinates": [ -117.831044135071508, 33.759771919431387 ] } }, 8 | { "type": "Feature", "properties": { "id": 4 }, "geometry": { "type": "Point", "coordinates": [ -117.867542319244933, 33.767952923471661 ] } }, 9 | { "type": "Feature", "properties": { "id": 5 }, "geometry": { "type": "Point", "coordinates": [ -118.010965012685332, 33.774599575833179 ] } }, 10 | { "type": "Feature", "properties": { "id": 6 }, "geometry": { "type": "Point", "coordinates": [ -118.007803390930093, 33.856026422497266 ] } }, 11 | { "type": "Feature", "properties": { "id": 7 }, "geometry": { "type": "Point", "coordinates": [ -118.006296511236187, 33.870943805794177 ] } }, 12 | { "type": "Feature", "properties": { "id": 8 }, "geometry": { "type": "Point", "coordinates": [ -117.998151551962238, 33.869754523553361 ] } }, 13 | { "type": "Feature", "properties": { "id": 9 }, "geometry": { "type": "Point", "coordinates": [ -117.968264511765611, 33.87004674197874 ] } }, 14 | { "type": "Feature", "properties": { "id": 10 }, "geometry": { "type": "Point", "coordinates": [ -117.932896928642279, 33.870294656097578 ] } }, 15 | { "type": "Feature", "properties": { "id": 11 }, "geometry": { "type": "Point", "coordinates": [ -117.889437483381698, 33.866480734929887 ] } }, 16 | { "type": "Feature", "properties": { "id": 12 }, "geometry": { "type": "Point", "coordinates": [ -117.862082315858473, 33.876164267361666 ] } }, 17 | { "type": "Feature", "properties": { "id": 13 }, "geometry": { "type": "Point", "coordinates": [ -117.846926060282698, 33.85379420063564 ] } }, 18 | { "type": "Feature", "properties": { "id": 14 }, "geometry": { "type": "Point", "coordinates": [ -117.812718206951658, 33.810656348736288 ] } }, 19 | { "type": "Feature", "properties": { "id": 15 }, "geometry": { "type": "Point", "coordinates": [ -117.818285446287931, 33.787763625592554 ] } }, 20 | { "type": "Feature", "properties": { "id": 16 }, "geometry": { "type": "Point", "coordinates": [ -117.851844391785662, 33.760027646129686 ] } }, 21 | { "type": "Feature", "properties": { "id": 17 }, "geometry": { "type": "Point", "coordinates": [ -117.884859578059505, 33.766831988296126 ] } }, 22 | { "type": "Feature", "properties": { "id": 18 }, "geometry": { "type": "Point", "coordinates": [ -117.928803310917118, 33.752460266910361 ] } }, 23 | { "type": "Feature", "properties": { "id": 19 }, "geometry": { "type": "Point", "coordinates": [ -117.96360319633169, 33.75206571038639 ] } }, 24 | { "type": "Feature", "properties": { "id": 20 }, "geometry": { "type": "Point", "coordinates": [ -117.989520249112871, 33.752072864292607 ] } }, 25 | { "type": "Feature", "properties": { "id": 21 }, "geometry": { "type": "Point", "coordinates": [ -118.011028890513444, 33.795437336284351 ] } }, 26 | { "type": "Feature", "properties": { "id": 22 }, "geometry": { "type": "Point", "coordinates": [ -118.010732973120497, 33.824614791232307 ] } }, 27 | { "type": "Feature", "properties": { "id": 23 }, "geometry": { "type": "Point", "coordinates": [ -118.010412395944869, 33.846473222660478 ] } }, 28 | { "type": "Feature", "properties": { "id": 24 }, "geometry": { "type": "Point", "coordinates": [ -117.842138036796214, 33.798373845297661 ] } }, 29 | { "type": "Feature", "properties": { "id": 25 }, "geometry": { "type": "Point", "coordinates": [ -117.840714026870728, 33.825609187274907 ] } }, 30 | { "type": "Feature", "properties": { "id": 26 }, "geometry": { "type": "Point", "coordinates": [ -117.849396291976731, 33.860775274466043 ] } }, 31 | { "type": "Feature", "properties": { "id": 27 }, "geometry": { "type": "Point", "coordinates": [ -117.882737477317946, 33.811372788973465 ] } }, 32 | { "type": "Feature", "properties": { "id": 28 }, "geometry": { "type": "Point", "coordinates": [ -117.881669070988437, 33.828912459549727 ] } }, 33 | { "type": "Feature", "properties": { "id": 29 }, "geometry": { "type": "Point", "coordinates": [ -117.906910170523318, 33.866173130291699 ] } }, 34 | { "type": "Feature", "properties": { "id": 30 }, "geometry": { "type": "Point", "coordinates": [ -117.93213031483819, 33.781382078446256 ] } }, 35 | { "type": "Feature", "properties": { "id": 31 }, "geometry": { "type": "Point", "coordinates": [ -117.919660484417463, 33.810051034366793 ] } }, 36 | { "type": "Feature", "properties": { "id": 32 }, "geometry": { "type": "Point", "coordinates": [ -117.928901534139229, 33.838973285819364 ] } }, 37 | { "type": "Feature", "properties": { "id": 33 }, "geometry": { "type": "Point", "coordinates": [ -117.933014080078323, 33.864679380251964 ] } }, 38 | { "type": "Feature", "properties": { "id": 34 }, "geometry": { "type": "Point", "coordinates": [ -117.967238131793806, 33.781168420915698 ] } }, 39 | { "type": "Feature", "properties": { "id": 35 }, "geometry": { "type": "Point", "coordinates": [ -117.967539194677869, 33.824846818359028 ] } }, 40 | { "type": "Feature", "properties": { "id": 36 }, "geometry": { "type": "Point", "coordinates": [ -117.968063626798227, 33.864737650487577 ] } }, 41 | { "type": "Feature", "properties": { "id": 37 }, "geometry": { "type": "Point", "coordinates": [ -117.984136500120954, 33.781110150680092 ] } }, 42 | { "type": "Feature", "properties": { "id": 38 }, "geometry": { "type": "Point", "coordinates": [ -117.984894013183848, 33.839380386290941 ] } }, 43 | { "type": "Feature", "properties": { "id": 39 }, "geometry": { "type": "Point", "coordinates": [ -117.853042555036126, 33.798257081349512 ] } }, 44 | { "type": "Feature", "properties": { "id": 40 }, "geometry": { "type": "Point", "coordinates": [ -117.852863370995578, 33.825230430743439 ] } }, 45 | { "type": "Feature", "properties": { "id": 41 }, "geometry": { "type": "Point", "coordinates": [ -117.859826664151072, 33.858036573392333 ] } }, 46 | { "type": "Feature", "properties": { "id": 42 }, "geometry": { "type": "Point", "coordinates": [ -117.889241959379845, 33.81056747805571 ] } }, 47 | { "type": "Feature", "properties": { "id": 43 }, "geometry": { "type": "Point", "coordinates": [ -117.889323052283842, 33.82821978137013 ] } }, 48 | { "type": "Feature", "properties": { "id": 44 }, "geometry": { "type": "Point", "coordinates": [ -117.906821136662515, 33.859584624592998 ] } }, 49 | { "type": "Feature", "properties": { "id": 45 }, "geometry": { "type": "Point", "coordinates": [ -117.923584013615269, 33.7816151593887 ] } }, 50 | { "type": "Feature", "properties": { "id": 46 }, "geometry": { "type": "Point", "coordinates": [ -117.91527079333477, 33.809779106600608 ] } }, 51 | { "type": "Feature", "properties": { "id": 47 }, "geometry": { "type": "Point", "coordinates": [ -117.921685810481648, 33.840653886397362 ] } }, 52 | { "type": "Feature", "properties": { "id": 48 }, "geometry": { "type": "Point", "coordinates": [ -117.933072350313935, 33.859522464400399 ] } }, 53 | { "type": "Feature", "properties": { "id": 49 }, "geometry": { "type": "Point", "coordinates": [ -117.967296402029419, 33.788452200367054 ] } }, 54 | { "type": "Feature", "properties": { "id": 50 }, "geometry": { "type": "Point", "coordinates": [ -117.967616888325352, 33.832344255340956 ] } }, 55 | { "type": "Feature", "properties": { "id": 51 }, "geometry": { "type": "Point", "coordinates": [ -117.968063626798227, 33.859172842986737 ] } }, 56 | { "type": "Feature", "properties": { "id": 52 }, "geometry": { "type": "Point", "coordinates": [ -117.992818765226971, 33.780935339973254 ] } }, 57 | { "type": "Feature", "properties": { "id": 53 }, "geometry": { "type": "Point", "coordinates": [ -117.995440925829428, 33.839322116055321 ] } }, 58 | { "type": "Feature", "properties": { "id": 54 }, "geometry": { "type": "Point", "coordinates": [ -117.8769706265266, 33.780787688420453 ] } }, 59 | { "type": "Feature", "properties": { "id": 55 }, "geometry": { "type": "Point", "coordinates": [ -117.881678551445631, 33.782691107790228 ] } }, 60 | { "type": "Feature", "properties": { "id": 56 }, "geometry": { "type": "Point", "coordinates": [ -117.879840228163374, 33.784092566709994 ] } }, 61 | { "type": "Feature", "properties": { "id": 57 }, "geometry": { "type": "Point", "coordinates": [ -117.87858972377289, 33.778708033301669 ] } }, 62 | { "type": "Feature", "properties": { "id": 58 }, "geometry": { "type": "Point", "coordinates": [ -117.872970697891716, 33.775865544857083 ] } }, 63 | { "type": "Feature", "properties": { "id": 59 }, "geometry": { "type": "Point", "coordinates": [ -117.879218456715719, 33.780257881989563 ] } }, 64 | { "type": "Feature", "properties": { "id": 60 }, "geometry": { "type": "Point", "coordinates": [ -117.877758928523036, 33.781658562020404 ] } }, 65 | { "type": "Feature", "properties": { "id": 61 }, "geometry": { "type": "Point", "coordinates": [ -117.883353707048656, 33.779822238942437 ] } }, 66 | { "type": "Feature", "properties": { "id": 62 }, "geometry": { "type": "Point", "coordinates": [ -117.820354298315593, 33.84653252945639 ] } }, 67 | { "type": "Feature", "properties": { "id": 63 }, "geometry": { "type": "Point", "coordinates": [ -117.824516248416288, 33.844572479999698 ] } }, 68 | { "type": "Feature", "properties": { "id": 64 }, "geometry": { "type": "Point", "coordinates": [ -117.831699434736095, 33.841051972255272 ] } }, 69 | { "type": "Feature", "properties": { "id": 65 }, "geometry": { "type": "Point", "coordinates": [ -117.833397079878253, 33.83952797936427 ] } }, 70 | { "type": "Feature", "properties": { "id": 66 }, "geometry": { "type": "Point", "coordinates": [ -117.835066214949364, 33.83674954334532 ] } }, 71 | { "type": "Feature", "properties": { "id": 67 }, "geometry": { "type": "Point", "coordinates": [ -117.834598390600902, 33.831704556674687 ] } }, 72 | { "type": "Feature", "properties": { "id": 68 }, "geometry": { "type": "Point", "coordinates": [ -117.831711097946879, 33.814388576224445 ] } }, 73 | { "type": "Feature", "properties": { "id": 69 }, "geometry": { "type": "Point", "coordinates": [ -117.831699758723403, 33.806999062582598 ] } }, 74 | { "type": "Feature", "properties": { "id": 70 }, "geometry": { "type": "Point", "coordinates": [ -117.830721844213812, 33.791732152552264 ] } }, 75 | { "type": "Feature", "properties": { "id": 71 }, "geometry": { "type": "Point", "coordinates": [ -117.830805070980588, 33.78554216177335 ] } }, 76 | { "type": "Feature", "properties": { "id": 72 }, "geometry": { "type": "Point", "coordinates": [ -117.830857087709646, 33.781027109675762 ] } }, 77 | { "type": "Feature", "properties": { "id": 73 }, "geometry": { "type": "Point", "coordinates": [ -117.830721844213656, 33.772954113298546 ] } }, 78 | { "type": "Feature", "properties": { "id": 74 }, "geometry": { "type": "Point", "coordinates": [ -117.83059661334967, 33.768191893760012 ] } }, 79 | { "type": "Feature", "properties": { "id": 75 }, "geometry": { "type": "Point", "coordinates": [ -117.831358609795174, 33.768145240916411 ] } }, 80 | { "type": "Feature", "properties": { "id": 76 }, "geometry": { "type": "Point", "coordinates": [ -117.831158784739188, 33.773110163486258 ] } }, 81 | { "type": "Feature", "properties": { "id": 77 }, "geometry": { "type": "Point", "coordinates": [ -117.83123160816011, 33.781308000013624 ] } }, 82 | { "type": "Feature", "properties": { "id": 78 }, "geometry": { "type": "Point", "coordinates": [ -117.831210801468615, 33.785417321623193 ] } }, 83 | { "type": "Feature", "properties": { "id": 79 }, "geometry": { "type": "Point", "coordinates": [ -117.831127574701839, 33.791721749206417 ] } }, 84 | { "type": "Feature", "properties": { "id": 80 }, "geometry": { "type": "Point", "coordinates": [ -117.832006657425879, 33.807118701059842 ] } }, 85 | { "type": "Feature", "properties": { "id": 81 }, "geometry": { "type": "Point", "coordinates": [ -117.832239830174373, 33.813673232622541 ] } }, 86 | { "type": "Feature", "properties": { "id": 82 }, "geometry": { "type": "Point", "coordinates": [ -117.834017970956381, 33.829796261115092 ] } }, 87 | { "type": "Feature", "properties": { "id": 83 }, "geometry": { "type": "Point", "coordinates": [ -117.834324869658857, 33.838786485817792 ] } }, 88 | { "type": "Feature", "properties": { "id": 84 }, "geometry": { "type": "Point", "coordinates": [ -117.832291015545891, 33.840886227787934 ] } }, 89 | { "type": "Feature", "properties": { "id": 85 }, "geometry": { "type": "Point", "coordinates": [ -117.8309177738941, 33.842086080342284 ] } }, 90 | { "type": "Feature", "properties": { "id": 86 }, "geometry": { "type": "Point", "coordinates": [ -117.822969617667027, 33.845692573569238 ] } }, 91 | { "type": "Feature", "properties": { "id": 87 }, "geometry": { "type": "Point", "coordinates": [ -117.820414198262938, 33.846656937039327 ] } }, 92 | { "type": "Feature", "properties": { "id": 88 }, "geometry": { "type": "Point", "coordinates": [ -117.878519498162817, 33.866325229803891 ] } }, 93 | { "type": "Feature", "properties": { "id": 89 }, "geometry": { "type": "Point", "coordinates": [ -117.877696672552844, 33.863605120489872 ] } }, 94 | { "type": "Feature", "properties": { "id": 90 }, "geometry": { "type": "Point", "coordinates": [ -117.876108164432978, 33.858697995729258 ] } }, 95 | { "type": "Feature", "properties": { "id": 91 }, "geometry": { "type": "Point", "coordinates": [ -117.875743715152439, 33.857254164534076 ] } }, 96 | { "type": "Feature", "properties": { "id": 92 }, "geometry": { "type": "Point", "coordinates": [ -117.875352366805132, 33.85542807247657 ] } }, 97 | { "type": "Feature", "properties": { "id": 93 }, "geometry": { "type": "Point", "coordinates": [ -117.875911907841967, 33.845190904292025 ] } }, 98 | { "type": "Feature", "properties": { "id": 94 }, "geometry": { "type": "Point", "coordinates": [ -117.875874424899877, 33.841707393417089 ] } }, 99 | { "type": "Feature", "properties": { "id": 95 }, "geometry": { "type": "Point", "coordinates": [ -117.875966690603875, 33.834541423742984 ] } }, 100 | { "type": "Feature", "properties": { "id": 96 }, "geometry": { "type": "Point", "coordinates": [ -117.875866736090927, 33.821542211229847 ] } }, 101 | { "type": "Feature", "properties": { "id": 97 }, "geometry": { "type": "Point", "coordinates": [ -117.877072300997199, 33.81457109226573 ] } }, 102 | { "type": "Feature", "properties": { "id": 98 }, "geometry": { "type": "Point", "coordinates": [ -117.879434343310635, 33.808584005696154 ] } }, 103 | { "type": "Feature", "properties": { "id": 99 }, "geometry": { "type": "Point", "coordinates": [ -117.879064021438651, 33.802356965585133 ] } }, 104 | { "type": "Feature", "properties": { "id": 100 }, "geometry": { "type": "Point", "coordinates": [ -117.877342987354268, 33.798270750342589 ] } }, 105 | { "type": "Feature", "properties": { "id": 101 }, "geometry": { "type": "Point", "coordinates": [ -117.878696217678993, 33.793595954675368 ] } }, 106 | { "type": "Feature", "properties": { "id": 102 }, "geometry": { "type": "Point", "coordinates": [ -117.879787580963182, 33.785388161506539 ] } }, 107 | { "type": "Feature", "properties": { "id": 103 }, "geometry": { "type": "Point", "coordinates": [ -117.880089222909092, 33.785800785623934 ] } }, 108 | { "type": "Feature", "properties": { "id": 104 }, "geometry": { "type": "Point", "coordinates": [ -117.878921756066447, 33.793924010511667 ] } }, 109 | { "type": "Feature", "properties": { "id": 105 }, "geometry": { "type": "Point", "coordinates": [ -117.877753057149633, 33.798106722424436 ] } }, 110 | { "type": "Feature", "properties": { "id": 106 }, "geometry": { "type": "Point", "coordinates": [ -117.880028944513938, 33.803642664661936 ] } }, 111 | { "type": "Feature", "properties": { "id": 107 }, "geometry": { "type": "Point", "coordinates": [ -117.879864916595793, 33.808563502206376 ] } }, 112 | { "type": "Feature", "properties": { "id": 108 }, "geometry": { "type": "Point", "coordinates": [ -117.877350676163246, 33.814781185478608 ] } }, 113 | { "type": "Feature", "properties": { "id": 109 }, "geometry": { "type": "Point", "coordinates": [ -117.876270996250071, 33.821387128941979 ] } }, 114 | { "type": "Feature", "properties": { "id": 110 }, "geometry": { "type": "Point", "coordinates": [ -117.876289620567732, 33.835498680421551 ] } }, 115 | { "type": "Feature", "properties": { "id": 111 }, "geometry": { "type": "Point", "coordinates": [ -117.87624348771574, 33.841680482586753 ] } }, 116 | { "type": "Feature", "properties": { "id": 112 }, "geometry": { "type": "Point", "coordinates": [ -117.876266554141608, 33.846224568506685 ] } }, 117 | { "type": "Feature", "properties": { "id": 113 }, "geometry": { "type": "Point", "coordinates": [ -117.875898932977336, 33.854850691001012 ] } }, 118 | { "type": "Feature", "properties": { "id": 114 }, "geometry": { "type": "Point", "coordinates": [ -117.876135844394298, 33.857177276447459 ] } }, 119 | { "type": "Feature", "properties": { "id": 115 }, "geometry": { "type": "Point", "coordinates": [ -117.877542896379637, 33.861498386916168 ] } }, 120 | { "type": "Feature", "properties": { "id": 116 }, "geometry": { "type": "Point", "coordinates": [ -117.878434798184514, 33.864620043233408 ] } }, 121 | { "type": "Feature", "properties": { "id": 117 }, "geometry": { "type": "Point", "coordinates": [ -117.878845955652395, 33.866265873896694 ] } }, 122 | { "type": "Feature", "properties": { "id": 118 }, "geometry": { "type": "Point", "coordinates": [ -118.000094742842705, 33.771783672672015 ] } }, 123 | { "type": "Feature", "properties": { "id": 119 }, "geometry": { "type": "Point", "coordinates": [ -117.996012330178402, 33.771482116057562 ] } }, 124 | { "type": "Feature", "properties": { "id": 120 }, "geometry": { "type": "Point", "coordinates": [ -117.987745123642341, 33.77095510397168 ] } }, 125 | { "type": "Feature", "properties": { "id": 121 }, "geometry": { "type": "Point", "coordinates": [ -117.980942385252234, 33.770293406800597 ] } }, 126 | { "type": "Feature", "properties": { "id": 122 }, "geometry": { "type": "Point", "coordinates": [ -117.976697540970989, 33.767690148735767 ] } }, 127 | { "type": "Feature", "properties": { "id": 123 }, "geometry": { "type": "Point", "coordinates": [ -117.966971722655074, 33.765973827856477 ] } }, 128 | { "type": "Feature", "properties": { "id": 124 }, "geometry": { "type": "Point", "coordinates": [ -117.961768508495155, 33.765983691769598 ] } }, 129 | { "type": "Feature", "properties": { "id": 125 }, "geometry": { "type": "Point", "coordinates": [ -117.955929071940346, 33.766062603074388 ] } }, 130 | { "type": "Feature", "properties": { "id": 126 }, "geometry": { "type": "Point", "coordinates": [ -117.940458688134925, 33.766138479117288 ] } }, 131 | { "type": "Feature", "properties": { "id": 127 }, "geometry": { "type": "Point", "coordinates": [ -117.934629939317205, 33.766190323134737 ] } }, 132 | { "type": "Feature", "properties": { "id": 128 }, "geometry": { "type": "Point", "coordinates": [ -117.928084014924949, 33.766194026278846 ] } }, 133 | { "type": "Feature", "properties": { "id": 129 }, "geometry": { "type": "Point", "coordinates": [ -117.923397886538751, 33.766782668730634 ] } }, 134 | { "type": "Feature", "properties": { "id": 130 }, "geometry": { "type": "Point", "coordinates": [ -117.916779200849064, 33.76921905526617 ] } }, 135 | { "type": "Feature", "properties": { "id": 131 }, "geometry": { "type": "Point", "coordinates": [ -117.90961602382427, 33.77215403098198 ] } }, 136 | { "type": "Feature", "properties": { "id": 132 }, "geometry": { "type": "Point", "coordinates": [ -117.900533335974387, 33.776715629221698 ] } }, 137 | { "type": "Feature", "properties": { "id": 133 }, "geometry": { "type": "Point", "coordinates": [ -117.896755457257328, 33.778599636623667 ] } }, 138 | { "type": "Feature", "properties": { "id": 134 }, "geometry": { "type": "Point", "coordinates": [ -117.894171112025276, 33.779132287931041 ] } }, 139 | { "type": "Feature", "properties": { "id": 135 }, "geometry": { "type": "Point", "coordinates": [ -117.887283047508106, 33.779055594361573 ] } }, 140 | { "type": "Feature", "properties": { "id": 136 }, "geometry": { "type": "Point", "coordinates": [ -117.885287048634808, 33.779097144248844 ] } }, 141 | { "type": "Feature", "properties": { "id": 137 }, "geometry": { "type": "Point", "coordinates": [ -117.87820929866065, 33.779078363983338 ] } }, 142 | { "type": "Feature", "properties": { "id": 138 }, "geometry": { "type": "Point", "coordinates": [ -117.870149826721914, 33.778388537307386 ] } }, 143 | { "type": "Feature", "properties": { "id": 139 }, "geometry": { "type": "Point", "coordinates": [ -117.856442276104673, 33.777037274432502 ] } }, 144 | { "type": "Feature", "properties": { "id": 140 }, "geometry": { "type": "Point", "coordinates": [ -117.848598502887128, 33.775337204004188 ] } }, 145 | { "type": "Feature", "properties": { "id": 141 }, "geometry": { "type": "Point", "coordinates": [ -117.834082124922162, 33.777750055733982 ] } }, 146 | { "type": "Feature", "properties": { "id": 142 }, "geometry": { "type": "Point", "coordinates": [ -117.835502181630289, 33.776225965567399 ] } }, 147 | { "type": "Feature", "properties": { "id": 143 }, "geometry": { "type": "Point", "coordinates": [ -117.848979553155544, 33.775090986907671 ] } }, 148 | { "type": "Feature", "properties": { "id": 144 }, "geometry": { "type": "Point", "coordinates": [ -117.856600558523866, 33.776855542766029 ] } }, 149 | { "type": "Feature", "properties": { "id": 145 }, "geometry": { "type": "Point", "coordinates": [ -117.870225088528642, 33.778134756576662 ] } }, 150 | { "type": "Feature", "properties": { "id": 146 }, "geometry": { "type": "Point", "coordinates": [ -117.871170235373455, 33.778180425237714 ] } }, 151 | { "type": "Feature", "properties": { "id": 147 }, "geometry": { "type": "Point", "coordinates": [ -117.879776841916794, 33.778813554914464 ] } }, 152 | { "type": "Feature", "properties": { "id": 148 }, "geometry": { "type": "Point", "coordinates": [ -117.889328280280679, 33.778728620452647 ] } }, 153 | { "type": "Feature", "properties": { "id": 149 }, "geometry": { "type": "Point", "coordinates": [ -117.892168737666125, 33.778767323146361 ] } }, 154 | { "type": "Feature", "properties": { "id": 150 }, "geometry": { "type": "Point", "coordinates": [ -117.896163622471377, 33.778323447056884 ] } }, 155 | { "type": "Feature", "properties": { "id": 151 }, "geometry": { "type": "Point", "coordinates": [ -117.900434696843391, 33.776528214872805 ] } }, 156 | { "type": "Feature", "properties": { "id": 152 }, "geometry": { "type": "Point", "coordinates": [ -117.907832631667901, 33.772671424850955 ] } }, 157 | { "type": "Feature", "properties": { "id": 153 }, "geometry": { "type": "Point", "coordinates": [ -117.916700289544281, 33.768873818307704 ] } }, 158 | { "type": "Feature", "properties": { "id": 154 }, "geometry": { "type": "Point", "coordinates": [ -117.925617266986052, 33.766023147421983 ] } }, 159 | { "type": "Feature", "properties": { "id": 155 }, "geometry": { "type": "Point", "coordinates": [ -117.928061796060334, 33.766019978506016 ] } }, 160 | { "type": "Feature", "properties": { "id": 156 }, "geometry": { "type": "Point", "coordinates": [ -117.934642747471955, 33.765894916551687 ] } }, 161 | { "type": "Feature", "properties": { "id": 157 }, "geometry": { "type": "Point", "coordinates": [ -117.940482184026763, 33.765855460899289 ] } }, 162 | { "type": "Feature", "properties": { "id": 158 }, "geometry": { "type": "Point", "coordinates": [ -117.953620916275099, 33.765776549594506 ] } }, 163 | { "type": "Feature", "properties": { "id": 159 }, "geometry": { "type": "Point", "coordinates": [ -117.959509672395399, 33.765746957855193 ] } }, 164 | { "type": "Feature", "properties": { "id": 160 }, "geometry": { "type": "Point", "coordinates": [ -117.967652332658943, 33.765677910463502 ] } }, 165 | { "type": "Feature", "properties": { "id": 161 }, "geometry": { "type": "Point", "coordinates": [ -117.976026794880241, 33.766822124383026 ] } }, 166 | { "type": "Feature", "properties": { "id": 162 }, "geometry": { "type": "Point", "coordinates": [ -117.980931275819927, 33.770043444573659 ] } }, 167 | { "type": "Feature", "properties": { "id": 163 }, "geometry": { "type": "Point", "coordinates": [ -117.988445461472423, 33.770738097883495 ] } }, 168 | { "type": "Feature", "properties": { "id": 164 }, "geometry": { "type": "Point", "coordinates": [ -117.996928426737824, 33.771231293538435 ] } }, 169 | { "type": "Feature", "properties": { "id": 165 }, "geometry": { "type": "Point", "coordinates": [ -118.000094742842705, 33.771398980061129 ] } }, 170 | { "type": "Feature", "properties": { "id": 166 }, "geometry": { "type": "Point", "coordinates": [ -118.005976101028423, 33.856189177063406 ] } }, 171 | { "type": "Feature", "properties": { "id": 167 }, "geometry": { "type": "Point", "coordinates": [ -118.001870247200671, 33.856211370867896 ] } }, 172 | { "type": "Feature", "properties": { "id": 168 }, "geometry": { "type": "Point", "coordinates": [ -117.994383537158242, 33.856270554346487 ] } }, 173 | { "type": "Feature", "properties": { "id": 169 }, "geometry": { "type": "Point", "coordinates": [ -117.985254485584903, 33.856559073804625 ] } }, 174 | { "type": "Feature", "properties": { "id": 170 }, "geometry": { "type": "Point", "coordinates": [ -117.979275554290098, 33.85818063433107 ] } }, 175 | { "type": "Feature", "properties": { "id": 171 }, "geometry": { "type": "Point", "coordinates": [ -117.972628289021301, 33.856301500976265 ] } }, 176 | { "type": "Feature", "properties": { "id": 172 }, "geometry": { "type": "Point", "coordinates": [ -117.969623396219532, 33.855344386972739 ] } }, 177 | { "type": "Feature", "properties": { "id": 173 }, "geometry": { "type": "Point", "coordinates": [ -117.965206698704762, 33.853993223409539 ] } }, 178 | { "type": "Feature", "properties": { "id": 174 }, "geometry": { "type": "Point", "coordinates": [ -117.962395483471525, 33.8539685636268 ] } }, 179 | { "type": "Feature", "properties": { "id": 175 }, "geometry": { "type": "Point", "coordinates": [ -117.955712682346686, 33.854153511997417 ] } }, 180 | { "type": "Feature", "properties": { "id": 176 }, "geometry": { "type": "Point", "coordinates": [ -117.944975855756553, 33.854372433992388 ] } }, 181 | { "type": "Feature", "properties": { "id": 177 }, "geometry": { "type": "Point", "coordinates": [ -117.939099620944177, 33.85434275603879 ] } }, 182 | { "type": "Feature", "properties": { "id": 178 }, "geometry": { "type": "Point", "coordinates": [ -117.927480702110699, 33.854090493433212 ] } }, 183 | { "type": "Feature", "properties": { "id": 179 }, "geometry": { "type": "Point", "coordinates": [ -117.916303242837031, 33.854120171386818 ] } }, 184 | { "type": "Feature", "properties": { "id": 180 }, "geometry": { "type": "Point", "coordinates": [ -117.893410411380472, 33.854253722178001 ] } }, 185 | { "type": "Feature", "properties": { "id": 181 }, "geometry": { "type": "Point", "coordinates": [ -117.886419926325345, 33.854208435202359 ] } }, 186 | { "type": "Feature", "properties": { "id": 182 }, "geometry": { "type": "Point", "coordinates": [ -117.883035108517902, 33.853196395762076 ] } }, 187 | { "type": "Feature", "properties": { "id": 183 }, "geometry": { "type": "Point", "coordinates": [ -117.879510270296421, 33.851587512549287 ] } }, 188 | { "type": "Feature", "properties": { "id": 184 }, "geometry": { "type": "Point", "coordinates": [ -117.869256282843054, 33.847162603163611 ] } }, 189 | { "type": "Feature", "properties": { "id": 185 }, "geometry": { "type": "Point", "coordinates": [ -117.865425333926325, 33.846674363813541 ] } }, 190 | { "type": "Feature", "properties": { "id": 186 }, "geometry": { "type": "Point", "coordinates": [ -117.858570903388539, 33.847343954632287 ] } }, 191 | { "type": "Feature", "properties": { "id": 187 }, "geometry": { "type": "Point", "coordinates": [ -117.851911725813252, 33.848962691947108 ] } }, 192 | { "type": "Feature", "properties": { "id": 188 }, "geometry": { "type": "Point", "coordinates": [ -117.837922693431096, 33.851299976980727 ] } }, 193 | { "type": "Feature", "properties": { "id": 189 }, "geometry": { "type": "Point", "coordinates": [ -117.831694557050653, 33.84711783195025 ] } }, 194 | { "type": "Feature", "properties": { "id": 190 }, "geometry": { "type": "Point", "coordinates": [ -117.830731388231371, 33.845966071781341 ] } }, 195 | { "type": "Feature", "properties": { "id": 191 }, "geometry": { "type": "Point", "coordinates": [ -117.837964306814484, 33.850953198785831 ] } }, 196 | { "type": "Feature", "properties": { "id": 192 }, "geometry": { "type": "Point", "coordinates": [ -117.852750949848343, 33.848315971925004 ] } }, 197 | { "type": "Feature", "properties": { "id": 193 }, "geometry": { "type": "Point", "coordinates": [ -117.861450504618176, 33.846371937339562 ] } }, 198 | { "type": "Feature", "properties": { "id": 194 }, "geometry": { "type": "Point", "coordinates": [ -117.865409956308994, 33.846213035293751 ] } }, 199 | { "type": "Feature", "properties": { "id": 195 }, "geometry": { "type": "Point", "coordinates": [ -117.872639358654851, 33.848116015437839 ] } }, 200 | { "type": "Feature", "properties": { "id": 196 }, "geometry": { "type": "Point", "coordinates": [ -117.880755857299846, 33.851725911105227 ] } }, 201 | { "type": "Feature", "properties": { "id": 197 }, "geometry": { "type": "Point", "coordinates": [ -117.883216756622573, 33.852872024146599 ] } }, 202 | { "type": "Feature", "properties": { "id": 198 }, "geometry": { "type": "Point", "coordinates": [ -117.885972293495925, 33.853702415482218 ] } }, 203 | { "type": "Feature", "properties": { "id": 199 }, "geometry": { "type": "Point", "coordinates": [ -117.892816534582423, 33.854039761962319 ] } }, 204 | { "type": "Feature", "properties": { "id": 200 }, "geometry": { "type": "Point", "coordinates": [ -117.915616940160021, 33.853712099524849 ] } }, 205 | { "type": "Feature", "properties": { "id": 201 }, "geometry": { "type": "Point", "coordinates": [ -117.927436185180298, 33.853823391850824 ] } }, 206 | { "type": "Feature", "properties": { "id": 202 }, "geometry": { "type": "Point", "coordinates": [ -117.939040265036994, 33.853867908781226 ] } }, 207 | { "type": "Feature", "properties": { "id": 203 }, "geometry": { "type": "Point", "coordinates": [ -117.944797788034961, 33.853838230827627 ] } }, 208 | { "type": "Feature", "properties": { "id": 204 }, "geometry": { "type": "Point", "coordinates": [ -117.95618121821893, 33.853820604930306 ] } }, 209 | { "type": "Feature", "properties": { "id": 205 }, "geometry": { "type": "Point", "coordinates": [ -117.962666741081748, 33.853672646233818 ] } }, 210 | { "type": "Feature", "properties": { "id": 206 }, "geometry": { "type": "Point", "coordinates": [ -117.965417473733098, 33.853841244994776 ] } }, 211 | { "type": "Feature", "properties": { "id": 207 }, "geometry": { "type": "Point", "coordinates": [ -117.971667561784841, 33.855719408201921 ] } }, 212 | { "type": "Feature", "properties": { "id": 208 }, "geometry": { "type": "Point", "coordinates": [ -117.985050278180424, 33.858480597469629 ] } }, 213 | { "type": "Feature", "properties": { "id": 209 }, "geometry": { "type": "Point", "coordinates": [ -117.984234223750178, 33.856830139524689 ] } }, 214 | { "type": "Feature", "properties": { "id": 210 }, "geometry": { "type": "Point", "coordinates": [ -117.987148356899979, 33.856011626627591 ] } }, 215 | { "type": "Feature", "properties": { "id": 211 }, "geometry": { "type": "Point", "coordinates": [ -117.994831108056616, 33.855945365533081 ] } }, 216 | { "type": "Feature", "properties": { "id": 212 }, "geometry": { "type": "Point", "coordinates": [ -118.002065109246075, 33.855900848602687 ] } }, 217 | { "type": "Feature", "properties": { "id": 213 }, "geometry": { "type": "Point", "coordinates": [ -118.0059687030936, 33.855893259670424 ] } }, 218 | { "type": "Feature", "properties": { "id": 214 }, "geometry": { "type": "Point", "coordinates": [ -117.990511745768529, 33.862221370919912 ] } }, 219 | { "type": "Feature", "properties": { "id": 215 }, "geometry": { "type": "Point", "coordinates": [ -117.987675870752483, 33.860454086489611 ] } }, 220 | { "type": "Feature", "properties": { "id": 216 }, "geometry": { "type": "Point", "coordinates": [ -117.985611191910905, 33.859432503614663 ] } }, 221 | { "type": "Feature", "properties": { "id": 217 }, "geometry": { "type": "Point", "coordinates": [ -117.974615433314455, 33.854136044651263 ] } }, 222 | { "type": "Feature", "properties": { "id": 218 }, "geometry": { "type": "Point", "coordinates": [ -117.971314104898994, 33.851935159040991 ] } }, 223 | { "type": "Feature", "properties": { "id": 219 }, "geometry": { "type": "Point", "coordinates": [ -117.964137819137136, 33.848307859122301 ] } }, 224 | { "type": "Feature", "properties": { "id": 220 }, "geometry": { "type": "Point", "coordinates": [ -117.955735287147604, 33.843627894727646 ] } }, 225 | { "type": "Feature", "properties": { "id": 221 }, "geometry": { "type": "Point", "coordinates": [ -117.942134742670945, 33.83625731684964 ] } }, 226 | { "type": "Feature", "properties": { "id": 222 }, "geometry": { "type": "Point", "coordinates": [ -117.932641400603686, 33.832839239775218 ] } }, 227 | { "type": "Feature", "properties": { "id": 223 }, "geometry": { "type": "Point", "coordinates": [ -117.928495474629216, 33.829282066113748 ] } }, 228 | { "type": "Feature", "properties": { "id": 224 }, "geometry": { "type": "Point", "coordinates": [ -117.919286105372976, 33.819542029891934 ] } }, 229 | { "type": "Feature", "properties": { "id": 225 }, "geometry": { "type": "Point", "coordinates": [ -117.912778234581893, 33.813279215692113 ] } }, 230 | { "type": "Feature", "properties": { "id": 226 }, "geometry": { "type": "Point", "coordinates": [ -117.905410899541025, 33.806339307284709 ] } }, 231 | { "type": "Feature", "properties": { "id": 227 }, "geometry": { "type": "Point", "coordinates": [ -117.897589109992779, 33.799308929832421 ] } }, 232 | { "type": "Feature", "properties": { "id": 228 }, "geometry": { "type": "Point", "coordinates": [ -117.88961775985527, 33.791793572153139 ] } }, 233 | { "type": "Feature", "properties": { "id": 229 }, "geometry": { "type": "Point", "coordinates": [ -117.884667109159636, 33.786630947728824 ] } }, 234 | { "type": "Feature", "properties": { "id": 230 }, "geometry": { "type": "Point", "coordinates": [ -117.881833536314417, 33.783555065994967 ] } }, 235 | { "type": "Feature", "properties": { "id": 231 }, "geometry": { "type": "Point", "coordinates": [ -117.87473840049195, 33.777432753685659 ] } }, 236 | { "type": "Feature", "properties": { "id": 232 }, "geometry": { "type": "Point", "coordinates": [ -117.871790174848613, 33.773913395020436 ] } }, 237 | { "type": "Feature", "properties": { "id": 233 }, "geometry": { "type": "Point", "coordinates": [ -117.8706861876761, 33.772545705179802 ] } }, 238 | { "type": "Feature", "properties": { "id": 234 }, "geometry": { "type": "Point", "coordinates": [ -117.871068919485126, 33.77221764934351 ] } }, 239 | { "type": "Feature", "properties": { "id": 235 }, "geometry": { "type": "Point", "coordinates": [ -117.873057483145658, 33.77483916881777 ] } }, 240 | { "type": "Feature", "properties": { "id": 236 }, "geometry": { "type": "Point", "coordinates": [ -117.877386789600465, 33.779363879436893 ] } }, 241 | { "type": "Feature", "properties": { "id": 237 }, "geometry": { "type": "Point", "coordinates": [ -117.878212825975609, 33.78018496948642 ] } }, 242 | { "type": "Feature", "properties": { "id": 238 }, "geometry": { "type": "Point", "coordinates": [ -117.883020654458321, 33.784211278524516 ] } }, 243 | { "type": "Feature", "properties": { "id": 239 }, "geometry": { "type": "Point", "coordinates": [ -117.885360995709121, 33.786759147745443 ] } }, 244 | { "type": "Feature", "properties": { "id": 240 }, "geometry": { "type": "Point", "coordinates": [ -117.894153062476249, 33.795312298747923 ] } }, 245 | { "type": "Feature", "properties": { "id": 241 }, "geometry": { "type": "Point", "coordinates": [ -117.900556905352587, 33.801392981685076 ] } }, 246 | { "type": "Feature", "properties": { "id": 242 }, "geometry": { "type": "Point", "coordinates": [ -117.906861821716916, 33.807104338977453 ] } }, 247 | { "type": "Feature", "properties": { "id": 243 }, "geometry": { "type": "Point", "coordinates": [ -117.913997577355161, 33.813820382330519 ] } }, 248 | { "type": "Feature", "properties": { "id": 244 }, "geometry": { "type": "Point", "coordinates": [ -117.916627954181664, 33.816352120026018 ] } }, 249 | { "type": "Feature", "properties": { "id": 245 }, "geometry": { "type": "Point", "coordinates": [ -117.931658091766678, 33.831704889768787 ] } }, 250 | { "type": "Feature", "properties": { "id": 246 }, "geometry": { "type": "Point", "coordinates": [ -117.941136021469632, 33.835327951287312 ] } }, 251 | { "type": "Feature", "properties": { "id": 247 }, "geometry": { "type": "Point", "coordinates": [ -117.954354339313696, 33.842394905590226 ] } }, 252 | { "type": "Feature", "properties": { "id": 248 }, "geometry": { "type": "Point", "coordinates": [ -117.963960962257744, 33.847974952055196 ] } }, 253 | { "type": "Feature", "properties": { "id": 249 }, "geometry": { "type": "Point", "coordinates": [ -117.972703272660269, 33.852390337530878 ] } }, 254 | { "type": "Feature", "properties": { "id": 250 }, "geometry": { "type": "Point", "coordinates": [ -117.975396840180139, 33.854229096800204 ] } }, 255 | { "type": "Feature", "properties": { "id": 251 }, "geometry": { "type": "Point", "coordinates": [ -117.981437716335179, 33.857129896400508 ] } }, 256 | { "type": "Feature", "properties": { "id": 252 }, "geometry": { "type": "Point", "coordinates": [ -117.989804831996409, 33.861358278523717 ] } }, 257 | { "type": "Feature", "properties": { "id": 253 }, "geometry": { "type": "Point", "coordinates": [ -117.990651484537437, 33.861933673454516 ] } }, 258 | { "type": "Feature", "properties": { "id": 254 }, "geometry": { "type": "Point", "coordinates": [ -117.82718750000042, 33.787818917851638 ] } }, 259 | { "type": "Feature", "properties": { "id": 255 }, "geometry": { "type": "Point", "coordinates": [ -117.829671106283271, 33.787830897859671 ] } }, 260 | { "type": "Feature", "properties": { "id": 256 }, "geometry": { "type": "Point", "coordinates": [ -117.832357326224852, 33.787798183254488 ] } }, 261 | { "type": "Feature", "properties": { "id": 257 }, "geometry": { "type": "Point", "coordinates": [ -117.822090244866345, 33.810449002764727 ] } }, 262 | { "type": "Feature", "properties": { "id": 258 }, "geometry": { "type": "Point", "coordinates": [ -117.830860979463509, 33.810386798973255 ] } }, 263 | { "type": "Feature", "properties": { "id": 259 }, "geometry": { "type": "Point", "coordinates": [ -117.832654522117508, 33.81000320892587 ] } }, 264 | { "type": "Feature", "properties": { "id": 260 }, "geometry": { "type": "Point", "coordinates": [ -117.83388272746032, 33.834089375167927 ] } }, 265 | { "type": "Feature", "properties": { "id": 261 }, "geometry": { "type": "Point", "coordinates": [ -117.836165148598624, 33.835007837184186 ] } }, 266 | { "type": "Feature", "properties": { "id": 262 }, "geometry": { "type": "Point", "coordinates": [ -117.849109681943048, 33.853271361646541 ] } }, 267 | { "type": "Feature", "properties": { "id": 263 }, "geometry": { "type": "Point", "coordinates": [ -117.851637045814087, 33.767409162717357 ] } }, 268 | { "type": "Feature", "properties": { "id": 264 }, "geometry": { "type": "Point", "coordinates": [ -117.853159381484474, 33.775090986907671 ] } }, 269 | { "type": "Feature", "properties": { "id": 265 }, "geometry": { "type": "Point", "coordinates": [ -117.853130069925371, 33.776175514594705 ] } }, 270 | { "type": "Feature", "properties": { "id": 266 }, "geometry": { "type": "Point", "coordinates": [ -117.853026263823622, 33.787806822669971 ] } }, 271 | { "type": "Feature", "properties": { "id": 267 }, "geometry": { "type": "Point", "coordinates": [ -117.852953692733593, 33.8091323558453 ] } }, 272 | { "type": "Feature", "properties": { "id": 268 }, "geometry": { "type": "Point", "coordinates": [ -117.85289675244222, 33.815753392618618 ] } }, 273 | { "type": "Feature", "properties": { "id": 269 }, "geometry": { "type": "Point", "coordinates": [ -117.852264941201938, 33.835631146254904 ] } }, 274 | { "type": "Feature", "properties": { "id": 270 }, "geometry": { "type": "Point", "coordinates": [ -117.852410743795858, 33.842581069897911 ] } }, 275 | { "type": "Feature", "properties": { "id": 271 }, "geometry": { "type": "Point", "coordinates": [ -117.854780035946874, 33.84682149533743 ] } }, 276 | { "type": "Feature", "properties": { "id": 272 }, "geometry": { "type": "Point", "coordinates": [ -117.856092259292055, 33.849008534246074 ] } }, 277 | { "type": "Feature", "properties": { "id": 273 }, "geometry": { "type": "Point", "coordinates": [ -117.857319431124125, 33.851122671857759 ] } }, 278 | { "type": "Feature", "properties": { "id": 274 }, "geometry": { "type": "Point", "coordinates": [ -117.862155217155419, 33.865010368927614 ] } }, 279 | { "type": "Feature", "properties": { "id": 275 }, "geometry": { "type": "Point", "coordinates": [ -117.862884230124976, 33.870988275277895 ] } }, 280 | { "type": "Feature", "properties": { "id": 276 }, "geometry": { "type": "Point", "coordinates": [ -117.884800394580893, 33.773095573114219 ] } }, 281 | { "type": "Feature", "properties": { "id": 277 }, "geometry": { "type": "Point", "coordinates": [ -117.886444165359222, 33.789275434163265 ] } }, 282 | { "type": "Feature", "properties": { "id": 278 }, "geometry": { "type": "Point", "coordinates": [ -117.87689191057936, 33.795769324590829 ] } }, 283 | { "type": "Feature", "properties": { "id": 279 }, "geometry": { "type": "Point", "coordinates": [ -117.878316903118261, 33.795738569356175 ] } }, 284 | { "type": "Feature", "properties": { "id": 280 }, "geometry": { "type": "Point", "coordinates": [ -117.882563688436875, 33.796097380427071 ] } }, 285 | { "type": "Feature", "properties": { "id": 281 }, "geometry": { "type": "Point", "coordinates": [ -117.866988725021159, 33.809028247974481 ] } }, 286 | { "type": "Feature", "properties": { "id": 282 }, "geometry": { "type": "Point", "coordinates": [ -117.871089422974862, 33.806267111352319 ] } }, 287 | { "type": "Feature", "properties": { "id": 283 }, "geometry": { "type": "Point", "coordinates": [ -117.879072114991388, 33.806089414441004 ] } }, 288 | { "type": "Feature", "properties": { "id": 284 }, "geometry": { "type": "Point", "coordinates": [ -117.881781202968028, 33.80607660243605 ] } }, 289 | { "type": "Feature", "properties": { "id": 285 }, "geometry": { "type": "Point", "coordinates": [ -117.883403270301216, 33.805604592338867 ] } }, 290 | { "type": "Feature", "properties": { "id": 286 }, "geometry": { "type": "Point", "coordinates": [ -117.886595086997531, 33.803463739676701 ] } }, 291 | { "type": "Feature", "properties": { "id": 287 }, "geometry": { "type": "Point", "coordinates": [ -117.868136920448208, 33.815698716645834 ] } }, 292 | { "type": "Feature", "properties": { "id": 288 }, "geometry": { "type": "Point", "coordinates": [ -117.874223217451828, 33.818122554046248 ] } }, 293 | { "type": "Feature", "properties": { "id": 289 }, "geometry": { "type": "Point", "coordinates": [ -117.878516628072276, 33.818043412836651 ] } }, 294 | { "type": "Feature", "properties": { "id": 290 }, "geometry": { "type": "Point", "coordinates": [ -117.873988103841157, 33.837509303887011 ] } }, 295 | { "type": "Feature", "properties": { "id": 291 }, "geometry": { "type": "Point", "coordinates": [ -117.878398644339612, 33.83816401895799 ] } }, 296 | { "type": "Feature", "properties": { "id": 292 }, "geometry": { "type": "Point", "coordinates": [ -117.872037709376656, 33.847427867062521 ] } }, 297 | { "type": "Feature", "properties": { "id": 293 }, "geometry": { "type": "Point", "coordinates": [ -117.876650994574618, 33.861498386916168 ] } }, 298 | { "type": "Feature", "properties": { "id": 294 }, "geometry": { "type": "Point", "coordinates": [ -117.878404042949924, 33.861037058396349 ] } }, 299 | { "type": "Feature", "properties": { "id": 295 }, "geometry": { "type": "Point", "coordinates": [ -117.883163415512485, 33.859822226627571 ] } }, 300 | { "type": "Feature", "properties": { "id": 296 }, "geometry": { "type": "Point", "coordinates": [ -117.890649695048822, 33.774338426164739 ] } }, 301 | { "type": "Feature", "properties": { "id": 297 }, "geometry": { "type": "Point", "coordinates": [ -117.889337794606604, 33.777771067923325 ] } }, 302 | { "type": "Feature", "properties": { "id": 298 }, "geometry": { "type": "Point", "coordinates": [ -117.888834735038515, 33.78006935967548 ] } }, 303 | { "type": "Feature", "properties": { "id": 299 }, "geometry": { "type": "Point", "coordinates": [ -117.890817381571509, 33.789015928856607 ] } }, 304 | { "type": "Feature", "properties": { "id": 300 }, "geometry": { "type": "Point", "coordinates": [ -117.889160686269889, 33.796112758044394 ] } }, 305 | { "type": "Feature", "properties": { "id": 301 }, "geometry": { "type": "Point", "coordinates": [ -117.889164110192198, 33.799574524007134 ] } }, 306 | { "type": "Feature", "properties": { "id": 302 }, "geometry": { "type": "Point", "coordinates": [ -117.889183572489031, 33.803346965895109 ] } }, 307 | { "type": "Feature", "properties": { "id": 303 }, "geometry": { "type": "Point", "coordinates": [ -117.889222497082898, 33.818177236154845 ] } }, 308 | { "type": "Feature", "properties": { "id": 304 }, "geometry": { "type": "Point", "coordinates": [ -117.889203034785965, 33.84001393330896 ] } }, 309 | { "type": "Feature", "properties": { "id": 305 }, "geometry": { "type": "Point", "coordinates": [ -117.88922249708294, 33.847266882631104 ] } }, 310 | { "type": "Feature", "properties": { "id": 306 }, "geometry": { "type": "Point", "coordinates": [ -117.889241959379916, 33.853527254809869 ] } }, 311 | { "type": "Feature", "properties": { "id": 307 }, "geometry": { "type": "Point", "coordinates": [ -117.889216009650724, 33.854831228704079 ] } }, 312 | { "type": "Feature", "properties": { "id": 308 }, "geometry": { "type": "Point", "coordinates": [ -117.889360595295003, 33.859714583306285 ] } }, 313 | { "type": "Feature", "properties": { "id": 309 }, "geometry": { "type": "Point", "coordinates": [ -117.889437483381698, 33.86309765911809 ] } }, 314 | { "type": "Feature", "properties": { "id": 310 }, "geometry": { "type": "Point", "coordinates": [ -117.902979586423015, 33.774427201382643 ] } }, 315 | { "type": "Feature", "properties": { "id": 311 }, "geometry": { "type": "Point", "coordinates": [ -117.900779933801914, 33.803371210387255 ] } }, 316 | { "type": "Feature", "properties": { "id": 312 }, "geometry": { "type": "Point", "coordinates": [ -117.892904114918736, 33.840286405465982 ] } }, 317 | { "type": "Feature", "properties": { "id": 313 }, "geometry": { "type": "Point", "coordinates": [ -117.906214949919615, 33.774417337469551 ] } }, 318 | { "type": "Feature", "properties": { "id": 314 }, "geometry": { "type": "Point", "coordinates": [ -117.906145902527896, 33.77585746878205 ] } }, 319 | { "type": "Feature", "properties": { "id": 315 }, "geometry": { "type": "Point", "coordinates": [ -117.906145902527925, 33.788858106247005 ] } }, 320 | { "type": "Feature", "properties": { "id": 316 }, "geometry": { "type": "Point", "coordinates": [ -117.906362908616117, 33.796157401940533 ] } }, 321 | { "type": "Feature", "properties": { "id": 317 }, "geometry": { "type": "Point", "coordinates": [ -117.906597587548703, 33.803352304553783 ] } }, 322 | { "type": "Feature", "properties": { "id": 318 }, "geometry": { "type": "Point", "coordinates": [ -117.906042742436838, 33.81060228068182 ] } }, 323 | { "type": "Feature", "properties": { "id": 319 }, "geometry": { "type": "Point", "coordinates": [ -117.908030937420847, 33.81809268969166 ] } }, 324 | { "type": "Feature", "properties": { "id": 320 }, "geometry": { "type": "Point", "coordinates": [ -117.91413991696065, 33.836631259336549 ] } }, 325 | { "type": "Feature", "properties": { "id": 321 }, "geometry": { "type": "Point", "coordinates": [ -117.917746410187647, 33.847270414356032 ] } }, 326 | { "type": "Feature", "properties": { "id": 322 }, "geometry": { "type": "Point", "coordinates": [ -117.92028088999929, 33.759641195646687 ] } }, 327 | { "type": "Feature", "properties": { "id": 323 }, "geometry": { "type": "Point", "coordinates": [ -117.920366662614938, 33.767081546482139 ] } }, 328 | { "type": "Feature", "properties": { "id": 324 }, "geometry": { "type": "Point", "coordinates": [ -117.920369665217251, 33.768469397870632 ] } }, 329 | { "type": "Feature", "properties": { "id": 325 }, "geometry": { "type": "Point", "coordinates": [ -117.920152659129016, 33.774318698338526 ] } }, 330 | { "type": "Feature", "properties": { "id": 326 }, "geometry": { "type": "Point", "coordinates": [ -117.914905057360158, 33.777534334008934 ] } }, 331 | { "type": "Feature", "properties": { "id": 327 }, "geometry": { "type": "Point", "coordinates": [ -117.914944513012557, 33.788739739289809 ] } }, 332 | { "type": "Feature", "properties": { "id": 328 }, "geometry": { "type": "Point", "coordinates": [ -117.915043152143568, 33.796117946288135 ] } }, 333 | { "type": "Feature", "properties": { "id": 329 }, "geometry": { "type": "Point", "coordinates": [ -117.915240430405547, 33.803377786329264 ] } }, 334 | { "type": "Feature", "properties": { "id": 330 }, "geometry": { "type": "Point", "coordinates": [ -117.915360576206723, 33.81808556147336 ] } }, 335 | { "type": "Feature", "properties": { "id": 331 }, "geometry": { "type": "Point", "coordinates": [ -117.916761560114054, 33.825589841610991 ] } }, 336 | { "type": "Feature", "properties": { "id": 332 }, "geometry": { "type": "Point", "coordinates": [ -117.919494172289902, 33.834134456333274 ] } }, 337 | { "type": "Feature", "properties": { "id": 333 }, "geometry": { "type": "Point", "coordinates": [ -117.923780350778841, 33.84720105871704 ] } }, 338 | { "type": "Feature", "properties": { "id": 334 }, "geometry": { "type": "Point", "coordinates": [ -117.924168742357125, 33.850224964576562 ] } }, 339 | { "type": "Feature", "properties": { "id": 335 }, "geometry": { "type": "Point", "coordinates": [ -117.924245805168539, 33.853081443010872 ] } }, 340 | { "type": "Feature", "properties": { "id": 336 }, "geometry": { "type": "Point", "coordinates": [ -117.924245805168567, 33.854357595015593 ] } }, 341 | { "type": "Feature", "properties": { "id": 337 }, "geometry": { "type": "Point", "coordinates": [ -117.924271773378024, 33.859495590732209 ] } }, 342 | { "type": "Feature", "properties": { "id": 338 }, "geometry": { "type": "Point", "coordinates": [ -117.924316290308369, 33.866217647222093 ] } }, 343 | { "type": "Feature", "properties": { "id": 339 }, "geometry": { "type": "Point", "coordinates": [ -117.919632883567871, 33.818099432601159 ] } }, 344 | { "type": "Feature", "properties": { "id": 340 }, "geometry": { "type": "Point", "coordinates": [ -117.923486661756598, 33.774358153990931 ] } }, 345 | { "type": "Feature", "properties": { "id": 341 }, "geometry": { "type": "Point", "coordinates": [ -117.923782579149602, 33.788818650594607 ] } }, 346 | { "type": "Feature", "properties": { "id": 342 }, "geometry": { "type": "Point", "coordinates": [ -117.9238417626282, 33.795920668026149 ] } }, 347 | { "type": "Feature", "properties": { "id": 343 }, "geometry": { "type": "Point", "coordinates": [ -117.924039040890179, 33.803338330676866 ] } }, 348 | { "type": "Feature", "properties": { "id": 344 }, "geometry": { "type": "Point", "coordinates": [ -117.922135305662138, 33.818078304818414 ] } }, 349 | { "type": "Feature", "properties": { "id": 345 }, "geometry": { "type": "Point", "coordinates": [ -117.927034382501375, 33.832611136784784 ] } }, 350 | { "type": "Feature", "properties": { "id": 346 }, "geometry": { "type": "Point", "coordinates": [ -117.930160009964737, 33.83259264194772 ] } }, 351 | { "type": "Feature", "properties": { "id": 347 }, "geometry": { "type": "Point", "coordinates": [ -117.934914820653162, 33.832463563397461 ] } }, 352 | { "type": "Feature", "properties": { "id": 348 }, "geometry": { "type": "Point", "coordinates": [ -117.937641377054135, 33.759522828689505 ] } }, 353 | { "type": "Feature", "properties": { "id": 349 }, "geometry": { "type": "Point", "coordinates": [ -117.937759744011359, 33.765283353939523 ] } }, 354 | { "type": "Feature", "properties": { "id": 350 }, "geometry": { "type": "Point", "coordinates": [ -117.937759744011402, 33.76691089960093 ] } }, 355 | { "type": "Feature", "properties": { "id": 351 }, "geometry": { "type": "Point", "coordinates": [ -117.937897838794839, 33.774190467468259 ] } }, 356 | { "type": "Feature", "properties": { "id": 352 }, "geometry": { "type": "Point", "coordinates": [ -117.940857012724621, 33.779714258803907 ] } }, 357 | { "type": "Feature", "properties": { "id": 353 }, "geometry": { "type": "Point", "coordinates": [ -117.941221977509272, 33.788621372332607 ] } }, 358 | { "type": "Feature", "properties": { "id": 354 }, "geometry": { "type": "Point", "coordinates": [ -117.941379800118852, 33.795802301068946 ] } }, 359 | { "type": "Feature", "properties": { "id": 355 }, "geometry": { "type": "Point", "coordinates": [ -117.941369936205874, 33.803101596762538 ] } }, 360 | { "type": "Feature", "properties": { "id": 356 }, "geometry": { "type": "Point", "coordinates": [ -117.941632973888531, 33.817897466411587 ] } }, 361 | { "type": "Feature", "properties": { "id": 357 }, "geometry": { "type": "Point", "coordinates": [ -117.941386376061047, 33.832463178088325 ] } }, 362 | { "type": "Feature", "properties": { "id": 358 }, "geometry": { "type": "Point", "coordinates": [ -117.941679210981007, 33.847030944746926 ] } }, 363 | { "type": "Feature", "properties": { "id": 359 }, "geometry": { "type": "Point", "coordinates": [ -117.941829992675181, 33.853393061523661 ] } }, 364 | { "type": "Feature", "properties": { "id": 360 }, "geometry": { "type": "Point", "coordinates": [ -117.941770636767998, 33.854698891481959 ] } }, 365 | { "type": "Feature", "properties": { "id": 361 }, "geometry": { "type": "Point", "coordinates": [ -117.941800314721604, 33.859284135312819 ] } }, 366 | { "type": "Feature", "properties": { "id": 362 }, "geometry": { "type": "Point", "coordinates": [ -117.941859670628787, 33.866673945758656 ] } }, 367 | { "type": "Feature", "properties": { "id": 363 }, "geometry": { "type": "Point", "coordinates": [ -117.957572440962366, 33.846981625181421 ] } }, 368 | { "type": "Feature", "properties": { "id": 364 }, "geometry": { "type": "Point", "coordinates": [ -117.954824313673186, 33.759443917384708 ] } }, 369 | { "type": "Feature", "properties": { "id": 365 }, "geometry": { "type": "Point", "coordinates": [ -117.955001864108993, 33.76475070263217 ] } }, 370 | { "type": "Feature", "properties": { "id": 366 }, "geometry": { "type": "Point", "coordinates": [ -117.954992000195915, 33.766753076991343 ] } }, 371 | { "type": "Feature", "properties": { "id": 367 }, "geometry": { "type": "Point", "coordinates": [ -117.955041319761435, 33.77408196442417 ] } }, 372 | { "type": "Feature", "properties": { "id": 368 }, "geometry": { "type": "Point", "coordinates": [ -117.95876987891306, 33.779398613584725 ] } }, 373 | { "type": "Feature", "properties": { "id": 369 }, "geometry": { "type": "Point", "coordinates": [ -117.958700831521327, 33.788581916680215 ] } }, 374 | { "type": "Feature", "properties": { "id": 370 }, "geometry": { "type": "Point", "coordinates": [ -117.958582464564145, 33.795802301068946 ] } }, 375 | { "type": "Feature", "properties": { "id": 371 }, "geometry": { "type": "Point", "coordinates": [ -117.958796182681425, 33.803101596762538 ] } }, 376 | { "type": "Feature", "properties": { "id": 372 }, "geometry": { "type": "Point", "coordinates": [ -117.958927701522754, 33.817700188149601 ] } }, 377 | { "type": "Feature", "properties": { "id": 373 }, "geometry": { "type": "Point", "coordinates": [ -117.958993460943461, 33.832364538957322 ] } }, 378 | { "type": "Feature", "properties": { "id": 374 }, "geometry": { "type": "Point", "coordinates": [ -117.958863322792737, 33.844864351646962 ] } }, 379 | { "type": "Feature", "properties": { "id": 375 }, "geometry": { "type": "Point", "coordinates": [ -117.959101347492748, 33.84701861485555 ] } }, 380 | { "type": "Feature", "properties": { "id": 376 }, "geometry": { "type": "Point", "coordinates": [ -117.959263691062475, 33.853253429927094 ] } }, 381 | { "type": "Feature", "properties": { "id": 377 }, "geometry": { "type": "Point", "coordinates": [ -117.959239031279722, 33.854609717978256 ] } }, 382 | { "type": "Feature", "properties": { "id": 378 }, "geometry": { "type": "Point", "coordinates": [ -117.959313010627952, 33.859196437569452 ] } }, 383 | { "type": "Feature", "properties": { "id": 379 }, "geometry": { "type": "Point", "coordinates": [ -117.959337670410704, 33.866545052828471 ] } }, 384 | { "type": "Feature", "properties": { "id": 380 }, "geometry": { "type": "Point", "coordinates": [ -117.972342623337653, 33.759286094775113 ] } }, 385 | { "type": "Feature", "properties": { "id": 381 }, "geometry": { "type": "Point", "coordinates": [ -117.972432560104096, 33.765127520777256 ] } }, 386 | { "type": "Feature", "properties": { "id": 382 }, "geometry": { "type": "Point", "coordinates": [ -117.972460990294877, 33.766669233729985 ] } }, 387 | { "type": "Feature", "properties": { "id": 383 }, "geometry": { "type": "Point", "coordinates": [ -117.972613880947875, 33.771734353106503 ] } }, 388 | { "type": "Feature", "properties": { "id": 384 }, "geometry": { "type": "Point", "coordinates": [ -117.975099587048916, 33.773983325293159 ] } }, 389 | { "type": "Feature", "properties": { "id": 385 }, "geometry": { "type": "Point", "coordinates": [ -117.975430028137808, 33.788473413636126 ] } }, 390 | { "type": "Feature", "properties": { "id": 386 }, "geometry": { "type": "Point", "coordinates": [ -117.975627306399844, 33.795486655849771 ] } }, 391 | { "type": "Feature", "properties": { "id": 387 }, "geometry": { "type": "Point", "coordinates": [ -117.975827872633005, 33.803035837341874 ] } }, 392 | { "type": "Feature", "properties": { "id": 388 }, "geometry": { "type": "Point", "coordinates": [ -117.975893632053669, 33.817502909887615 ] } }, 393 | { "type": "Feature", "properties": { "id": 389 }, "geometry": { "type": "Point", "coordinates": [ -117.975910071908871, 33.832265899826325 ] } }, 394 | { "type": "Feature", "properties": { "id": 390 }, "geometry": { "type": "Point", "coordinates": [ -117.976045700713854, 33.846685707788431 ] } }, 395 | { "type": "Feature", "properties": { "id": 391 }, "geometry": { "type": "Point", "coordinates": [ -117.976242978975833, 33.8542655085107 ] } }, 396 | { "type": "Feature", "properties": { "id": 392 }, "geometry": { "type": "Point", "coordinates": [ -117.976252226394365, 33.856577363143352 ] } }, 397 | { "type": "Feature", "properties": { "id": 393 }, "geometry": { "type": "Point", "coordinates": [ -117.976242978975776, 33.857761032715295 ] } }, 398 | { "type": "Feature", "properties": { "id": 394 }, "geometry": { "type": "Point", "coordinates": [ -117.976204961810581, 33.859122458221208 ] } }, 399 | { "type": "Feature", "properties": { "id": 395 }, "geometry": { "type": "Point", "coordinates": [ -117.976352920507068, 33.866298455000987 ] } }, 400 | { "type": "Feature", "properties": { "id": 396 }, "geometry": { "type": "Point", "coordinates": [ -117.982069880140997, 33.859106018366028 ] } }, 401 | { "type": "Feature", "properties": { "id": 397 }, "geometry": { "type": "Point", "coordinates": [ -117.989747498001549, 33.764435057413003 ] } }, 402 | { "type": "Feature", "properties": { "id": 398 }, "geometry": { "type": "Point", "coordinates": [ -117.989905320611143, 33.766407840032876 ] } }, 403 | { "type": "Feature", "properties": { "id": 399 }, "geometry": { "type": "Point", "coordinates": [ -117.991641369316625, 33.769662931355654 ] } }, 404 | { "type": "Feature", "properties": { "id": 400 }, "geometry": { "type": "Point", "coordinates": [ -117.99268505520206, 33.772648606449934 ] } }, 405 | { "type": "Feature", "properties": { "id": 401 }, "geometry": { "type": "Point", "coordinates": [ -117.992746127583743, 33.773746591378782 ] } }, 406 | { "type": "Feature", "properties": { "id": 402 }, "geometry": { "type": "Point", "coordinates": [ -117.99280037910583, 33.788512869288617 ] } }, 407 | { "type": "Feature", "properties": { "id": 403 }, "geometry": { "type": "Point", "coordinates": [ -117.99297792954161, 33.795555703241568 ] } }, 408 | { "type": "Feature", "properties": { "id": 404 }, "geometry": { "type": "Point", "coordinates": [ -117.993214663456016, 33.802835271108883 ] } }, 409 | { "type": "Feature", "properties": { "id": 405 }, "geometry": { "type": "Point", "coordinates": [ -117.993155479977432, 33.817394406843569 ] } }, 410 | { "type": "Feature", "properties": { "id": 406 }, "geometry": { "type": "Point", "coordinates": [ -117.993451397370436, 33.832012726056838 ] } }, 411 | { "type": "Feature", "properties": { "id": 407 }, "geometry": { "type": "Point", "coordinates": [ -117.997816178916835, 33.846672966900798 ] } }, 412 | { "type": "Feature", "properties": { "id": 408 }, "geometry": { "type": "Point", "coordinates": [ -117.998013457178814, 33.855017837382881 ] } }, 413 | { "type": "Feature", "properties": { "id": 409 }, "geometry": { "type": "Point", "coordinates": [ -117.997993729352629, 33.85704980348136 ] } }, 414 | { "type": "Feature", "properties": { "id": 410 }, "geometry": { "type": "Point", "coordinates": [ -117.998072640657441, 33.858943674796443 ] } }, 415 | { "type": "Feature", "properties": { "id": 411 }, "geometry": { "type": "Point", "coordinates": [ -117.998112096309839, 33.863125973950581 ] } }, 416 | { "type": "Feature", "properties": { "id": 412 }, "geometry": { "type": "Point", "coordinates": [ -118.001855451331039, 33.788512869288596 ] } }, 417 | { "type": "Feature", "properties": { "id": 413 }, "geometry": { "type": "Point", "coordinates": [ -118.002092185245417, 33.802835271108883 ] } }, 418 | { "type": "Feature", "properties": { "id": 414 }, "geometry": { "type": "Point", "coordinates": [ -118.002033001766861, 33.817394406843569 ] } }, 419 | { "type": "Feature", "properties": { "id": 415 }, "geometry": { "type": "Point", "coordinates": [ -118.002269735681253, 33.832012726056838 ] } }, 420 | { "type": "Feature", "properties": { "id": 416 }, "geometry": { "type": "Point", "coordinates": [ -118.002205620246173, 33.84670995657487 ] } } 421 | ] 422 | } 423 | --------------------------------------------------------------------------------