From 32ecdce03d646dc51a907ed5c302cf4f96d3dd30 Mon Sep 17 00:00:00 2001 From: Yelrose <270018958@qq.com> Date: Thu, 10 Oct 2019 16:04:20 +0800 Subject: [PATCH] pgl version 1.0.0 --- .pre-commit-config.yaml | 2 +- docs/requirements.txt | 3 +- docs/source/api/pgl.rst | 1 + docs/source/api/pgl.utils.mp_reader.rst | 7 + docs/source/examples/md/gat_examples.md | 12 +- docs/source/examples/md/gcn_examples.md | 12 +- docs/source/examples/md/graphsage_examples.md | 10 +- docs/source/examples/md/node2vec_examples.md | 2 +- .../source/examples/md/static_gat_examples.md | 10 +- .../source/examples/md/static_gcn_examples.md | 10 +- docs/source/instruction.rst | 3 +- docs/source/md/introduction.md | 10 +- docs/source/md/quick_start.md | 2 +- examples/dgi/README.md | 36 + examples/dgi/dgi.py | 160 ++ examples/dgi/train.py | 165 ++ examples/distribute_deepwalk/README.md | 31 + examples/distribute_deepwalk/cloud_run.sh | 42 + examples/distribute_deepwalk/cluster_train.py | 348 +++ examples/distribute_deepwalk/gpu_train.py | 156 ++ examples/distribute_deepwalk/job.sh | 42 + examples/distribute_deepwalk/local_config | 7 + examples/distribute_deepwalk/model.py | 167 ++ examples/distribute_deepwalk/mp_reader.py | 145 ++ examples/distribute_deepwalk/multi_class.py | 244 ++ examples/distribute_deepwalk/pgl_deepwalk.cfg | 22 + examples/distribute_deepwalk/reader.py | 146 ++ examples/distribute_deepwalk/utils.py | 144 ++ examples/distribute_graphsage/README.md | 57 + .../data/reddit_index_label.npz | Bin 0 -> 3704478 bytes examples/distribute_graphsage/model.py | 130 ++ examples/distribute_graphsage/reader.py | 148 ++ .../distribute_graphsage/requirements.txt | 3 + examples/distribute_graphsage/train.py | 265 +++ examples/gat/README.md | 13 +- examples/gat/train.py | 8 +- examples/gcn/README.md | 12 +- examples/gcn/train.py | 8 +- examples/ges/README.md | 22 + examples/ges/gpu_run.sh | 22 + examples/ges/gpu_train.py | 314 +++ examples/ges/model.py | 222 ++ examples/ges/mp_reader.py | 145 ++ examples/ges/reader.py | 153 ++ examples/graphsage/README.md | 10 +- examples/graphsage/reader.py | 63 +- examples/graphsage/train.py | 14 +- examples/graphsage/train_multi.py | 369 +++ examples/graphsage/train_scale.py | 357 +++ examples/line/README.md | 55 + examples/line/data_loader.py | 233 ++ examples/line/data_process.py | 137 ++ examples/line/line.py | 197 ++ examples/line/multi_class.py | 286 +++ examples/sgc/README.md | 35 + examples/sgc/sgc.py | 271 +++ examples/static_gat/README.md | 12 +- examples/static_gat/train.py | 6 +- examples/static_gcn/README.md | 13 +- examples/static_gcn/train.py | 6 +- examples/strucvec/README.md | 44 + examples/strucvec/classify.py | 110 + examples/strucvec/data_loader.py | 55 + examples/strucvec/requirements.txt | 3 + examples/strucvec/sklearn_classify.py | 54 + examples/strucvec/struc2vec.py | 545 +++++ examples/unsup_graphsage/model.py | 140 ++ examples/unsup_graphsage/reader.py | 214 ++ examples/unsup_graphsage/sample.txt | 2000 +++++++++++++++++ examples/unsup_graphsage/train.py | 389 ++++ pgl/__init__.py | 3 +- pgl/contrib/__init__.py | 18 + pgl/contrib/heter_graph.py | 203 ++ pgl/contrib/heter_graph_wrapper.py | 234 ++ pgl/data_loader.py | 4 +- pgl/graph.py | 161 +- pgl/graph_kernel.pyx | 234 +- pgl/graph_wrapper.py | 133 +- pgl/layers/conv.py | 6 +- pgl/layers/set2set.py | 93 + pgl/redis_graph.py | 478 ++++ pgl/sample.py | 253 +++ pgl/tests/deepwalk/test_alias_sample.py | 69 + pgl/tests/test_redis_graph.py | 56 + pgl/tests/test_redis_graph_conf.json | 8 + pgl/tests/test_sample.py | 68 + pgl/tests/test_set2set.py | 67 + pgl/utils/mp_reader.py | 152 ++ pgl/utils/mt_reader.py | 79 + pgl/utils/paddle_helper.py | 22 +- requirements.txt | 6 +- setup.py | 42 +- tests/scatter_add_test.py | 40 + tests/unique_with_counts_test.py | 74 + 94 files changed, 11296 insertions(+), 286 deletions(-) create mode 100644 docs/source/api/pgl.utils.mp_reader.rst create mode 100644 examples/dgi/README.md create mode 100644 examples/dgi/dgi.py create mode 100644 examples/dgi/train.py create mode 100644 examples/distribute_deepwalk/README.md create mode 100755 examples/distribute_deepwalk/cloud_run.sh create mode 100644 examples/distribute_deepwalk/cluster_train.py create mode 100644 examples/distribute_deepwalk/gpu_train.py create mode 100644 examples/distribute_deepwalk/job.sh create mode 100644 examples/distribute_deepwalk/local_config create mode 100644 examples/distribute_deepwalk/model.py create mode 100644 examples/distribute_deepwalk/mp_reader.py create mode 100644 examples/distribute_deepwalk/multi_class.py create mode 100644 examples/distribute_deepwalk/pgl_deepwalk.cfg create mode 100644 examples/distribute_deepwalk/reader.py create mode 100644 examples/distribute_deepwalk/utils.py create mode 100644 examples/distribute_graphsage/README.md create mode 100644 examples/distribute_graphsage/data/reddit_index_label.npz create mode 100644 examples/distribute_graphsage/model.py create mode 100644 examples/distribute_graphsage/reader.py create mode 100644 examples/distribute_graphsage/requirements.txt create mode 100644 examples/distribute_graphsage/train.py create mode 100644 examples/ges/README.md create mode 100755 examples/ges/gpu_run.sh create mode 100644 examples/ges/gpu_train.py create mode 100644 examples/ges/model.py create mode 100644 examples/ges/mp_reader.py create mode 100644 examples/ges/reader.py create mode 100644 examples/graphsage/train_multi.py create mode 100644 examples/graphsage/train_scale.py create mode 100644 examples/line/README.md create mode 100644 examples/line/data_loader.py create mode 100644 examples/line/data_process.py create mode 100644 examples/line/line.py create mode 100644 examples/line/multi_class.py create mode 100644 examples/sgc/README.md create mode 100644 examples/sgc/sgc.py create mode 100644 examples/strucvec/README.md create mode 100644 examples/strucvec/classify.py create mode 100644 examples/strucvec/data_loader.py create mode 100644 examples/strucvec/requirements.txt create mode 100644 examples/strucvec/sklearn_classify.py create mode 100644 examples/strucvec/struc2vec.py create mode 100644 examples/unsup_graphsage/model.py create mode 100644 examples/unsup_graphsage/reader.py create mode 100644 examples/unsup_graphsage/sample.txt create mode 100644 examples/unsup_graphsage/train.py create mode 100644 pgl/contrib/__init__.py create mode 100644 pgl/contrib/heter_graph.py create mode 100644 pgl/contrib/heter_graph_wrapper.py create mode 100644 pgl/layers/set2set.py create mode 100644 pgl/redis_graph.py create mode 100644 pgl/sample.py create mode 100644 pgl/tests/deepwalk/test_alias_sample.py create mode 100644 pgl/tests/test_redis_graph.py create mode 100644 pgl/tests/test_redis_graph_conf.json create mode 100644 pgl/tests/test_sample.py create mode 100644 pgl/tests/test_set2set.py create mode 100644 pgl/utils/mp_reader.py create mode 100644 pgl/utils/mt_reader.py create mode 100644 tests/scatter_add_test.py create mode 100644 tests/unique_with_counts_test.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 041ee06..625f91e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: sha: 5bf6c09bfa1297d3692cadd621ef95f1284e33c0 hooks: - id: check-added-large-files - args: [--maxkb=1024] + args: [--maxkb=4096] - id: check-merge-conflict - id: check-symlinks - id: detect-private-key diff --git a/docs/requirements.txt b/docs/requirements.txt index 290d4cf..4e7960b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,7 +2,6 @@ sphinx==2.1.0 mistune sphinx_rtd_theme numpy >= 1.16.4 -networkx==2.3 cython >= 0.25.2 -paddlepaddle==1.5.1 +paddlepaddle pgl diff --git a/docs/source/api/pgl.rst b/docs/source/api/pgl.rst index bf5fc0e..36da0df 100644 --- a/docs/source/api/pgl.rst +++ b/docs/source/api/pgl.rst @@ -8,3 +8,4 @@ API Reference pgl.layers pgl.data_loader pgl.utils.paddle_helper + pgl.utils.mp_reader diff --git a/docs/source/api/pgl.utils.mp_reader.rst b/docs/source/api/pgl.utils.mp_reader.rst new file mode 100644 index 0000000..1952a6f --- /dev/null +++ b/docs/source/api/pgl.utils.mp_reader.rst @@ -0,0 +1,7 @@ +pgl.utils.mp\_reader module: MultiProcessing reader helper function for Paddle. +=============================== + +.. automodule:: pgl.utils.mp_reader + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/examples/md/gat_examples.md b/docs/source/examples/md/gat_examples.md index 5153444..fd55c04 100644 --- a/docs/source/examples/md/gat_examples.md +++ b/docs/source/examples/md/gat_examples.md @@ -32,18 +32,18 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| -| --- | --- | --- |---| -| Cora | ~83% | 0.0188s | 0.0175s | -| Pubmed | ~78% | 0.0449s | 0.0295s | -| Citeseer | ~70% | 0.0275 | 0.0253s | +| Dataset | Accuracy | +| --- | --- | +| Cora | ~83% | +| Pubmed | ~78% | +| Citeseer | ~70% | ### How to run diff --git a/docs/source/examples/md/gcn_examples.md b/docs/source/examples/md/gcn_examples.md index 37af668..11d5f4e 100644 --- a/docs/source/examples/md/gcn_examples.md +++ b/docs/source/examples/md/gcn_examples.md @@ -27,18 +27,18 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| -| --- | --- | --- |---| -| Cora | ~81% | 0.0106s | 0.0104s | -| Pubmed | ~79% | 0.0210s | 0.0154s | -| Citeseer | ~71% | 0.0175s | 0.0177s | +| Dataset | Accuracy | +| --- | --- | +| Cora | ~81% | +| Pubmed | ~79% | +| Citeseer | ~71% | ### How to run diff --git a/docs/source/examples/md/graphsage_examples.md b/docs/source/examples/md/graphsage_examples.md index c52c2e0..6ad6901 100644 --- a/docs/source/examples/md/graphsage_examples.md +++ b/docs/source/examples/md/graphsage_examples.md @@ -12,7 +12,7 @@ The reddit dataset should be downloaded from the following links and placed in d ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### How to run @@ -22,6 +22,14 @@ To train a GraphSAGE model on Reddit Dataset, you can just run python train.py --use_cuda --epoch 10 --graphsage_type graphsage_mean --normalize --symmetry ``` +If you want to train a GraphSAGE model with multiple GPUs, you can just run + +``` +CUDA_VISIBLE_DEVICES=0,1 python train_multi.py --use_cuda --epoch 10 --graphsage_type graphsage_mean --normalize --symmetry --num_trainer 2 +``` + + + #### Hyperparameters - epoch: Number of epochs default (10) diff --git a/docs/source/examples/md/node2vec_examples.md b/docs/source/examples/md/node2vec_examples.md index 7324b9d..981c39f 100644 --- a/docs/source/examples/md/node2vec_examples.md +++ b/docs/source/examples/md/node2vec_examples.md @@ -5,7 +5,7 @@ ## Datasets The datasets contain two networks: [BlogCatalog](http://socialcomputing.asu.edu/datasets/BlogCatalog3) and [Arxiv](http://snap.stanford.edu/data/ca-AstroPh.html). ## Dependencies -- paddlepaddle>=1.4 +- paddlepaddle>=1.6 - pgl ## How to run diff --git a/docs/source/examples/md/static_gat_examples.md b/docs/source/examples/md/static_gat_examples.md index 6be646d..7659be1 100644 --- a/docs/source/examples/md/static_gat_examples.md +++ b/docs/source/examples/md/static_gat_examples.md @@ -19,11 +19,11 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| examples/gat | Improvement | -| --- | --- | --- |---| --- | --- | -| Cora | ~83% | 0.0145s | 0.0119s | 0.0175s | 1.47x | -| Pubmed | ~78% | 0.0352s | 0.0193s |0.0295s | 1.53x | -| Citeseer | ~70% | 0.0148s | 0.0124s |0.0253s | 2.04x | +| Dataset | Accuracy | epoch time | examples/gat | Improvement | +| --- | --- | --- | --- | --- | +| Cora | ~83% | 0.0119s | 0.0175s | 1.47x | +| Pubmed | ~78% | 0.0193s |0.0295s | 1.53x | +| Citeseer | ~70% | 0.0124s |0.0253s | 2.04x | ### How to run diff --git a/docs/source/examples/md/static_gcn_examples.md b/docs/source/examples/md/static_gcn_examples.md index d9ad8b3..6b0997d 100644 --- a/docs/source/examples/md/static_gcn_examples.md +++ b/docs/source/examples/md/static_gcn_examples.md @@ -10,7 +10,7 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance @@ -18,11 +18,11 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| examples/gcn | Improvement | +| Dataset | Accuracy | epoch time | examples/gcn | Improvement | | --- | --- | --- |---| --- | --- | -| Cora | ~81% | 0.0053s | 0.0047s | 0.0104s | 2.21x | -| Pubmed | ~79% | 0.0105s | 0.0049s |0.0154s | 3.14x | -| Citeseer | ~71% | 0.0051s | 0.0045s |0.0177s | 3.93x | +| Cora | ~81% | 0.0047s | 0.0104s | 2.21x | +| Pubmed | ~79% | 0.0049s |0.0154s | 3.14x | +| Citeseer | ~71% | 0.0045s |0.0177s | 3.93x | diff --git a/docs/source/instruction.rst b/docs/source/instruction.rst index 6a33851..9ece987 100644 --- a/docs/source/instruction.rst +++ b/docs/source/instruction.rst @@ -8,8 +8,7 @@ To install Paddle Graph Learning, we need the following packages. .. code-block:: sh - paddlepaddle >= 1.4 (Faster performance on 1.5) - networkx + paddlepaddle >= 1.6 cython We can simply install pgl by pip. diff --git a/docs/source/md/introduction.md b/docs/source/md/introduction.md index 6dd06fa..bd42565 100644 --- a/docs/source/md/introduction.md +++ b/docs/source/md/introduction.md @@ -35,8 +35,8 @@ Users only need to call the ```sequence_ops``` functions provided by Paddle to e return fluid.layers.sequence_pool(msg, "sum") ``` +Although DGL does some kernel fusion optimization for general sum, max and other aggregate functions with scatter-gather. For **complex user-defined functions** with degree bucketing algorithm, the serial execution for each degree bucket cannot take full advantage of the performance improvement provided by GPU. However, operations on the PGL LodTensor-based message is performed in parallel, which can fully utilize GPU parallel optimization. Even without scatter-gather optimization, PGL still has excellent performance. Of course, we still provide build-in scatter-optimized message aggregation functions. -Although DGL does some kernel fusion optimization for general sum, max and other aggregate functions with scatter-gather. For **complex user-defined functions** with degree bucketing algorithm, the serial execution for each degree bucket cannot take full advantage of the performance improvement provided by GPU. However, operations on the PGL LodTensor-based message is performed in parallel, which can fully utilize GPU parallel optimization. In our experiments, PGL can reach up to 13 times the speed of DGL with complex user-defined functions. Even without scatter-gather optimization, PGL still has excellent performance. Of course, we still provide build-in scatter-optimized message aggregation functions. ## Performance @@ -50,11 +50,3 @@ We test all the GNN algorithms with Tesla V100-SXM2-16G running for 200 epochs t | Pubmed | GAT | 77% |0.0193s|**0.0144s**| | Citeseer | GCN |70.2%| **0.0045** |0.0046s| | Citeseer | GAT |68.8%| **0.0124s** |0.0139s| - -If we use complex user-defined aggregation like [GraphSAGE-LSTM](https://cs.stanford.edu/people/jure/pubs/graphsage-nips17.pdf) that aggregates neighbor features with LSTM ignoring the order of recieved messages, the optimized message-passing in DGL will be forced to degenerate into degree bucketing scheme. The speed performance will be much slower than the one implemented in PGL. Performances may be various with different scale of the graph, in our experiments, PGL can reach up to 13 times the speed of DGL. - -| Dataset | PGL speed (epoch time) | DGL 0.3.0 speed (epoch time) | Speed up| -| -------- | ------------ | ------------------------------------ |----| -| Cora | **0.0186s** | 0.1638s | 8.80x| -| Pubmed | **0.0388s** |0.5275s | 13.59x| -| Citeseer | **0.0150s** | 0.1278s | 8.52x | diff --git a/docs/source/md/quick_start.md b/docs/source/md/quick_start.md index 9356362..0a30c39 100644 --- a/docs/source/md/quick_start.md +++ b/docs/source/md/quick_start.md @@ -95,7 +95,7 @@ After defining the GCN layer, we can construct a deeper GCN model with two GCN l ```python output = gcn_layer(gw, gw.node_feat['feature'], hidden_size=8, name='gcn_layer_1', activation='relu') -output = gcn_layer(gw, output, hidden_size=1, +output = gcn_layer(gw, output, hidden_size=2, name='gcn_layer_2', activation=None) ``` diff --git a/examples/dgi/README.md b/examples/dgi/README.md new file mode 100644 index 0000000..3de5252 --- /dev/null +++ b/examples/dgi/README.md @@ -0,0 +1,36 @@ +# PGL Examples for GCN + +[Deep Graph Infomax \(DGI\)](https://arxiv.org/abs/1809.10341) is a general approach for learning node representations within graph-structured data in an unsupervised manner. DGI relies on maximizing mutual information between patch representations and corresponding high-level summaries of graphs---both derived using established graph convolutional network architectures. + +### Datasets + +The datasets contain three citation networks: CORA, PUBMED, CITESEER. The details for these three datasets can be found in the [paper](https://arxiv.org/abs/1609.02907). + +### Dependencies + +- paddlepaddle>=1.6 +- pgl + +### Performance + +We use DGI to pretrain embeddings for each nodes. Then we fix the embedding to train a node classifier. + +| Dataset | Accuracy | +| --- | --- | +| Cora | ~81% | +| Pubmed | ~77.6% | +| Citeseer | ~71.3% | + + +### How to run + +For examples, use gpu to train gcn on cora dataset. +``` +python dgi.py --dataset cora --use_cuda +python train.py --dataset cora --use_cuda +``` + +#### Hyperparameters + +- dataset: The citation dataset "cora", "citeseer", "pubmed". +- use_cuda: Use gpu if assign use_cuda. diff --git a/examples/dgi/dgi.py b/examples/dgi/dgi.py new file mode 100644 index 0000000..2f8706a --- /dev/null +++ b/examples/dgi/dgi.py @@ -0,0 +1,160 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + DGI Pretrain +""" +import os +import pgl +from pgl import data_loader +from pgl.utils.logger import log +import paddle.fluid as fluid +import numpy as np +import time +import argparse + + +def load(name): + """Load dataset""" + if name == 'cora': + dataset = data_loader.CoraDataset() + elif name == "pubmed": + dataset = data_loader.CitationDataset("pubmed", symmetry_edges=False) + elif name == "citeseer": + dataset = data_loader.CitationDataset("citeseer", symmetry_edges=False) + else: + raise ValueError(name + " dataset doesn't exists") + return dataset + + +def save_param(dirname, var_name_list): + """save_param""" + for var_name in var_name_list: + var = fluid.global_scope().find_var(var_name) + var_tensor = var.get_tensor() + np.save(os.path.join(dirname, var_name + '.npy'), np.array(var_tensor)) + + +def main(args): + """main""" + dataset = load(args.dataset) + + # normalize + indegree = dataset.graph.indegree() + norm = np.zeros_like(indegree, dtype="float32") + norm[indegree > 0] = np.power(indegree[indegree > 0], -0.5) + dataset.graph.node_feat["norm"] = np.expand_dims(norm, -1) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_program = fluid.Program() + startup_program = fluid.Program() + hidden_size = 512 + + with fluid.program_guard(train_program, startup_program): + pos_gw = pgl.graph_wrapper.GraphWrapper( + name="pos_graph", + place=place, + node_feat=dataset.graph.node_feat_info()) + + neg_gw = pgl.graph_wrapper.GraphWrapper( + name="neg_graph", + place=place, + node_feat=dataset.graph.node_feat_info()) + + positive_feat = pgl.layers.gcn(pos_gw, + pos_gw.node_feat["words"], + hidden_size, + activation="relu", + norm=pos_gw.node_feat['norm'], + name="gcn_layer_1") + + negative_feat = pgl.layers.gcn(neg_gw, + neg_gw.node_feat["words"], + hidden_size, + activation="relu", + norm=neg_gw.node_feat['norm'], + name="gcn_layer_1") + + summary_feat = fluid.layers.sigmoid( + fluid.layers.reduce_mean( + positive_feat, [0], keep_dim=True)) + + summary_feat = fluid.layers.fc(summary_feat, + hidden_size, + bias_attr=False, + name="discriminator") + pos_logits = fluid.layers.matmul( + positive_feat, summary_feat, transpose_y=True) + neg_logits = fluid.layers.matmul( + negative_feat, summary_feat, transpose_y=True) + pos_loss = fluid.layers.sigmoid_cross_entropy_with_logits( + x=pos_logits, + label=fluid.layers.ones( + shape=[dataset.graph.num_nodes, 1], dtype="float32")) + neg_loss = fluid.layers.sigmoid_cross_entropy_with_logits( + x=neg_logits, + label=fluid.layers.zeros( + shape=[dataset.graph.num_nodes, 1], dtype="float32")) + loss = fluid.layers.reduce_mean(pos_loss) + fluid.layers.reduce_mean( + neg_loss) + + adam = fluid.optimizer.Adam(learning_rate=1e-3) + adam.minimize(loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + + best_loss = 1e9 + dur = [] + + for epoch in range(args.epoch): + feed_dict = pos_gw.to_feed(dataset.graph) + node_feat = dataset.graph.node_feat["words"].copy() + perm = np.arange(0, dataset.graph.num_nodes) + np.random.shuffle(perm) + + dataset.graph.node_feat["words"] = dataset.graph.node_feat["words"][ + perm] + + feed_dict.update(neg_gw.to_feed(dataset.graph)) + dataset.graph.node_feat["words"] = node_feat + if epoch >= 3: + t0 = time.time() + train_loss = exe.run(train_program, + feed=feed_dict, + fetch_list=[loss], + return_numpy=True) + if train_loss[0] < best_loss: + best_loss = train_loss[0] + save_param(args.checkpoint, ["gcn_layer_1", "gcn_layer_1_bias"]) + + if epoch >= 3: + time_per_epoch = 1.0 * (time.time() - t0) + dur.append(time_per_epoch) + + log.info("Epoch %d " % epoch + "(%.5lf sec) " % np.mean(dur) + + "Train Loss: %f " % train_loss[0]) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='DGI pretrain') + parser.add_argument( + "--dataset", type=str, default="cora", help="dataset (cora, pubmed)") + parser.add_argument( + "--checkpoint", type=str, default="best_model", help="checkpoint") + parser.add_argument( + "--epoch", type=int, default=200, help="pretrain epochs") + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/dgi/train.py b/examples/dgi/train.py new file mode 100644 index 0000000..6774209 --- /dev/null +++ b/examples/dgi/train.py @@ -0,0 +1,165 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Train +""" +import os +import pgl +from pgl import data_loader +from pgl.utils.logger import log +import paddle.fluid as fluid +import numpy as np +import time +import argparse + + +def load(name): + """Load""" + if name == 'cora': + dataset = data_loader.CoraDataset() + elif name == "pubmed": + dataset = data_loader.CitationDataset("pubmed", symmetry_edges=False) + elif name == "citeseer": + dataset = data_loader.CitationDataset("citeseer", symmetry_edges=False) + else: + raise ValueError(name + " dataset doesn't exists") + return dataset + + +def load_param(dirname, var_name_list): + """load_param""" + for var_name in var_name_list: + var = fluid.global_scope().find_var(var_name) + var_tensor = var.get_tensor() + var_tmp = np.load(os.path.join(dirname, var_name + '.npy')) + var_tensor.set(var_tmp, fluid.CPUPlace()) + + +def main(args): + """main""" + dataset = load(args.dataset) + + # normalize + indegree = dataset.graph.indegree() + norm = np.zeros_like(indegree, dtype="float32") + norm[indegree > 0] = np.power(indegree[indegree > 0], -0.5) + dataset.graph.node_feat["norm"] = np.expand_dims(norm, -1) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_program = fluid.Program() + startup_program = fluid.Program() + test_program = fluid.Program() + hidden_size = 512 + + with fluid.program_guard(train_program, startup_program): + gw = pgl.graph_wrapper.GraphWrapper( + name="graph", + place=place, + node_feat=dataset.graph.node_feat_info()) + + output = pgl.layers.gcn(gw, + gw.node_feat["words"], + hidden_size, + activation="relu", + norm=gw.node_feat['norm'], + name="gcn_layer_1") + output.stop_gradient = True + output = fluid.layers.fc(output, + dataset.num_classes, + act=None, + name="classifier") + node_index = fluid.layers.data( + "node_index", + shape=[None, 1], + dtype="int64", + append_batch_size=False) + node_label = fluid.layers.data( + "node_label", + shape=[None, 1], + dtype="int64", + append_batch_size=False) + + pred = fluid.layers.gather(output, node_index) + loss, pred = fluid.layers.softmax_with_cross_entropy( + logits=pred, label=node_label, return_softmax=True) + acc = fluid.layers.accuracy(input=pred, label=node_label, k=1) + loss = fluid.layers.mean(loss) + + test_program = train_program.clone(for_test=True) + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=1e-2) + adam.minimize(loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + + load_param(args.checkpoint, ["gcn_layer_1", "gcn_layer_1_bias"]) + feed_dict = gw.to_feed(dataset.graph) + + train_index = dataset.train_index + train_label = np.expand_dims(dataset.y[train_index], -1) + train_index = np.expand_dims(train_index, -1) + + val_index = dataset.val_index + val_label = np.expand_dims(dataset.y[val_index], -1) + val_index = np.expand_dims(val_index, -1) + + test_index = dataset.test_index + test_label = np.expand_dims(dataset.y[test_index], -1) + test_index = np.expand_dims(test_index, -1) + + dur = [] + for epoch in range(200): + if epoch >= 3: + t0 = time.time() + feed_dict["node_index"] = np.array(train_index, dtype="int64") + feed_dict["node_label"] = np.array(train_label, dtype="int64") + train_loss, train_acc = exe.run(train_program, + feed=feed_dict, + fetch_list=[loss, acc], + return_numpy=True) + + if epoch >= 3: + time_per_epoch = 1.0 * (time.time() - t0) + dur.append(time_per_epoch) + feed_dict["node_index"] = np.array(val_index, dtype="int64") + feed_dict["node_label"] = np.array(val_label, dtype="int64") + val_loss, val_acc = exe.run(test_program, + feed=feed_dict, + fetch_list=[loss, acc], + return_numpy=True) + + log.info("Epoch %d " % epoch + "(%.5lf sec) " % np.mean(dur) + + "Train Loss: %f " % train_loss + "Train Acc: %f " % train_acc + + "Val Loss: %f " % val_loss + "Val Acc: %f " % val_acc) + + feed_dict["node_index"] = np.array(test_index, dtype="int64") + feed_dict["node_label"] = np.array(test_label, dtype="int64") + test_loss, test_acc = exe.run(test_program, + feed=feed_dict, + fetch_list=[loss, acc], + return_numpy=True) + log.info("Accuracy: %f" % test_acc) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='GCN') + parser.add_argument( + "--dataset", type=str, default="cora", help="dataset (cora, pubmed)") + parser.add_argument( + "--checkpoint", type=str, default="best_model", help="checkpoint") + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/distribute_deepwalk/README.md b/examples/distribute_deepwalk/README.md new file mode 100644 index 0000000..24775aa --- /dev/null +++ b/examples/distribute_deepwalk/README.md @@ -0,0 +1,31 @@ +# PGL Examples for distributed deepwalk +[Deepwalk](https://arxiv.org/pdf/1403.6652.pdf) is an algorithmic framework for representational learning on graphs. Given any graph, it can learn continuous feature representations for the nodes, which can then be used for various downstream machine learning tasks. Based on PGL, we reproduce distributed deepwalk algorithms and reach the same level of indicators as the paper. +## Datasets +The datasets contain two networks: [BlogCatalog](http://socialcomputing.asu.edu/datasets/BlogCatalog3). +## Dependencies +- paddlepaddle>=1.6 +- pgl>=1.0 + +## How to run + +For examples, train deepwalk in distributed mode on cora dataset. +```sh +# train deepwalk in distributed mode. +sh cloud_run.sh + +# multiclass task example +python3 multi_class.py --use_cuda --ckpt_path ./model_path/4029 --epoch 1000 + +``` + +## Hyperparameters +- dataset: The citation dataset "BlogCatalog". +- hidden_size: Hidden size of the embedding. +- lr: Learning rate. +- neg_num: Number of negative samples. +- epoch: Number of training epoch. + +### Experiment results +Dataset|model|Task|Metric|PGL Result|Reported Result +--|--|--|--|--|-- +BlogCatalog|distributed deepwalk|multi-label classification|MacroF1|0.233|0.211 diff --git a/examples/distribute_deepwalk/cloud_run.sh b/examples/distribute_deepwalk/cloud_run.sh new file mode 100755 index 0000000..4d40084 --- /dev/null +++ b/examples/distribute_deepwalk/cloud_run.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +set -x +source ./pgl_deepwalk.cfg +source ./local_config + +unset http_proxy https_proxy + +# build train_data +trainer_num=`echo $PADDLE_PORT | awk -F',' '{print NF}'` +rm -rf train_data && mkdir -p train_data +cd train_data +if [[ $build_train_data == True ]];then + seq 0 $((num_nodes-1)) | shuf | split -l $((num_nodes/trainer_num/CPU_NUM+1)) +else + for i in `seq 1 $trainer_num`;do + touch $i + done +fi +cd - + +# mkdir workspace +if [ -d ${BASE} ]; then + rm -rf ${BASE} +fi +mkdir ${BASE} + +# start ps +for((i=0;i<${PADDLE_PSERVERS_NUM};i++)) +do + echo "start ps server: ${i}" + echo $BASE + TRAINING_ROLE="PSERVER" PADDLE_TRAINER_ID=${i} sh job.sh &> $BASE/pserver.$i.log & +done +sleep 5s + +# start trainers +for((j=0;j<${PADDLE_TRAINERS_NUM};j++)) +do + echo "start ps work: ${j}" + TRAINING_ROLE="TRAINER" PADDLE_TRAINER_ID=${j} sh job.sh &> $BASE/worker.$j.log & +done diff --git a/examples/distribute_deepwalk/cluster_train.py b/examples/distribute_deepwalk/cluster_train.py new file mode 100644 index 0000000..aa4c9ce --- /dev/null +++ b/examples/distribute_deepwalk/cluster_train.py @@ -0,0 +1,348 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import argparse +import time +import os +import math +from multiprocessing import Process + +import numpy as np +import paddle.fluid as F +import paddle.fluid.layers as L +from paddle.fluid.incubate.fleet.parameter_server.distribute_transpiler import fleet +from paddle.fluid.transpiler.distribute_transpiler import DistributeTranspilerConfig +import paddle.fluid.incubate.fleet.base.role_maker as role_maker +from pgl.utils.logger import log +from pgl import data_loader + +from reader import DeepwalkReader +from model import DeepwalkModel +from utils import get_file_list +from utils import build_graph +from utils import build_fake_graph +from utils import build_gen_func + + +def init_role(): + # reset the place according to role of parameter server + training_role = os.getenv("TRAINING_ROLE", "TRAINER") + paddle_role = role_maker.Role.WORKER + place = F.CPUPlace() + if training_role == "PSERVER": + paddle_role = role_maker.Role.SERVER + + # set the fleet runtime environment according to configure + ports = os.getenv("PADDLE_PORT", "6174").split(",") + pserver_ips = os.getenv("PADDLE_PSERVERS").split(",") # ip,ip... + eplist = [] + if len(ports) > 1: + # local debug mode, multi port + for port in ports: + eplist.append(':'.join([pserver_ips[0], port])) + else: + # distributed mode, multi ip + for ip in pserver_ips: + eplist.append(':'.join([ip, ports[0]])) + + pserver_endpoints = eplist # ip:port,ip:port... + worker_num = int(os.getenv("PADDLE_TRAINERS_NUM", "0")) + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + role = role_maker.UserDefinedRoleMaker( + current_id=trainer_id, + role=paddle_role, + worker_num=worker_num, + server_endpoints=pserver_endpoints) + fleet.init(role) + + +def optimization(base_lr, loss, train_steps, optimizer='sgd'): + decayed_lr = L.learning_rate_scheduler.polynomial_decay( + learning_rate=base_lr, + decay_steps=train_steps, + end_learning_rate=0.0001 * base_lr, + power=1.0, + cycle=False) + if optimizer == 'sgd': + optimizer = F.optimizer.SGD(decayed_lr) + elif optimizer == 'adam': + optimizer = F.optimizer.Adam(decayed_lr, lazy_mode=True) + else: + raise ValueError + + log.info('learning rate:%f' % (base_lr)) + #create the DistributeTranspiler configure + config = DistributeTranspilerConfig() + config.sync_mode = False + #config.runtime_split_send_recv = False + + config.slice_var_up = False + #create the distributed optimizer + optimizer = fleet.distributed_optimizer(optimizer, config) + optimizer.minimize(loss) + + +def build_complied_prog(train_program, model_loss): + num_threads = int(os.getenv("CPU_NUM", 10)) + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", 0)) + exec_strategy = F.ExecutionStrategy() + exec_strategy.num_threads = num_threads + #exec_strategy.use_experimental_executor = True + build_strategy = F.BuildStrategy() + build_strategy.enable_inplace = True + #build_strategy.memory_optimize = True + build_strategy.memory_optimize = False + build_strategy.remove_unnecessary_lock = False + if num_threads > 1: + build_strategy.reduce_strategy = F.BuildStrategy.ReduceStrategy.Reduce + + compiled_prog = F.compiler.CompiledProgram( + train_program).with_data_parallel( + loss_name=model_loss.name, + build_strategy=build_strategy, + exec_strategy=exec_strategy) + return compiled_prog + + +def train_prog(exe, program, loss, node2vec_pyreader, args, train_steps): + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + step = 0 + while True: + try: + begin_time = time.time() + loss_val, = exe.run(program, fetch_list=[loss]) + log.info("step %s: loss %.5f speed: %.5f s/step" % + (step, np.mean(loss_val), time.time() - begin_time)) + step += 1 + except F.core.EOFException: + node2vec_pyreader.reset() + + if step % args.steps_per_save == 0 or step == train_steps: + if trainer_id == 0 or args.is_distributed: + model_save_dir = args.save_path + model_path = os.path.join(model_save_dir, str(step)) + if not os.path.exists(model_save_dir): + os.makedirs(model_save_dir) + fleet.save_persistables(exe, model_path) + + if step == train_steps: + break + + +def test(args): + graph = build_graph(args.num_nodes, args.edge_path) + gen_func = build_gen_func(args, graph) + + start = time.time() + num = 10 + for idx, _ in enumerate(gen_func()): + if idx % num == num - 1: + log.info("%s" % (1.0 * (time.time() - start) / num)) + start = time.time() + + +def walk(args): + graph = build_graph(args.num_nodes, args.edge_path) + num_sample_workers = args.num_sample_workers + + if args.train_files is None or args.train_files == "None": + log.info("Walking from graph...") + train_files = [None for _ in range(num_sample_workers)] + else: + log.info("Walking from train_data...") + files = get_file_list(args.train_files) + train_files = [[] for i in range(num_sample_workers)] + for idx, f in enumerate(files): + train_files[idx % num_sample_workers].append(f) + + def walk_to_file(walk_gen, filename, max_num): + with open(filename, "w") as outf: + num = 0 + for walks in walk_gen: + for walk in walks: + outf.write("%s\n" % "\t".join([str(i) for i in walk])) + num += 1 + if num % 1000 == 0: + log.info("Total: %s, %s walkpath is saved. " % + (max_num, num)) + if num == max_num: + return + + m_args = [(DeepwalkReader( + graph, + batch_size=args.batch_size, + walk_len=args.walk_len, + win_size=args.win_size, + neg_num=args.neg_num, + neg_sample_type=args.neg_sample_type, + walkpath_files=None, + train_files=train_files[i]).walk_generator(), + "%s/%s" % (args.walkpath_files, i), + args.epoch * args.num_nodes // args.num_sample_workers) + for i in range(num_sample_workers)] + ps = [] + for i in range(num_sample_workers): + p = Process(target=walk_to_file, args=m_args[i]) + p.start() + ps.append(p) + for i in range(num_sample_workers): + ps[i].join() + + +def train(args): + import logging + log.setLevel(logging.DEBUG) + log.info("start") + + worker_num = int(os.getenv("PADDLE_TRAINERS_NUM", "0")) + num_devices = int(os.getenv("CPU_NUM", 10)) + + model = DeepwalkModel(args.num_nodes, args.hidden_size, args.neg_num, + args.is_sparse, args.is_distributed, 1.) + pyreader = model.pyreader + loss = model.forward() + + # init fleet + init_role() + + train_steps = math.ceil(1. * args.num_nodes * args.epoch / + args.batch_size / num_devices / worker_num) + log.info("Train step: %s" % train_steps) + + if args.optimizer == "sgd": + args.lr *= args.batch_size * args.walk_len * args.win_size + optimization(args.lr, loss, train_steps, args.optimizer) + + # init and run server or worker + if fleet.is_server(): + fleet.init_server(args.warm_start_from_dir) + fleet.run_server() + + if fleet.is_worker(): + log.info("start init worker done") + fleet.init_worker() + #just the worker, load the sample + log.info("init worker done") + + exe = F.Executor(F.CPUPlace()) + exe.run(fleet.startup_program) + log.info("Startup done") + + if args.dataset is not None: + if args.dataset == "BlogCatalog": + graph = data_loader.BlogCatalogDataset().graph + elif args.dataset == "ArXiv": + graph = data_loader.ArXivDataset().graph + else: + raise ValueError(args.dataset + " dataset doesn't exists") + log.info("Load buildin BlogCatalog dataset done.") + elif args.walkpath_files is None or args.walkpath_files == "None": + graph = build_graph(args.num_nodes, args.edge_path) + log.info("Load graph from '%s' done." % args.edge_path) + else: + graph = build_fake_graph(args.num_nodes) + log.info("Load fake graph done.") + + # bind gen + gen_func = build_gen_func(args, graph) + + pyreader.decorate_tensor_provider(gen_func) + pyreader.start() + + compiled_prog = build_complied_prog(fleet.main_program, loss) + train_prog(exe, compiled_prog, loss, pyreader, args, train_steps) + + +if __name__ == '__main__': + + def str2bool(v): + if isinstance(v, bool): + return v + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + + parser = argparse.ArgumentParser(description='Deepwalk') + parser.add_argument( + "--hidden_size", + type=int, + default=64, + help="Hidden size of the embedding.") + parser.add_argument( + "--lr", type=float, default=0.025, help="Learning rate.") + parser.add_argument( + "--neg_num", type=int, default=5, help="Number of negative samples.") + parser.add_argument( + "--epoch", type=int, default=1, help="Number of training epoch.") + parser.add_argument( + "--batch_size", + type=int, + default=128, + help="Numbert of walk paths in a batch.") + parser.add_argument( + "--walk_len", type=int, default=40, help="Length of a walk path.") + parser.add_argument( + "--win_size", type=int, default=5, help="Window size in skip-gram.") + parser.add_argument( + "--save_path", + type=str, + default="model_path", + help="Output path for saving model.") + parser.add_argument( + "--num_sample_workers", + type=int, + default=1, + help="Number of sampling workers.") + parser.add_argument( + "--steps_per_save", + type=int, + default=3000, + help="Steps for model saveing.") + parser.add_argument( + "--num_nodes", + type=int, + default=10000, + help="Number of nodes in graph.") + parser.add_argument("--edge_path", type=str, default="./graph_data") + parser.add_argument("--train_files", type=str, default=None) + parser.add_argument("--walkpath_files", type=str, default=None) + parser.add_argument("--is_distributed", type=str2bool, default=False) + parser.add_argument("--is_sparse", type=str2bool, default=True) + parser.add_argument("--warm_start_from_dir", type=str, default=None) + parser.add_argument("--dataset", type=str, default=None) + parser.add_argument( + "--neg_sample_type", + type=str, + default="average", + choices=["average", "outdegree"]) + parser.add_argument( + "--mode", + type=str, + required=False, + choices=['train', 'walk'], + default="train") + parser.add_argument( + "--optimizer", + type=str, + required=False, + choices=['adam', 'sgd'], + default="sgd") + args = parser.parse_args() + log.info(args) + if args.mode == "train": + train(args) + elif args.mode == "walk": + walk(args) diff --git a/examples/distribute_deepwalk/gpu_train.py b/examples/distribute_deepwalk/gpu_train.py new file mode 100644 index 0000000..f6c4d98 --- /dev/null +++ b/examples/distribute_deepwalk/gpu_train.py @@ -0,0 +1,156 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import argparse +import time +import os + +import numpy as np +import paddle.fluid as F +import paddle.fluid.layers as L +from pgl.utils.logger import log + +from model import DeepwalkModel +from utils import build_graph +from utils import build_gen_func + + +def optimization(base_lr, loss, train_steps, optimizer='adam'): + decayed_lr = L.polynomial_decay(base_lr, train_steps, 0.0001) + + if optimizer == 'sgd': + optimizer = F.optimizer.SGD( + decayed_lr, + regularization=F.regularizer.L2DecayRegularizer( + regularization_coeff=0.0025)) + elif optimizer == 'adam': + # dont use gpu's lazy mode + optimizer = F.optimizer.Adam(decayed_lr) + else: + raise ValueError + + log.info('learning rate:%f' % (base_lr)) + optimizer.minimize(loss) + + +def get_parallel_exe(program, loss): + exec_strategy = F.ExecutionStrategy() + exec_strategy.num_threads = 1 #2 for fp32 4 for fp16 + exec_strategy.use_experimental_executor = True + exec_strategy.num_iteration_per_drop_scope = 1 #important shit + + build_strategy = F.BuildStrategy() + build_strategy.enable_inplace = True + build_strategy.memory_optimize = True + build_strategy.remove_unnecessary_lock = True + + #return compiled_prog + train_exe = F.ParallelExecutor( + use_cuda=True, + loss_name=loss.name, + build_strategy=build_strategy, + exec_strategy=exec_strategy, + main_program=program) + return train_exe + + +def train(train_exe, exe, program, loss, node2vec_pyreader, args, train_steps): + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + step = 0 + while True: + try: + begin_time = time.time() + loss_val, = train_exe.run(fetch_list=[loss]) + log.info("step %s: loss %.5f speed: %.5f s/step" % + (step, np.mean(loss_val), time.time() - begin_time)) + step += 1 + except F.core.EOFException: + node2vec_pyreader.reset() + + if (step == train_steps or + step % args.steps_per_save == 0) and trainer_id == 0: + + model_save_dir = args.output_path + model_path = os.path.join(model_save_dir, str(step)) + if not os.path.exists(model_save_dir): + os.makedirs(model_save_dir) + F.io.save_params(exe, model_path, program) + if step == train_steps: + break + + +def main(args): + import logging + log.setLevel(logging.DEBUG) + log.info("start") + + num_devices = len(F.cuda_places()) + model = DeepwalkModel(args.num_nodes, args.hidden_size, args.neg_num, + False, False, 1.) + pyreader = model.pyreader + loss = model.forward() + + train_steps = int(args.num_nodes * args.epoch / args.batch_size / + num_devices) + optimization(args.lr * num_devices, loss, train_steps, args.optimizer) + + place = F.CUDAPlace(0) + exe = F.Executor(place) + exe.run(F.default_startup_program()) + + graph = build_graph(args.num_nodes, args.edge_path) + gen_func = build_gen_func(args, graph) + + pyreader.decorate_tensor_provider(gen_func) + pyreader.start() + + train_prog = F.default_main_program() + + if args.warm_start_from_dir is not None: + F.io.load_params(exe, args.warm_start_from_dir, train_prog) + + train_exe = get_parallel_exe(train_prog, loss) + train(train_exe, exe, train_prog, loss, pyreader, args, train_steps) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Deepwalk') + parser.add_argument("--hidden_size", type=int, default=64) + parser.add_argument("--lr", type=float, default=0.025) + parser.add_argument("--neg_num", type=int, default=5) + parser.add_argument("--epoch", type=int, default=100) + parser.add_argument("--batch_size", type=int, default=128) + parser.add_argument("--walk_len", type=int, default=40) + parser.add_argument("--win_size", type=int, default=5) + parser.add_argument("--output_path", type=str, default="output") + parser.add_argument("--num_sample_workers", type=int, default=1) + parser.add_argument("--steps_per_save", type=int, default=3000) + parser.add_argument("--num_nodes", type=int, default=10000) + parser.add_argument("--edge_path", type=str, default="./graph_data") + parser.add_argument("--walkpath_files", type=str, default=None) + parser.add_argument("--train_files", type=str, default="./train_data") + parser.add_argument("--warm_start_from_dir", type=str, default=None) + parser.add_argument( + "--neg_sample_type", + type=str, + default="average", + choices=["average", "outdegree"]) + parser.add_argument( + "--optimizer", + type=str, + required=False, + choices=['adam', 'sgd'], + default="adam") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/distribute_deepwalk/job.sh b/examples/distribute_deepwalk/job.sh new file mode 100644 index 0000000..e0a0ba5 --- /dev/null +++ b/examples/distribute_deepwalk/job.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +set -x +source ./pgl_deepwalk.cfg + +export CPU_NUM=$CPU_NUM +export FLAGS_rpc_deadline=3000000 +export FLAGS_communicator_send_queue_size=1 +export FLAGS_communicator_min_send_grad_num_before_recv=0 +export FLAGS_communicator_max_merge_var_num=1 +export FLAGS_communicator_merge_sparse_grad=1 + +if [[ $build_train_data == True ]];then + train_files="./train_data" +else + train_files="None" +fi + +if [[ $pre_walk == True ]]; then + walkpath_files="./walk_path" + if [[ $TRAINING_ROLE == "PSERVER" ]];then + while [[ ! -d train_data ]];do + sleep 60 + echo "Waiting for train_data ..." + done + rm -rf $walkpath_files && mkdir -p $walkpath_files + python -u cluster_train.py --num_sample_workers $num_sample_workers --num_nodes $num_nodes --mode walk --walkpath_files $walkpath_files --epoch $epoch \ + --walk_len $walk_len --batch_size $batch_size --train_files $train_files --dataset "BlogCatalog" + touch build_graph_done + fi + + while [[ ! -f build_graph_done ]];do + sleep 60 + echo "Waiting for walk_path ..." + done +else + walkpath_files="None" +fi + +python -u cluster_train.py --num_sample_workers $num_sample_workers --num_nodes $num_nodes --optimizer $optimizer --walkpath_files $walkpath_files --epoch $epoch \ + --is_distributed $distributed_embedding --lr $learning_rate --neg_num $neg_num --walk_len $walk_len --win_size $win_size --is_sparse $is_sparse --hidden_size $dim \ + --batch_size $batch_size --steps_per_save $steps_per_save --train_files $train_files --dataset "BlogCatalog" diff --git a/examples/distribute_deepwalk/local_config b/examples/distribute_deepwalk/local_config new file mode 100644 index 0000000..455a342 --- /dev/null +++ b/examples/distribute_deepwalk/local_config @@ -0,0 +1,7 @@ +#!/bin/bash +export PADDLE_TRAINERS_NUM=2 +export PADDLE_PSERVERS_NUM=2 +export PADDLE_PORT=6184,6185 +export PADDLE_PSERVERS="127.0.0.1" +export BASE="./local_dir" + diff --git a/examples/distribute_deepwalk/model.py b/examples/distribute_deepwalk/model.py new file mode 100644 index 0000000..3740ff2 --- /dev/null +++ b/examples/distribute_deepwalk/model.py @@ -0,0 +1,167 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Deepwalk model file. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals +import math + +import paddle.fluid.layers as L +import paddle.fluid as F + + +def split_embedding(input, + dict_size, + hidden_size, + initializer, + name, + num_part=16, + is_sparse=False, + learning_rate=1.0): + """ split_embedding + """ + _part_size = hidden_size // num_part + if hidden_size % num_part != 0: + _part_size += 1 + output_embedding = [] + p_num = 0 + while hidden_size > 0: + _part_size = min(_part_size, hidden_size) + hidden_size -= _part_size + print("part", p_num, "size=", (dict_size, _part_size)) + part_embedding = L.embedding( + input=input, + size=(dict_size, _part_size), + is_sparse=is_sparse, + is_distributed=False, + param_attr=F.ParamAttr( + name=name + '_part%s' % p_num, + initializer=initializer, + learning_rate=learning_rate)) + p_num += 1 + output_embedding.append(part_embedding) + return L.concat(output_embedding, -1) + + +class DeepwalkModel(object): + def __init__(self, + num_nodes, + hidden_size=16, + neg_num=5, + is_sparse=False, + is_distributed=False, + embedding_lr=1.0): + self.pyreader = L.py_reader( + capacity=70, + shapes=[[-1, 1, 1], [-1, neg_num + 1, 1]], + dtypes=['int64', 'int64'], + lod_levels=[0, 0], + name='train', + use_double_buffer=True) + + self.num_nodes = num_nodes + self.neg_num = neg_num + + self.embed_init = F.initializer.Uniform( + low=-1. / math.sqrt(hidden_size), high=1. / math.sqrt(hidden_size)) + self.is_sparse = is_sparse + self.is_distributed = is_distributed + self.hidden_size = hidden_size + self.loss = None + self.embedding_lr = embedding_lr + max_hidden_size = int(math.pow(2, 31) / 4 / num_nodes) + self.num_part = int(math.ceil(1. * hidden_size / max_hidden_size)) + + def forward(self): + src, dsts = L.read_file(self.pyreader) + + if self.is_sparse: + # sparse mode use 2 dims input. + src = L.reshape(src, [-1, 1]) + dsts = L.reshape(dsts, [-1, 1]) + + if self.num_part is not None and self.num_part != 1 and not self.is_distributed: + src_embed = split_embedding( + src, + self.num_nodes, + self.hidden_size, + self.embed_init, + "weight", + self.num_part, + self.is_sparse, + learning_rate=self.embedding_lr) + + dsts_embed = split_embedding( + dsts, + self.num_nodes, + self.hidden_size, + self.embed_init, + "weight", + self.num_part, + self.is_sparse, + learning_rate=self.embedding_lr) + else: + src_embed = L.embedding( + src, (self.num_nodes, self.hidden_size), + self.is_sparse, + self.is_distributed, + param_attr=F.ParamAttr( + name="weight", + learning_rate=self.embedding_lr, + initializer=self.embed_init)) + + dsts_embed = L.embedding( + dsts, (self.num_nodes, self.hidden_size), + self.is_sparse, + self.is_distributed, + param_attr=F.ParamAttr( + name="weight", + learning_rate=self.embedding_lr, + initializer=self.embed_init)) + + if self.is_sparse: + # reshape back + src_embed = L.reshape(src_embed, [-1, 1, self.hidden_size]) + dsts_embed = L.reshape(dsts_embed, + [-1, self.neg_num + 1, self.hidden_size]) + + logits = L.matmul( + src_embed, dsts_embed, + transpose_y=True) # [batch_size, 1, neg_num+1] + + pos_label = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", 1) + neg_label = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 0) + label = L.concat([pos_label, neg_label], -1) + + pos_weight = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", self.neg_num) + neg_weight = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 1) + weight = L.concat([pos_weight, neg_weight], -1) + + weight.stop_gradient = True + label.stop_gradient = True + + loss = L.sigmoid_cross_entropy_with_logits(logits, label) + loss = loss * weight + loss = L.reduce_mean(loss) + loss = loss * ((self.neg_num + 1) / 2 / self.neg_num) + loss.persistable = True + self.loss = loss + return loss diff --git a/examples/distribute_deepwalk/mp_reader.py b/examples/distribute_deepwalk/mp_reader.py new file mode 100644 index 0000000..d4df899 --- /dev/null +++ b/examples/distribute_deepwalk/mp_reader.py @@ -0,0 +1,145 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Optimized Multiprocessing Reader for PaddlePaddle +""" +import multiprocessing +import numpy as np +import time + +import paddle.fluid as fluid +import pyarrow + + +def _serialize_serializable(obj): + """Serialize Feed Dict + """ + return {"type": type(obj), "data": obj.__dict__} + + +def _deserialize_serializable(obj): + """Deserialize Feed Dict + """ + + val = obj["type"].__new__(obj["type"]) + val.__dict__.update(obj["data"]) + return val + + +context = pyarrow.default_serialization_context() + +context.register_type( + object, + "object", + custom_serializer=_serialize_serializable, + custom_deserializer=_deserialize_serializable) + + +def serialize_data(data): + """serialize_data""" + return pyarrow.serialize(data, context=context).to_buffer().to_pybytes() + + +def deserialize_data(data): + """deserialize_data""" + return pyarrow.deserialize(data, context=context) + + +def multiprocess_reader(readers, use_pipe=True, queue_size=1000): + """ + multiprocess_reader use python multi process to read data from readers + and then use multiprocess.Queue or multiprocess.Pipe to merge all + data. The process number is equal to the number of input readers, each + process call one reader. + Multiprocess.Queue require the rw access right to /dev/shm, some + platform does not support. + you need to create multiple readers first, these readers should be independent + to each other so that each process can work independently. + An example: + .. code-block:: python + reader0 = reader(["file01", "file02"]) + reader1 = reader(["file11", "file12"]) + reader1 = reader(["file21", "file22"]) + reader = multiprocess_reader([reader0, reader1, reader2], + queue_size=100, use_pipe=False) + """ + + assert type(readers) is list and len(readers) > 0 + + def _read_into_queue(reader, queue): + """read_into_queue""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None") + queue.put(serialize_data(sample)) + queue.put(serialize_data(None)) + + def queue_reader(): + """queue_reader""" + queue = multiprocessing.Queue(queue_size) + for reader in readers: + p = multiprocessing.Process( + target=_read_into_queue, args=(reader, queue)) + p.start() + + reader_num = len(readers) + finish_num = 0 + while finish_num < reader_num: + sample = deserialize_data(queue.get()) + if sample is None: + finish_num += 1 + else: + yield sample + + def _read_into_pipe(reader, conn): + """read_into_pipe""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None!") + conn.send(serialize_data(sample)) + conn.send(serialize_data(None)) + conn.close() + + def pipe_reader(): + """pipe_reader""" + conns = [] + for reader in readers: + parent_conn, child_conn = multiprocessing.Pipe() + conns.append(parent_conn) + p = multiprocessing.Process( + target=_read_into_pipe, args=(reader, child_conn)) + p.start() + + reader_num = len(readers) + finish_num = 0 + conn_to_remove = [] + finish_flag = np.zeros(len(conns), dtype="int32") + while finish_num < reader_num: + for conn_id, conn in enumerate(conns): + if finish_flag[conn_id] > 0: + continue + buff = conn.recv() + now = time.time() + sample = deserialize_data(buff) + out = time.time() - now + if sample is None: + finish_num += 1 + conn.close() + finish_flag[conn_id] = 1 + else: + yield sample + + if use_pipe: + return pipe_reader + else: + return queue_reader diff --git a/examples/distribute_deepwalk/multi_class.py b/examples/distribute_deepwalk/multi_class.py new file mode 100644 index 0000000..5ffe690 --- /dev/null +++ b/examples/distribute_deepwalk/multi_class.py @@ -0,0 +1,244 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import argparse +import time +import math +import os + +import numpy as np +import sklearn.metrics +from sklearn.metrics import f1_score + +import pgl +from pgl import data_loader +from pgl.utils import op +from pgl.utils.logger import log +import paddle.fluid as fluid +import paddle.fluid.layers as l + +np.random.seed(123) + + +def load(name): + if name == 'BlogCatalog': + dataset = data_loader.BlogCatalogDataset() + else: + raise ValueError(name + " dataset doesn't exists") + return dataset + + +def node_classify_model(graph, + num_labels, + hidden_size=16, + name='node_classify_task'): + pyreader = l.py_reader( + capacity=70, + shapes=[[-1, 1], [-1, num_labels]], + dtypes=['int64', 'float32'], + lod_levels=[0, 0], + name=name + '_pyreader', + use_double_buffer=True) + nodes, labels = l.read_file(pyreader) + embed_nodes = l.embedding( + input=nodes, + size=[graph.num_nodes, hidden_size], + param_attr=fluid.ParamAttr(name='weight')) + embed_nodes.stop_gradient = True + logits = l.fc(input=embed_nodes, size=num_labels) + loss = l.sigmoid_cross_entropy_with_logits(logits, labels) + loss = l.reduce_mean(loss) + prob = l.sigmoid(logits) + topk = l.reduce_sum(labels, -1) + return pyreader, loss, prob, labels, topk + + +def node_classify_generator(graph, + all_nodes=None, + batch_size=512, + epoch=1, + shuffle=True): + + if all_nodes is None: + all_nodes = np.arange(graph.num_nodes) + #labels = (np.random.rand(512, 39) > 0.95).astype(np.float32) + + def batch_nodes_generator(shuffle=shuffle): + perm = np.arange(len(all_nodes), dtype=np.int64) + if shuffle: + np.random.shuffle(perm) + start = 0 + while start < len(all_nodes): + yield all_nodes[perm[start:start + batch_size]] + start += batch_size + + def wrapper(): + for _ in range(epoch): + for batch_nodes in batch_nodes_generator(): + batch_nodes_expanded = np.expand_dims(batch_nodes, + -1).astype(np.int64) + batch_labels = graph.node_feat['group_id'][batch_nodes].astype( + np.float32) + yield [batch_nodes_expanded, batch_labels] + + return wrapper + + +def topk_f1_score(labels, + probs, + topk_list=None, + average="macro", + threshold=None): + assert topk_list is not None or threshold is not None, "one of topklist and threshold should not be None" + if threshold is not None: + preds = probs > threshold + else: + preds = np.zeros_like(labels, dtype=np.int64) + for idx, (prob, topk) in enumerate(zip(np.argsort(probs), topk_list)): + preds[idx][prob[-int(topk):]] = 1 + return f1_score(labels, preds, average=average) + + +def main(args): + hidden_size = args.hidden_size + epoch = args.epoch + ckpt_path = args.ckpt_path + threshold = args.threshold + + dataset = load(args.dataset) + + if args.batch_size is None: + batch_size = len(dataset.train_index) + else: + batch_size = args.batch_size + + train_steps = (len(dataset.train_index) // batch_size) * epoch + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_prog = fluid.Program() + test_prog = fluid.Program() + startup_prog = fluid.Program() + + with fluid.program_guard(train_prog, startup_prog): + with fluid.unique_name.guard(): + train_pyreader, train_loss, train_probs, train_labels, train_topk = node_classify_model( + dataset.graph, + dataset.num_groups, + hidden_size=hidden_size, + name='train') + lr = l.polynomial_decay(0.025, train_steps, 0.0001) + adam = fluid.optimizer.Adam(lr) + adam.minimize(train_loss) + + with fluid.program_guard(test_prog, startup_prog): + with fluid.unique_name.guard(): + test_pyreader, test_loss, test_probs, test_labels, test_topk = node_classify_model( + dataset.graph, + dataset.num_groups, + hidden_size=hidden_size, + name='test') + test_prog = test_prog.clone(for_test=True) + + exe = fluid.Executor(place) + exe.run(startup_prog) + + train_pyreader.decorate_tensor_provider( + node_classify_generator( + dataset.graph, + dataset.train_index, + batch_size=batch_size, + epoch=epoch)) + test_pyreader.decorate_tensor_provider( + node_classify_generator( + dataset.graph, dataset.test_index, batch_size=batch_size, epoch=1)) + + def existed_params(var): + if not isinstance(var, fluid.framework.Parameter): + return False + return os.path.exists(os.path.join(ckpt_path, var.name)) + + fluid.io.load_vars( + exe, ckpt_path, main_program=train_prog, predicate=existed_params) + step = 0 + prev_time = time.time() + train_pyreader.start() + + while 1: + try: + train_loss_val, train_probs_val, train_labels_val, train_topk_val = exe.run( + train_prog, + fetch_list=[ + train_loss, train_probs, train_labels, train_topk + ], + return_numpy=True) + train_macro_f1 = topk_f1_score(train_labels_val, train_probs_val, + train_topk_val, "macro", threshold) + train_micro_f1 = topk_f1_score(train_labels_val, train_probs_val, + train_topk_val, "micro", threshold) + step += 1 + log.info("Step %d " % step + "Train Loss: %f " % train_loss_val + + "Train Macro F1: %f " % train_macro_f1 + + "Train Micro F1: %f " % train_micro_f1) + except fluid.core.EOFException: + train_pyreader.reset() + break + + test_pyreader.start() + test_probs_vals, test_labels_vals, test_topk_vals = [], [], [] + while 1: + try: + test_loss_val, test_probs_val, test_labels_val, test_topk_val = exe.run( + test_prog, + fetch_list=[ + test_loss, test_probs, test_labels, test_topk + ], + return_numpy=True) + test_probs_vals.append( + test_probs_val), test_labels_vals.append(test_labels_val) + test_topk_vals.append(test_topk_val) + except fluid.core.EOFException: + test_pyreader.reset() + test_probs_array = np.concatenate(test_probs_vals) + test_labels_array = np.concatenate(test_labels_vals) + test_topk_array = np.concatenate(test_topk_vals) + test_macro_f1 = topk_f1_score( + test_labels_array, test_probs_array, test_topk_array, + "macro", threshold) + test_micro_f1 = topk_f1_score( + test_labels_array, test_probs_array, test_topk_array, + "micro", threshold) + log.info("\t\tStep %d " % step + "Test Loss: %f " % + test_loss_val + "Test Macro F1: %f " % test_macro_f1 + + "Test Micro F1: %f " % test_micro_f1) + break + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='node2vec') + parser.add_argument( + "--dataset", + type=str, + default="BlogCatalog", + help="dataset (BlogCatalog)") + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument("--hidden_size", type=int, default=128) + parser.add_argument("--epoch", type=int, default=400) + parser.add_argument("--batch_size", type=int, default=None) + parser.add_argument("--threshold", type=float, default=0.3) + parser.add_argument( + "--ckpt_path", + type=str, + default="./tmp/baseline_node2vec/paddle_model") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/distribute_deepwalk/pgl_deepwalk.cfg b/examples/distribute_deepwalk/pgl_deepwalk.cfg new file mode 100644 index 0000000..8c06b31 --- /dev/null +++ b/examples/distribute_deepwalk/pgl_deepwalk.cfg @@ -0,0 +1,22 @@ + +# deepwalk config +num_nodes=10312 # max node_id + 1 +num_sample_workers=2 +epoch=100 + +optimizer=sgd # sgd or adam +learning_rate=0.5 + +neg_num=5 +walk_len=40 +win_size=5 +dim=128 +batch_size=8 +steps_per_save=5000 + +is_sparse=False +distributed_embedding=False # only use when num_nodes > 100,000,000, slower than noraml embedding +build_train_data=True +pre_walk=False + +CPU_NUM=16 diff --git a/examples/distribute_deepwalk/reader.py b/examples/distribute_deepwalk/reader.py new file mode 100644 index 0000000..f797c18 --- /dev/null +++ b/examples/distribute_deepwalk/reader.py @@ -0,0 +1,146 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Reader file. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +import time +import io +import os + +import numpy as np +import paddle +from pgl.utils.logger import log +from pgl.sample import node2vec_sample +from pgl.sample import deepwalk_sample +from pgl.sample import alias_sample +from pgl.graph_kernel import skip_gram_gen_pair +from pgl.graph_kernel import alias_sample_build_table +from pgl.utils import mp_reader + + +class DeepwalkReader(object): + def __init__(self, + graph, + batch_size=512, + walk_len=40, + win_size=5, + neg_num=5, + train_files=None, + walkpath_files=None, + neg_sample_type="average"): + """ + Args: + walkpath_files: if is not None, read walk path from walkpath_files + """ + self.graph = graph + self.batch_size = batch_size + self.walk_len = walk_len + self.win_size = win_size + self.neg_num = neg_num + self.train_files = train_files + self.walkpath_files = walkpath_files + self.neg_sample_type = neg_sample_type + + def walk_from_files(self): + bucket = [] + while True: + for filename in self.walkpath_files: + with io.open(filename) as inf: + for line in inf: + #walk = [hash_map[x] for x in line.strip('\n\t').split('\t')] + walk = [int(x) for x in line.strip('\n\t').split('\t')] + bucket.append(walk) + if len(bucket) == self.batch_size: + yield bucket + bucket = [] + if len(bucket): + yield bucket + + def walk_from_graph(self): + def node_generator(): + if self.train_files is None: + while True: + for nodes in self.graph.node_batch_iter(self.batch_size): + yield nodes + else: + nodes = [] + while True: + for filename in self.train_files: + with io.open(filename) as inf: + for line in inf: + node = int(line.strip('\n\t')) + nodes.append(node) + if len(nodes) == self.batch_size: + yield nodes + nodes = [] + if len(nodes): + yield nodes + + if "alias" in self.graph.node_feat and "events" in self.graph.node_feat: + log.info("Deepwalk using alias sample") + for nodes in node_generator(): + if "alias" in self.graph.node_feat and "events" in self.graph.node_feat: + walks = deepwalk_sample(self.graph, nodes, self.walk_len, + "alias", "events") + else: + walks = deepwalk_sample(self.graph, nodes, self.walk_len) + yield walks + + def walk_generator(self): + if self.walkpath_files is not None: + for i in self.walk_from_files(): + yield i + else: + for i in self.walk_from_graph(): + yield i + + def __call__(self): + np.random.seed(os.getpid()) + if self.neg_sample_type == "outdegree": + outdegree = self.graph.outdegree() + distribution = 1. * outdegree / outdegree.sum() + alias, events = alias_sample_build_table(distribution) + max_len = int(self.batch_size * self.walk_len * ( + (1 + self.win_size) - 0.3)) + for walks in self.walk_generator(): + try: + src_list, pos_list = [], [] + for walk in walks: + s, p = skip_gram_gen_pair(walk, self.win_size) + src_list.append(s[:max_len]), pos_list.append(p[:max_len]) + src = [s for x in src_list for s in x] + pos = [s for x in pos_list for s in x] + src = np.array(src, dtype=np.int64), + pos = np.array(pos, dtype=np.int64) + src, pos = np.reshape(src, [-1, 1, 1]), np.reshape(pos, + [-1, 1, 1]) + + neg_sample_size = [len(pos), self.neg_num, 1] + if src.shape[0] == 0: + continue + if self.neg_sample_type == "average": + negs = np.random.randint( + low=0, high=self.graph.num_nodes, size=neg_sample_size) + elif self.neg_sample_type == "outdegree": + negs = alias_sample(neg_sample_size, alias, events) + elif self.neg_sample_type == "inbatch": + pass + dst = np.concatenate([pos, negs], 1) + # [batch_size, 1, 1] [batch_size, neg_num+1, 1] + yield src[:max_len], dst[:max_len] + except Exception as e: + log.exception(e) diff --git a/examples/distribute_deepwalk/utils.py b/examples/distribute_deepwalk/utils.py new file mode 100644 index 0000000..0958d63 --- /dev/null +++ b/examples/distribute_deepwalk/utils.py @@ -0,0 +1,144 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Utils file. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals + +import os +import time + +import numpy as np +from pgl.utils.logger import log +from pgl.graph import Graph +from pgl.sample import graph_alias_sample_table + +from reader import DeepwalkReader +import mp_reader + + +def get_file_list(path): + filelist = [] + if os.path.isfile(path): + filelist = [path] + elif os.path.isdir(path): + filelist = [ + os.path.join(dp, f) + for dp, dn, filenames in os.walk(path) for f in filenames + ] + else: + raise ValueError(path + " not supported") + return filelist + + +def build_graph(num_nodes, edge_path): + filelist = [] + if os.path.isfile(edge_path): + filelist = [edge_path] + elif os.path.isdir(edge_path): + filelist = [ + os.path.join(dp, f) + for dp, dn, filenames in os.walk(edge_path) for f in filenames + ] + else: + raise ValueError(edge_path + " not supported") + edges, edge_weight = [], [] + for name in filelist: + with open(name) as inf: + for line in inf: + slots = line.strip("\n").split() + edges.append([slots[0], slots[1]]) + edges.append([slots[1], slots[0]]) + if len(slots) > 2: + edge_weight.extend([float(slots[2]), float(slots[2])]) + edges = np.array(edges, dtype="int64") + assert num_nodes > edges.max( + ), "Node id in any edges should be smaller then num_nodes!" + + edge_feat = dict() + if len(edge_weight) == len(edges): + edge_feat["weight"] = np.array(edge_weight) + + graph = Graph(num_nodes, edges, edge_feat=edge_feat) + log.info("Build graph done") + + graph.outdegree() + + del edges, edge_feat + + log.info("Build graph index done") + if "weight" in graph.edge_feat: + graph.node_feat["alias"], graph.node_feat[ + "events"] = graph_alias_sample_table(graph, "weight") + log.info("Build graph alias sample table done") + return graph + + +def build_fake_graph(num_nodes): + class FakeGraph(): + pass + + graph = FakeGraph() + graph.num_nodes = num_nodes + return graph + + +def build_gen_func(args, graph): + num_sample_workers = args.num_sample_workers + + if args.walkpath_files is None or args.walkpath_files == "None": + walkpath_files = [None for _ in range(num_sample_workers)] + else: + files = get_file_list(args.walkpath_files) + walkpath_files = [[] for i in range(num_sample_workers)] + for idx, f in enumerate(files): + walkpath_files[idx % num_sample_workers].append(f) + + if args.train_files is None or args.train_files == "None": + train_files = [None for _ in range(num_sample_workers)] + else: + files = get_file_list(args.train_files) + train_files = [[] for i in range(num_sample_workers)] + for idx, f in enumerate(files): + train_files[idx % num_sample_workers].append(f) + + gen_func_pool = [ + DeepwalkReader( + graph, + batch_size=args.batch_size, + walk_len=args.walk_len, + win_size=args.win_size, + neg_num=args.neg_num, + neg_sample_type=args.neg_sample_type, + walkpath_files=walkpath_files[i], + train_files=train_files[i]) for i in range(num_sample_workers) + ] + if num_sample_workers == 1: + gen_func = gen_func_pool[0] + else: + gen_func = mp_reader.multiprocess_reader( + gen_func_pool, use_pipe=True, queue_size=100) + return gen_func + + +def test_gen_speed(gen_func): + cur_time = time.time() + for idx, _ in enumerate(gen_func()): + log.info("iter %s: %s s" % (idx, time.time() - cur_time)) + cur_time = time.time() + if idx == 100: + break diff --git a/examples/distribute_graphsage/README.md b/examples/distribute_graphsage/README.md new file mode 100644 index 0000000..7e424d4 --- /dev/null +++ b/examples/distribute_graphsage/README.md @@ -0,0 +1,57 @@ +# Distribute GraphSAGE in PGL + +[GraphSAGE](https://cs.stanford.edu/people/jure/pubs/graphsage-nips17.pdf) is a general inductive framework that leverages node feature +information (e.g., text attributes) to efficiently generate node embeddings for previously unseen data. Instead of training individual embeddings for each node, GraphSAGE learns a function that generates embeddings by sampling and aggregating features from a node’s local neighborhood. Based on PGL, we reproduce GraphSAGE algorithm and reach the same level of indicators as the paper in Reddit Dataset. Besides, this is an example of subgraph sampling and training in PGL. + +For purpose of high scalability, we use redis as distribute graph storage solution and training graphsage against redis server. + +### Datasets(Quickstart) +The reddit dataset should be downloaded from [reddit_adj.npz](https://drive.google.com/open?id=174vb0Ws7Vxk_QTUtxqTgDHSQ4El4qDHt) and [reddit.npz](https://drive.google.com/open?id=19SphVl_Oe8SJ1r87Hr5a6znx3nJu1F2Jthe). The details for Reddit Dataset can be found [here](https://cs.stanford.edu/people/jure/pubs/graphsage-nips17.pdf). + +Alternatively, reddit dataset has been preprocessed and packed into docker image, which can be instantly pulled using following commands. + +```sh +docker pull githubutilities/reddit_redis_demo:v0.1 +``` + +### Dependencies + +```txt +- paddlepaddle>=1.6 +- pgl +- scipy +- redis==2.10.6 +- redis-py-cluster==1.3.6 +``` + +### How to run + +#### 1. Start reddit data service + +```sh +docker run \ + --net=host \ + -d --rm \ + --name reddit_demo \ + -it githubutilities/reddit_redis_demo:v0.1 \ + /bin/bash -c "/bin/bash ./before_hook.sh && /bin/bash" +docker logs -f `docker ps -aqf "name=reddit_demo"` +``` + +#### 2. training GraphSAGE model + +```sh +python train.py --use_cuda --epoch 10 --graphsage_type graphsage_mean --sample_workers 10 +``` + +#### Hyperparameters + +- epoch: Number of epochs default (10) +- use_cuda: Use gpu if assign use_cuda. +- graphsage_type: We support 4 aggregator types including "graphsage_mean", "graphsage_maxpool", "graphsage_meanpool" and "graphsage_lstm". +- sample_workers: The number of workers for multiprocessing subgraph sample. +- lr: Learning rate. +- batch_size: Batch size. +- samples_1: The max neighbors for the first hop neighbor sampling. (default: 25) +- samples_2: The max neighbors for the second hop neighbor sampling. (default: 10) +- hidden_size: The hidden size of the GraphSAGE models. diff --git a/examples/distribute_graphsage/data/reddit_index_label.npz b/examples/distribute_graphsage/data/reddit_index_label.npz new file mode 100644 index 0000000000000000000000000000000000000000..69c2ae1ced956dd5b40221ea0e8e11d2b470230a GIT binary patch literal 3704478 zcmbT513Y~LCrc%B1QC#7?h<=+g`1EW+|2~ONox}WXYK>OS^78|2K8l7TtQb zY5RZUm0ES~)%Jhmy*jk&-u8c;HD96p1@q<2nJs6!!Rh}0{>6@DMWZk}V=@+FGY;c2 z0Tc2~zTN>zbW+Bc7XBxdPR%q-%k<2^x0#t)nVmV9lew9f`Iw&tSdc~d4vVrFORywM zvkc4f?25?${a<-qffZSam05*VS&cPVleJizb@(ouuqiJ&u+8-7Jz>3?>uFZFg>K1K z{D7_5hHcr7UD%D?Irq=7yq>yr^l*mt(S4c!)3Bob^Z*XxM;y$d9L|v(#THq^{Kn}| z>9mW87ALI7Oylvhgr2SEa4zR_As2BOmvaSI@pG=>I)23=gTnsVs2_yYh}f*Ryq>N> zm~N}y#&5Zu!%eqC@8b8|%{|=9{XD>Rj@v^diNF*oxtFY~hi3$hT4uwta}z$vPWu{cY!49l`SE3y)+vKni$7HhLE-(@{E zW>Yp}bGBehwq-lEXGeBsS9WI)_F`|Av%i0L90wR5$U*#wA9E;2a5TrTf)@hg^aOTn z688TjJ()9j(|XL-bGU$uxP(i&jLW(1emKtyTnZ1smB#Ow|L1xQ*K!@dP_6tE&Q5WxsBUtw?}-hcXK}v@Zf7(g#Gq|KEk6s#)r1=gg(iic$#O~_p7jiTbK1UUgr%ieH!k6OEzS6$$%os-DgnoXI|3kId0?IiCx-h<)aT2U-m$ z`ZD9o>C2dim3n30upW2ghyCW|T|`Syl-lof1#6A6hfAMcV}aMOJ22R$~p;Vr|xCvp2)}`%kQ}zv~-sNSFBt zFXJMb8h`Kg{psaOL@V8n9oUhb*qL3}mEGBcJ=u#lJ<$4Smz{`y`sZU|e+|+faVSS{ zBu8;H$8an^;W&=x1Wx26&hv%Qr+Nyfayn;lCTDRT=W_uw{27kVLcN$vxRfjT89(Q0 zuHjm)8eD$W@8atdvN%UJx#*|FO)J($+%*af9o0*xF*_fRzU0t6I z*pQ9bgzvFATd+0Tur1s3Lw031R!I=ntEcY8-t5D^?8pB6m_s>?BRG47#5XpU8DGwo{G6+~hF@?kzvNfkz>VC* z&D_FPzEQGWf5#o%$zA-O2UCUfaj)LT1FvuAAs*%rJj!GIk-vMKozy?^6o2Mvp5a-Z z<9YtV3;d0jEa#%W%z>_Vf9NZ`&KtbNJN%P(d5`z`fPe9CKI9`l<`e$Ir+mhlMZ@Fj zU;Ugf`HEA&3eP){qlM#j{YdDcwzJ=kFrVA@M-0=&WGu#J9LD7vjL(Ej%p^?4pVEZ& zNTE|Q71J;sGcXe~GYhjZJ9986b2AU~G9UA^01L7(i|`#5WpO^V-}a{s+f~|lrXk@8 zvAmw@g=-~UnN?Vo)mWW1S&OwD*Sz5u)7dHp@(&DoNz_yO;jzKw3n z_Uyop?8GkY%5Ln=9_+>5?8AQS&w(7ok2shgvzISuhU#G)!BHH`PdJVfIFXb1DJOFZ zr*ayna|UN|Hs^94=W_uUauFAE372v?S8ydi<0^j6)m+0bxQ^?&gCW;Tf8npZ#6LL04-T&A ztGveR?B;dVO?`{&?2kM8Pu}G{{>8ufkdOG3&-k1#84*2feuq#$-{i598=J z7@rB4kcpU#$(fpIn2x2)KcmjXx0!|6n4LM8lew6ilYN04Z&!Gp%4>YLADrgb1z4CB zt!X`u2pnZR%3P6WTMRB_|(>QSeNgz9_urcA51sYjo6q?`5s66 zzGKqqVR_Asw_rHaOaJV>p)MIGIy8jng@UGdYX1IhXS|p9{ECfUvM2aa3eQyGq-R%cW@{7a4+}sAP@5g9_1-s;BUOhOT5ghyvFOy=?zb}^&M`l z93J2I^nE^HcE|gne#DoI6eFCsk$K2+I=c=;Gaj8W*v0L!bzHu|_)NfrOvI!)!g5pS zluX6cOw07lz>IvGnVFT@nS(i*n|YX*`B{*KIM^FO-qA%_jKx`!rC6F}Se6x7k(F4P zef+$nimuA)tic)m!}EAez1riswywka{LS^afo{acY{I5&#ujYJR&32SY|D1+z>e(9 zuI$F{?7=J6vzP9}zU;?=9Lymc!I7`c70$EKdJM;MJj-}Kn4*s-5Bqnfp2NAE#|2!- z#azbaT)~z6jH|eYUvMqg@k@Ti4cy30+{~f5!*+k8w{jc5<#v9@9o)%X{GNNbm;1P% z2YHA`c$CL^l0We@fAJ0c%6Y>2|6;tCzNoLTQMmj?+|W09n|FA{{qO2~yw3;xi+}SG zAM+nR4#n&KQizSd7ECe1q|sfQgudKj#h0Po|SI1yeE= zQ!@?IG6OR*6W?YQW@C2dWG?1r9_C|{d|^Ec=^`x3Vr=AbT0)m(DVAY*R%B&XVO3UR zb=F`l)@EJSV-vo|W^BP$Y{!oLke%3>UD=&I*ppKu!t1j>dRP9izt(yK+W1HO%i#orG^ODU&k=Q!x$GF#|I)GqW%U zb22aM`anTpU4-wjD2uZU%dtEwvTMDtU6piYR$(<(XAL&16Yf`2*I`}OV|_MYLpEkp zzRwnH$yRL5_Uyop{E(g4nO)h9J=lxA*_Zv;p946MgZL4Lau}!kdgymwzl<_InxAkS z$8%EAaQ;qw-JHxRoXY8($=RI4xtzx+#lrj->BU^e70he8Th{+`<7@Z@*K!@#a|1VW zGr!?Be#`CL!JXX2@41_It=B%ipNDvuM|hMei-+z1Q6J|?{=`%KnWtIZ{m<%iJkMrs z|5ab)AH2r=UBh+jhQ7tyyu&|vm-qRAfAMcV;$uGLGycoxe92dgh#mG%Bt~WwMr91f zWGu#J#S&pYadkYt!T4P74SaI|*>w))WG?1r zeiq?7EXEQn#WF0*axBkEtjwyc#@ejQLnXuhtf%kl2KxDD;e2YO8?yj|95N&J-K?u7l?s%3bdn`V3lXL1&2a}MV+sW+O=)APBQOSqIPxRRgo zbFStZuI1O<%5D6X+ga?xaGc9m58JoX_-^jyKJI6}vf+M*^$$G4qkP*N-kxU()1NZ_ zGf(pj&+;69;RXK6-+7Ujc$t6j8n5#PM|eGcTi@Yb-sc1U#lJbcT-csR`Z1sIA3o(X z{>$fl!Iyl+h}WMxU@XREJifsMOvF(>c#>FmC?D4MEuD-fygo^xQ!*9Pa=iVONoQeJ zW@C2dU>@dWK4#1wt{(+-L0lz6OR+S|u$T`9l+)!|k(F4&bX9dV*5b{u zni11%e_iA6vOXKK5&!h{M-$zQw`^Z?-GVLIimlm(?bx38%%`LN&2j9kyKqs(aNN7; z?(D&y?8QFp%fbBF&v8H2LpY4X`M32NsYi1R$MO@7<9JSB)ko* z@B)A3Z~UDXd5M>Kg;#lvPtu0{eqG<-P2Og-@N^b&S3lt2e8@+9%qJY+jq+QZNBp%IjTsE%&3gUn2g1^jK}y)@Y=ay0}|;s+0h&4-_os||IN;X>Cfy8$1SDXQ!zEu zFtQI2rq$_~o>AT2&ivmto`qSNjoF!lyX?2zIuG-*W3{lJ`E>ynVi6W)-!kF27t_UA zilteGWm%5pIl}o`QCDHY>S2AV>FSJQKh)B-S%-D`F6%L_`!&!F*@W-28JlxJ;;@}9 zbW47~)@;MJY{&MDZ}}Z{Cw696c4H6rWkDYV`B)F(aE|0Cj%Jn`VLy)3<2iwsx`gY= zr+PA{avEE>&d=1dIG6LefD75HSeX9@?!VOdN`A&w{DNz_j;Ec!TlKfx&Yj%FJ>1K# zmcL&g6w8UnTf4^KrXY+!mP}}oJ^G??9cqV01L7Z3$xbn z@VH32Ay~wCah6~ymgQfLYeij&m069|S%bA%hjsZb>#;r?vN7Ldw47mmo9Pz(fNi)c zeweO-$ju|Lby3(Fg%KjL6E@P4?D^$-s70n?%SjV@um zM(B|o#ZS1#=lCY*iJZ(SoXXnW!hEOe8Jxx0oWr@C$N5~q#azafEKo0;ho9@!T*EJT z(+je7dOf51z};rOgHv#Do4JEQxcZf||W~+*G zJyh@2`*@Itc$h!%2#@kd9%rVeVLj$G56@rYRtHbH{WQ<=953<`H<-^K`n3IcP2XUL z{9$`<>D&C15BQKzIOl_~p3n4izT|(uwk5zR|)@B{n<-4rMhFoGkjdfGL&t`1S*{(M&bw=+WZ>_I13&*d6 z?#K@ryLq_1tM0*`?8SZ@z=0gZk2r+GIGiImilaHe^2h4&oXAQ1lv6mB(>R?oIFqwD zn{zmi3%Qufxsr93hW+!IUd7M3mV11CGO$IMe!cOpxPhCvnOpcZ7ds!f>TUd%+xZ=L za3^>1d+z2Q?&Uu2=K&sM8o!Y0kUq>KJjtJUia+xV&$01?uwfVUul${tc$GJJlZRS{ z{d$!5jNj)2uJL&2<`+=>ZTtzJ@i|}cC0{YZ=TaguDx)zbV=)fnGa(Z(G2ddG9N{{c zOs8O!55jh)(y5t-X?d_t*q`ZjCT8JA=TT0*N$1hgwua^8*AJ70=b-|+APccDyWI~n zdPf&!DVAYbmSaU$W>r>WP1a@|zRP;7&xUNwrfkj@Y{}Ma!?tYC4m{a9?3WL9XLez& z&%$x*q4U-X`>mJm%YN+7*logm2kF85n8R4VW|(fc9>t38KSqDTaU9QyoXn}5@p{}Z zV4A7tay}REW5;=kj$0yZ_g|62_O39#n#Vov*6MZqk{h_0U-KJ&%kA9BUHqQAxtB4= zhW+(p@33BxYlibPM!PV6&~(T6Baib0Px2@J%riX8bG*RI{DVJP?lpa#H+hShEXHOW#$`Od!T3zT#2v!= zCDOmT?j+SIn3AcOnrWDp>6o4wn30+IHg{Wo7JXXh&^eilxtWJ~`Jz%dpYrMAuGd9$ zQ5JiBJ4>)M%drCMG!8qYl3v#_?5`@iDyy+NYqBoiWj)qs12$q~He)NcW_xzvhwQ{2 z?8)Bj!~Pt|LHw8_`1^-pJICmuABXG7I6a;dIFXb1DJOF(r*Q^na}MWmJ{NEy7jY?< zaXD9Vk~cc6(yO_KU+_zQ#SPrkDQy2T-(TKh{Dkpu^j2=;x4dV%@ANKy&)wY1?_9t4 z>HR#&L;Qh9c$CK&Ej$b&j_VWriMg_b34Yc~-V1$NpJDu&Vf)YN^ZbRs@^@b3!_MJ; zf9R{c#@qap_xXSi`It`_&o733s-N*CUolD|>)j<7O-E;@G+}#V=$MSf*o?!te1q}% zmi?SiC*qq-@_ITZWpbuqYNlaYrek_$;M&Gv!I^XxW@j$uW*+8cKIUfu7UYl4!@~Mh z*RUVo(ZyMUC0UAPSeE5jffZSam05*VS&OwgO+A+}@4d*^|B4hxgsTzaGePd%}DN>yJ5vLpjm&(QrM2qdA6S`3c8y z0w;13Kjmaj;WSolAI`g(dKPDM4(qzU%+(9Hgv+>`E4Y%Y_&M`=oUPGca4pyIORncv z+`!G;!ma$4+xZ=La3`aU(^^zqzkxnC^-GhtK$&FZhxXZ-)CtVKl~MEH+pbUT4M8@%RSg zGXWDa5#MBDCTB{fW*VktdS+loW@2V$VOC~icIIGC=3;K;5@?Ebp59otD#KSzoV?4pLJje6=g}?D#uOBb!%lv~^d4o53i+A`Z@A5wTMh(}m zzx3bi)IV(ZBmJ09`JV0nS3mIw0iq=i_dDYkI!D(r7?ZIWn{k+kiJ62+nVcz@ifNgS zM_hN_)|r`=*_fRPvvz5R$^sVV}GwF zs_UAp#Ulg5{OalYY{VvP%02PIaeq(0&t`1Fa@oUtTkAH=GAN99)ScLwU0K3(CE3Gx zANFNGZnobC=?jkI5Iv0FnC`0ijxnA$W4LaP*N@%)sh-N|oWot-XE|RlsD9YjXl_#>4%5y z&&dA92XG(bBee`Hv%Q~GC~;W?h?MAQGOf8+1G$jkhLS9q1zc%3(Ri`y*c zuD;K|_>hnIm{0f*pYj+)UJV*@tj`)tWn&BA`` z;C+%G8t=r;?8ffw!Jh2J-t5P!O~U*K=z$!>!TgvbIFc`|*J!=Rew?5ua|)+&8mDsx zXL1&2a}MWn0T+%9=g}g)n9GeX)yw!9o3;zDo7d`f{E8d6iJQ5FU-KJ&%kA9BUHqQ= zd4LCbh==(DkFc@hRAqfQUdN4};7Oi(J$m_}e zfA9*g@;Yzuy_I44lk$f3y=DA1@37~%u$;U49`Ex3AM!ER`u@>B`YErP-*f$fuNaXu zEH5&nFdCyX24k}B_;A0>*Mo74$K@ML#F3_dODAK--QoUQ+@8+(O^=%o9p}u(vv8?D z{FP1TWG?1r9_C|y7Gz--;X5qKVl2)QEXiII!upriWmuNwS(#N>mDO0CHCU5d%)hp- z!*^Ma_1Tb(n9BRD8tY#?Z@#aau{l3r8@6RTwr3~ycYM0&uI$bp?8#p2%|7hQLFU(A z4|qM!kNCUo7_2|$5Dw)qP8u2>e5crF-*7AMn9okVn}3_nSf3Z%Z~Pz+ z@i2ej5gz4_Jjql1ndf_j<8xM@;|2c4BzwYim-QdK!W+EFTfEJ?yw68`%zyZj5y`@S zjKnC6$_LKFxBOr|hVj^p%lJ&lH<^roCJo0qg-*-#%)m8M!un*=Z! z^D;jRvJm6V3d{R!dRV{W#s^Og<0bVBT~1dV7M@Vc>k6#QDy+(1-M_l7!J4mcH^2J2 z0UNO~oAQ0OU~9Hv2X^F#TsJLjR~Oxt-PnUM{eHe)x;OiA0CPKE2k9Xk%3&PN5zJ)2 zkJjTkffMJ*CM_6_3i7z@n5Ewb0wELKA-ERUO#=I z*YQiP=U3dwP5g#ixsBg)JHO)&{xBmPzg9!T`B&Wj-{bbZ+|PqN%%f~={ZHzjc#0`b zhy78&_3^y%U-@`jxc#EO%4=NW4}K1E|69gy^A7*yUB0n8%=a(-Hy`r}|KU>>_J_(} z=$DM*@3KW@G)89(#$*!bWo#XXaT$+qFg`!DKa=WN=95~dV|r#_MrLA-;o-Pu*EyJr z$Gm>Xqw_I83$QSY@EsOoac1`WN=xXHEXC3+!*VRoI?lh%v%`5=$#_*(XARb5ZNAHT ztk1!t!hUF=8?q5g&k4(GqMNb>TeA6_Fx>~bHQTa1^ZG-xopfh*WjA(b5B6ej_F+Hv z=Kv1mAb!Nb{Fp;IjKevCqxcCo%njQ)UQgtM_+dZp+7%vG(~ZyO9L{CIs9`?y^+GP; z3VzPDT+gq#ft$FQTlh7<;Z|4z`yvAkNDX2;rYd| z{!fhm!{>a#mwd&D6k)w1F$$wH8l&@><;Bu*7?*D_J`*w#6Eg{uG8t1a6;m@U(=!7z zG85lsA%8$Ri_XRz%*XsJz(Op}k}SotEXVR}>UvU1S7CM5U{>!}ter7DPHP#j%Xe9i z4cL&4*^JG(*zaj;t=q5zJMu$zVGs6XZ}w$B_UAwj;>R4qp&Z8H9Kn$s%`u$FAsz>x z>dBlJC!D8K^)$}lEY9UT&gTLyfr`pwtlOv1OgVNAGgC)cT&hG|)#Y&f45czk3qp7Hf`&%<&v>CDW=?99PA zUdQFqxjE5(&Zi5o5R32~7Ud;>?<7alus!9BmuDqbXDzUgJ-yA1 zw`41}VOzFidv@f9?949gy)v8^39E$t-62}ouif3=gFV@Y{n(#_SipJ@(Ze{LBRGn&a>5e4Zq-8uH%Re;rv;zzv359!}vzMiJQ5FUvq=yZq?iPEhAQi?cQX%oyK=@ z5BG6D5AX*b;ZYvrk37y3Jjql1nWuS%=XjnM_$x2+60fqo*ZtS^E#BtLU&40(sqgVV zAMz0&^BMo;(9gqsUg(!R=j-B#RN?kWjLhha$ykidS{^U)^vE^gd{3YgGBK0zEhc3$ zCT9w!WGbd%T4q`u);qJ#!fedWoXo}C%)`9Q$Nc=-{0r(rEX<-T&JuhzDV+Z$bs3gr zIW~DeOjkiyWF=N+6;@?6)?iK6Vr|C09QIE=-H?sgm`&K6E!dK+*@o@do}Ji*UD=J@ z*^6l!hV!Ja?#BTf$U*#wLpYSfIf5fOieosIzNu>A3Q0y{aMC+Vr2&I_(Tv-EFz zv0ldIT*=S4il4KG<$a;o@k_4f2G;Eup652|P29{a{F>YN9d~da_wxXEd%bi>ALb7{ z!lOLKA9$(f3&nU?98o*9^lnVFTJ)CtSYp>r}n3-TQnV=0znc~;3s;Tz_Wh znVikJoX1y=$46zud>0x|m@DkZ#d-;s@}l)wsXyZ?uI3tk!7sU538O>{w1d+z2Q?&AR-p3%}+!+{$hIjyt%MySaz`T@OmRz8x@rkcW7fKd|`jaD0yG6FkXN{F$eD zj_3Is`&|f+^Nad2|KK%V=L5^Xsc-Qv@9{qW;@^D8M|{G6_>>*?gzZf4^N6pEN2Ckm zkr<898H2GHn{gPI@tKf`n3&P>hy9XFCua)AdN16bZEwVX|H?6)+tah%@&9g)$fz?h zGqW%Ub21lmvj8VLZwl!me1}C@jKx`kC0UB4dBggb)#X@`m6&H=#DD*)>gue)nykgz ztix&UUtc$1LpEY#HepjXV{^7(OSWPP$EUS!!;b8eJ-oj7P^UJ1SKWfMt{O_oXAQ1l#@AyQ#p+@Ig7J7 zhx0g}3%H1jxrED@-TJQ3D>?r_#DD)j*K7C%*YZoQ=SJ>z|F88@kCScsTYkqK{GPkH zm-~2t2YHBxd6GZ#4Ab~Md*}2oyubyXzc1=byv!@S#_L?-ez){(MmZGm-@iZgUEbq; z{>^mHBS-w-zpU=J((8gJZvU6hxx#W^>Q`K8JaYPo|Ncc`G{#^|#$s&7VO+*zd?sWf zzR4s^%H&MRR7}IPOwSB_o0*w~S(%O5nS*r?hwaU!zpx()=t3;acUY9gxXF21LYLy1 zyW#kh)#douax3d9tjZd!$y%((?p6tcm?86pE!f_d(2XYWU;$VKvAsotK9L|v(#nBwYu^h+otY!aA)RXur zCvys?avG;|24`}&{XI+1;atw=LN4NBF6A;V=L)XmXI#b4x%Ft+&tK>-xsjW=nOpb` zw{km+9Sif@p}*%I?&kp>-y7+_I~>)`eZSz?>)UyfKk*cQ=4tlb6zRYDozdUS4(s!a zzQAMl`z3vuv40HHU(qS_4Skax{C(;_^*yG$9O=IqJkX~sXPfnSYWx}hN$<`53$FplIHj^#K`qa2c0#1y}Nf$H^M~1#8a@^UGQ?xX$=`ZscZe;WymI?cBvfg~R!@ zTkqvQ9(+9=KlVIuRR746Jk2vq_j6d^U-Sh|DHWFctG>j`{5MAUdf}?R#_PPno4mz4 z{FBl5h2=cZkNBAX@E7a(O#jR0eCYO<`X3!BW7xhZjK=7U$=Hl*ed6kPyzRIr&F>x z;w-_EEXC3+!^FA6@hq<^up%q78mqGgYqA#WurA+aJ=SMK7ING-czxFN_3dZF_P(#1 zvtHaN|J~41x8etE!**=X4(!Y>?84v#-FhDm?;0v;Fu zVkTuWCTBJ0V@jQx)s3gs>6o4wn30+IHZwEcs&Ky7F~82ghV?AfBg%jOliPIpSb&9C zm{;?L>5J&1Y;3;8b(=54@+#^|tjsE`%4)36e7}YDtEp?THp{xbu1;pZ*EC+?aaevE zx6iH}uE*_l2mWdL4|OMYW*2s4clKZ}_GVxHdn&AdKRt*a@na65RZbk5`~&f#3n<9sgQA};0jON(qs(+EOxMKgpEJhK@*H=(8P?~bp5lJj^bHPM6wbpt z`Y!MBKFh2O=jTKHh=rWj|LW&_!I$h=E-WYV+hP5qaG>)irjEtfjKjE$$M{UZgiOT5 zOv0p0#^g-FluXSuOv`kv@<&+zYRqUn6W?ZL-q{(Z&#JRAJ9986b1^rIux7=u|K8Ch zS&F5(t6VtlWp#O0;77T_?G^QHUx!rD)mVcyIc-;1ev>O`q zNAK$vY{Rx}$KNckqwd0P?9N^sz=0gZ!JOiJ8>Xl0(K^Gku$`aiaU9PHoW#jYd@byk zsd^e)<_Y67bz#%Z)^j+Q^SF?UxR^`1oGZAJyUqV|y_yx;hU5N)Ud!RGBXc@AYo(d3`(gaX%085D)VR zkMbmc<~jbt3;dP8@poS2CAP7>SM@bs=MCQEE#Bh;KIT(C<8yY;6ZT8w%wa!9VKhc( z48~#{PIo-x={FdkMQ?`rCeii6;v$mjWK7N!{N8k_bZVyIJj=~HF-(}vcn;=dZsuWL z=3{;qU_ln*J1oZHEWwgowlAE2{UDjh`HsO1GpSxX8TIiN+ z#nx=c_PkOjTo*g&57~)b*_}PulfBrReb|@%*q;M9kRNd{-}@vS$Dw){M{*3ua?|aw zpU3NooWv=d#_62NIh@B|dxztf>`s{PLgS0Lm`k{n%eb5?xRRf76+h={uHhG4%XK_o zJnWY*^?GjLCT`{yF18)t=xzL#+u7CYsa^Ve?&dxoRY_cJN%P(d5`z`fDieI-?^SV)zA2X5m~}{5s6V4jnNr{F&Ud% zZiVwJj*iQCe1i#?h;K46lQJ1o-V5uMQm5tt+mlXbU`D>pZtkB|XJZcL1rFdKjjQuM;pK6Y)*H#iUHdG)&8M zOwWwW%xuig9L&SK%+CTW#KJ7XcUY9g*!D#@o+Wi@UVjv}yPU4Timb%Stir0S&Kj)A zTCB}Ftjl*gE^GLIGiJyq)%ASQF=7T@)M5ZcuwF%PT~|!rT&T=7He`YNp{2`NMjp*SS6p=Vw-(ow=EZd6|#d_J{pdSQp_tEXv|6#nLRpvMkRE zy!Sk;XH{LDwOE_8y>6+m8?Yf8u`!#n8Jn{OTk?a~x4#JM(MGprwmxCJz3#vp4Z``{ zQFmfzc40SmXAkydFZSkCuZQ~TXcNM62Izqt#E&?bLpYSfIGiImlA}0=wI7A$P0$lL ziJx)`r*ayna|UPg57)K%x}N3y7(MLYCB~O>1y^!4*Ki%b89?w?s_W#qYGJM-w1rpu@Evj7XS5DW7i7G-gkU}-L1 z7PhBgl(0ROj8|nfR%Z>?WG&WaUB1hDY{1Npb7S3vP5B<*XG^x?2W-tYY{&NOz>fTo zo!E`t+0)~{x9-D!tQ$4#pFujl<1|DM z#azOrT+R~F!ghV8tLYCs&wgoqJvVS8H*qt!aI*PKoK6HoDHp5_^@trq5gPM_y5yujc1J1_Dw|6mvEb5&pC4c_D( z{>i(%$I9=8_4->sVC*&D_GTxs?;lXS;6ceB7aT@`>ZQ zNAG2&f#JM3pbxUJ^Y5@e!lOLK<2=EW?9)8V_q0C4v+NZ&oPT}!i}8>2ulhIs&MUme z>%74)J-^@9clamovAXB=2l{V5;Xi!JXZ)AX`GPO`iV-=(b#1=m6Gca5G{$5sE;4-r zosfx{l*yQ!DR?qo*srN{x7eXm>$FVAd#2B*GcnB@;eNSvZsuivridSob3t8*MHsVL zc->iCPcz?gx;!hgGOMsEtFbySm`_bzi*;F#^_e(+*q+9^3EyKgHfIaAVr#ZxTefEh zc4Q}ZW*2s4H+E+a_GB;i<16nQ9iRtt5I^Eze#{{p%3&PAQ5?gu{Dk8;k(1cd_q8YM z`Ffh3&Y3L#GMoo<^jyy4LN4MmF6T;q##M}!FdWy_dL0WJ|4MJ*MsDI}ZsFJ5#y#B2 zeLTQ}Jj@?>j6d=OPx2?8;?F$IOq;|0IL3CoGbm~86y_t=cB*qR;Kh22=n@$0MmaR7&M7>9F|*B7Jo zXpZA}PT)j-%E_FKGm$U+ZtUmD~6& zcks5y*Dk%A`?#M!Fq-!j9M#8of+u;3=XjnMc;9j_>Px)LOeezmb44$=+?)CqZ}SfC z@*e-<-+as`{D)8Zm*xDcpYs(XSFNLMGzYkHUPC=%h@>@9So4&K7LR)@;Le zY|l>Y%r5N8>Z!u=dgz|)#op}0e(cWy9K??}m>+YC{gAzHSl)2sqd1P^Igyk2DJOF( zr*j5paSrEl0XKR6U8#>6+nGL1Sl%wZm-~5u z2YHBxdDi>0kLe$Ik{^2>`_A^BHhzX@d5-7#3xDJ9yvR$u!t1=jo4m!_yu-V^#|Qk2 z5BZ2s_>|B1FQ4-T=cNt%bs-~pe}7~~VKhc(Ovd7h?O{G~bv(vr0w(0Jso{E-NN>v& zt_P{p{Xd%SGJJ|^0pKtV(nt!DA}Zb8NOwr5APv$W9U>{INJ^J4IT+Gcp%*z5S%pxqtgCoQCO6pSll%;vW>%P1`V?V0ss;tICnZtUk>ze$G^;nBelr@4XJ1>Cf4mU$7Nhvklv_9UG+!+iS~i#=CP-rSSMyx)1xZANz9v2lCSL z@ce7$X^8Pn6T$!m&xtZIzojbUTySbP9_zU;*01xpnkFd1=PC2E| z@GLKIbcS$WxU8@6S3Y&VuIt}<*X!t}zQsHIiwm8e#2oL$x$4`@tnx-cK`*BzQ!+X5XhkV4Zi-hMr z(NFm=|KoGMzS7BA=@%@Ne`ZLyLeST-XjdWu+Wix)x=4`>1Y{j;0&knq4JDqe_c4H6rWG`Ow z{@+{oVPE!Re-7Y44&q>b%?$;^ybsgEIf5fOieosI<2ix*W{1~JqDo=CsgeXIdHe@X z<8$sj9xRINH=Xjo%c$ruE8?W&?_xOF{-}O!2<{kdQ zzZqe5nE$)_AKv4AKI9`l<`e$Q|M-G0*(+JNu3qcN?w=9;Tz3?{!&r>Vc#O{kO!-T= z4=2=#n3(S|Ia4qt(=r1;VMbHdK&v1 zpP}dQfzMa-^+GPKd0ygWUSWTKPx3dNCs(-7{H|~CCU5aJ7kd5~?>m1Q|BHX~ zAMV{AuFHG+J|A$9`Fo`Q<$rv^SA4%&c%8n{5psojjmSuh%qYBCKkP>g9h0&7`q%Jy zT>b8>u$}li0jJ~(;|cX3_vPd|1skUg`*pgG&k4rUaESjt{zPYFCT3w)W@C2dVO|zs zLGH*O_OpmC#*+M$WmtigSeaE=m9|R!&gN{v>I1?&wbZTH znr+yQ?b(4%{oKTtdfKC~{Z6_I57iCZ>8X3M5Bsto2XG(kWD%H*qt!@PhZ3ZTi5H zFz-9{F7DqTx$Y0A^}v^5{pa-sUgQ-PFC6CYy8fLvSABf;oI$U3d>M5n zW@irOWG>cm9puq@nUDEdm_=EPB{?-T^)~M0F7DqJ1tr4z59z}^!eczn zlRU-KY=0r#x6kRm<->7b)R%aLS9!ttyrzHW4c_D*{G0#q9?O>u$MHZvW(VW{>Sz2Y z>|TTy`W0XE4I{XZHQEvGXOVRj#^5`AVtcW4Y{q8-zRQG6#H38d!pkC z%5Ln=p8Sfv*@u1EkNr7_LwL*n-R4N+-*ODcavaBV0)OCSPUUpY;B3w;6RwZBdZk{d z7jZF{av5(~ewAL$HC)Se{FxiLiJQ5FRoJ7Htg>ny^p_eKM(N;kMbB#_7+ZeE4#7&yWx85p?k6~`*8pVa|pj?cdwUk^e_(R2#(|^9`?TUtscX%9M1`y$SIu0 zKlX;}<)+`?m|=V-Gqn!$F-yy ziCejyJGhIxxre`SKM(K_4>MwwaGf64CwP))c$VjRfkS@_*Ue@9E3fhzuk&|)m?LcW zroP47{DXh-9`Ex3AMz0&^9i5wUq0h=zGTIs;ktOO-!MYHaQ-4Q8e{Ms#$sFd)i^pX z<1s!H@LeWkVkY5xOwN>C*C)(hYMq8@nYmhc`~#hy893F?k$tQ`VMbMrq&PN4ZiIrJ}x!(!rr>4$aJsfv!U55?WnEfr+T({sC zY{hYYue7ah&(7?^AG(MA=%#D;?cWnbh38s?>v@`<&KdlXGdYX1xzhUQ>IGcHC0xp7T)~xG!=JgHo4A!bxRblN zm;3ld{czm-^#LB?Q6A%QuJOE6I%%wM9h}i;d5-6KfwkL)`Mj!s<27FAP2T1o{F8sN z? zWG#Ni`uuig*sq4VF`KX{o3jPKU`tMLKHBPbY|qWEvoCcgc4obFVP3lFTbBPy_hvu# z=Kv1mAP(jb4&^r-#^D^vQ5?(hoWSomiIe&Lk}!``^i)pgOlEH$&hND*VfnE>C(ZTv zJTCG5g2iu}OSzmYxtjBR?p&`oa|^d|CwFrX_i`T(Fwg#Qeh%tGJj@48!|@!~CwZ0^ zc#)TQnOAs~zwsKc^LO6hO4r>jeVc#sFaFKDyvO@|z=wRyr~H@C`I4{rnh^?y^Ba+o z7?nNahIx#u<1s!HFcFh58B_3mrerFnW*VktI;Q7`%)pQMF+X8OW@Z*<w|FE%X;`#Wrlm4s7ak|ChQGJM)nF>8880C;yG%{m=IM8t=~m9LPZ&%pn}g z5gf^^{{F*w{T;vOB>uq3T$!m&xrv*(joZ0{JGq;CxR1Z^5D)VRkMcMRwFWc)Fo@G1Z0Gycbm?(;A7OTOZ3zF~wy;XWLR zQTYyIF*f5e9^Yj`#`Nz^Ceg|G9+UH^>-&x4O=Ua{(=r`DV0wPY4E%^6^Al!fHfCoI z=49^$VIFepJj~1dEWn@Jg!5EL7hzErV{zVbUP|k-EXVRpR3hAu&Y7P|#w)Xn-%G8k ztFbz3uqF$)4f|O~*JVA{X9G55HLrulx(S=IIa}}xesVL+V{6@x?b(4H`6WBCGrO=W zyRlxEFh4zXPxj(h?8E*Xz=0gZx{mW}eZ#yD(<3>W-*ODcaXfFg3-kS*p2W$V!l|6W znat_umFDRAT)>4~#KruHE4hkmxsDsSk(;@N+qsjwxrclC3-|K?5AqNX^9YagG|%uH z&+`H=@-naRS6=0BJk%k~|8@O4Z}28BTkf{L!}vMF^Z(M(XN2qdZ+(}EJBH=%>HB=Z zCw$65mVc#R^9{eM7_RGxg~RsVVNAxiAMxHc6YyOoWilpb3U2asu#`Ft)A0j-$PE05 zA2TC!GcWV801L7hi?akvv4O8cl-1=}ffZSaRau=iSc{*rHtVt;>$4%_#|-n{ST|u) ze!=#g!+CG>w%LIl`6UlqzK8C~UhKoZ?8gBd$Y;&N=i|Y82*2Sle%vMO-v~X5qq)`R z<*|AKzvmB3R5)CZQ}k3$=M4VHnViK5?yGb4JkI9=F5+S?;f6Bdd@R$;xq^TBJJGB3 zI{wV{+{_$a*IV^=?%+=D;%@HcKK{b}JivoI#3MY)V?55de&6||KE*wE!udO`&vNCQ zFdygjMPA}%Ugb4j=MCQEZQkLZ{D=4Wh>uy+edwuv!Iyl+*L=eWMZ*3^V|2#gJIv8F zTz9c_T*hO3Cg8hF$Rte4_js~QT!Wpp`~X9ZSd4forsZ=0X7HtVo1 z>#;r?upt}qiu+6x-IUGvIh(TuTe2u(k7;UFTvR z=4F01bsh@pA}q>c{M>S-by-$mC06AfKgU}`*JLf$Wdn|@67KsAbu)g>7Hr8@Y|9Sp z$S>K6o!N!m*n{8o3)f9A-JA1`_tS%T+V~JXoZm80)9^YRr^mB#|FE5jInWVZ z>72nIIg@iZm-Cp!dKc=>&fjAF6PIu)mvK2)a3xo9HP>)0*YRg=;6`p?{nz33xI^#f z0UqX&w~r49^LAXH;7Ok0S)Sv0Uf^Z^%CF4JZ~8iKGSB$1-P?MY*VkR$%-<3JN8jUp zKHx(>;$uGLGycaHe92dgP%O;b^WCu^5MO8IKA0E)y~l z6Eg{uGCAuG3j6uKPRSwWJ+)59515`GG6O&6C(Ovq%)+e9!JN#+Jj}=ZEXczAt#_F3 zV!AjZmJah;Qdb)sj`LGpUw7*ho?q5@IhJPy#{MtdFDmLvtir0S&Kj)ATKtT)`TqT| z{kpmy>$3s>u)j@oQ+6vI_Um)qoC$}7<87tevY*fC?R5us>nrpd^KXW5DaWl7Yx}PuErnhqkcX2oOavy);e*WzE4(cz5hU@9D zKEk6s#^XG}mY;{$;YodpslA@g=(9Y>B5lL`UCZ%dI2raYuE!HF5tA?}lk<)Brq$_~o*(gJW@OBRVSCwi z4(4Po=4Kww@x1)HAPaHRu(00Z`h+g2OYu{dW;vE;C01q?R^>ZW!u)=wI}Z=rZLFKH z8Jn{u&sn~W?!ec^JL#f+-nfhI&h#U~_Il}@x}WaPAsot)9L3T6mV2ycoIau_=!yJ} z-*dIk2S4b^oXTmO&KdlXGdYX1IfrYkf4*MGMf{0NxQyAmhx4>XujM-a%=O&Bjoi$w z+{XDM!~E~mySayZxsUsKh==))^&Hioeh}7sOdn^8%3=JJev~!zX?=!gd5-6Kk(YRd zS9y)s`8#j$7H{((-s62f;$uExUH6%1`aeEr7k`)Rm43~?{9VRv&VS?*5&r+b7<`AZ z-;Uo4=lhoTt9OlOb>B#&lX1f6i2q+-3ccHQ(&)6@Zn+P1dS>89%)(^fM*RPJv+3;I zZ~X_D$9P`mV}2H3K^9^W_OYE}x+F`nG|RFa%d;Y@uuGoE|KIOwx;ksHCZF5xXSz1) zupS$-DL-d(wqWlu5&ys4R=N#`tPkfi&iwyB9HFi8FFD=&XJ_4oUD=I2*pvO3dThl1 zuXu?5n%{63hqK0%i2q-Hq#ni59K&%O&k6jFKX4j<%dOUHxX^O@JBRt+XuO8yx9RQt()doji@Ujpd%2JMd4LCbh=+NEM|qql zdCc}t>oYvd4{wI!xTG)hrRV*suQG3r|Ow{7H4w~=W_uUauI*x5-#O3 zF6SDy`z_M{k7vE!z|H)0QrOR}dKu-IR|L_4H@)0L`-V^fRMGejRZUqkgbd~aHK{%}2lBRQI5IG&~4zrWLyIE9U^cbaaa zf7Ek0j|;eni}@3maRpbh(6I2jT%*@=9b0D!=lN{)$p2q(i}9^|Xur1Wo!rIU+{gV) z-zD<@*LP6QcAn4Z^|`|17xYD5;uZeR+q}a+`8V(L0Uz=SpYl0h@FidIHQzAer(ymg zF*2hv8ly7?-(gI~Vr<4?TqfYVT)QHimqa=#lQB6{@O`FaDyC){reiPn?GJSZe#DRY z2{SP>v+%nQ!~D!C8u|bKC%f?+%*7c$hS$+7<}-e#ZWu413$hT4u{cYyG|R9oht~`H zGjUL`lJVn*+z)jo-><2zYqAz=vo7ni0UI(=qOkvsbu-r45w_n#f5G*4!hW>T?b(rE zvNOA|E4#4=d$BkBurK?uKL>CS2XhFE-w6BtwI0fEnCb7Z|Lxr0Mi?K>F}yM>%*%NF z9lz%!{=mtc!l|6b8T^s6IGc0W)qX9|KXDnCb2ZoS$n3Dc>-5juz&|~{S#RN1ZsT_D z;4U6?|J$SYaz78Sul+xvPx2Jc@*-Ex3Hv?evvA(78Nbe~&BFOAA2+-{Zy3MH+Z_CL zSZ-6*;9tg@oet~G8!c?-p7Hz4W&MxzV?N`5e9jkq$yba}I&3ErBQpx4G8&^Z2H#=+ zd0{`}>G({*giOT5Ou~hppIpDslx*m8V;X(H@*n8*Z_O9xJCn}LEX>Mm%)y+@#eB@q zf-J6r=rgDQFy$X{*1L*hjm$x_1S=# z`i1p2(oNWu&GR}wg zah$;KIEhm@jng@UKeD6iZI+(RIh@ORoX-VZ$VFVtC0xp7T+4M_&yC!~&D_d|kHdUy z*E_hAySSUb@LZ(uyaW0m5A!IG@f6SS0x$A1f8|wP<8|KPP2S;M{=<8G%qM)xe;J`n zxQ-(;3ZpSPV=xwDGcMzChtFs6bpj?~QYL2#rerFnW*VmD2W;a0ok2I%AM0BE!gXJ3 zX*f@rjA!P@?}zcMIvcaIc*1ZW%%yWPFY_@!3$P#yu`r9UD2uT;ORywM@l%#&8J1-^ zHhmtBx1z4Xnykg4=A*W*%X+NO25iViY{I5&X}isIbGBeBwq_f)V|#wdw$|5O_h2v9 z7#hw?Up;_BSUzibJo%w;e!nq3oTE67<2iwo_a4PIg4{SpNsetmv9-E za|Jss58GX(S91;5bE4%o>CN22ZQQ|~Y*an0{};WV2Y8SR+`o_NSS!Nwj_VUV&9gku z3%tln{FT>uoz1NOre13Mcl00plYjF=|9;6o`W_$h5g+pzpYs*pu)~#boRQ0h`(hME z<;Sk882YCBT`c{x{f?{S^IaxlVkTuWCT9x1&y-BX)J(&)Ovem-6ek?dCpr_eFb8up z5A(7B3$ieavN%hyBunvAW?LQhql_-k3ard3tj-#&%{r{hdK~S((Lgt1V>V+8wqz@| zW*fF;2XR@kNRLl7 zK8@2kgFkX6XK@ZI+Mfk_As6!}F5yxx<8rR#YOdkW+`z5e&K=yz-Q3H4+|L6%#7IAf zc{-|(^8`=w6i+jk=bhE(c%Bz|nZNNmf9DO}y)m4J4!R>d@uJ7O>E7(e3IoG&_SXYA zm_zvIj7zWx<2=EW zJjK&I!?Qfc^NhbGoX3m$GOzF|uk!})@DKjQuGaUDzQ+fA$egXhb|35Ej`yj4&R2ZR zh~>lijl{?-o-N!5qv><5x0pH>6Yzq^6Y4YmyY+pYl51my^`_J5`5`~%C(Ovq%)wmD z!}abn`E?TYbcJDF7@1KR zo$oLvV=*q{@m(flA|_!{CgXc-zB?RO3Z0UFoeBG&MyF*urss#u!0%>;=Y6a{VMb=+ zI^PG&s@K2$`kv0sJj}=Zob2aJ3+RF@y(b(`QT?v-Qc{n-H?sg%i~RTbGBehwqk4Mh#jt{cDg;kWG8lEclKaU_Tr5O zVL!jpeb|rvIgo?+HHY#W4&!i+;P!oCJEQd&j^zYS?CJ(bg$<(IJj-@UKR zGCqfMIgib}?=IAfxr9r(lB>9eYq^daxRG19joZ0{JGqOyxrh6>p9gr5hnTcQIPN3* zD39|5Px2Jc@*L0e0x$9sFY^k2Yp^CiV{O)9UDjiLHezEo zV{^7-E4E>YapC=`t?s~%+|o3B4(OyivnzXWtiMyA@^HBRdKv$Uz1fF-*^dJ`n3Ix( z^$gKNIgBG1Ye`sclpf7;e*SKZer>xrDiA2^u}kA(G3)zcWWY#5)Rf8;FA;ScVc z^YnZ!;6g6u5-#TouH-7N<{GYJxvb$lZqOU~U$b!jHtQ|i#vRx|lkI(snxf6!-^h&?x8%C%UKDR{VLi-z8pV!fK48~XSkC};Cn4LM9i@BMP`B{JkS(rswjKx`kC0UC7PK4tqt;?`1 z%d-M2vI^V0{amYSuogdKZT@3>b#((aWMh8L=4{RO?7%PCnT1=1>!yqD!Jh2HzPvp# zEZ<)b;6M)IU=HEe9LjGvoFh1z-*OBKzP-=tiTsY=a}w`n4cGf*J%v*_jWhToXL1(j zavp!;5-#O3F6Roa zPdLEq?U{bg7ktU8=KZyP!w8k#HyMeM8HG_9jnNr{F&T@OypPA#@fe?1Jf29$uIYHo z2j4TElBt=7>G<8cuzUvnG56L8_u0%k2XiqmbDj(5C%-Pp!Ysm~EXLwo@=kbuNnM6h zt+%|c$jYqBYP@4UYUs~cn{`;1^?BFx8tJBN#?RTDE!dK+IL&p`Mz>`Lc4P)$H=lk! z9QPdd@^~}XS#N#F<1?*)pz-Jz!t;mgksQTuIfmmno)h>Tzvm?Wz{#A#O>e^WK10uB zkDK8-nx~(;k1f#c9oJ(06PI!smvaSIauwHd9e?I}Zs104Vx5a&zP9M?+{sEK6 z9=(@u9M67zfCqVqhk1lYd7LMBlBal@FM5alJfqL@0x$9sukcr1<#pcRP2S=i{=q-_ z7yscs-sb~8Y!uFS|4U(ipBf+NJpZSk^Cbs+{1?xQP$kTFBt~XbMq_lo!`O_&cuc@| znUIN?n3cS*R%J5d@3EQj_jO99Vrr&gTBhR%{D|ALhxy8=voagAGY4}r7jrWYN1MkR zCBl8WknzK>!h9Cf4gB2Jp6Fq@xjIpvaNa6et}?5z8mqGgYckre;rVrSeKukfHe++P z;1_JoHf+xh9P?G!?@qciyRaLV`Mb*9br1GrZ}wq7_U8Z&;$RNpP=3Q<9L|U4;|WI_ zAH#8+z{FR>{H5mi#bu>oji`QYh%j`!?^ z;q|cJnRHv7Rp(?b=4Kv_vwS|Cp9NTug;1^SR6W;ZTo%!|om*u19hdM{^7(@_SC^R8He`&R~q2VLxW- z#Co=#!`j|==jrz6!s~aT{)tPtjLW%#E4hlRxt8nr#&x=0Z(^3e!u{fk{oHPR7kBd) zHn!gf^a=BQNFU}A9^)y?oqXH;@AGinXY^T~;{{%P+wX<*9dm4W-mk{5@j7qv7Vq#c z{>{6*&xd@(CVzzad8(iBIbZQL-!M`&_hCk1R7PWT#^5`Q$ykidIBe>55l<)JyG+PL zOv2<$!S~tpPPlGU=`_p|CmhFz`V(elE~ft@Jim}G%wjCg5-iD5EX#7Nz>2KK8m!4$ z{ET&2m-Sem4cLh9H4oR(-LU%+ni_A$&)J+U_yt>XsMkeX-HsjDkzcYCJF^SBvKzbe zXq9l?_s~7ri+$La{W*YxIGCN+hXWp?$8sXS=Oq5X$(+HNoW;Yt!}T&p&*ePM=Rz*x zV($AZ?AH>#l*>5Sb-!Lm{W~nbRd3@C?&NOn;a=|JFWk?AJi?7{|G7_UPI^SVT#$s&7 zVO+*z0=~{mTq zpN-jsP1%es_|W=V>Q-#cHf+mwZ2z|7hyCeyJ?uv(<6YR5rOSom@2-2WCwuYfgRs6n zdH@G<5Qp$<4&{{l;rYY$NPf$4oWP0vo|E{>dM4{BoXTmO&KdlXN&OtaY(0l_S>a`v zk7cvMye%}oh>Q6XmvV#mt5tf6`C6xc=6Y`APRni9Tey{1JibfsVHNwiPycDT{rV7( z@)#3!2*-CupXE88=LKG2wTI#S-O_jX2k&u;J zGcgOZF*|cG7xOUlk70lE>jEsuLT~$V*ltl>oF!P2rC6F}SeE5jo)x&*`YY=ytje0K z#X79ZdaTa|Y|JKX%4TfAmTbk=Y{NGx!sorV`WLV74o||obTFPhc33XSv2eY0G2WHE zSY~2)-T*z2gE*L9v%S~r2tAUc_$|k9EXQ#?C-6Id&qQ6X&suJ&UdH8I!IeDyG|bm(y@qSKj{WS{dcA>FhKK8Xi{8#1+{uXf!}%-w zZ`j@*<9oS}zi>Yf@(>U62#@lL<36dky$RbnrBCyY*Z&!Pmgjh$Lmcl#eTkR($&GN_ z*KGHy@gGNq@$1H~8^6Juyu~Ws_ikAJ597mZ|1bSpfiQpH9SQ5dZ~Ort@)4i%U;fAE ze8HD|#W##lGs6G>7m<-!{=YD<(R6gi;5&@P*o?!tjK}zV?!3IK6EYF!+HO*vjPLP% zrsVIIPpu=p6Xq|iPR9?Jo*(ifW@IL2W)@~;HfCoI=Hx#;r?upt|=2#`yt(RoV;N>y>wp|c^SqB=x=>LVW6(z@xl6Q z4&@gfAErleBu8@$$8tO;ax$m!1D_9n)brgRX6f0S%Xx2?;{q<^BL2j|uflOJ)62Pn zE4hlRxt2e3JvVYQw{Rz9mB%l(^?7==+8 zjnSE8c6eSa9f$FmfbTLPlkq(!X9~X0luX6cOv8c^!hJ8DPR|ed5kKZ9%*ZwFCs}kh zZgu{0>fFr3d@RahEY6ZF%W|y1imb%StitN7$=a;Lx~#|gY`}(W#B&+LJT=ix*^Ehk z4d=0i{{B$tFLW!mVLRsb^FSSR$G78=!uC4rF6_#2uEXxS2YazM`*9!#aWIE)D8Jz_ z4rld_;eItzkK(r+!`FTU=yv`_5!~Pxd`n_ZPPyWT4-nakJ_t@O?AL++@%4dARmwd(7e8UL-9%)2IViZPY zG)89(zQdS|#n_C?_)NfenV1=)g?UM)FPfhex{k+F>oiQu4E%_zyiPOfOw7Wp%*O1@ z!JN#)f-K5nEY6ZF#ZOs=O`Xqjx&kY*GRt{is-~;61~V)Oue(}$UWG7kjdVrNZ>pQ| zb2euSwqaGzYp1is2^VmoC?zL_WjUjRm0=cjsM7*oW;$uEx zWPgw5U;T_Z%~x(ltR3bn5~J`&{4gFv$7C$VW*jEqyG+PLOv0r6t9>{h$@F_n&h&A@ z2KI%B;ew-28cX9ruYFwpZPF4c25We#W}2$NFr*hHT6x z+-5tU>*j31qaJUq+psO$u{}GmBfn%Pc4ilLV}Gxs9=aEMvk&{SANw<}uR9OagE)lW za5zVBBu8;HzvUQ?Ru-+^h&PcI^OmEv_)^_PVV9!-n0CET`fVljt}ZXJj!~m_v88`*EbLQ zeM+Cep4?WfY@i|}dH6zps`x%i#-VMha zO~>FnjLBGx%{Yw9c#O{kOvpqm<$jq&C*^xg&J=u~DVd6?nTB!tg?UZw_jo@r{@;vn zyy^9a%)n2Wk(rp8S(ugCn4LM8lew6iMO@c;bYAA;s6yd&u-SeWGG3TPSae=EPsMa` zmSib@%F-;ua;(To%<1pfR@2p4gSGe>>##1%w+;JM)p>1TydfL0F>CpG%hKkhrSVp5 z&9-dM4(!M;*_mC~mEG8jU$GAda3BY92*2h~e#2oL&Ji5RQ5?-!N5lCYnmEkUSmWb3 zo)h^U>zL2P^~3X~8lT4LJZ`-+^=vNUVlL+juH-7N;adL84cy4SbHe_#_xWO*@$KBr zef)(7c#wx#({*rCpWrQTjn{aczw-uf@)mFN4*%dN+y6`d&Aa@E z_jsQV`G}ACgirY|pYcCF=L^2%t)$_8_F6}%8@i;w#}G-UPZs7ahR&~ReHrePv5d!I zTqfjT%O}=Jn2hf+Ia4qt(=aX5@dGZ+8D1Bk=!|UXy3ee$Fe|e$J997>^D-X`upqw} z7UrdpF3ch<%3>_e5-iD5JkcQ>M`>M_b71_^>qU_WMekrYR_+`KW7Vm!Itdq-{Y>GJRC=R;~m(Ay`0BBx*rE{AP4hn4&`u; z;3$sfw;aoH9M6fI!~*WaQ}k3$;|$K^9M0uD&gTLyBBt2qddm1ozEe@&V1VV8J^{NF7SDMwBPr; zWW0XLaQs*Ful$YIc%8rV25<5f|Kwl%hxd4&5BQLe_{8VuC;BP>L%mD`%IN%;rRC0pYg7XESAf`oXpKU%*#S7%;GG;Pg$B}Se6x7k(F4PRat{IS&Ow< zhu`%M_p^F>Zo|+GbVD{`V>V$^wq$FzVOzFidv;=Hc41d`V|VssFMh@RX~TKxtNU{> zhw>Yaz%fx%0*^ z@FFkq3V-EQ{>Be4hk3lIZ}B$&XN2jLK+?!Pe=+JjK+n_J;Y7qu*shCSo$CU`nQCI)3f?9?DF{hqevZe>R<+Ihd2V zn45W+m-$$LzkL{vr-UxaQjDG~V-H~6iGrO?|d$Jc_+D?Rz!twPrzCUtUe?Q%y138F;IfUPE6u&JHuCH(P7>?z5 zPUQET#L1k->0EAqXX)9T!?|3*gWH*yoVavOJWCwFtN z_x~mS?(<>eM|qqld5WibhG&`F_jjUy63*vEk^kY8ZQ~t|me8E?I!w3!BzZi)<{r+tf9hK1-gRvN! z3D_}X*v}+7DN`~P)A9pmc>8#!@cgH)m+Z!K@;&p}bAMPapYZ}L$ezE3$BXLXEWy$& z!*VRoO03N4ERi{^x0bHWH1=z=`%XjSjo5^}oY&8F3$|n{wq_f)W$ACjeY~T7WPdv8 zZtTt;?8&d#n|;}j{W*|>IfO&`4To_gM{zVyWeM{&M(21KdZNx~-rD1I?{yo3_`T!5|Fpu&WPw*s9^Zv?k{Acw!USL1x;gY_>t4!zb8{N>i zn8oq zp7%PArDHQb6EGnYF)5SrJ*MFMOvTjfdLvvPX>=FAKbKa=%^4maSy$or=AoLd!CL%`by=Sc*ockUgiZN5o3jPKU`w`UTef2dc4B9CVK;W? zSM1F`?8k?$$ANk^xz=|85!fZ@KXmT**~j!?oPNjoiYK*1KEp;XWSVK_22! zp5RHI;#r>Kd0yZ}US{++;rM>l*La=3vw*L=-`02dC;#H#yvqlC$VYt4C;XSs_?)l! znh_d>>mni}F$$wHI%6;vGe6CK|j-(bY@1&AD)+0 zXJdBeU{2;@9_D3!7GPl(wf^F|BunvAmS!22WqDR$MOI>ER$(sl7$r`4e{b&Z!`1M3 zP1fRJ`&UPwT^r`3p03XZY{U82IgK;; zBWH0oBNPhjo2%z>A$xxm?wgBrA>hHJTwKXW5Da|^d}J9lyy&)J`S z`WNo!0UqQb9^>8P;d(f!8x{`pF>y{9KX3dZukcr1^e6AqaeHu^;^NtaqPtX7=ov zGv{)-T#eu4ZKio1_VcGsemv~&FZ~Z6^C_S41^?qqzT#^}Y#6qCt8dufJ31QQWjphY zsbeuVA|OS25ivjQu! z3ahdjtFs1cvQzP}4z+b1)@3~=c^ID8P&Z;@HsM!n&X#P&)@;MJEOIz(zq9Vf?(D%~ z&Tk+6$tU4;hu#bC@BYTC86W)ibsWJ_9K*33$MKxZshrLkoXJ_7%{iRM`CP=cT+a>c zSv?#_p09&jjBn*O?%-~I&vV`%U*8R%gZqu|S{U9xoxQJ*8$Zd@Jj1g*$MgJ^7kH7s zu}{-5?>+YSyYWAGg;$xNV3_AkeT%nwhj)38iA#m^eqTReI^+M-kN6KC^GEZ0rk`^| z_AvjK`W3&h-6o9MD6D5RzRQ@5#W;-1cuc@VOw6QA#^g-FluXO?%)m^{!ahD{-`Clg zogXj##2CvjH2jF`KX{SGwLO3%jv9AN#!^z4VPw!|{BrzhPhY zV}B0j5Dw)qerSEh=pt|1c`2)>czil%a3;t12=khy=W-tBa{(7}5icwZ@0%rhDOYk8 z*Kwi=JAQ{i+hak<9`0Y11#dcwI*q}UmP}m zj9=UCDSet}c#h}!jptv`7kP=7`GN1FUeVWhoj2IV^LD-n>wU-gUEbrLe87kNi~r*z zKIRiXdd3M4n3sHyi zDdi?ApwRS55=61uJ~rAzZumSI_zV|iBKXZ)O%S%p=3 z+WxBR8mz_Iti$?jz(#D$ru>r4*@7+Eimlm(ZP||P*?}F|iJjS%-PnV@*qeRWpAjpC z^&h0qyDtvWLph3Vc7^AU)#Esx6WF~$IR6v%6i(xG&fsjez8vArfAjQwF6LG9TdE8A zKGZV3f^*y-*6NMi!mZrK?cB+|+|Si(!f_warM?aQlfG+Shg(K?^WS0PM|jWUM}7Zj z`{&{HCp>@D^`#W##btzw}f7 z%je8kB|LAl^?qsm6=QY_^NG+T!khmhG7{fm6u!&o9PapH>DY|J1Wd>zJn6obOebeb zp7D4({T?$i6SFWYvoSkAU=HSFF6L$)=4Cz>U_lmQVSdaaEXram&QDl^yPc1Vj!Pu4!e;!6&Dnyj*^cem zft}ffUD=J@dC76yWpCr(un+sPANz9v2eQY>ur7o2U=HDMj$mW|-?7np41e?W^LRah zlQ@MlIFqwDoB6EoTs@ETxqu6~h>N*|OIg77mg^N<$yHpM#P676YQ#4e z#tyxcySayZxsUt#0}t>Z=hO)2=a4?kqdd-Ec#5ZahDEJI)|z2^=Z*iyOT5C?o_9mv z$9$4#5X=O{(}GUC13G1BQ_21yGV@2=#0TQe5ZVPeq0@o z@tJ^$n3$_;MSAnX%6?C4D&wh{hH06O>6w9abiY{8an#o5;*zL`fG z-HsjDnO)e8J=u%B`8E5nFNbghM{*R$a2zLaA}4byr*S4{aV{5dPn}3_j_+H&gv+>s ztGJr$xq(}_jXSuDyZJr$a4!$=M;_$QJi?V{!mtLqx9$y%K9b2vY>b$vEqBQ{}E zw%~$7;q`5GJGN&xe$9UD&jB3B!5qR79K|sl%WJK|{cnPv%qg786ph1r%+NDAkMp^J z3;8XVa4DB_1y^$o*K!?yw*L)!6TjnT7HJjMbDQ45-Ta<=xt|Alh(Gf%kMaa(&I{{y zN}uK#p5?E+z?wd9f76$EnSbya&o&9`eoKFpKlEecuX*3&5BL}VVQu?;rvK%0cDWn2 z`${)T7LG5{mtj3ip9mdQM`LvMa(|4i<1jAcF-^0upM*LQOZ5%=Nup~v56?@XQ?jgi zq}2~HMt<|c^g1K6G8?mVqy6X5A2Anyi59k(Ul(9O7Ghz>|1!+8xGu#q#>?u)j;DgI z#LrlnRalkPS)UEqkd4`dKQ{~WZ>GOwbGBehwqjehX9spC&Zn`^ruou5( zKlW!k*X3Z{*VmWB^`1rHx)_@{Tz{jCkLDQGc3q6u6F8BRIGIy8mD4$c2kdv8>w3QN zg;NX!rsnX@fP9wKW_XaPxB1V@*L0eBKz3RC4HH{^ABF(RbJzD-r!B%;tt#IZ{GKe z|H%h@$iMhE|KVdk;Zvq<8P?&se#O^}@Kv~uBQg>rGYX?II%6>o<1!u-Fd-8$F_Uo7 zdtrVZy-!jYPsx(q!gZOtQ+S`HF`ky`n1SyxBQrA#vobq#Feh_y?BKB9JUTxIvcj*FE_S`>-GT za{%+U3G*4Ohj0W(aWuzpEGKXxCvys?aXM#m7H4w~=W#KYa2c0#CD(Et*Rw{Uu-+T= zcihTt+|C``$=&>(`}rde@(7RfBv0`)&+shI@jQR!1zzN3{?04B#)gjbuD-|ne89i> zh=23NqHvu*)=&A2|Gs@5U-2~~HV?0l%&3gcSd7iMjK}y)z^@!nVx5G^n4Bq?lBv17 zYq(FuJ0IrN()KcXJQL$A4cC2E{Q-0ELw>}Z%*EWy!@OMYb3eZ>z=GW6bF8E;#kd*5 zyg$`tS&rpdk)N@X)m+21{3do-#|^snui^N<)0?@4Te*$f`E}QefSzQ;d#pAY#LA91|b|DzxCDWCCQKIaR* zkRzE>oe+1%*-sz%J-R#+4%u;Fjlv4Jb83p=3{;qU_lmQVHROgmSib@$}%j+@*LJD zoS#biGhQ*jYPtq%@(b2x9oA!gHe@3;9vY7AMtNK<`ZAPJk$SjeXnr+ z{HG)Me%K$zBk6Y-h41n|&x@sFGY;c1e*CbWNpw=CU^>3XOw7zIe4igM2lFs5ulVy| zL0yPNSd_(?qG`Avl+>kInxC=^%d#BHvjQvfb5>zhR$~p;;uoyVI*hg;d>yiFayVZN zjW=Rre#x)coGsXrt=O8|ef`{4cVJB4cj~OWuq$Il2rfRhPx*}h@;|=hD@O45 zZISp6qc9qyzkU3daGWu9EXHOW#$`OlX96ZnzO5 z_nDm^Fb6+mPUc}==3{;qWFZ!2Q5It;ShU6xUN zKeN29z>2KI&-gj3vnE^a4BP)g*JhVGVZ4s6%ld4c%>t^ z3Ge%N7==+8i?JDp37MEln2afylBt-QX_%Jjn1Syx3$yZle!vfzi@BMX`Iw&t_%Ua+ z2=C((x)l3t4(G9~uE2^cJ0?6{SvS)YT&J~+f5Fy0PbyQc^V|_MYLpJ6#+i$9y z@k>S+8|Kwqw_wRVVZ5bo#nx=Ywrs}^?8MIO%5Ln=-u#*ydx!P?Mn~{-MtyW&_G5nz z;7|@@{$1fXM(Qyf%W)jf37p7DoXn*@uczv1oX#1X#o3(0`CPzW?)S0th2vggd?}Z4 zC0B7Z*KjS@ak}^I2ECD4$A|U!PH*NGZsiW<@bi=3>pk4Zjn<=@uP+W5|B(lIh=+NE zM|q6Ld4gMP|D;~-dQKTV+=nh1zs%qH2e0rdukku>@(%CvPu}MP?lhmj^#AyXe{+83 za6X^tr+mhL`J6BKA7AnnUo%46aNN-+hVz(^?--B5sEo#U8I!SC)$8Nvcuc@VOw6QA z&Xi2W)J(&4OwSCQ=(^85DI7;;<5~GWvoSkAU{2;{Q`@O|F5D;c8!y0uEXram&QDl^ zC0UB4xz>Kl=yKfWx-73Nup*Cr7>=`=uEFQFS4-DtBQ|DJHshE4iU;k#rEbO6Y{Rx} z$M)X0opfh*VOMrzclKaU_F`}LVPE#=Kn~&%4&^Y8;3$sf7^a^R*7LaI9&dayr*MVq zY?hwQIh@D&T)>4~#KruUOSz0^&102b%{5%hb&NSR%zuO4$j)iQ^}9)b$8Frj@41Kj zcz_3ah(Gf%kMbCg^8|n4NuJ^vp5-~7=dZlLi~Nn3xO`N&KVH$-c!Rfihj;lWclvyL zp#S3k_%|PON2IXcPxYT8!v6o&HByI;{B5|uzA*lpk=yyYmr?jGi%$>RkEvrb4&yRD z6EYER`CRGa=Q5HSKmS#@9=44P^Gj(w6;m@U(=k0W@I7W^CT3<wD5RaR#We!<$T%ld4{#%#i7 z{F2StlC9Z}$7hD)?4`e9ANJ)y4&q?WZWq>TxE{eV9LsSW&k3B!DV)yqv%|dR=y{ya zMf{daxRfP-3$I_PSFvp0FyFO$Jzu)6H|s6j%I%DKCTusG_umi3e`KR+;eAj&d)UuU z#t-o@kMJmu^8`=v4A1f$&+`H=vd5e-zf1ZL&NhBcU*`?pqt>cHrKVnYiVs7STKIUfu7Ghz3 z%p&YsEzG-^{)8o1lBHOhpRx?gvK%Y25QR$(>PU`^IyZFYPWuABP037hguHfIaA zW*aV@AJ)H}ZqJVF#Ln!>ZtTt;?8)Bzntj-p{WyRFIfxaV_n~??M{*R$ay%z;5+`#C zr*ayna~9`tF6VJR7jPjLaWR*16<2c&*K!>DrEgV&ha_HXGsyvOKYh4;||{g8k05wk50*WY9Pgira5&-sG? z@g-lek?lq75RNMnBeR#sqv)uN#&;Q=SsZ5^9hd8DC%#U=giOT5Ov+?T&Xi2W)O>Iu ze2%8o>6n3;n3-9a?c1=P`IyUi9v<}f5cza|7GMs?TUdY0A}q>c{DdV~lAp3H%dUUiw}IR zexr+8&%U}JujUEox4$01L9Dhk%xkD_sE6wboXAPc^KrQD7pw@cpK83S&*Ry84(D?@@IO z#$+tUW*o+2d?scRCS@|FU`nQ9jE}={rqSt`f$uRR&zo-+{XVlZ2R~%$RpIz@>RdXH z&dYqv&w{Mw`5)^dEXram&JrxmGAzqwwpU(POG!t1;0ZtTt;?8$!Y&sJ-~{s-tG9L5nG z$x$53ah$-)wl`T%;Z#oNJkI9=F61I6E*IXHOY|}>=L)XmD*lrt9M>AXmg~5l8JzzF zYs2#!oDA=q%^u&%ZQRZs+|BQ~hkLn?J>9<#>Ytd&{txSB_J36GtQ3y_m_ET@c#5Za zhUfSzFY#nQu?p$a5 zK+W*Hp2mBzH~X+Z2XG)8YzoIcOb_P>j^t>L;W&=x1Wx26PUaL=aek-i>72otoWoc&!`kHzkTTa9nyb{_M*@AY2p<9@#MyaW129^@e& z<`Ev{F`nQlp5uA`$_u>6-*}0a`8%)iI&bhM@9-`k@PB;7zxkMroablyIsfBJzGnX| zVcjEj4)>YJoNN4D9i1^4ld*Z)^W*9GOu)oU!lX>b+`hg~p;Iyy(=aX5F+DS|)z)x4 zS@iqN#_arnAMzvSWFF>aeime57GY6-!jin}ep_0XWqDR$MOI=JHrN)9r@F4m?#92+ zoBaG~U0sj$*?DbidObIABijrQ=jA)SnOnJy+qv6$+V!^i zJ@;@gBPnzsF3>!mNCs+4%uKT)d4io9cg zm30+XWp&nIO@6`JtjGGCx-DEsjdU}9$#u?CbG=@-(yiH+?bx0j*_mD0jomqRQCNo_ zx+lNp6F;xJ+5Y<)@5la3?R`2#Pxa@Z;d&IuavUdcA}4V&x7qJhJ&n^jgEKjcvpI)5 zpN8X{uNQD37jZGaxxJ!}-6U z>kbL~xupAgT|R$KyL&BsUR?M14HhuJJ9@9z-P8B^fFIfKBmFmTL(~TI%6=t^AKCdc{|Po{O*S^??gH=lQJ2TGX+yJ6;Iht z8l9HunBTf()X@)w{l2fWGbeL1FY_@!3$P%QIo`s$2#c{eOR^M8b3)m$-eq(-mS+XF zb03XzDqK&MjaOk+-gkU8bRGX*ua>U;cARO=zn)&YFw7@%kFZV+jW=Rr*7z|z-c&c^ zm%RS=zOGyHP>%3^X|3C{1G}&ryR#>I^BeYIe-7Y44&q=AI!NyE^~N`FBmc4A@ASu>zeShP z+x1TF;$H6K4?MtwJj4p#Z%6d!3B&bt(tgsJ_eqbR;u)UhIiBaQyuge6jhA?tS9qN_ zc$1g?T*57VkN5dEt2&-1`ro(DI~2~#3;iEo@--uLb3bJyM&>(=#^{X653N^h9f#e2 z4*QR<6EZQAFe#HW1yk{$?WEP|n1LCYiJ6&&S(%O5S;xA4q&Hj%^UbMqF*oxtFY~bg zbEOOSje@%D+xxEmm_=BO#aV(SS&F4umK9lvpRo$7vKp(iCTsBvHemcB;lABSH)azi z@OU%*C0np1TXE2lu%2CXS9W7}_F`{-!~Pt=K^(&2JeDfVd(7MC`MPDS9>=QA#{@l* zlR1Ma{Ck->dM;bLPt4cRj)mh}s2B5FF5yxx=kw0tI$5b#a}C#W9oKUsH}N|TF^}zf z2X}H8cXJQ-@dy6MLp;pmwtwtx^8`=x4A1f$&+`IP`28N2^zZzG@43#d>VlqsOP6=Q zxufs$J|FNA|K?*p;Zr{2zkJRY{Eu18>y>`Z%jOrQd$^BAWiQ=Y|PFNn1dhkBj#cr=4Cz> zU=bE&F&1YD)+!p_FQs&8e#){e#|o^(&v~^|*iJQFlbe1C$6Z&~V-q%IGk(S9Y{8an z#nx=Ywrt1t?7)t1b)V{@yRsX*vj=;!7kjgF$#A^=^&qZue;lTVb0kM`G{)VLajL+aq&f;v&;{q<_GA`#zuHtI0jxZcJ9GHR_+vidQ~t~6e8Dqm!u9%EN9Ymum-1{_m&iIgWAcab;qyP1 zj?FlX%LGi!B>cnoL6YiZ{KtM%>&kV)Jksj)%)s}UiJAF6voi-jVlL)p9_C|y7T~^f zVICjrBK*yG30;b%`6=^$7+zmimtzH1WF>ya%B;d_tj?OO#b!;z`K+z$us$2GAsexq z&-bRfIjiOj=efP^$Sy4WYdEf6`ZN8t9>}3=Q!31FxE{gE+roZE>QNlSaqQ&lfk}EY zr*H;mavtY%0T*%+7xPk?ncqk_%8P+2a4+9tj#*C%X+NOMx66|m}e8+ zl$(vW)UDW>ZP|`@oX<|W3%jx#yR#>=I!}FcU-n~v4&)#X<`90KC>+NKJ(8n2hGRLN z3$6P^J&BV!g;P0=Gv2oOPv>0Y^EjVF@`m{>)Qh;7@gj%oa;aX%)m+PU%;oz(oAg$0 z<1X&z_uRw1{DB*7?`Iw|euUSIAJfMfIZ=4Op41;*4aa%@?dy1*H+h?Pc$fG1C-3tC zAMz3Z=0AMQ7}vr)p6P%2g8%U)U-2~~^$N!onNb*xv*U#G6+_2lEXHOW#$`OlXQu4o zzL!w%Ht)nb36nAfQ!*7(GY!)+Ju@&PGchx>u*CJSZrSyR{D}EjfCX8U#aNQ1_$kY< zEX%V3E3q=GvKp(iCTp=a>#!c{vjH2j5!>7d$Gap;IG;WAKz`|YEjaK(xGq}1eLdT; zJvaLQl62Ia*o9r$josOUqx`<#Ub;8G<_&*dihDE6zpwHB9LPZ&%%Yw@R1f2D7S0#8 zH&T!0cuwF%PUaL&dIzI08t>f+ z>lmDnU4io zh#xbZpSv%vKN}YAQ>Aoie#$Z|$MUSe&sdpNS&cPVleJizby$}T*oaNpj9>CAw%~o& zXNuNgeOeoD!?w)q=Th724(!NI?949g%I@sJlz#4SpdQ4*9KvB7&Ji5RF&xW(&2yrj z#3`K31zf}>T*l>G!2+L#^=al%PVVOS z+{1nRfd_e*pM4yz)1&$rkMjh7;Ypt2X`bPEUf@MuVsHPB^RoV(S9q1zc%3(Rlec)A zcNxR)hkB?B`SZqKy0CSAq|25K=j|W;m_0j$b$OO&sc?3 zS)H}`1#7boQ&@-kx&a%r3G4hFj;oo@lOn8RE8T`|*@Z`AhwG)g?#W*4!@m6cPFUvw zI>kR>zeDtJj^Id6_j5?2^;p)+9`-+8PvAsO;$%+YR8He`&frWg;$j{#-(`9^S8x^A zauc_3E4Ohwck_Gh`3|EnDx>jT#$arAF#p!>6A6tc;#TuYtdlbZQ!*7(GY!)+9n&)- zGchx>u-LP3zH;cC%*A}n&jKvS_Kv5pF2)ip#nLRtimb#cZy$HwUYb`8<5B(%^Q@(N zThBVWE*r85o3a_dWGf!%7w&tPZU1QD(Ct0mft}gY@pjeSc+~mpsaN zM)zSq_UAwj;$RNtFplIXK6xJ2X{;X4iJZjA9A+J->lvKII?l(spTlqA3^$DJ2!NlS5Gx{vg z@d7XMH(usM>vu&L^!<*j`UY?EHt+B*|Hr@i4pYb_g@ISufpRUK(I)eY7V?;(` zWWK|wjK+7_(sjH0Ww;LF7@zL=nUOI)$#T zYqA#Wu|6BH5gW59n{&HAFSOLH*_IvHk)7C;-PoNy*pt2a4To(G>)uc2&K-_xpdQ4b z9M09Qn~^%wp|G7nuEPP=dz{C|a{?!FGN*DHvmFojnHhQ}XK^;?FxfldJ~3Y};6g6q zVt&gdT*_O^!tpQHE4Y$F-`+3v8m{LCZsAsL<96=gPVVA9Umxw~0pkaGm`8Y&$9T}| zPU=%U%X2)>F^(r{%dp-TjbGwr{?4ns#(VB#H}p;3;%(mHUEbp!*U|B1FI&1UUg_72&^KJK5gCb*`3|EnDx)zvf3W?S`k0Qb<1oGPcsf24 zF)=HQ3G-^wEgWa=DB-$J=JDiA#nep0rk zo^tA3%+0*a&w?z(k2!HlIG!T9C_iBdmSl>kVIH6AvMk3+tjuYZ!}VK5S7kL;XASPQ z{aU&<>#!dG^1KGRAse#^zhrZ^WF7x5_=un5Y-_wo*D&99x;;Dag+E_))!o>WzeWq| z(?|DXij-ly1N9&d<`53$Fb?Mkj^rqg=2(vBL{8=uPUSRC=SXUHqPVxsN~a0Ds~k9_CS= z;7Mld63*{geU9gOk-za0FY|Z)!7IGVYrMe|_rrbSmcGq9yvsj%pUV%2c|Owr@M?^( zz7P1q_-jV&7xov4dEAep=xBVG(HVm=8H=$QhjE#Jnev2rCen$SgvpqkDL6MlIF3|0 zHPbL1(=!8K_`J)ivoSkAU=Du7Tr9wXEX2Yr!LzZ#{65uXI5S=tkLdUON8>;K-mrq_ zea6bH%4)2^nu)^pzR-2pfQ{LNKl}Qym2S<>?9LwS#ojFMy6L9}a3BY9FsnxhpF6|! zaE{B=Z%lv~^c$L?9oi})sw|JX(`6uu557+Hu{e(~XjIa2b5&DPo8ktcUjRWI{ z^BhCRpNCY;6zU1 zWKLn}#1Y>7H%(9H41N;j&BGC9>$#lA`CPznxs=Pef-AX-tGR}2xsL03%=Z~L>P`HP zC6+~a^WPS|mD`ypNq8TBulH~-_c5pE9nc5)6RUgtm_Etb{``1WpJN{HmtXa7yu{1= zoqzBeuk$8vG1i%IzVGS#e8@-qn+44yuGc*?zR0|v>lb{uzv3h2pxs* zG6rLEi{~e_zc|L@GCmV~JfU80K1p;kCT9w!Vj31o7UuV!&d5xx>+$z>Hh#by{E#0p zPO*q@4!EE$#KJ7j5-iP6S%&4A*73eHpEmv;Ilb{}o>z-sur}{o*Lu1>$0ZNPKaq`$ zH|3XX$<}PcD*m3otv>DN-rMVr?8MGo+A-|6i|)!C{yw~i?#Tw;r{Cy4?92Wfz=0gZ z-M;@iR1fD!?(y@5qxBe$72n?oXt6$%lTZu zMO@5pSvh4`&l+4|d?i=0na9`YbzIL4+{jJ*j+?oa+qj)OxRblNhkLn?``NhGg|(WiKh15<_dnR_strwhh^<7NKNtNgEM#5XUvp>Odv@A4k+^8p{S zp#Klt|MVmN&42iqPxzEAy#8PPoG?kqV|QO)^mJY1^88F5&&({$%DKLuoI~gHx{q{DKJBelrW^BpUY{ydWlO1#?c4k)&abCLXp6t!9*@yi&fP*-gLpY41Y=49v`F5OR z_`vT!dC7^!C$ad~Vg0A->72<~oXt7>mP@#dE4hlRxhH+t&sx2X8~8`uNN+BPP5L`- z;Z|p46n4njd5#xY z?fuAaj^na!q5sfVc$L?9gEx7H_ju8E{?h+rwO!%7J=M?nFP}4El*n)9^-8~Hgu&su ziOeXB%4m$qSS;}{>^Htnz=TY~q)g5fOv$Nd!gf;YG)&8MOwSC=$Slmtsm@b2ot+=> zLw>}Z%pE(x@oGL@k@Ti7Hr8jY{w2fktFP=v+l}n?9N_X z;ri&K`?4SVa{vc&5C?MzhjKVaa3u3N-oLEFZ~pu;!Q-c$_i1`MXK)s0b1vs|5x?aU zF6Dr@;d~b{kJZN4uu<`Foo>{d_#HQME0^aE&)=bUau>hnUhd0LdaTa|Y{VvP#^mEMXTovz(!Kc&`>-FAw+Y8TShxE)^iW+bU%1~d&Kt%@7$3<|9LqEBh5e7$ zM_j*?^efw$re|;_zvU7x=L&ujGi-mAUd=UJ%XM7OO+1h<9LE;DmD{+JySSTsxQ_>T zkU#Md5AzsL@a)cT-Sx{K=5fmSX`W$H-?uuad)^4=;iCSHky?fA{Gq%0+=_=vR&g#G=apYsJ@@iik14aXaak@*gzFe=|=bjD;X#%3JG zWjtoEZV7ZkCT0>QWpbuqN~U5a+e@RFUBCoIX$g~E9(t;?_+%d-+cXJuAlRc0z2ws*(-y|(c>tjp<-!gW|r*JlGZ zWFt0a6EvYxZSx_s9Nv5QlICmw8@{_Thay*7!J% zuM^g5lAgk;oW|*#!ILS%`)QV*!?`T$b7hfU%q3jPWn96PT*cK~!?j$;_59cQ-l#Y6 zI~Mc)*`l{{J9ls=cX45_ux{V$z1+wB{E0_+l&5%_FN%isKBuD<3w=Q+(!c4;yuv%Y z%X{4Abx-xbe9o7A#R$W~`HRR%e1{2&hj~TS(HN7lc)nlQPHY{Aak;|%BEC+*giOT5 zOu}SL&J;|^R7}lu%)pGy#MS1JMQ7#v%*Gtd{Yg0fe7YbDak0mX>S8R;ycxoEQ$m+y zDL(f4GP*n~FiG+7`bv7tlW@N(<@5A&-`?ck_8#b4hqzb&r3+daTa|Y{-`0 zFRfUzWY}&SkGEq-c4k+0V|VsoPxgBIxcfxfv*CFA81Ks-9v`3waWIE)D2Hqh|^0H%U+C6i($dE@&IpX|`VZcX)rKOdQ4+7+=W6{FY0&lo7gy*S+%R z+!e-GaxK?$BR4T(>G1jpm4dsC?`3_DAJ7N+6MyDm9^p~W_4?!b1b^WvuB#Nz?^%70 z=lLry^A9HYG|c;kzR6o0?fS^&`gvgdA%7SZ&fov^BR=H|4so5o))9w?^LB1yFp7@K z^ku@lV(Qq8%Xm!4MV_BnCt*@1X9}if8m47>W?)8UVrFJxR%T;%e#noQlO5e(^5}fL z;r>}b7i1w8=BBb?U5e;pEY43@f+bmspRx?gvK-5^0_XXD<7fJFR$(>P+M9{aJ{!S-iB@2j_uij9odE5*quGti+i_){e7*! zVITHme-7ec4&hJ^;|Px8gYx0Lj?rT|j*~c;1S;FZB4L zx6kwVw|Xg;aXD9W4cGEWg>XFU^+t|%{cqLVxq~}dvQ}94@AV#z^ZI@I2Oi*${E3Y! zhIt&;M|g}id>zobN4Oq;F@BP#c!p=fnj?VE3y(lW0s2Hd{ov|SdGCyhjJK)a|B0n6h|}B`f!|M^>|L;L`L{39RKVp z!70Y4aR%pb0T*&HmoY}EaJ{V5tGJfyxrv)OAb*(e7QKzzxq~~oi{En(_i{gf-~s-~ zgWUL2*za+DlBalvXL+8#@&YgNH(p|PUvK}e|KJr~<#pcVE#BrG-sL_1$@_fBzxarc z`IOK2oG&MF#k_GHA>r(v<`>-$jagpm`kdFIBnBNdRjKevCBRPtrIfmmniPJcpGdYLz zxqu6~h>N*|OSz28nQ}!iX%*8ycQ!mV`pf1G1{Fp^pj2jb$*L|W(a=&#hrz5Ng>-v}dR5TvRcom($e%M|$ zU4u3G1?#XL>$3qHvJo4zDZgSXw&qs*kDD~icbc!KI(oblJF^SBvKxD_Cws9s`?4SV za{vc&5QlL%M{pEJa}39F94GMg*l<6Yq$jg%k}y6+&tRU0;e5>2b6MN?0=6tTLxZX4BOgu6%%>R9zjUO-vKVmMX@#m@BIuG+QAM>*y3-MzXVNn+2Cv5Ut zSpQPG4BNyF^Dd_=up%q*Gk(sG{rp1}U6s{XgAZNzU+8$v!g;H!>#;r?upt|piE`KkF%(vvxrGdPp8Ifq5vU*_rgT*yUS!ev~}m0Zn!uJ5&a12=NM$3Hjkmvh7Q zxXa_a`91e>KM(Ln{=`H4nIHRl^N2pmV?4oMc#@}hnrHbdFYq^B;${B9E4<5l{FC?j zfF=EW)+7BlAM*(}whrs{O#jR0e92dQ&4_;gTZ~V_{VcMM%6A$4?eqA5n(i{p%4z|? zC@tL~4FUoJN=kQ^bazS!T%@}@l#=d{MoK|aLP0?UBn6~Hxe9e<#+F$X{7 zN6g7w%*{N^%Y6Kp1z3=ax`pj5q>CL2`(5O}W=WP}X_jGGmScHVU`1~Cxwp!CK%}t# zs`?Z5@b^k;>e|fSAxvLa*JFJ)U~|(o)y@7JXA8DuE4F4Ew&ka6$M)>N%45QH*-?MS z)UMaAx*NN*C)1g(x9-RO9KeAb#KBw{)$>>n=LnAEXpZH0)*KzSe}bOKB|c~RrJlse zoWg1Riql!x=f-B}nViLHe}(nV(WQP1Jx?!SX`d5VqL*UG?}P29}y zxP>RozeDfjZti7UUk~@|ANdmtZ3y?(FM3Obu%CzZul$Y2`8!YWBxCr!K4;8^Mq(63<2#Jb7>vm;eEp8C<1jAcF#!`XG4q@X=P#+wIwu^*6gnkSF)h>aJ!W7= z?&uPZ*N@C%JS#t7c6RbPqqzSI^L=c5yssw(bWs*#aTXj9<}0B~vJ}g*A}jGX``agK zI1aUp*Jd5oWBOg;_%zauIjw70e+%7`t+=UIc>OconO!(zX1E@@=^pIKUhK`;j!R$N zkNr82rJdi(p35VQkK{bd8K=i{0>9vwoWkjx!I_-RxxDy!*zfr|)gR&bE!2znHJ5WG z)BC!@zslPJ>J#}E%&az$A^5x zCw$6he9jkq$=7UTzaxGT)*G2o7?tm^iRokM*o?!tjK_pb#5&W%@kp$bFd5JE2*)wC zPQ$cJ&kW4S3w^?Tsd@&p7|+TNn1i{Phk2QgA2UA-aI5>ah%UzBEXC3+%kr$iimb#> zSdBGVn{`;1_1S<8*@R8mjLq4StvSo{v7K(u4(!O!*oj|zztTnjk6rnP=W_}i6F*dRNWppL)3(M(>|BbT> zt24ryaDT>Ped7(-kd4@wEqTlO+UigFbA)i7JL?Ps!~XtHf6ngg%|86X`?weN!hHRV z58xmU=1>mfNRHwdUTqe(YrLMoFF2V~IF-}>d);}-omZ?-RnE_9`5Bn{>TITnV+@}$MIKvgy(#HI;xNH zIDh8}p5*5R!}c!rb>Ot|v;2eSc%B!m?@xV^S9q1zc%3(RlktXx_5Y>Q>%00M@ACm4 z@(~~N37_*NU-2~~PYTbkD2&QzjLuk$%Xmz{giOT5oa8(YOdj?xsqtidmnoQ%shFB+ zn3n07fti?<*_neM@+0Qt2Io7s&dZNkfQ49?MOd6A+12yAv@XN4EXVS!z>2KI%B;ew z{Djq5oi$jKwOE^V7-4ug5A}3?Hef?GVq-R8Q#NN?wqtvCvFx>B#^8m?t~pDXxAujdACu*r?U~*l_>s48e)j8byYU$c+z|CI2>UwK#yfxeKQ?_SEKARD)yDoZ%&-r|=d$KqC zurK>_5C^mM*l?VN=`-FpM!g&Mf0XfY9M1`y$UiOTuKk;2d<@9=Q8u>be;{r|>Ghw+E{ z5g+pjpYj=>v+UBa9WV7O{>^{*nr|3+eweT3s<5AtrUWB1Dx)z5V=@+FGY;c29>4P( ziLVp#T_$G=ZZ~~uotEjDff@NeM|TL@pIPs)oNPKfb1)}!F%R>xFpIJn%d#BHvjQu! z5-YO`tMU_8V|CVGP1a&<)?ouS(7D{rlm1?WDW% znXg|(eSe~x@$T%&NT%b4~#Km07W&D~exQeT}h8;a;*6H=!z>VC*&HR>I%7o*vMQ`Oc#)}f}i=BEGck>7C zWiHc~{xDomKN&y3gZ!DjJUI>OYjzKD#($Qm`%+0u1?O>Ov`jk&kW4S%*??LnTxqu+nz#G0Xkf(|GqzVgLH*zU;@hmN!8E z?S0)qJ)9#rlA}19V>p%*`6VZF3a4@!zhWDoQK<8l7Z z6FklQzP_H*=Xrq_d5M>Kg)y!Fs=m$}yvbXf=RUu!@9-WU@F5>@SgddypXg_N&X;_} zfB2ej7{TA0h{#Bc%&3gUcNm>97?ZIWoB3mg>maU<$M{UZgiOT5Ov0p0&QwgxbWG3p zn1Kf)hwHYD=j#W?v$3u596Bd+GY^0A@3!RC`S>yOvz_G?)P-1t#aV)-S&kK0k(K!* zPB`z?bamEbE!JUO*5~dP;W^h(H)3NpWplPWN(9-+%Z@&*W^*;atw=0xsktF6I(0=L)Xmqj+II z*XXre$MxL6joi#F+{&YM!v1a3+u6`_Yp34D-TZ<3c#uCcL;i4|{;GF-F0G0mw*R>C z-+8)rxQpa7={DbE>;FGZ4OZqae@G5Wc7XRXH7IR(Q*AMuJkNK3(`I4{r znr}JYeH`(ta2z5r3ZpXyV=@+FGcHdj2+K*J6EYDKGYPK@3DYOl$@nglGX-D72-im{ zT`OUjKaEby^n8yQnTeU1g&!~*voi;CG8a#|e)8&k{FwO}J5kuag1Qh3GwbN^dMRC+ zWmuNwSc#SSzsKP^t)i>)6IN#p?zcU)bsg4aeKz1L(>K;l*^JG($aU0Gx8_yHsZQ&# zpPw3U$M)>Nj_jT|Oy5a={@*xzuqS)5H*Z<*5IvM5IEte=juSYMllT=MSndoxle753 z`|CM+ZIZAb^YnZ!;6g6u5-#O(uH-7N;nVoxe)vYO=LT-%CT`}poc4RTezxeX{GQvm zgFE?;760LDMw%Y3rzm`fF&LAv z7@PT>uedrs6EG1IGltK%hj182aui2%EXQ+!-$(U@ zUgrLvq$hI*XL1&2^YS<0`b(EG9FGOY7jZEQd;M#@lB?Ok>+AG4T+a>M#LfJcTX| zIeFXoJ>KU7KIT(C<8!{?P0M?w-|#IX%n0W(A|o*-V=*q{GbxktU8ZCzrs2?x;kcyL z>6o4=(}eA4nTh=uuEY9l$VP0!W^BQhOz8WDZFF0{U5BK$Iy@qSKj_bLB8@Y*PeO>xi*SDTC>BITiYJA@p zVSU^5cJAOV{=hxl%YEF>A9;Yk@DPviH?DjyY|k-$lBalvXZefi&*}5r=KNgLmw1_1 zc-ncsrmyn`Z}JxZ;vGKXV?N^{*nr|6lX4v0|jKs){!l;bNSd7ECjK@dg!g3Sn z4$gNXotR0Ol(jO3`I74tOvzMC&2&u9Onjf2nT1*T0dp`X^D;jRupkSuFzY7|+gnnX zW?7bJC05~O=e?S)&Km6Pc-7LiS%-C5j}6&~Es}@rYOY(d72B{K+p{A(ap(JCIek5M zx)|@u&)J>5*q?(ql*2fJqd1ylIgaBwffM;9r?6{`@O5{Vp2K;Z&jnn_Mf@;J*w5wq z?+D@fze2C%Dz4=^uIC1BQu4aGZ|n zWBi?`d4|2ShU0QxU*Mm-$jh8*`m6dHZ}2An;%(mHUEbq;KHx(>=2QO7WD}hkVQ@{L^$V^h>^CDZh8}rRm-nf6EB7!*)bu zByMXT#@9N2(Tu;t=#0UbjK$cD$N4$K@{;Oge3vPhl0SIAlUk?YPfNq~l1`^*24>{@ z%*@U9BT25X9UmCa#_arvIhl*O`5;SpACO1qV}6dX{6e~Usj$7pba9qoNtR(HR%R7e zWwwIhdakZ(uqJD$3qHu`!#lDVwo1k2o)F^{4E>PVCGs+@3oe_a3?zd$SMw zu|K2b3G)roiS;O**}tnhMvvnJPT~}P#rc-AFM2qhvy9K-T+ZWS&#?u15pP<~O1+BL znuqh=&G}zz{H){mjb6_U+{mwdE@-ppiRg;5nXWL!T4>Q(xj$UgIrZcKq(@dyLd69EZocK>l!_KGo0o zg7+$f*GJzE=l^fx|L`p%&I!wn#Hbu*|6}L|ex4jl$L0vr#ntf`pGo*GQ!+KvFfB7M zBQx=RW@c7qV-9}AoXpEsw*OU7RIYlBIYce>i@Bva<2Vx~h&^AWTRYqo2>-pEb-j%&7s<1ozc(fr={Pk#U9Hocoaa1Zx#ANRAU zp9{72`yvh)Kg?fwl*f3SCwP*ld4{hFh3&5C@5h`oex4V2k%z8^=`ZOkyvl1VSvX90 zOW)>QKHx(><`X{SbH-Q`miJP>;y>)`x$#yZ^##Hjq`RCvx7&mW9#JSJl?HsdfZ zC0-HV3fQ&-n#12$wMHf2lR^M0qj?#NE;%r5N8&)JRL z*@HdVi+>ag+nLsNHo*8muJV0^L%!||H9m~PIf5fOilaG(W0`VLIG*G61Wx1^{F0M6 znNv8G)A$vqa|UN~4(D>xbiJi~Lm#4EhYYrM`Iyv4sbt7Nzi z@9Fz|z-N5UNGZbft@DQSchUTRd;K52WdvWJ-eGjcVER&Fd9idMolqxYVkTuWzRNVc z_%>`;I-Q>HGc&U=E3@-Me#D&2#oWxpk6DOqQ-t*w*Clz!by7}OU?o=OcF*%_x&~{q z7HhLE>oHN8a6B96hHT6xY|4_RZ=qYV6eeqY`IJ&=Pqm}e}1sJ`Uq5X1EduKP2bw~=}jM{^8olnBRnyq;4ryr26* zkMw!Mse0m}@VuR_XK)s0a{(7}5hwdT))Kw1Y*_y?{WX_!CD(8*i~TR`-#2k(QkOl^55zR^TYX#$ViOLD2&SJjKP?U z%{Yw9c>LyUSWg0-kcpU>N!WIFIL`0t6imrfOw0F}ftlE%Vpwk${Qe#TDh%r5*NyYh2(V{i6hU-suf4&q=A;ZP3a2#(|qzo&Y%9>cL5 z$MKxNiJZjAoWiMGTsfSdnR*uIa4r{cF_&{C(=`jv_tknWAA3%0(3|)zxAJ@L;BNM= z61H!T-phU5&mZ{{5AYy=W*5)*L;6?#JtKVmIi^qWBv0`y&oNQeuzeTwTl;%aXYl$J zeVsRW)c3h=>A!fJci7l+9_WYcVSk?L7yNm9xW8WN4d$;IA&kE<{+1CIg#C!f$c)0M zjK+5ugRvN!aTu5J7@rB5h>4kmNtulAGC5N+HPbLH)AK!MV053;%cL_i3qN2sW@iq5 z$d8zlxtN=In3o?jKMSxh>sO2L?|(&gahBkr%;EkjsRx+8tS-m$ob2_Ax-zG&iSX}# z)pZTlW?j}}eKuf2HezEoVKcU1D|UJjuDdq6E%R58@b7;e^k?kEWX{)2+uhZ8clKf* z&a}Mg$-??7_8)(Z_v$@ulTVFg}r!IGIy9le0O8b9veCH=M5* zauJtsDVOnUemX4d&nmr|P2)uP_rC>>&qm|*HiqfH(_6WXJGhg3xR3kUv1WvS|2v=$ z@@I}IANk+c59!1FmAh($<9<{h=LuGs7~$Xl&giq;W4-6}Z~B7%lUMlk84j-r`@p%{S)1ryp?ao^U)L>POsKF0A*7e#&Qj&X>&Tdj3bh=37Qs7~$XlA~F&q zGYX?J8ly7?V>1pDFcA|o31ij{>rJNLWpWPm?^~zPshF1On4a%312ZxcGcya!EwH7kjf0`?4Rq)eXm| z2L~A+%pn}gVI0m89LZ4}%{{J%v3eZGa{?#w3x3H-oXn}5#_62FnViiztmA&2tLJe( z57^EndKtgwa<1S?uHtI0;aYyf4g8i{xRu{?8@F=@cXAhZa}W3ONB+!1ynHmA=U?@2 zJj&zz^I@3ogg(X7Jj1g*$BVqe@qVxTReg=`6p#4t3U26Qj{7Zrhj)38_xXg+_<{}2 zM*MfVuk>3+Tom?aSBhYC9fLm@|Hbbai)H+B!!UhZoq!3Mh>4kmNtuj!8inPg&?%XU zz5TnN=e9=rcf$0>GcY6HXJ#(3+z<6f%*A~Cm<5<{2(E|2ci07kH7Ec!gJajn{dDH+hS>n}_YZr|brL3JGCs5ZbQ zGx2>kYZ2C;RcB*%=HQ3S&Aj}Wt^EDS0(!Eqe}!~muD=zIV-bDQ`b+4NEXC3+%ZmIa zbHsl)ys};~A@aXnRe!>2tj-#&$$Txt{@2!ZSeNzKkd4@cP1%esnQcf|?q|9S|HrQU zoZVQuOW3a-x)1xZANz9v2XQcmau{p23foiHpJzuIAI&iw$MO7;9 zS$a0-aUmCT^Yw5&EYVB3jLW&g^|VH}z8Ti@jb6`9+|0-+!*pA8ht{E^7~gJuCwFm- z>3-1rINSJ7dV}ZutW#mR2aR9-B=WxlKkGw0%p*L;@~< zh%MWO+HfKw= zVr#ZxTefEhcI0R5#Ln!(|FJ7SXE%0d5B6j)_GTaUV}B0dKn~(y4&g99Y9Ef%2pzRU z=r8n_oWwV0!hJJYPvKNf<5$ezHB5io^JIqc-|~d!hP4+c5OBOJ-2fQo0x95-p?QT6A$npf8k;N$|F3=W9(TV zY}W~Wif8!;&+$Aj@FFkqFZaV$eT~<7gSYq>hkq8%*ByPA_u08ucrHHBkNJep`GPO` zivRE}BPvc(jLUdTz=TZ984JSom_nZ%9FBJ?otkNwmg$(D?=ds8 zFe~?V3j32y=irCT$z06M7v{^W^YLTmXCW455oYfk)>}+3DHryyxGup`EX^`(YW{M% zJS%dz*Q@9W`V(D^)meizS&Ow)0zhS(tVgEMhP29}yxRpD(i@Uj(`?#M!@*scVA^yrEOn5Wg&%f!T zJjUbvohNvb5!Z+PIoB`TC#Q{{;aOhbMPA}%USYY@VL3PSP2OUAfBw9u|Mq^o&F5h| zo)~}1=X}Xm{D*J3$NZ6&h2=zM6h>t(G!P29{a+{*8{jXSuLySaz^`6GYgLH^8Nc$mNP2!G>I9^-?x;d~$0CwPjd zd4^~C2hZ~=U;P=5({+85_xO;H_?XZ5f-m`sfAb%{<{L)%I;=M$BQY|gFe;-l22Hsi4PAK^I?Pse8xCgY>O!*nThO4f-MwlBS&==qvm=U^`8LM+0fEXMfr z!+K`8&&nAu&nm3S>a5l;%vV#_Vjb3HJvL+$Hf0O8WLrM8{Pwy7J9575?W8+1UjMLN z|I=OhIlHktd$14dnSX#D#K9cOVeH!_TnEGTNKUhyar#S6;*|fU<8;nsvH@W~1{MtW z+k1MB*XME`7jlK;vh=^^YL2m-wR#;la3eQyWcRRt-|FwUg~u+0?c1(*@dtMKBfP#( z@8?fEz=QmShj^I3a-I9&H+_u9`8!YWj_36$eTHZG2hZ_5FYr%paa=FzE4<2KJ;Q$9 z(6^Y>`>NZz&YLjZef@y{3=HS{v3|lEE5h?3)5_or<1hJ&X?uj%|Ix4chHn{hd00;r zeikd7-*zu=dg z#L1k(shq~?oWYrVY-{u{@^?BQS`aU1=y7fQNPx*|``I4{rH(&D&-!g)qr$l5V zM&?NOPjsEee#F$*ONHYRTgPEs#$)*rVY-AmF_SVG-(_plr_d>xifNdR>6wY|GYhja zJ9F?ue#D&2#XQW*%=Z6dU4TVcl*L$_C0LTBIDTX}E@gB%E;L?2uXr7vM^*K&UN2BQ z^1lnHW_+6SRa@6#UDjiLHef?GVq-R8Q#NCBwqPr^;lPYxyV~iF{Lu01th?}k?8}`C3?)pVIPW_Dc=Kv03*NtJip?dwx@H`r>M{p!ZaWuzpEXVP-?UoijL-vpAb`IG6MP>(SwOE#NZaE4Y%YxSDIZjvqU38}vqQ=C}Ng zTbLz5xDLM8+qsi_xsUt#Bk%tdw!fY4dmlD_gpKxw^LA7p<8hwkDdyb}roW*7WX-W* zJ(u)lUg1?<<8>bJb?>IW#Z8uXTi@X`fBv|yAMha`u|&hLolkV)abf#vZwuG$bK@gB zhUs4Dm&|JV5BZPr*L=gbtZ2HbjJz_eFAAeF8sA}b#^5Xa*UxhP)^WTZkMWs+37LqA zS)xwZ-xwK#$&IIE8m42_B;k6?qO8@AVzEwNI_1VjKZ}wq7_U8Z&+%ft8zy^5>3hU@qZ*K;E`vEUbBf41rE+`*mP z#e5~h`YSsx`;Gs|13bvX{FO)e8}C~G@A?E!^9;}OPhR9DUglL^<8|KTE&j#Zyu*9E z&j)19r?9?~x_d$KvpLc%Ihj@g)@hDI5B=1ZM%WIP=_|Wps zdHo_UbKml?{a5r=Ugr(o<{jSUeLmnrKIRiXa4E&%sR_|~oi$jKwYXwNIDQRuLpEY#He(C6 zVr#bHr)u=r<494yRkcauor924DKl3@t6?!$-ay=Uy498=m-o(xPj^A?|w{r(~aW_-V z4$Ix6_cDv|pY%cg!ozH6x;9+UB-|fIz5Y87c>bN%=XjnM*r!04|BmHdF@Bx5_?XZ6 zif{Oq5!QtLi^Rx`!l;bKcNm?Awuk3%EFGJ17?<%Fp9z_mNtl$$n4Bq?nj3r{r2pKo z{TYmBLen2p()gC8*u^D#dQupkSu2urXe%di3~vJxw^Dyy+NYw)k%!~WLN zwON<-*^rIcl+D zPT^EeXXgdsIL*?tIfrd*&pf@5i@2CexRlHIHJ5V*^EC?h=SsbbtGR}2xsKm3>%y?z z8}vqQ;%0u!3ZA>iyzkg*{Cjq=pF8v}{=hNTw^#4ue*VZsraP>Eau{Zm300(jqhj1u|a|B0n6vuEZCvYMs zaS9VG3)kB;okUO98T2eYn{zpj^SOWvIn?*@)3y%hsgdQacO5P@-7AY>%g~x^Svs3TlZvMbM+{^v^kq3B?Rnmn0`C0$MLp;o1d7LNtQKfL) zPwCT4?eBM;*B5w+mwAO(d7Xc|AOF((9Iw0j0Uz=ypYs*};cLF(TSl;+$c)0MyyU#R zqoXqhV{vc4a2#XnIE>49jL*bO!lX>bcX{2<%~R-F49v((e4qI& zCyRbiI$Uqrbq;ni-7G&B%4s|o^D-Z!e-o~c!nz2HvN%h!6u)u(m(gWej^$Z_l~|co zSe4aSleJizqf3YLS6}xoAGW)pZp7wn!PacUw)~Xs*q$BOk)2rH_g8x8-i)&$Y*%01 zp946MgE*K!IDVt_XpZLuPUIK-l2duJXSfbhI*-$h&)`e1KE+|QqQfCqVqzw!uw<53>t zah~QGp5u95<-zu|hu z^Y^Pa>P_6tZ}}a!a4Wy(HtygquHG27>j%A;`?#M!@+ThTA=dJBp|7Ih{<+Xmp2=2Q`jLayE%4m$v7_3k#tS@=j@LY;%ys`Ba^mE9##;fKH=OLb+ z@=oZa`dudH2Y-kCOsmr|J>O#nX5#tHVY$Eg{8P<2p|g2CJ9F?u=KRlZ!}Pgz9_D2} z=4Syu_w%TNx)2Mq2-`b8#dL9&VriCPIhJSBBHnL%&Qvm9g;iODr|nNIeL>gJbs2L| zINtSj12$wMHfFpyVLO`WW^B%uY{jnjyN&L^j{Js z9LiA~!?7I4@tnYk{F0N{X-l|%rs}Uao#!5e`(~z|#imKZ_yWC!n=I6YJo4A?ZaSOL{8+Wpp>u~#--qM+ zhd$3gd6AcRG<&!{uj*^O$x*Jy+xiag@*W@YF`w`mU+^Vg@iiZMzt*l_*#5W1BWwsA ziIEwFQMr9_I1Vpshy96eJO*Pj4&(8oiedU%Il_AOZwn^#dUB>C!C2Pu&l#{(JrzugYqy&dI*sW!(|>zpn9mtj~sQ z!lrD-7Hq|3uAlb0BXj!u5}kDye$H-OZvMDC!**q1Kd%qs7@zAHqKC1Y;}FmHU%Klt zULVKtoWMlq!*k{fJ+)Z4PQKKWIGI!an~u}?6{m9+=di%8uwM)HVlLrQF5?QWtL zmw1_1c$KquhvR!g-{fDs&0&tuef@wBxyN#z>F0dGmwd%6j?+JSSp0DPyw-2{mXW-_ zkNrc~-l#e{^B9k<<1j8Odp&_p$V5!cBuvU=Ou>{)#nep8bWG2Te4kmEl^-x0FWJry zbx!7DZYInXjzhlxUf&bCpdRhHR^51U<0V;&rP<4L<#c&gVii_pHEuFr4PA@1*(_ez zuDZG&>$3qHGTPoSePbPYO2mH$n(Ah3&K7LRR&32SY|BsCj_uijpRp6Wuq!`j5B6j) z_GTaUWj_{o-4D-C1#^d~*CwP+YRtx9tv_8YL{Da@`56Anw{*z1X?GXV$8JLlon3-AF%X&Z1*_eY!*+|#_c|bQcABZ60Y+yx-84FJS(swzy0s)g08`uti{@_%Sc1Q^?Jqe z+;Fw3Kg;#lv*LjP#`BScNpWfB?c%KjWkdOG7Pxy?_`GS9Q%b{>TzSR+Y|1u&YF)E|+ z9Y$vi#$+tUW*o+2d?wXJ!^=Wj5yE z7vG2D{GtAcIhl*OnV0!kfCU-n*Kje4L7@~ps$tjsF>gwUKP7yrce%o!FTPx`*@o*!10vXBisKb5GreLpYSfIGiI` z?npS^qxBe$-S`gf;!ixlgZ#tSp~HII(XgD~^idw;ac*}1oX{tEhG+Q)&$0C0a9p;8 z&5rP=@r%5~%e=yCyv`fE$-j7;cX*fgc%KjWkdOG3&-jwB_&4A1EhG3jMMOqs6khZ5 zhgQeJ@r_|TCgbpe^KrxU@r@^7DyC*yrsI2z*ex93OnQ&=743Lfe^%qs%ZKT*>pRx_ zkPmQpI>x9$p)^x4N#unykgzti!sj$NFr* zoWF`?#M!@&FGqZQ8J$L;5f;pA6e|ME}MY#%tvY=l{6z zcl#dmrOW1kDhd7IwO9o)%X+|3`jhkLn?`}qq;Sy5A_7>SV?g-PvyH2n^vGX`Ta7GpCG<6a2siKpW;0TVJ26Eg{uG8x}x3Z`T# zre+$B@;)P-&cKY!#4P-P*_neMGVj1}U$)5{_A9UPf-KCUEY1=v#nLRpvMk36tjL6Z zE>c-nWo_1BJ=SMKE=V7)=jOVD>vEFg^QrOn?8wj9nO*olc4aqqXAkybUoOZNwquAM z#sR*MK3tFBNRHwdj^~%G;{C={{S`kkK10vq9M0uJX1x^7>s7y}Wr^|ST**~j&9z*| zZ@8WtIoI*ttjAj4cY11#u>SA$HtsjwFWmRvIL{mZNgw1dJjBENl}Gp+kFu}p<9B_M zr+AuY*y>TZFV5-nyv!?Xb~)_d4PC@@Chef`zWA>3f!2RtKjb4m<`X{UbH3m|e9bp} z%LrS;_C#bPMqwg9H;$%Txt5BnS4_)6!s-J^*AE-8S#2#0bQM{pF!uvOb|{Ko2W9M1{-lIN{&hMvjR<-&62=(&t@ zBWz!ME;PP`OZhdIa|Ks%H5V-j$KincWv%gX&hr7^*V$lvBRBI~e#b4`%I~?2O+8mRs>d%2JM*}&(3j_BWboV9O;<8o3j8x{8Jv_8YL9BBG;`aCc2PhR9DUgi~E<2=vD zotAsY_Q~iw3`I4{rnr}G$*KmDD@VV9f7sLKX(NP(li*AM2-;9u z?=l6?n=h44$MpPuXV{MSON8q+qw!39pP8AJ*_fR<_z`om&|hJ@^XR`N47bDnf2KRJGrO=m zd$1>au{Zm&ANzA42XQcmav0C~dwV1GXpZ4V+q;buj8Ehj{F2!#gzIO9p2gXm!+u-B z{X9?4=Rz*xVlL%|_TjqxS}*4cuHqW5W$XfByVmPX+{*8{joZ0{ySSU>d>?MFuBP|v zANdmx@@M|S!~B&;c$Dp^{*nr|4v=g%WD5~DFXV=yLTF)rgVJ}=h~ z*IPoJh>t6T^O9I6VREKmN~U6Jre%6gy&smh-t#H5@m0pN>zvHR+}!QColk$v6c563 z3+RH(wla(#@O7?;@uGZEE!>~QbqSVYX_n#lw!6Hpz)GylDy+&+SdG zthc^y$hQ2H?b(6nU4NhHPVCIC?8ct#!+z|~VI0X(jPxiR=dpSm$MZ?%@LZapC-Ms> z=@HJu6g`#G_!XzKQ1P(5xjJ>?(DU_TF6A;#x1Fo>dbXGrwtuVsp53B{@x(s2z1{c@ zUUPh7z8~(N-Nti14)YzlSRuFW8E$`6a(%*C$~)?R0x~U`KZ1*W7EKyXtQ2#op}0e(cYu=6{eL%puHIHO$*L z`dbd;aE{4<{=dAx=s8@( zC0xekT)~xG#no(CC9E&Sv*0@8>$!m&xtUv7)%Chl@8YnEVgC2%z1+_OJjg>l%%eQU zzj=Zud5WibhUb{+dDyQDI{ogjU6=J$Mss|x=^MPslg`)M`YxmUy5gb!myh{^FZr4g zHizwc?0yzWzr!eem$4X|aT$;Cxyir(Cen$Sgh`oAse#^o3c4u@C&wLYktX_&a-wp;;S$}9dw7Dp}*Fh*@a!%gT0tFZrJ|bx)1xZ zANz9v2XY99au|nm1V?fdM{_L4a}pXK*HGaW+T!d-l0{J{NEy z7jZF{a49pozE|qi%x6A_`n_Q5jc?#4c5#2)qPKE8cXAhh;~wtiKJMoqEaU%Qc~BqX zVIJX8{>>9S#nU{)vpmO(yu>TK#_PPzJG{&L>=z;2SN_vIqK1B=pYl0h@Fia{;+Ak7 z#OxD{tlwc&#$YVQ=6igf37C*c*(ze#zLYvO(=a_VFe88T^D$ZVdCSSJb1)}6Mi19# zZk>l8F(31@nE$_V0bPi-B8BZOs*AG(OS25qBo6ES(d)_?FVBjs#LBF~s{DkX@-tRr zbzZlgyR2or9vd)k%5Ypi*NxbmE!dJZHiZ5DLbqaTHj5k{|5AU&wrt1t9On6pSB2Mg zG~S6{vopK08z=eyob=Is*`EX0%lD}a*59zW{r^@E;|PxAD30cMPT)j-#~(PAKXTYR zVLxZ+S)9YUoW})R$VFVtLw;_4iC)T;tm?kHMz7_1ZsM;jA0=$x4!w)NaX0sHACvew zkl*z-KiB%F9&5RW^kE+1asI`>d4i{Snl-kC_p7ry^ZBsd=k*0%%7goyvO@| z$VdE_kNJ$x`I>K7-S1(0$8n0nz3#`+bacjGOvYk7zQ^~OfQguxN%#SiG8vOI1wUj; z=6^TLXKJ066^v)lnVFT@n4LM8lOHiJ^D#dQun-Hg2#c~9i?akvu{6u@ne8s86P^p_ zPf_PhCF50Cm7lR1YjIGtFh6y4UDjsZ*INC+Cd_>+Pfaa(?tMK2Q(h5Dw*Vj^+>UJ7e{DPGAz>Uoc63&&llN^*`yK zIgK+ole75?=Ws6PafJ1beY|V@9v|>KpTi&NfB7FD z^Stw{uIuWV@#l;XEA00x9dVn_m3)U$7?tlb8ly7?W3rRqFBeP4W*o+4JjQ1dCS`J_ z;D=1b)J(&%&ez}VUwY%?jAzoBnT6SygE^U-d6#;r?FkYN+UNq8;*_1`{MR@zCg>K0&*ov+B z73Vr{A2=^N8gH;Qtgo}~!mjMb?p)nGTu*&;U-sjWlo8(k8T7wq%Ld_fL-n^D&d0WE zlpf779LMpT!0$MT-*Ymj@E`w9@uU8UKXV$Va|UN|Hs|oRSE9JOB0gPQ8n}xrckXpMS8o`_K`6lz;OCPx2H`^9;}O9MAIt zFY*%q;Wb`o)MMd%xTWv#E+4SJ?S8DE@HrpH5AzvyRao9D;~%~k#v^Qx@b*tcM&>*G z-F5MedbyehmtwvNNNjL-L(fJyiPlX05sBb`pq%*?_=wkw;?&Y51HOXp@x+nHDA zV}5?=_n{Tg1zCuNS%k&8XK*-gOX_2z!#tPOq4|k$M!XC5-s?1RSf!aRR$|e3Jg2Q&?(vIDa>F2+RN3_%zPoEY9a5E@qnZ z;kf^79+w-x>^xni*K-3maua`L@A?tnZrEnMmD{+JyZ9S-GflU!J^S?U+|NIFfR__R ze7n9Q`Y4a{FaFIFJjF9S%kusn>%6|eY_7vg`kwju)ph%i@oT)nTfEIXyvuvM&j)Z8rrerFnW*YvPBrG?bPR|U?$V|-4teouM@v`e2%*kAw=sL-( z^YL_SnI01L7Z*L@J4S5y~c36^4MmSI_zV|i9!MOI>Ee#|PY%1`(yi#e~W>FP&?prN%OBQ|=>Fo*ox8;0gye-?Y13U3+ zc4ilLWjB_!Jw0?!_F`}LVL$fgKn`N}WMRI((L*`X_%J>Ef8+eZeP*HO#rOT+<9|)x;9$?Yt?%$2AM+`n@i|}e72hz@&hWkvnXj!UU-htGF^tD#EXHOW z#^vXZb9|kEiI|v4n2agd>{+C@82PKDHyFPQ)Zk!IVtRG)&73%*f=a!glA> zxtN=I_!0B601L7Z3$qxDvm{ILL+dT8KX<<$3qHvN4;m1zWN;+we=aWjnTKwv1uFI_XNfv+l}H#(OfO^Q^DO`*8pV zauC1aFb?Mk-Y_4d^%zcIR_pstf6vM6oGI+b6g`zcaTfDC4h!`XuH*S3$ieauo#Q81V7If=CiCW$MUSeO032We};LeryKBdHf9qxV+(%4 zR&33ZIl_6;Mt{Yo*~50W)9u-T9odPUS?80myso+%yR!#-u{Zm%ozItp^k9C&q5PJ^ zIGiImlA}3><2Zre@q13@Pn^c-oWYr#&0jc&^EjUixrmFogiASjTR6_k^$M=!YOdj0 zuH$-c;#M|v->$JFEPuQ4o!rIU+{1m`&p&v82l@PJxQ`ss$9SB7@dQuu6i@RE&+;74 z^8zn(f6j289^y6Q*LlVGUER4#*#GDBzgcpJJXD$x#KK+r7UnI#m`k{f%ejIpxteRajzjZ??c1O?azWX!-t*4aU;2mM z?(yGvfCqVqhk1lYd5p*T7YpSJ+wpu;G3j;Zr{63%=xQM%WY97m<&L?8Gj-p)McxQe%pC{@`{GQ2uf7fLF1E+8*e`MBkVLN`-(>a5) zxTSEI-?@4o=W_uUauFBvvez%w%emeA<4V1XtGR}2xsL0(ff3%tlnyv&q6!hQH3eT~<7lec)A zcX*deDu(muzJA1i`Is;Gim&;G5%z}VEGZi1Ka!5jcNm3H`7Wa|I%6;3Rldau$E#9M0ncF5+VLvD{^P1y^!4*Ki#trwixdM!kuf zxrJM~ox8b*k9-}qPw(d+{FCu2hx6l*KFlLL&cAqqr+AuYc$OD><$9xSm-p}}8J%rzK7-xIl2tAUcIGSTPo)b8cllW=A zu$|xQ$^3~wa~h{}24`{>XY&_!D;AbNN6+OvjxHbOW3gVsWn95kT+KCH$MxLAU%8oy zD}?oI)!UfS_zt~`ySb0Q^JC9HqK`3w^XzYZf+u;3XLz1FEbpSe#LK+O>%766yv5tR z!-xFdzhgbtPx*|m81?sX|B20be2)p4h>2O=|IaF!PR9kD8jLgie z%*JUx&*#v&n45Wd!@o}z(uMijcrjgqCE3(tQ|&oYPWAY1A% z&()3BWG&Wa4PW=x(e>Hje~-5c%lTaI^}gLiH)S(6XA54iJrO<**F|gN9azeEReo)} zGrO=GyR!#-vKM=^5BqX~e=ol1@6QGrk6taz*I+%A-*Om7a3n`@3~QQ~3A&Tx`<VC*U%8oExt%*X z#C5qx@8=dWd8%<{EDsPFfJEm3d@hL z6EGnYv0(Zz4@q=Vw)Fj8AL^7$#WYOI^vuXi%*t%c!JN#^k8g+l`AFwweimXemS9On z`z#!{(t1qHuwNB)MOI>Ee#|PY%EFfSss4=BSd+C_n`7J$>gsx|&!1fv4Rs?nW>Yq2 zOSWQbe#N%D7BTF92i=ihGg-CpcsJdhJs5Lvc)XYH&9mjhdDK_;V}H)JKLhn(e!~^k zTfccY9>a}~;EW-`_i4PvAt}s2-O4y`Ib|oXTmO&KaD^S)9#ZIEQmNp9{E{ zOSp_HxrS@Gp7ngb+oU7-d5f)jJ9ls=ckwsw=05(xLp;nQJj&IM+i`t@O;d;CeM+C^ z8J^>L_FEIK+Y9<4FY^ko@*1!625<5f+tm!`;~jmM_xXU2_%HwC6F%j0zTiu~;%mO) z64!C0Kf-)OW)wzcG{$0V#^n)zuNzMf_W9v`otRCkhk4vOAe_(H7KTpZ@ei1k$(Wp} zm~(D;U3#5?cWZ_D%&fC8E3+{tb1@I|GCvEjAPccDi?RLGustPoNtR-1mSuTXU`5WX z9k#!+{+Jt$f2#An7minTU6b`#{Z4qif&QG0*xmWxR5#aW<2?b(r?_%%DT z3%jx#yR!#-a&4Wk-apvKc*SF3KlM^%#!jIF9E;PUa7+<@@A+ z)IafOW^jL=p=WV6f8iX?LWqmeaLpEY#HepjXV{^7*YqsHzHeo-%)L*eJ+p#_OjSug0o%Gl2 z%*2ht@#&$rJ_+4R_hvu#=Kv1mAP(jb4&}ET#&5n4+ci>;;%JWHIF9E8PULr-#P2zo zKX3}C@<;x}X`Id(oXJ_7&AC1&&-q_-0oykY^SDGW<#LYq_!_;A>$$|^Tl7|L<96=g zF8;>d+{3-x$NY)H^>#o<>lON_-dr>spA-5dPw_O@v<}ZZtCyRX^ZEiW@)B1z3G;L1 zf9-WQ^b_~*S8>Ag?i#g!$-MD(qh*9hvVk8e_7k z`&%3xm+=^%N#6_C@%uUf6EYDKGYQi*3-ggwCu0hJ$dpXObUe2?>`z9Wi79PQR-KL6 znS(i*haWL7^D#dQaC7P~pG9;oUsryd^oxNDTMcA+YdH@G<2*2S_{^WJv_6+CM z2;(C;ilaG(V>yoFIf38v2TtKs{>bS(Zr*0;+5CmYT890bs~2!FmvK2)a3$ApE!S}~ zxA2~?XLst|{KECQUth7khxHPFe|b`$<{6&lIiBZb{=;j$&TanP^oG96d%VwwEZQo} z(^LI|FZs&;MLrm=tLdH}Rlm#2sl(&3bR5RzMXyUcB|I;_@rUN++2*hv?;B6RgiOo` zt;6$P+pc8BQ!*7(GY!-B2-kl)ot_z3-Ey<)Y|PGF%*{Ofi1}H7P5XxHqo6L#A}q>V z=Ivwm#S+F#vJ^|R49oKJ^)MghbOl!AGk@=2S%1t4X~XNP>W%)rsJgDfnykgztizGc z^Ln~I8}f5DVq-RE3&!#9Vo%zH?doj23%jx#yR#R2GneB$L=WY~qV89^h@W#GrAKot z$8!QFax$lIDu3ipeC@c-(6gBEtFV8G?C*t$q33#hAs2HA<6a8STc$fr3cXUV<{D1- zbGaj|Z@ux2+{9nGnOnG(+jzuscIchl#oxG_d$^bT_&fjL0Zz{p_9s%BaDO;#JXhN= zp3;0BH~trgc>I(;&FzW8@jk1gS?)!BmH+S>uQPeOu-=>c7H{(o@9`m@@F}111?Rh7 zvf7__4u$=V!f1@nn2gOhjLY|#fC-tRec1lQItf2uGA3sVe#n$;XgR5M8m41`^;n+`nbLV1t7F*D=Ehs_OSWZucI4OW!qJw~UH4#5R&-wW)%`e- zgLvF>hUlUEmcuxlBRHC4Ii3?Zk>9bu>!o_9u>X^dPvcbMGxSW(<}X~pgM$W6@V`{cIht=z`#+`*mP#ogS?ef*vK`3Lja{?XQZ*!U41|H24?}EOArtw>>Z+&<5J>KU7 z7PEbi^nZN9XMDkze8ty{a5&s|BXXk8U)g#^diy|Rymk(t@i`&t&AmD!k`d54F2$ffge zWy&yKKo??R7G*IOX9<>MDIOmd_M?n0%UwRVme-Y7nYCDlcYI&Tg05kC4UK=!bB!Y#q*nR>p@IkJv3NCobE1yd66_UpxG-*@<7X8{dl>=B=0B@8<~m>HbWABRp@Y z9>(EJ=5yT`J&wmxhwZJAChX5d0l37LqAnS@E1jLDfge>lz`>Xb~w^vu9a%)+e9#+=N>-0adToYx=eyv)afEW)Bp z+%3#+d*|ESufq10@pxHQU=@DConym#tLYl7$vUjZ25iViY{pZrgVlM$cC|C!o_BkP z^>xx;vopIeZlCbH9=a!cvk&`m00(ji>sZdWdKg!H9+p2+kK$d+{3-x$Nl_+fAS!YaMARzUB~or=lMx}ibMT8{yBY~JFh2Gchx>FdNtSywHC@IFIuh&(8uZ$lT_ss4l^hEXA8K!*M9B&slysU6GYo znIE$Xt1|k)uzhh^&3JXzVw%+9{H?9)v8mTJ(aqSLE%*gnu{Dd@@3EFsa75U@DZ0Jq zbznz!WjA(bANFH^4&)#X=C>TlHVwmkjM7ct3EPv=&zGbh6doV%@d=#B?>LE***#}? z-4y*3r*jr(a}MWn0k?b+j>96om`hl(YS`XYdJWfe1ApaKZs!i}<{s|l@7&Knd4LCb zh(~ywe{qxdvtN1M_yt~MS>Hc*MPKDLUgs^|;a%S2k}+Za@9PJA$VdE_Pxy?_`H~TQ zA6+CyW6p2FdSdFhTrn>kmw5U;CSXDqS|6U*%W^(2o~cM!?r`IK%v(y2r($ZpasNxF zGcY4FF$=RY8*?xx?|&KApIhhQN6gFoEW{!#KQz3)xGup`JZgWgyKj~?UXBC2zJjjI zs{DkX^0MEnR9)9#P1fSpG~s=#p03XZY{bTF!ffw{>#(_Q!Io^r)@;MC*p}_so*meU zU$Zm2up7JcYu`7}Q}<$T_F-T4V}B0dK<2c6L-aQs%GU1NBlReb=2#}^8P4bNdIBf1 zrN77cUQgx}CiMDVp7)dSpE-@w`Plh0OV8n4&f|RM^K(QC^%7pNzGZqjS8yelr4Q%N zYQ2VQxt<$1d2l#yHtJ3MmB-tJ0#iI{{bIJ19PPfC5tyrtF?MuzpJ)z!^!4Q4i;g&RFT zVZksDIgRIHZsy@feCTzBbYT`@Q5IuyR^-R5%16%UnWMt?&tr9u$2On;{1?uLy2k6V z0UNO~o3P;Mu-s<)jo;(hLbv?ixc7s2*7v3Huh@>A_%%DT3%jugd$JdMvk$k}zMiGS z@$GMX00(jq2XhF&;V34u{fT}47-M`aYx{k2HI9nLM+UpEXGnS%kr$qO03NK{=K7${*<3_`Pwl5)pcDy@;SPm zZotycs{#|lel#-Pm`&J>%~{j)TkA*J!g?FW4$Jx4cxQHDS9W7NpYwX^-t5D^?8p8b zz(E|$A^e7qZD%3p&nV+#IF92vk>7EO>uHjn%pW+_<5Ts|oW>cP$yuDu4?2YV)qK5x zi@2CeI6Qlp=LEi=X_@gAT*)MT7sbBF8Bm5nf-*$4?k4QQ)-(eI+<-3f=(XOYMIu_$F9>;jz zdpZFN_&o=SbYdo9mLJ0QCDqB8oE1I(p-#m#%*eW~$M)tsoAK>F7vFcKwPC(X>oTm!O03MP{EWZ44r}O|tj)T-94{RA`nn+(P6^x9SQktX zwx_vn!NhyR^S;pU`Fp_Dx(&bNS8T`j?8r{Mk~iFUy6SH1&R%To_gf6sLpYoxIFh3| zhGRL7-_lHcvj8TX9{2C0UB4S&^0aF{|$9N(Ci zdHcfaCK~^qllh+Qo1&-kM>aQ)GxSU@Ge2|nJkI9=F5)WBU#3@ZB~RrF$8VKxGc#=W z8oie5xq%zGiHYpb7QK}_xRbk?AX+$Xd-PuJUUn|;`q z{n(!aIFN%lm_zt2hjBPZax^DB4-+^}PvAs;_rK@yd#)%O_H(lSfm8T1r*kF?whgbF zt>KV^ z*7HcG@cSB~`+nZX#-H;gBb*BNhbWB7cNv{A7?ZIXhd-tb%ZaDoXTtw^F3dwBotR1Z z0h2NrlQR|5F%vU03$rpCb1)Zc9uM0w^iHtE`(eBDd%OS(vJeZi2rm>5*W=JdmSg-K zKQB;9mu6Y^>JipgPFLXia$$KDbtP726;|aZ{FI-u25Ykp>#{x@uo0Uu)8Mcj&2)3N zWYIohf4|gUu`S!PBTFX;%j>MWvKzZ|*NreQy>;LJJm+x?^diPJcPGdYX1`3vW8F6VJR7jh97 zvwO5KpG)<7&dXJLHP>)0*YVq>VSYF0jqF|`+_yLBU%8oExRu*@!18wK-Q2^$=IeL8 zpMNmTvame|^kE+1F&^g$p5z%`;y>JExi|Dp_Ve>DxAjQdcSqmlJwD(Q%j@j(#ec>h z|L<{LT_5)6nSQ~S+;csgPj7UD)8Tk-*cP0+JiI=t@o0>}n2f`?jK>7LX*s|6+??Ea zDyC*f-^Y+nr)L&sXHMo~ZhpkP%+CTW$U-d4qD;3k>~C>hf+bmsrCEkue#>DT$x$4`u`GNw9G~y>r=N!X ztGYT^jX!uiSI=<%|EQaIybW*p95UVGGdPpIJa4uhr|0P-F~jl~=!IOwAAO(X61|km zxSWOEZ&&J7T+KCH%XQqyP29{a+{W$P!GwjveR-$;jl20L5AvaTI;@ZKIRE0mo_9i@ z<{6&l1zzO6=wTi&>1({swrj)jy`^vSF7NXpAMs!QSt~4mp5;6-{*=#Hvt5{%4W1X_ zOn6;HM&dh+!l-;>U4bQ>$6NcGqW%& zvoSk!FgNouAM>*S3$hrCvjj`B6w9zI%dtEwFuV7^O1d&XW))WDC#>dm)pT{%U`^I$ z1=nFcU7rp4IUBJto3a^O@C&Z+{f4b|8-B@lyk>j9)?L_@-54ibI4`^F9_-0J?8|=a z&jB3BL2R=joIl^_q5Q+=nPGY)M{zXAa{|BPBu?fO{>*8d&R;l}^SOWvxrmFogiE=c ztGJdMxY)l#|Ef208@F>e%Wewuvsc&9wfLv;13bu<9zU#)@GrKj8kT!X7x%t?USHy6 zUg0^*y{2#L8~PUS@GkH15&z?3KH*b7<8!{?pkKpwzt$u41V%m^&eKhL3!@r;mmhr_ zmJ?0KU@XRF9L8ll#^-xXz=TZ9B>aF$nT*Mqf+?AbshO7Pn4X!Kg;|-6*_o4hn3wrk zf~9!P=e07rEX%PxE3gtP^ZDoDeeGjim7nr6-gTYV&^1|`by%16Sf35~IUBPH+ql0r z*ZG=<^J7AdaQwe8-s*p^+Zx8d(pla2+UfS}z)q}uEiAXI?!mt7$Nn6^fgH>s?Aa}B z$2WQ?Z~FbR!}TbR=2(v7cuwGVoXn~Gkv}na>u~(0>sj2mEo|3ZJ&*Ibkc+sOP2+^m z(aZG;u4CTqVY!?1uiVOQ+|3w1m(TIKy~dlkj~&v7d6dW5-1AQ84!gqfJEc$a49~OG zjVeMp=lTU-@)ck6 z4I`Wj+c%|jI8N{Aj+P%w$7Y=M;ra1&e107#%+GuJeI{T+CSg*h;D=1b)J(&)Ovj9z z<>b}*n4bk%h?}y6^%U17_?hLF)@4|Z z>9?>3mM_ z`{K?RKg)Bxz)P&>=hd(1tNe%8I5T;;j&AB(tdKCgAGNXmUlxVuJ@EKLKH|T8%qM)x z!?yqSy0Dy=#$WL@A9-Gc^WlCMiSIB9qw-xwV^ZID5>v-w9G>v?|NA6w9xcDSBO886FnEYC`; z%&Po^pYk)-WG&Wa%);R~*4GXBIUBJto3JUHvjq$85A(ijb=beJjJIVk=V51^ZESdc zH~okG@2=Nd-sXwnc}@Jib{~%)@OVGnp949FLpYSfID#WNnhnc`>t?K;z=<69N7$ap z`Ug(oRQ}8voXJ_7&0jc&b2*Rmxqwmr4C`N{7jp@hb0wep{rIc&YOdj0uH$-c;6`rZ zW^Utl?%*yiww-(QGQay3|C*65g!M#b6vp5r*VlVG z5fd{BKVVWOX9|AE)J(_p%*ag4%&g4Dh=;;{nW*Au{6tYldfHl`x?3?Yq2)#upaBP0UNO~o3JUHu{m3? zCBNW&KbO`Nj_ks&?8ffw!Jh2RzU;@r9KxX-#^D^nt^Fgs{WDsR8CmUdH8I$$Bp%Mfkrz ztMzi%>3Y3^8@Y+Uax=GZJ9ly~_wx__$pbvZ!#vKvxxjUIQlI7-o@f>J49jL+Y#w|?KSyadK$*#D$D8B;J`$B1vYFQrb! z1D2OjXW}ehXJysdn4LM8hk2Qg`B{JkS(rswl*L$_C0LTBS%zg`E4YShxsL0(fhkT#e7n6_xY_s?Zsm6F;7;!1HrK~)-OBRz>V52E{7-#=2YHBx zd4xxKjK}#G|K<(%&y}b2X`bOFUSa!k;q}+_b>84jj+q$d z^|rplv)2DmKjObElrp@oVCG0~|Ko}AXMD~Ve93ed!gjsU5iW=2L}FyV!zhf(cNvY_ zUqyPmfEYR^W3i|8#ntin9uqJT=X!oJot!E7AyYCf(=h|feI54mzU5^x{!C}rIoR#z z@cf+mBUbt@>|cIeh=o~%#aV(SS&F4up4GEQemife(}(#_!zv!H%BfYu`m5<0tjSue z%{rVKJ@VTH*VXk{pAFcM%W8)0Xrvpn37c}%r7%xtCxz#KVZ1fl@GG`uJGN&Bc4QZJ zXAkyfANJ#&yJ0&9=z$!>!TjQKc-~N5x_{`AdNjvyEXQ*)f8fuY&KW#zJ+t*iJx9;w zd@kT(F5yxx<8rRxO0ME+uHn;@;e6Ssf8`byNEG?)f!n6Ha|d^F7k}e!?&Xo3VLkix zpFF^WJj|m!#^d~p!#@hg<&-|nb3D%ryvR$u%4@vA+q}bjyw3-G$OCo5c0AUpHiYxM z>+G<B20+qWrFL zyoFIgzbygzMl-%bjfe2TtWr z{F&1@-s@-RnViKrJo;-`&pf@DOZeDwR_WDT!*$%ijoidvxtUwImD{+TJGhg(xSM;p zm;3lTYa9>9XTLrgHQY!3)CYKohyV9H9^-NT#lLxyr?~lMn7{e%Pv?za;6+~Mb>84j z#=RAmb6elxUEX6K=fea2kdOE;|Knpm;Zr{6OTOZ3zG1|xVg4fV9Y$ePZn6E>i-+e& zHy(pAxyn4n)^XUy`)fQMp9z?diI|v4n3M%>hj~n{Q!*82Uk&F+TAhwrn3dU>gE^Ut zAMvpD<E8UuH*p}@%s&jas>8cC)oZ3_OVsG|kKMvwI9LjGw z$?`_%ksQU*9K-Rf;r)1${+^S0(7aF4KXV!r-V5_KG!6Vk& zsco3I)yCIw9oKUMw{bgn@i+csd++iO;|F+Kk&R{Ov&88gy*Hz>6w8UnTc7L zmD!k`Ihc#NnTH>7vh6LP3$h4{u>?!8JS(s&KVxmyWdnZBMr_O$Y{@U!nqTs3c41dm z@pa6wp z7oN1e^YsEQ@vKWF}_eCdjLl4oIiO6Zb2 z?YtUmN`; z+p-QtuZsQK_WbT*Y`M>Gi+{3+m{UmJPKHbXeQgsXSa=`c@cKtLw|FAyBzj>0Uc$#N; zmgjka7p?b_zRWAU`oHnyVg3K;YkcYTH}x&v<{jSUJr;5v-q#QKknL)Pd3dCYy$bXC zpMJ{ce92dQ%?Q`SeYCjsec_ z00(lB@6Q;dhj1vrtU{5 zz(rilC0x!GT*)4J!f{`t*K!@#a|3^63fr|=-*A3x)!SKPXW0LpdKZ7=Ztmmn{F4WH zh=+NEM|q6LIX+TY@89|aPx2H`^9;}O0x$9suksqNbMS?*zK+h{o5t_)J|FNQ|7F(5 z;q_1SQ$FJhzT|7x@VZDh!g&*!Q5fSuxL)7Y(b?U0#?o;Zm+=^%?=vA2@dNg3YWh3gzZ12&+;7q=6PP^CFUL)?zb!Y zDzEV$Ugr(o;%(mJeLmnrKH_6$j32i9ss4}8`I4{rnr|85RyeN_8HG_9lW`cI?=vxz zFe#HUIaBZhrebQQWk>f>MxBY7`GxB=tIo#k%)!IW!uiOp^Dr;-F+V?K0T$$B?>9wt zF&1YDmSicGVOf@Ac~)RWe$2}JgjHCL)!8CpIPW!eZPsNy)@K8b^E_>&o3JUHu?1W4 zg!Q%2?fJlXC*6fz*^S-VgFQLL_Vm)d*@u1E{Qa=M1N1-+;$Y568Rq-R{QG^r9%=el z9L3Qb!*QIzNu10noXTX0!uo#D+4W34i$C%w&f#3nV{5O!;rX=4_^({dC0xoC{Kow; zrc~Ijb;j3otov)D-o(w^!mZrSUw#YE-(7kS_i`Wi^8oAm`I1BWFq@7I_vaCPl*jld zkMkr?@eFH}4Ewn|YVdF4=Xr^jd4*Sbjn^6Z)3BV|`X2A|3IF3WKIaR*;u}Wv_2M5= zgy(G(9gXktZj!M6&iR6|jK^kN#$$XY;e007DY(@9sdZYW zX9iAl9c9v)nT1)IjoG=<@^kCF%*Xt!m@MpnL0yFL3xwlWOqXCuMynb2tE?`^@+{mn zyneRr-)ub}n_iipunKE3a`LcUb#z=^PuFKdHepk486K|t=DG!2vJLwc3)|UNw_|&D zWG8;X&df0=yuOR>#_sIJ-t5bMY;QX!rwIEy$oOCm<#3MRNIv(v@ANp1=LAmTWKQ8! z{=jLR&KdlXYu|l-)&Ju!T*yWIm5aHA%eb8BPlo+prB^fZz%agE|IUrv%&pwXUEIyR z+{gVqz#}}yvpmPte}wD(lD@)gyv~1_FICv?+xiag@*eMVkLPQeZ^HGo&vAZc`XI|o z@B4eNj2|%H8~v6M?u6w;WF$srbiT)!jKw&-={Xl)pY0g#s{}eB-)ABwW)dc4GN$AQ zOwBY*$8xE|am=7IG840K+n}&rS#=KPVs3up=K>~JZa(8b>jJtE3$rMTu{cZcl-HNi zrCEk$S&rrT5p&cF*H>ko+w(Pkny~-XjMro>CfOUN*U@$Rg!5iwd{|z6<9j`a8|p?J zVEI4g4)g!(eWQixE!m3g*nu7S)^&2*>z`R}H`BYbCwuW>)NtPV>HaL2Htg3BJ(R=w z6-P5lvap!knHvGxSVmO&7N7Cq0LAIgdZ{7tZGbF61Kq%Ees5 zWn96PT*cK~!*%?f8@Q31xS3nHjoZ14ySayZc_?d^{&`GQZ~!ESEXFe!8B)S^SBa+|P6LT>i{o*wgZw`ThMx#zz=m zte0>pSMWEk;%ctpTK;Bv>-9!%;%4sV9`56QHgw+|)Q5POM|q5Y@;FcMB+s&h_qo6I zd0yltUgi~ENmSicGVS(&n{pECdR%9g>uMp<@NLS`3tjg-F z!P;!dMr_O`Y{uqn$S4x?r_|f>Sg?m!`z1}^=cM$elmO??w?O{h2?HEeKWUm8@F=@yL;U( zy@z|bkN1{_^&HkcH;41l-t**7<88kP^PSKqd75W85=yv5tR z!@IoC2YkfGe9C9MQa-Hrg?`1?Eb}((SA_e)h>XmrjLsO0$ykiTxGd!BtnqY#4Pp5S z_4`c3#7xR$OwPhypHjE^B3xgoby}up24-YtW@R?!U{2;@Ugl$de#n9>#KJ7XqAbSt zKEIUGrCEk$S&rpdk(Kx{tFS7o@$H>(zf{*XSd+E*p|5Ax)#H7Crjc&UW?W$Y7P=){ z@pHCgdv;()cH$T8%r5N8ZtTt;%#%Ot-WSyCd}W``c4}^!?Qfczj>Y)c#)TR zh2J|r|L6&&lma?U-J#$GU9`U^rCS`Jd zz*hys`AV(RG93@J3D;*vor#&5g;|-6*_nemnVWf-m-+c23vf!IuziJeVHROg7GrUi zU`g)qTsmiYWsH|)IaXvPR^}(H%Id7ePg#fcSf35pkWJW>E!m3eKMTjbwQkQ2{DPg? zmEG8rU$PhbuuPF~TnFjF9LnJw$x$55dYQxa9d%s4HvSFA@H>v!d z$fd>)>pysm$N3je@ifoy91|4_$1NSN7{AJEyw0|V!u&V%Ev~j*mCA(aca7iU1D^H1 z{a8QYQ~t;2e8HD|%Los{b1)(!bH~YWT}0J!7?1IpfC-s|DVd6Cn2s5kiJ6&&zkeIH zE4RK`E!+orbOHXEDU8qa^K=VY)b!#k!ICV+(k#PrEYAw8#E)2+!^?&3tfH%Ouk%=4 z*I-T7Vr|xELpEj;E{zz@M+@DOt=NWb*`6KvqxZ+VCBt=f)b@2ZeO2u+-c$GHS-&Q!9LwOq&Fxq%zGiJQ5FTe*$fxq~~oi+?*G`}IK{;u>E!II55FPafw9{>76##nU{) zvpmP^o;w%y6|QwY{&_ba*BOuN@4wtKew%lAm-qRA5BZe;@fn}<1z+>J;}!8yxc?$C zGNbUO&zCpNAJcd&#%3JGX9CXfd&!A(&2r&7{i|ts?xZk&=~TEsQ|UBJ&kW4S4VIHd zXJt0#;7#-8)_J(yanG*{upkSuFpID#i?IYtvNX$cpX=^pU6sSihvQIP*I-T7=9sNv zzOCkOV7wt4vk9BBIa{zLdsPj~`%JfHTef2dcH$T8%x>(#p8S%%*@pu-kb^mlqxcQS z@LPVzah%9WoXjbl#_8PEC0uU_Du(_4(fCiC&AFV%kIcVFFXmFN;znk2A8&HsY%|`% z?|pCAJGqOynPE`azWw?j5AiVn>KyJD-|mQT+<1yg;q|rs{f(2xFS-uT>GS;5{Fn4) zHa31uU*`?}%bQG+JRINK`VQ~1#qO|OLoD~P@h5!B|M-m0`GT+bnr|50-wS+U`H?>g z>x=w2Jl~=-CSx-m6EGnUI}a)CR}$mNn4Bq?l5uQDYMqAZnUR^8nc0|~IhlufnUDGT zAq%h|3$qA|vKWiA1WU0r%kZt^SYB6PC4R(DScO$tjp-f7>UvaD*Qp-%ap=0bJ{zzR zo3JUHu{m3CkL7))TeA(@u_HS%Mdh#^U36D=V|SK!pZC;XvKRZXFZ;1S2XG(BBt2^44=ySI~dz zlbmEZr*#w0jlcDIUf@Mu;x*pjP2S>d-r-%|<9$BlBW8~ij_VWslr3%FGyR;YoS#?v zHQzA86Q2_qnNb*(<;sNf7F{3obERvmh3$!LJRajS0pI7T%VB*d3 z3J3HE`&Ug@XARb5E!O6ztiyV2z=8h$%oM)e8rIXy^yX~Ami&yLvklv_Jv(rZ<#*Cw zurph_&w9E}yBY7!p6tcm=If&ea3BYB2#0bQzv3v4=GXj&ooj~ccbp#237p8uoXYQ+ z!gV=Y&*41I=K?O`VlH82KL=8i^|{9Mb=<&irf=3;xsBVogS)t!`?#M6SljdXkUq>K z{DVh%jDPYtPw*tK__^@Y`V7zV9J4!~7xYD5;V55^$>-}^{}^9r{HDIe+uUXPef@xs z_?S=ljL-RkFZr5p_?8i#hWjfbBl9btE28SCQNriy^j`&I7>~(VjLqJ@UKCfyV|*s$ zx8_TvlW?B#2KIk6D?YunMcPI%}{dYq1XNvOXKI5u30no3S}tuoXY!=WNXe zgTr;xR<~mZc4Q}h!LIDa?(D%Yxv68gj{E4o?9Tz5=DHrFhjJvp;wX-0IrsS(J(k~b z94B!Kr}78(uNSVP8G0sv;ynJ$U%8k|xs1!Xf-AX(Yq_2qxQSc2jall4?fakOw9oi{ z9^euF!9iYkT%Y86E zd-(mLSNb*IF!F!lx{AW6d{ZhcH=0hyK$X7GpCG-=iz9E;Cj=yu%`LyupyhW8Dsi=w3fP1WQ4h$(+LP`2(kO24`{>f8wZ>0daX3;8RTv9Pbltki#24aaAdUd=UJ z%XM7O4Q%531)KC1Zsj)4w%(okpyywK%3(kD8jn&UY|mkRlpiz;=Q%5n8$ZcYJk2va z%X9pjmw1_1_z$o1CU5aJ@9-|~@c|$55tkPT+y6vA;|spzE52cbXW@860gw^RB($&eQQ8hwc2Ip3j9`#Kl~~rCi44 zT**~j&6z%*uGbqG@lsg-X1#@5nJ{Jee6me%=PvH%9`5Bq9^xNN^m$m{&X(c)oicuw z=lC}-@FFkqGOzL)r(6DY{V#9w7H{*I`S0obe86R%bC2|6KH*b7=Nm?N?)k|`?AJQ% ze-s^!(HVp9F(zX%HsdfZGx$1Xe4T&^`92fzsO?CqSGz7#=#)%QJDmU2It?FreL9_< z8JLNgnT1)IjoF!lxtWJ~nUDGTAq%h|3$X}`ab}xv+)L_1~MGMd0y~g+ROVbbPzWT5}!arEhbLW^o z&J+BLCwYped4^~Cul1eR7kH6Zc`R|*zkl>~-r&Ey$y>b5JG{$#yw3-G$VYt4Cw$8P z_>3=@+x7NJzvdfG>JZLHgco6dA~G_gFe;-l24gY~<1!u-Fd^S(A|_!nCT9w!Vj8Ap zI;LkvX66O&C)sok=44(LU_lmU5f)=fmSU3F;rcDB%kh-|KdGdn`1cPh>uRjUqs78~ zSw}Zu#qYv+W8IX^m~Tv&-co`GA};0RGX+0jZ(qMlqth}S$D97a zrm+5u@23AA?)&UI2lFx?3$hUJSzZxcl*L(+rC6F}S)LVGiRo-#W&H`OvcUOpy;awr zxo&FdPg$Q0`M>Vrb&YisHfIZd#x`ur_Uyop?947q-a0(TyXtQ2&K~T^FWHNI*p~yi z(eF_Y)CSzZt4b*bsgxSYRn6<2c&*YfwCVY%zyH8=2x=^ynD`?uNn7H;LM zn_)SD4FBduUgBk5;Z=@k8?M8D^)24!9VY1& z_UpcWz^8o17tCHVEcc~;#n*hpw~X{EJZ~a13a43bOdYpx*pB!*0Tc3lCT0?ja6VG# zluX6cOv`l4$V|-4EX>C2TpS=3x-eG_8>jEsuLM+Y_EX}ek$MUSm zO8kf)vob$n6;@+))?iK6V#GdSyFb-+SeNzKfDPH0P1u|**@~aDHQTT)+pz;X@e6il z7j|Vgc4rUvJ zXHMo~ZsuWLj`Q!6{97&@pTfqAvKWiA1WU4s<4{hQ=d+1ndFx%5zxsW@DyCOw4c26B ze#*p+!hKptKWY-Xp03ZhzE9ssH)d0QW;>hf7Hr8@@8;v@Y|S=o%XVzf4(!NI{DPg? zghnIm{0hW|M9Z*KGVgYeI{ZOCS@`vX9{kr5!U~KPQ$cJ$1Kdo9L&u;EX0VPhU>eiF3!>{!*VRo zO8jnkxSl@Nm06W3Oz-FS5vv=o!CI`%Pg#d`S&#MEkWJW>&H0}FYNb~v5BvGch_JnF zjJIQZc3?+#W;b@{m+Zy9{H;q^&pjyGAjwKjTuLYfFs|(_a~X!wCLvUh_QRxJS{^7@aZr z$Nq3Wr&(SczT=Txr(jCXaG#{oshNgpS^Vp;f9Z7wW@IL2VOHj3 zZsuhc&xQQ@Ll$5`7G@C^WpS2ZNtR-1ZhR81+j6=BEAc9D@Kx*i8C3*!xRLpJAU{G4srmhIS{9odzSz6s~&uD_4f$9P}%;{Xn1bN~MKP(7R@ z_%*-bSbodz*ez$czQ^l{oXi=V#UHudzf-W?&*jZAK9@;2k3aK&oX-VZ$VE&sHXN5d z?$hPQvw9A$(yO_KYq^e_xS3nHmD{<4JGqOyx#wNmu6=qxOS&%(>BBt66a0%Od7c+| zk(YRdtKNj;aaEVIzJK&}{>z)Z#XG#qd%Vwwe8RKC!up=-&LcxV)6e;WFZqgZ_?8hO zg!?EWBQY|gF$UjbOvYkt#$gS|;k5t1jBh*v6Y_n2?B|jb>BKDVx=N~(F*#E(B|l(l zre!*&X9i|wR%T~T=HiDe%pxqxVl2T@EY13kM+IGppRfw6vKni!CTp=S>#-plu^F55 zGqz?Mmi{?hKW%k-|6kQ*d>HR&yc4^yJA3d;_F`}LVPE!Re-7Y4KHe1GuLtX)9L5nG z$%|#fc8=Bq+wH+n3;4~#9ujQ zM7SRp>m_{dxGdAlnb-MRI5BMBM&p~fnOnHqd|Rr7`D?qscACD6*=L6Hut#@s{T|SV zc$mj{lBalv=lC}-@FFkqG8@>gYx*Bv=MARwcQbG4yL`+ie9F_4!hXlt9QN;p@mGA! zH+;(oz8?^gkryg}hVvLh*Pa~K+nfoFCt_kIV+wx2)J(&)Ovm(m;dz@`Ps<** zBdd;nGjw*Hlew6idHEp=upkRF&7`or;<^M&u{6uFm(Mljb>ZK`d8nW(@gsiB%KU^? zSe4aSleJizby%16*nkb$h>^30?P{W%bIi(c9zWNu*@mOsC+&3yc4Q}h!OrZ$?(D&y z?8Un8?)MhqxTkU*_cwhIhjJK)vw_z)-F#4z;y1H z%{scjN55U~U<5x`x=Zij!5_kY9@a;Al*f3}d?)l@JjJ1&hiCLzCYlzOe_rQwJzUb4 zd4sojn|FAhkNA}T@g-mJHQzEqq;PzHc042LySDEEqZ*IFn2g2PjKg?L$V99;J?wYc z)WKxNlQRWVF%8o(Ju@&PQ@HQ5>O9VW4xNj+nV0$br|l}B3-O`xV!8xNvJ@B93D2F< zdZP1QR##v}R^rF3%qpzTnykgzTt6cmzdE{@>!+Ts&jxJBMr_O`Y|3VA&X#P&lwHDl zKhtg4fgRb2m1l^q6h3)O@IXlku37p6h=9{di@_YWkd!xd0ce$!m&xrv*(mD{hJKH+8HaHhj|rHBoh>JsPQg@6&y38(@{aczug_*YJ99D@^Dr;-^Fvm& zyn?zA3$qxD%nkcpLYHP)Ha7hu-Angl72{P|jn%osbEJE@@LaBGycTQoQ`TWU)@K7Y zVN*6^{%v7Dn(G#9$@ZShpXtxJ&-S&^ZP||P*?}F|m3O^g*L1vl8Sl;W^TKuw(u4WH z_%n_){x!d0N?%|2R!`tWPUbYu;#|+od2BN!Y{x>=xAYF@W079MWn9h`{EaJ_?tfu< z>-6v3z>VC@E!@T>wyWp-?8Dd7F2*%=7V{zRw4I#Q*q$J^ftsYds-)c&@(H5u$|cj>O1}%4m$z zC(IW^zsFdN%{Yw5_)N(6nTUy*gugqF$#in2;0H{_mY;~ds z{;Z?xvOXKIAsewVo4#{l*w5y=6$cw{t=q6IM|wYPuRE|SOZmCR?)s|b_0(Uo7yB?) z`f&dH>j50Z!5qS&9LC`s$*(wyGd<_O*57a}zvVoiXRgKz$9buqZ2A;__d(d+srm;_ z<8;p8OwQtuoXt6WV|_pC|8YLQc0DZ8zj6teayeIV4cBrV*K;E`aSOL{8@Kb%U&HmY zS0CmPw()yOf9m5r!M}Ktr+9{Ed5(YcJTLGfFYz+3@E_jbzr4v?yv;jYw>a$IPp4m{FkX|jSeu`+F6*&A8?X@@ zvk5!-_feYb?AF^#f5z5q!<^=OxGbE94#qpNGrO`ovn>zvf2n)35BqZ<2XhFAau`Q) z6vuL{`(=V&rzh(voXQ_KoijL-v-l%_;%qK{5U#s9dOjC$AqzWhi}bHt%w=586+Cw@ z9Jj>&9%eDidF%7hI`jR`6u!?;`?v7AO~$t{%9r7NXP4f?73SZk5AYxl^9YZ!qQ6gf zO#jK_Ji${u%`-g9bNrhJoVN@5GOzL)|KWAs_J3(Jqh$b1z)j7Qbc7@diShVv6k$7Vc!yDCgipc8S0@nrgl{Yj}mU@E3&I;Lj^ zW@HZLVs7SPUVb(tTtE5r8TWO5U4ZQmhV3t^i?IYtvAmztEThY^+`H*qvpOuVqOQb~ z_WxsDnV+xe!0gw!?~Qt|M3?t;6h%vUrTg;zgM$Dui|R1;X1BoQ}2fx^d@fRv~}S; zY}4DhgFCs4ySazawuH}v`}AGgeLx@NAs*%gpZosM#XWb9>k~Z5Q#{ANd7iOihyA#u zyRQ#@RbS%`{%ra!eTVmWpO5&MPxzG2`GT+bnv)ZTLS#(xrV|G^G5cV&p&c)o! z#}8SM@&695E3AvKC`+&;`}`Q@FQdz{JU?b-R%Lb8;Dxf`d00!==BKQ~k2Z$&)zkIa zh)vj(&Desic)V0Nj-Tt+Y{Pc!$WHu%o!NyA-9O!R5BB7j?8QFp$Nn6^fgH+yQ^NLs zrN{fcH%gD@7>?zhP2qTr*AqCIQ}{i9;55$UEdI#ZtgtRz??3DLT)@T5lu2;@UUOgc82xNGyXGw;e0OOB4+Y) z+spL|{>EwUi&c6x*KjR==SFVgX7=0_wr`uRYJYd=o!rIU+{5Kwzh58VK_22^9^oH6 z%0GF6Cz*D4*uFFREL-~dl)v?PUf?BO=2iZ~e|ejCc$Wv8g!Mkq5BZo=pM~r5nSRa} ze92dQ%ZKj!NbiN$M`bilNgCE0Q^#f;#$`Ny>U<^8Tla+5C(+56oGJJLQ!x$GF+H;| z8?!S9b21lmGcWToKMS!ii?Ag3?+x2uM&EfIj#F73!N2d-ZhRQ;=svG#dL@3u?rXyR z`-!f?s%+u-Ro69Hi=VO%>+#{A6k)|tMapPSyAZP=b2*omFlh27bMJ^3Yj zvmXcYj_1-4J(R;ZoFn-aM{zXAa4fg)5BvX}9?uCpWBMdLnN!%NP!V%|M59r@Fm|cV$85Tkr;*17=r^Vgzb1w$7F2AVLZlX0w(19Ow8V+ z!}XF>Cua(Nz*J1l^vukx%*Gtd$z06C{fEQ;ie91CR?T%+WArmtx zlQR`}-3r^0M%VYe%c#2_563I3&dFTN%{#!ahu`!#lDT_=E`+4R>u!ZrK{EVNoHQTa1JFwVaVL6?2XLe;bc4rTM$*Er7NB3nv z_U9h+4b+1;m_s;}!#JEHc;;5P4!+W(`8B`cSbp>FwOXUEIw*yyJEI^#LB_As*%t z{>c;kiwTE?ic}e$9%$Pe97006gzBB6h>nV zesCtNCzg)QxZLUIKHk@fnS}fN|KoR-Go6c>%6zGrmg$&*4{wF-%%n3j3$wA?)i7TU zos-GVhW*H+^D^H%O)spAu{cYzG|R9o%W_;er|eewqaYgW6AX4czvO}vKvo3f4y~I_G5oW^!>Ymx{&Wb57t9Cj3YRb zqxlWL;{;CRM(f$i!~EX#A2^LkGKb?bL(k+a{>a%po+r#dUoYT7F5<6T!kJUTaa^XC za|M6nDz4@le(mQX^LtLLH~u@&-<8VwL z=Lr_FohS7fKK?5#f3VLpy)5T~=@)s4S9zWP@)mFN4)5|F@AI+sJkn42l>hM=pYsJ@ z@)ch*$?b4nOWNOvetv6N&TxDp>!^&z=#0Vl7?ZKMre^ru7hA_=d?sK*zRyH_;p=fp zbuy-4D*kaXY;PKUJ9}7fIz1tOn4Vr|U`A$TcIIGC=3;Kpc}C)ScLwUD%a9_$7O>H~X?52e8|fu>RqCB)?+poMFF4>u*@s{V-O4%W)jf z39N7aZ0@Hi#y{Q~mOn$!Tg57Q5sewas?((;e%zj%tL zd4>u93CsIipXUW$!8gX= zGD6&NJ|i*`BQpx4G8&^Z2H#^W#%3JGWjt=NT?ut!CSg)0V@iI&R7}I}&UZSUo*9^t znV6Y{{d{FMor`&xm-$(cu{wt1R!A3SQ5IuymSidJj1!)hWpp`~X9ZT|$E?QctihVB z&8nUob#*;fGd{=mH!|LsP1%gi*@CT@wprNz+LqVOcqjgwJ4`=bBpjzV|Ayc1`Zn+I@Y=BcfjkdYuDTn$vj=;zH~X-4obX)e zr~7k}}~T<+-(4Z(+S2VLv854Ewj;c%#l?J%#=I zkvok4V!mBElAq(7a_QX6!+gxo4_SbPSeQjvl*O3H=fe`ZBzyf4 z&Ua~DmgQKU6beGNvJUIA9viSB8?hN%uq8iZ8^--Fthb$>;C}6- zzhGx}V|RYZUhK_2?92Wfz(E|$AsotK9L^DJTqJDoNc|N@aWwbYuW$4ij^(%f-u{l$ zMLZuT=_#z~_uszPKX4jnau$nwA1G>hW%L}==kmqf@En|{f8hcy3PzFd-8$2^aYKZc?3`xqZG$r_(bdGczl*GY5}- z7>;8uosW-ShU0hF=c>ZSt2-`5bukua36^9j=6MyC7k^@~g7J^}39GOwtFab$_&K`T zx-RRnJ{zzh8?iB)uqm6d1zWNeKjY^-@Bb&->kjO~uI#~{{F1%dhbjF3`9R(HbvRDL z^l*;kR~*IB{DxyVmf!L_j^_kUYc}dT&ckNCg^m(nf_q%7tUpsCu-p$8X@22xDBP8_o z1V&;MMrAZc=X;D9F+68p*`9>P6EP{1GX+!f1HSS4G&%!UTYgrZjX9W;xmei0$CpRv zWquZ5K^9_R7G*KEEfUU8aor+P*xxexmEQ*`uPd-JtFRiYvj%JOu;rd)&o1G-q<4MP zHD7&ZFy2sK_I}jQb=J~&D}Kh$*_Q3uk)7Cu-PoO9GRl*%eZ6&G_TvB!KR+Z5t(Q$8_UAbMN%9KfmbtT)?AVw@5GLGA`$D zT*-vn!hM`7YFO`jZ#IAx!^E zpX3>y<)pvEeCPD6`Qd)KpfBf2Y z^lLtI-@Mfk-VfJ7L`Gs{M&Vh@kEWwD2H#^$J~V$E9iIu9knb}QlQ1bKxxbU^TK*nm zO8o&-F*VznFRjkNjLgI=oN4~q-d}PU-(@_v&co~ej(k3ypC2-HjBx!I)P-1>MOlm` zSdyh!mgQKU6Y)c#&HjmrFWpuJAmKwmY2HYsUZKP2S>d-r-%|=VLzMQ~t*ne92dQ z&Hlb${8mRw6t*k>U%@CkDq}Jh<1jAI`Tx>*Iw2D?DU&lLKVW)hU?yf^R_0(%=3-uc z$O0_LLM+0fEY1>48ZX=*sae{1qMhNml-1=}o_jsNE9s9}nRoo&$tSuhtFZ=avkvRB zm*>wp*HvTV&Der1`59ZYE!(k->#?J*>)&JQs(bKD_F`}LVPE!Re-7Xx%N?SJayUnD z6hH4Dj{jJldUg2R@vR=m@tnYk+)ysOev+QdDV)k57}MX;o33YYCTHm{(p!4|43i)b)lwypR%&?s;tHutjX_O-?eoe z)@6M*U_&-yV>V%PwqQ%P=0`Kaezn!@*q$BOiC?fYyRZirxvqQZ-t5D^?8kLU!f_j@ z2XQcma43g!1V=LBPvLqTt-s+Ij^zYStyg&N3``ov+q&OI>e=R- z!=E|N^*vuNV2vGNd0Ty-<5%O0xs=Pff-AX-tGR~jSlr*m+@LpdGq-Rnw{bgna3^TT|;O2&7%PVbri zkdHaZd{6a%TU^rmPiv` zmqaIJa;D${%l|;9Vj7+>J-v?V-!aIhvok02@IzKGe<6Lue$+SKm8DEC&4};*{Xkvm zo%ZWv{RykEDyy+NYjBVAS4-FCr>w)e%-28Mr}cG1He$m1;ks_3o3c4u@pHCedv;(a zc4aqqXAkybZ}wqdUiJ4@2IxT?%pn}c;T*}YSkG}Dt-t0Nj^lVv;3Q7wdppDN`(97y zVn63MQ_td${E4$UhjTfPKXX18a3OR0e7ICE=L-JDFU+@2|ISUEY5EqumD{+TJNUWd zw@dHgUhd<59^erkxZ5rv2<+4VO-9&ocKBc z6EPW6GY!-7f%T@>8JLNgnT1)IojI7BPkjE)|8Bf~*#82$5DT*ii}GJT4^v#1U`du^ zMV2`cmcPWmtMt_VR5!gQ2fJPmX9&l=w(&9PL)Xy_xXpOs`eFI|^on!gJpQ4Zo4*Bb zG!N5T>Xc2x=g)S!1NRRL>+Ph!U}tt=H(tmdwxfrRI3g^!x9-b+?9Txl$Uz*!p&Z5$ z9LaP3oy@QGHyq1v`Q1CmhwU1#CvYMsaWbcJ8mDsxCpmAk^lZ-IJpRo8@fR-OA|A*X zj{6e5l*_oB2^`~2 zNP~2zG!jZFjew*|r+^?0A|WXtDU!ms*7scey4L;7%)jk@e6QZe{k&8noaYDi z5%>S)UGpf9vAE;tv_8x8{GCfZ4_?uK@*1!6CU3nnMmRq2>U;c~5BQKz_z$1*8K3hd zU-32n;~TzZgk)j+L}Fw{WgIs0IZW|%d?w@vOv0pGWBVl6DVU0>nU)!tk(rp8S(ugC z7&U)5UUKN1%*EWy$Nc<=1z3nL=ZF1ML>FUmmS9Pi;X=z%PM2o|R^q+r;W}GIf5IB9 z$vnQ7v7WBa25iKpY{uqn!Iu1#t=O7vxy<~!=&tO>?(D&y{G9z*-}$rK{vT*OmfyF` z_PjFO_y~^SIF9E$_n)LEv#I%1DjtsG>BeWUUG=b?XX!aS=JTEB>dM2yC{ZibWG0{g~M`X)R~xtS(%O5nS(i*i@BMXJ4`>n zKBSMZfbl{s%pxqt5-iD5EX{JPz>2KI%B;c?MZ$Vl)iqd?wOE_=*nmy=k@ttR&@K7Q z=b3$~Td@rrdjDK|ectkP)ScLwcirAi_vGj7#SzY84j-r{Zk#XG#qzj>bz_>fQd z51;a1KI3z~M^RWH881Kq%?9LwS$vzy!!5qpF9L+Ht%W<5*iJZ(S{E}1oq2q9dp2^m}m*^`! zmkanczu`j8${V)ta(%=3u|}`uM(*-?5nJ@OcjKMHbbiu5b31o%CwFl#_wyhld%bj6 zALVhD_4?|BesV3mE;^&n@poS4pS;HFyumxX$NPN1hkV4xe8PWt#C7Cf{gSWvns4}) z_mYI;JVJ_aTuv?*wreCEnNb*(?=d?6$M+eVaTu2gn3Tzwf+?AbsadCcSiZD69n&)d zGcgOZGADC!Z~3sEdG$xUYP^6xZ@U)KMOc)@SezwTl4V(r6x$8s?U6ZxA ztwLD-db&Ovu`!#lIX`7vwr6K{VOMr%5BB8e?8QFp%l_O@F)ZgV9Bh1v*B>Kw#F61R z9H+-~B7gfg?Ek5H8h@x1rawc^$sj9xRG1AjX!ZaH(HL}dN23$AP?~{XL+7ErvEgZ4Yv15<7at}*?limY}?@vlszQ$7qbs7>vpH8IK8=kcpU>t1L$ny(Cgtj-)ynPrF}ooq{Xv&)nXRlFoQW zW@c7qV|M0XPUdDF=4C$SXF;~^7xqJ8U4+G0oFzCSc38h(s)p@f#`x6n;W#L(%dtEw zFz%jkze>6atFjuavo`B6xBri+r|Yu;$IlPT*GM;J6Edg>B;=^-R<1v_?xLa z`McyCeL6|lo|k+s<|5-hukeH)f%litiN+{$hIk=r@0Z`f{o^gizA z^6BBYI-n2nSL=6JALViW#uGfrQ#{QxyvR$u${W1Rzj%jtd5>BB9sPlR#K(NXr+mhj zEb4f>vLhq3GjVR|EUHOJ#v zJ&xl!iIe#yXL1(j@oRp=MO@4!?DQZU@89Y*T+5Bz#Le8ot=z^R`7^h32X}HW_i;ZD z@E{NKI8X2-PxB08&AHa=nl`#E+pz<; zm`^9&nO)eG-PwaZIn8qS(tZ5Cs*mo=Q}e=clG*t))c7zC=SYs?7>?yQj^{*9;$)8W z{5?%S=oOx)XX`oqigP)Si@AjPT@Sw1%eb5?xRR^5nrpb0-*X+;b0ar#E4T3{{>+`+ z#Uhq-kKW5)c$mNP7=PnQp5`p?gT1IP@iMRQmx|#!dreo*?^7Mm`&M?&DqiWyIbf1ox}39(yiH+?b(4H*@>OmgmfaE{<8UUMBDqo?c%`(xs}=9iqt>72m~KCf=Je&GGFqy4}70^?tE zF>5Ug$K$tpIahEs+dDpHTE6d%uj2-8;%5G7xqi~Wc|O?t?*940{13gmohNvbXM9i1 zX?>1^T7~_8LI2M3e*XPKU*T0=<2L&*X{K;|{%!m|AMg=>bpPJA$5Z3~@?pKOK21E2 zy)gcgulSn(@hv0zoXIGR#^{W}l_SG^V(Ir8n{gPA37C+Hn1o50j34r7tFT=@Z4h8dE!mnK*_mB9e{xukZn`^rvKM=^5Bstoe=Z)TGf)rWFupt( z_TPEib)50>oWO~k#L1k(sodoJpQ&eY4!`1D&f@}p!$r){A?(+s`dcpJa<1TNcJ{b+ z`Uh_I_qWY@3%BtnZs!i}!KE~)6mh*r<$V2>vhk1m*@)(cvH=f`rp5|GeV}b$U ze7~T7=SBX(E4;=Vyxu7s2ev~4tN-SGKHy=WZ~0h1;Xi!J=X}jKe9MU5R~do|2%gz*p=PboeRxxqsR3!-kW{cp949F4?J$D9>(Du z!I2!z@tnv>oXjbl#?F4PGeghhY|i0V+~oIr^YsFL&4paVC0xpHxxxDflXMUJXPNQk zT)~xG#noKHwOq&bj65bBA3x|(=CfIE;WqxrpZGJkb0>H4gz4?kd%2JMd4RoIg!Ao? z{y`tsN0?|-xZiR88&B{Q&+shI@jNf^cW!h%{-H1NGOzMaUgLG%;7#7<`5s~a-PM=% z1O1TYUAO+#&-k1#`I`UnlJoqnj*vc_-;wy2_t!_(Q5cocILhZGrL%ow8{cR=zD~r% zOv+?T&J;|^R7}k@Ov`jk&rGatyJXSXS=#T%%RCJ0+u-xCo%6aqA0O`t$9Z90l*L(+ zrCEk$xzlvZ>%+QV)G*!3#;dRzYq2&*MF`7TSJ&e+%hyOZW>XgH71rxh-HNTb)a_k$ zH+E+)_GTaUWq%IfKn~&%4rQ|5VR<6?T$oYDN3(^`pDpcvV~vmFL{8=ue#xnv#u@M0 z^k(Tf{EG9w2-~+u|J~2k`Yj`52**K0p7ecJk#$$si)cDJ zWAJ~B&2i561UfMv_6z4ha((RYa6L$+hghGCIx|NY&!#_g9_7)a-JV|;Vo{c4DVAY< z`}co7x22Nt(gVVBR?*d2i?vyou|2-NZoo!t!lrD&mQ21aZ2!-68@6RTcHmRX*GYGN z=kc&Td+46*#op}0e(cYI9K<1vbtEj`NIi<l@<>xrk%UcZqH?C_L_4y^Jflnls(+d%cbu_yad`Gq-XZf8uug=jV6L$(C=Y z-p4PEAJo6_Fn{GS9_LA(;%S~|-I3vV_(Naj72e=&-eGUs`M!R@hkV4xe8Q(3Iyh|i z=X#cYrC;+6-!ekRaGXVA6u!q8Of@7-|9?6T<1!xOvz+^Xphuhy&v(gma;9KPreRv9 zV|pga9k%bHO<}non@={k=VWeX8XA^6pU%&Z_%REx5DT*iN1IMD9sgNaj?%ia@A>_} z--pT?A8Wss*A-dA^|Xrqgwo;&zu!q}wvOfoKAO~>>M{q3Hc>m*gJ%N)rg($nViM4 zo)^B-x7>feUcjB!bD>_u#azM^cf$IAtE+jR>2kf2tGJqLSlizb8*;tzjT|vI?7#f> z&yU6*_<4S(-o@SA%d@6?NYC&+OGouF9_Me2>-FzE$LA^Ir+J3wxHnzc?ickXw%ZZ5 z&sF^=ukj{t^Do}zJ^s!6JYxSm)Q?%;{(Y+drGYX?J z8Z%W1*RdEnCS&n`e4nuyhjAI733%B1S(EByOwLqH%{0u!%>M87s`YPXJ9TrN={h>> zzn^{z>z&u*^6_I9U?CP}5f)={mSicOvERz*vYfd;Y`5~d0`FR`%DM_aVO3URb=F`l z)@B{nWj)qs1NOccwnJ0hjLq4CE%_;1u{GPUE!(j@JFqjmu)qD%L-*w8?8QFp%S8T< zbb!bAH$H#^If!3yFo$p`w>kfZ>ov#1b{Vb5a4g4j0w;13Cv)zxu)k;N*_^}EW5eB`dUhBWmiJG`_h#b*jBnN3 z_!EETLH9e!J;wL(z`OhLw)q^>O~;4%pVX&#nrC^A=XrsnJ^l}Ug@5uoZ}28>vrycy zeeUSHyvM)!kWu{pKFWl!+|P_Z=S#lgYi4%;2$@}<8Hv#ugE9F(KD6E9=w(g9awpP> z`2mwK89!ulreI1wv3#j@TBc_PCYu=6`;7Bzn&U3B+s7;k&zsqFA@{Gz+{W`TKR@Ef zJa761^(^x#tc$Q1i?akv@|EpYb9q>a59Htj$4Q@6^@x z*pQ9bm`&J{pYk)dVr#ZxTef3+c3?+#Vpn!&56*VI?XCN;ABRm0+pWJI#38(GKaJ2M zIf~;ro)fraWH=9|=xLnE*_^|<+%+Z~fAjR7e4!WW#azN~`5l*WIahEMSF=FDaGdr)sJjK&I z!}H9aFzoM(`VU^>WnSUG_Ww2g$p33(ah<#wc29)+Zh!FZetgU)j29)$|Ed0$&$xe4 z*e~C^9=taGAK&mTBV-BtA(!Q;X!_L|#qDpbM+_aG37MEln2bwo@8miKQ!*9PGCeag z6EkzLziVXE*}2X7=G3`Z{#Mu?x%KwSVT0$_AF%)nvM`IV1WU0r%d)_GVZW5ul~|co z_zBC{-qmys)?z(2V0FLeZLV9eB|qh7Y{Rx}#}4es=-zMHMR#R4c4rUv+++Nqe#C$HjIa5Y5qzF| zBt~IWzQ<@h=6LMr@69odzt6brdo&#P`9_EBl*D*4*7JOsLZ@UZre+$ZW!_lfd`Yh} zFe9@tJ998M^D;j#Sf2vAAn&=37STmnjE5{o30;zm^Z}}aUa|Kh!4)>qt|B=({)o!o%eptVumUE5q?^!lpxP86;fg8D*Tey|mIMDol z);oCqr*MAm(!1ICco?7Oar=z#=K&t%A^yU{Ji?>=mB)CTCwP*ldBglq&I`-4&hOZkM$Ei}7EmhdhWsH|)IaXjLK63r)>;EdM8?VcHY{*7z%qDEg zW^B%%ONHh6Ot)fdwqZMVU?+BF7j|QJ_Fzx`5I=06-g+Rv;9w5r2#(?ymg^X%Gfw|6 zV>pg;+s+e>Pv#VU$?2TI*_^|#IG6J{p9}akmvAZ5UI@##T<7xhoz*R=tfs@+bbx?cBkg+{HcI%bA|f_v-^Z#6q_FVSR+h`5RC0 zBv0`)=b6u0eU6WIhU4_SzQBw8gO_=gfASiybDig*oB9_2;vMcx6t??A{fLkGg#Yj< z2bK-{?_d3l&-sEcxzu{M_w!$r?BVfK%ZB;Cr(-ZS<1s!HFd>(l?gu&vlW~XbkV2>A z^}S*K8FWTwVOC~icIIR*=4Kx5HNQf-D38?(>)FFEa!MF4$x@u|`Jjw0$MU@6_nZ}V zC06D-+vBk1sA{|#tMib*Th-LPlZ54~t#9}~__{h{-f(=@*A3W^D?PrkZo=kl!Iu1# z$33oJxJkoucGR8Nnd$R{+q>&t?8p8bz(M?igE@plIgBGXlB0Rra*oyG zIDr#6mD4$svpI+JSitLm`T83!=C@qNSb-!c$jVE}Lr`X+f`mBEYVK^Qx=-+vfmwAQP zd7FRn4)5|F@ACm4@i7Nlo~Qa>zT_*u<{L)L5w=5QmUdi^^?BD(jlaiejLsPRALB4C zzfKXhO9GvciTDBYv=6U4lIWyN#^g-F)J(&)Oven&#LUdfovwe`bx!7DZsuV==I6&O zz=ABq!Ys<-EWwg2&2lWyimb|Ntj^1>zcqDjzVf=Tfo{luT{oKQ=IrEk{b%~B>9)~r z*?}XIg#FY>5Awd8F1j0g@N@QJZ}#EdRN?sOr~7jN_jn)FWXJa)<6m$HhjJK)a|AC= z2*>$2J)RSoKXq7+NqRD;@}nZ*@iX)+Mr<6$=jg9Em-G1z7c#QPEz`@nifg!*>$x<3 znBOK{EP1$oZPgF$ztwNU{k9t~upzA9F1?3)d4Nwn{;2+y$N3vi@C?uL0x$70ukkv& zy3X9z_x;`NFMXHy-rddzJmB{ZkMv_c;Xi!JfBB5h`GT*w!2A79_+0e=jKASqM#veq zZ$w7o4&M(DMMvd-wreyUgE1M4aTt#Yn3zeKjLDgjshFB+n3hT39k1!a@sPoICT3<9 zW@UEfU{2;@Zsuh^{#7H)C%^uPAF}`pvM`IX7>lz6%d-Nnxt>?jm05+KuqvzZcmH=- zUDsqS)@F}#;XJFS8#2?8a2zzzO}Q~cSnn44SKZ$0%Fm2nGu~RaVOzFm2X9e z>m5Je>viwO`2#m{Gq>=V<^M@<=T7e8ZZ2@$-K+QUAb;Uu7Ht#O=cqo$<9y+GIiXMS zG|%uX&+`I*XQwOS{Q5&*;Z=U`_2{4a8n5#PZ}B$!3=GSEN8jZ=-sb~8xdUg~kVbROnqKIZ2~EWko6%%UvD z#M#39%II>e$jYqBI{e$~%m%s4cdn?_VZP=FW*q$BOkzLq> z3tETiey)45F9&cKhjRo!a$F^MTue0nC8sj(x-g&V`n31+&D66vhxz?}Z=Rmd1^k-d za3L3Q3BToXuHYK3jV6#QaE1^ z=|rc(_B*0)dfaJ!hUa;afAA77^9rx>vt8l%zM*gO7Vq*N|K=gr|3~^U|KU^q`>s!h z^?0sd@)ck64d1d!vGBNvxn2Jlh3_#2KXN?&Pse3E#%BU1#h5600(l8>GZSxhZrBp)ak>1 z9;?T3JST7>Cvh^9Ukk_MmwGCva|UO!nd9ag-D-B&E{pXNF6FoUj^F1C_g|q`@)zUj ztA zeV!NC(dTm({wOTpCF7TQg@3ZW`(4*JIKud7-ZuUh@9-|~@o(PeLq6hTKH)!n#^-#& zmwe6t_=ay8Ax}8oA~F&qb8E|RJV({%x zs5`MMyK&ddFu%`rU-svvf?@kj@pJ4@<0CndlQ@}EIF-{mgEKjcU-6db`T2SQzvkRR zVR;tm#r%%TxST7vnrrzz*K-4Z;6`rZW^Ut;+|Hfc#e#*yau(x0;|F<&DeH&xwS)Vu zE*SRP5x4)!6FkXNJk7H_$Md|v6|Scj^&h;#YrM`Iyv5tR$9UJm`aRGO`H27UDU12L z^)vl~FZr7P@hzj|4clW?kubmabaY+;vPRU_vJ52Ta0b{E*3+ zlBt-6X_=lGn30*7mDOD5a_F4Q#k|bN{QQU?vj7XSy6G0tMOlo+S(2q#nq^p)t5``zURxRR^6o{;zRkaQhj)38fAayG{}!hE zNI&L3e9E`}KmD10!B>3E|M-S)8QJGCM`LuxU`)QxIDBe798Hr>U1nHC0q|O>def-tStCmIFGXH9L&jF%+0*a&yV;q3$QSYuqcbMI7_e; zOS5V5u>9q81y*Eb?s8lnIvKV@P2;s#n{`>ARs3B1)bZcQcw;tUQ}*@y&*nNs&2as? zF)hrurSVp5%g$Wjb#zz#weF!uIG;b)?Y*BSo%h-0<&@@OegoWZAct}oM{pG1TF>q4 z!{f&pAJ0jg%qg78S)9!|T)^el=Nr9{i@1c5n}p--JH3p{xq>UXnrrwy*YgK%b{T}FtocLQ9f1;oAC6`#Qw>m=paR0xZR}pn2M&)-Nchh!F z;_v*i-5!q#n3#)7hwU)J&+~_phWUNy_T(J4Ka8ilt}PkP>!P|iORywMu{6uD0xR;E`Fx^(bDmV!HCT(aS(o*h%jdE;&~Yn=72o|7sK&4M}Nh+oX7e6nhUvzOSqKFxST7wifj2j*Ks{J za1%FkD}Un8+|C``!@bfJj|o~l~w#-{b_xU=XsHT@DeZc3jgFaUgr(oh)?*Z^XjSom(Tc|FSxX7IDcO0*L=hMZja*o?%!i{#$+s}coL59*g6j5 zG9D8!F+X4uCS@`vX9}izr}?GP`MQMpr_&jjkrR7{+cWDd%*t%c&K%6e+|0xLOycjh z1@(E?g~GZBi?SGtvjj`B6w9z2E3gtjVKr7~frMc_YwPF3Lf6rCS)YyBgiYC;Em+&@ zmR7nA+p#@6u`|1{EB~-O-E~iX&bD5cBGzAP4aa4&^Y8;24hOZvPiI-|vAY z7@x>VoXjt|+20!)+YaBH3D?o-ZlA$t&coSy4s$zR=j!=fz;C#SBhrWS^IN^qb$_|e zXL^lmhWo8H{yo=mJvZ<#$LB`9iJLjMZ#Z7I>TSGJCyf8Bw{r&{`P|Yy`Y{`3Lvf9#`~LKCyn+^?vueqwn!=-si@KVShf-kNJfE@F^GjzPM-l z1^;6OpR*eAZ zS(&&_*so>BhUL#=yt?s1x-g5fI7_k=%djlVu{Eh8EA$$!<@a32_1wUX+{z#M6Z6{N z+x6`FVY}?oySayZxsM0m^`~Juf6+(zE06IwPw))S@*IEXMPA}%UgLG%=49Vbdq>~n z-@MOfX~KFw)Q|X>Pxuf21rpG9KeI z0Tc5;!?50`ncR3vreYeVWqN*4Htgq2It#NgJ9986b1@I|GCx1!$1KP~EW)BJ#^Nl= zQv9oPIG@Yv3arRVtjsE`%4)368mz_Iti#Pu!*;E!>#+eFvI(2A1zYlBjIi9F=~isR z_Uyo!jl+C9>n`lZ9_-1_*^9l|hXWYL`+ElK;T*w{9L3Qb!?7I4@tnYkoW_Pt!g|Cv z->;0%G$yHp<{6&lQR{I*|IR;niI;hWe{%7_aK7KrH+hS%DWfB_zV3X-|#I5d)*h&`xPQFGNUjmqj9DA#?-O+VnaC3V(U1J%j+JO zKqq7(e!wLBkg1u5X<5bJ5i;s5%*Gtd#oWxpyv)x#mj7d2ga^#0xGu@-*}{ID=XkDY zyb3?zc-y(UPSPUmpD+CVrLOTB2f}y*y})#v=@$HypRqOb`98azUVpST-j40rfgRbI zi_EW^?#>?U$5bLnIFXZ>vt`(R zQ}mad#_62FnViMhoXfGV!u00r#iPUeF4T*-gx~TzuHYIj_rCLWdINvpMsDI}ZsAsL z6w8UnTc7LmD!ks?Oca)>Bp_Yc74Ts#;^GNuL8O- zi?Aq*u{cYz6ic%V%d#Ak`#p9=z02o=e4?wdI%~2P>#`o}vjOv;3EOX`a!t_4XpK*%sKX~Hzk8R&Q&gWLQ*B#iAomj3?IIjEozqd~Q zpQL)5uzxzTm-|PH8kVo0?$7z|H&74a7aYtX9LixF&R5oBq#ni59K*33#|fOsNu10t zIgK;8Adi|(>=63GjF7D$Q(>tIK@fVhe8K!$w|H|Y1jVE}TXLybm_&YE14_@I_{>f{+ z&Ux*_^4!*c@h&equQoUjpBPW*ec8|SbH3y&zGbAs;rxrtXpGJnjLBGx%{YwD8$O31 zk^af@O?912Vmv96@k1tO3Z`T#reQj!X9i|uCT3<9W@C2dU{2;@ZsuWL=3{<-#E-dp zL^$5-`dqkT#*4EA)7wvd+^@9pGAzq-EYAw8$V#lt8wbL5tctG6>a4*`=D*kcYa6e_ zx~#`WY{F)2$xrziTeBTIvNOB*p4P6q2M2O6hjKVaa1=*#499ZCxN!cA*AqCAlQ@}E zIfJt}n_qFR=eMtQe%o=OUc|**!lnF{%eaCoxtjCMXT9FQLgx2_-pGGl4}R1;xRblM zn|rvI`?#M6d5FL82#@kt9_LA(;zHkleqNWb{1^2fyu{1=@UL)Px~fZg+-ld6o5t_( zF8}6$u3`T_)Q|X>Pxy=#O#hAT_|o_*{>QiMoHv~3S6tsB6>%M9oPR<`*D;u)TUf4G z`hCV`9L8ll#%C>$Ppm&+5+>u)En)u2btOw5S>fOU~l+>kImK9lrpRg*cu{vj(UM*dlby%16 zSf35pkd4@wDQku8)=d9vJ}q@?wq-|7@_l+;bT{^3Pkzom?8|=dZtoGc(?I^}WKQ9ioXQ!T$yuDur>6Inp38Zh&qO`LdVH-jZVboELcN$v zxs1zM%j3uSKZw?PgWG@LAmf|$7H;Eq-uorYf2ZEVy*$7}{Dp^kln=fS)A?1OPd7RX~5Fi|C>(!7?n%a_r;( zXDaB5ti;N!!cSP0)meizS)2Ji-!;&U*qBY2sZZEH&2BqL$x}SdGd#=7yvjd$jn{dDH+hSH@ec3u9`Ex3 zAMr5<&kx(@sm`||Tt8pvmwd(7e8Wh^!u=yN3ZwGtrs4KzI{tt#zZg0uWAT4{pK%zE z37LqA`2mwLIosH;DRgS4;lC@x@@3GOn4LM9i@BMX`Iw&{vml>Y-{QIiOR)?qu$Iro zs;sN<6INq&)?h8x=Bhbiz3S_ErrSt2W)n7N3-(?Z9{-vC$M0X-=(bEaDD2Pnx&u41 z6FW1n`*+pd*n>U!IeW7Y`*8rj;9w5nZoi)%riXI`S6PlRdSlbDzTBp=@Arl$^=Y1CIp68{04EO*(;K9};7|_d z2#(|^j^AdWqMq3-mYq`f!-v z5?#vw+po}-W`)~V>D64zbzIL4{DGUenOnGxKk_GT=ML`VZtme=KfmtN`+0x|Ibmej zkH6^2dMb|^|CPrWXLoqqNqvUrd4XN_NBaLeR(IXIX#5Xe;uT({f0vB#r@qdcyv5tB zH!3X89etO7^FIHo7xveSrol(XAM*+S^?9OC-!-4{IoF%-OZ|$k`FpLf{;iz%Z;eOr z`;AD9%pKlm5mmp(r9X%D+v)XdT;mCth#mdEMU~Ov{vQ~R)GVxTQk{(LELUT%Z&Dg> z@A2t$bNjL0?l7GU#`oV0>z7eyW)@~+4(4PY=HL;W&=xL{8#lCb2$W>S>(8 znVikJoX-XPnhUvz!~Fej1eY5Bmdm-4tGJqL`8`uu-jU9$4aPTdGq-Rnf8@{H&Yj%F z-Q3IlJa7LV)R$Z*4(lU4&fj=~r?_rYI9|`{b3D(Ley@E|f14QhRW`9L08Ln?p8I92yX=0dO zEd4*mF+SaN68L#DlkvFj7oQ24h#xQ&`*>U$oq-vdiJ6&&S(%-=n45W+m-+Y+KV|_w za2yrWWm%5pS%HcqN7g^(`lw# zuoc^|-Me=G&bkY`@}&1ePjkN>#(T0C`>-GTa}dAa8pp#BJ(R;af}=TxV>yoF-;Ey) z>pM|T;$(iwsm$s8oTjI924`{>=kPz*lk=WW=Ng~K`TUxjtmj!jM=dq}9anHAS26CF zVSO?s4#&Yd<9Up4)?4{Aw{r&%@)sWGjo4wjC-qsL<3;|#OT5CX{FB$%WNKLMoB9@S z^Do}x+67@b?&}A9$VYs_fB2No_?$b<|CN5jw~SCKT*o3a3g2TiMrTaM;`@xvIE=>x z{D4WBj2|*NUwZwRR;OcS&zD(rHfCo|=3*81&#UvXRh_WD1$9v-dK$*_PY?U6wDB^W z@ALmF>PoE4Dm=0#?7ynI25Yi5>#!ahuo0WFC9}*3%axt&jdx~u_Fzx;VsG|kKlbMU z4rJd~VLgWGVI0X(9L>p`!fBk&nf!2knC@5l8!qG$e#hlp!IfOa)$iK(^sLvLxrM*G zeVhK7tsE!2^lt9uejZ>O$ImbNP1dkqe$~gg#PKrYc)0zz@e@4BQ#{QxJj-(&;roa; z%nH-1;^)cBZokIsyulal|CheYdwjr$e8k86hyU^!pYsJ@@iqVBTSh1y&aa4!#K?@w z_ZW@Q8G|vI%W;&Oag4`h;!NRnMM9m3A211%a_vXqxcpEjX9}idYNlfbW?>bti?iz- z%*8zH0<-iF$46n;v&zOlVRhDIE!N@5lwmuR zv|J61H({TD!}Oc#W^Bn%+1C3iTIu%ez^8r=@1nc12R~;o_U5U%Vg7w}KlbN94&oOa z%!<})j2_Ez9M8h@!hELaFFBPnIGc0$73cHV<1n2O_V+i&N9rYdDZk?~F6Roa=J#CB z4g7%{xrtl&6MyD*?qE&ZXSd$NybQGcYr= zaGt*#=G3{En|YX*`Iw&{@oVQv0bQ6y*v0Y}*CkkzrC5#?S(#N>mDO0CHCU6iSceVR zgw5ETpRyHOvklv_9ow@bJ2AWCxr^?~Ue^Efcg+DD#4k9QH9Lg!cc>o8Q5?-N9Lwl+ z!uc>>7qDDY^)ycB49;YnMd9%c{N8wu@wr@Qe=m3)o`;rrpV0!hf6Z^Wkc+s4OZgp_ zaXD9T4To8-b$UI2;3jV77H;K_{E0tvJ9ls=cX1yREDqb{pgzQ3c$i0cjK}#KPw*u7 z-4FZuls?TfJkQo%FSQsDt|u3bU*ct6VJ+Xkd|Us;JG{&Le86lUh4p--pYmTm<8!{? zOI}M6j*D0NKfd8xM)W=NQ5lWV8G|tyi~r*>e}|8)H!cawok%C zbZVwyTBc_PW@Kh&VK#R3|IACh9?NY!5A!k~^Ro~qqzT7G5nYVMS(00phV?G3=epih z)RkC;)mVddIMwUXRNsc_)i>UVjoF079Vg9o3x3M>?8u)Rhv|0J-PoNy*^9l|hke7_BSx@1YoXY8(!I_-J z*_^|(>>1m1S~;>+YZW z8n5#PZ}B$o@GkH1Z{BCx*I|D?)Q|X>|L`d@tqc3%KmCRg%7y7fWF$sr6n1dkdrwDW zbjDyT{*Ui7F5@!+6EYFolnu+7SbxAI>^3PZ?}s`$Q!*7(Gc7YPBQr4z8?OxW&8~AY z&YCd4JUTBoI=(*AAG06}al7dj(M5U0b+@E0$MUSe_kHeuMO}qeS&cPVi?vyYby<%M z*@%r<$IolcbxVHA&)ABs*@hk1k!e>72otoW*&Z&u_Spi#XQ#(x!5_K3p6Xj-%ynU%{1J#Wnn%OV)(#w~?ES z@6}uMHvY(;xt%+>le@T^dwAD$59ovZg@<{BM|q6L`5RC0u-Bs(^i}@JYrMgmyv5u6 zi}(09@ADxa@iCwB8K1LLx3GU+>R0@aZ}^rG%ZL3KiIMppbA2E7S6&unT(>7+LMG-1 zOv0p`=J7L`+;|G6WGbd+8m47B9yXn9x{~LG96Bd+F*oxtFY_@!3$P#yu`r9W7}GZo z+wolL;2FzN#_eTUo)uV$m05*VS&cQA*?em2I;_ivY|JKX%4TfAQtQM1EzefQTeA(@ zvjaP_6FajDyKY{kKN1<9b$h`)2+7 z$Z&o5S?}Ov_uHj+a}W1&ANTVB53_su@H+8VeT>Js(Eo3o&?kACkG&2#qtEgj&+`I* z=SBX(m=nT!Ue;H5m0352?RHIH=gmFgakuns{>3}I%X|Er_xXU2xYYcf=zsW(&-sEc z`HHXkh7l@+<0c{_GYX?J8nbN*>s!wC9n*7{$7R-8n4LM8lew6O`S=k(WK0wnZtN1-I~$=4a?b9x8tX#(@Fo= zG93Q{jCV60)8l*T<)4J}ytnSdwJF1V`so22$U(es`X~LpW{B}&9L|v(#nBwgaU9PH zoXAO>%qg748Jx+VwubGO$okGRKA%Z5hxPtOFXV^Dm*`Si!u^)%Rb0)rT*vj?z#sVL zr?5SnJ8$oLzwS1-CvO_&^RwQ;olN{=Sf4$5FZc5Ri@4t*{R>ms4!`Q-Ji*gE!?Qfk z3tSyBEaxBkGOzF|uk!|P@izbB9o}W0pTc@R)Q|X>Pxud?@)?JEd_m6}FOB!`Iyt@V z@W%LCMyMF}PeevyCijn`qw+mQ=OgotsbjHT_AuQzIxgcgA(ODN_tk%>Q!owFG9A-1 zBeO6oi#ncj>S8*#&cl4n&w?!J{zY_A7H0{TVriCPS(al(R%Z>?WctG4x>Z*%^gSUB z_35+W_Qtv?n=$i_aQytfKWz7w#y?{#wq{#aww|4IXLey%c4sg4W*^Qq{{ea+2k{FI zW>xbYs)utVM{z92a}uXb^mtF%$~i^d7e|8&xQPki@2D} zxq>UXnrpe9BUXg-u}R*{E!@g&{Epvq2X}Ed_i{gfWZk{tct6R9c$i1n!S}56w*CqA zp>m_N;XZdk{Tua*@~`}jzw=LC<8|KPP2Ofj_m?|zxpv{WcjbG$&%gPA|L_qX^9ldu zQ$FVlzT|&=%{P3@2o)p#|G-A%dyK@$jKcQjbu>9TV=x|1MhMq)d^rIVF)@>{-~MoZ zlgTNVlBt-QX_=1cnTc8WON-EsY;q3fWG?1s0Y*I#+EZ9A%3}P8#rZM&8lRH#*Pa*j zS1+qxffZSaFS3U7QC+UdTCB}Fe4?EVLsdi4l(!}2leV>yXaIGr;%le5^yb@#PAhx53A3%Q6( zxRlGdf~&ZiYq*x{xSkuhk(;=gTUl^=IN#gl@Ay4;a3}Zh2kzy59^_9P=DZx1kMJmu z^8`=w6i@RE&+;74^B4ZgOT5f0{GEUBPhRJ3X7Kvy9r+&b^KU-jLq6hTK4EU38+aza zH#v4H2-N#*2B!8^mk<3mb071J^!Gchx> zFe|gMRmX6hXP0v@Cv!6o^D-avvjD4p5ZYHrF3ch<$`APwOR)^gu>$KK3FBBr{*={O zlT)o%M{dN%T-_%0w~5@8CEdqb$w%Ce+sJL%j_uij9od;(*p=NFaa0(e?s8A|VsG~0 z=j_XV9K^vK%3&PNkvye8qvbC+hDU~k@f|CV<9MF2{X}^xr*Q_q;@6zRxtz}h{DzB} z$oqMh$;-KdE4hyAxrv*(g_WJxjjq4>?)y6|-^pFv%{}~qd%2JMd5}M`srh$UKFVY7 z^m(b+@xpkYP(R7aztFFYawcYFHfCqUlVSZ_a&A`gK9#(3 zKIUfu7Gxn7W)T);F@D72{Fpyf4fnxva(Px{C01cIe#+{s$=duy|2~uN$qnU3jCLxF zLmW0$Z^jhrt>rds%XVzfj_kzF?D9_g>n`_XZ}wq=8=+l&<$fH%K^(%N9LC`s!BHH| zJ?7Ooc|0d^DyQ*F&g3k9#jiP+^SO|VINWu%L|)3}T*Wn9%XR#go0zIZm_OU)@3@1z zxSM;pk3aGtkMbB3HVgNI<4f7(YcHLFK z$G+!E%q5bvc zhHS(pyygDVOm5B=Y{^z^%{FY$4(!NI?93b&LjStT-PoP?wWGH@EmD{-edT`a&jB3F zAsotK9L^CO$x$55FF1x{Ii3^vMn6`%Zl|b^(*7^yyuXD0&X(tL9v88&>uZU;l*_oB zaXp_~DX-!T$H{dkT<2@m*Kv{M-DidNY*hc2n^{ylw#wVMo!@f@cX1E*av%5e0Dok} zJmI_^ln?PJkMTH9@FY+34A1i-e`P=4TX#vm%Imzro4mzB{*QY{zRP?3o5wGP@q8#h z=D&Q(XME0R&%$|nCI83Qe9H)a2Q4Ba@qI>R48~+E#%3JGWp}^hmq1R)L`=*iOv>a; z$y7|uv`okJ%*4#h&K%6eyv)Y}EX0raF-!6jmS#CtU`1A9WmaKTR%3P6WF6M!zYW8E zwVqs`4cL&4*qDVs3iG~++>|NIhk@Ql+d{o1Cwvp;ODnl8+wn%?(4O{k2Xyr*K;$sa4WZQJ9ls=cXJPa;9gepdDR2*LH@+U%sVlhkK^(w zp5_@gefRxG@-Mu|2{Xccx*~US-|smy)c;Vw#vA;LcX^)=_zxfQ5g&8jkT6dNX9!NX z8qW7i%U|&|-!ekA(5}dQpWn9);}KoHW`D8dIE=^mOu)oU%4AH=luXSuOv`jk&kU^b zN9fmW^DT>d4(4Po=H~OVVO;Xad6|y|c-MZ5%EfrW|E)$w5Bpg(HMFC&kDXX&v`*aKErMA4l?>SX;U-(SDJ{z$yo3J@suq9jZl73Z65c<{&rF`#Se|Z20ayUnDBuDcL_Nf@=;TSox*TKfWThH}1QJ%~xoXTmO!7n+J zvpJ6oxRBp)2`hR3`!absS93i#a1%Fk3%7AQcW@_na}W1%KM(Q{5Az78`~S($@^PNv zDW2h3p5u95;4i$$-%^F^;j(;%`I?0D_PczI*Lj1tc$r8zoEyCDC+MsDx)zvqudI|izUZq z9DZXyC(y10>Iu2n@>T(U%Vq?qe$aPtd zzs?QgQeSSshHS*fY{F)2&K7LRROUe&xh>nVkH>>fa%Xm7SN^5_tzv|J_E7K1-t5Ca z{lBQM+>gos3frgTK=nZ!!l4|-;T*w{9K|vG#_wf}lgD!sCvzGH_`a4e<$G~M`@WL5 znV$>fh0Jg#tXFPHaFO~FF6BzbC>+*XEwAB5e#@=g#_eo8GTc8F)DHKn9qK!|i&?LR z^h8yk#K?@okMD(kmU10MSD&sOG35i7!~SB+aTu5J7@rCF zKPF;gCSg)0XF2UiEvMn})}fsl<;={+989nOdF7+#cRo2k3$P%IaHjureJIzD5aweE zd4X~HL@vurQN#VMl3a~7IML%^Ex92Zu`!#l8Jn{uTd_6UvK`y=;oo7rI?0{cg}nB-)$cLt^R^Ko}pT}KA*`i_=@}N@2wo6M%X?gBQY|g@O?&QG)89( z#$+u1^(c&Qd^y_VkVpL!OsbxY$=O@~Qp%~AnrWDp>6n2TxySJ`%UPI}*_fSm%%@y( zZsz3&ygn(6TRyn}3v#XdTVc5fi?TRBW_su26S=2(Sw=3;imb%Stisx?%X)0URL4WR zo5)SsoGsXrt=O7v*q$BOk)2reRXD$KXNK!9k?#TOVtH3~V-NOZFZSgC4rEj3X{bDm z!{2HCjFclkHQzW+eLN>{A}4V&r?QRhzm#Wk76)1WwH&>981K3Ad@kTOT*Sp(!XNE# znY^4UxQ1)Fj_bLBqm9S6azdXwJmc|uoBDQs#~s|sUEIw%qeK6GkoR&Q_wz>{;RRmgZ~UDFpNIYaAz$MS-sE4r%X@slfB2A(_?Z9l8K3ht-|#IX z_}$%ze2DShvJLOBt8x(-svsTjxasi%{(GCOlKFY|Ga<9u$vMbwM(BNk^S z^SgvxlBM_wOS25ivK-5^0xPmZvG90SS+4vtoY$&yHGaxktj)UojNLrHZy@)zzeaKs zHf1w5XQb?*J+0(6Y|GvD*GcZi?(D_h{G9zbh=VzVIgImAc^F4b z;3Q6Wzn=Cka|UPfD}GTn+}G#Gb2*<2xRBp)5f^g_momQbT_NZAFP!gH@@lT-Il%a{J#U@8%EO%Y8h+A9;{J@emI)ss8*dpWsQJ<{6&lue`*|yuy_B`s8?cD)?h8xW~m6_ynH5?I}ncFKyJil zY|gQ^>wP3_-%7nT+psO$u{}F*V6M==E^>GFWG^n&zt81Z<_oiXL1(5;vCN9|GJ0m7s^Z6-t(7b@+z+88m{F!u4hNvZFY$u* zU6!x#H(q5=<8n*B%lrJB5BLusGGg>_z8=ec?C)RsDWCBjd9pWWLXsjKz42&jkD*6EQK9Fe%UJS8_QeQ!y=Xc%S(VrV zOwJ)UlpC=zo3JUHu{m3?j{UTfTeA(@vK`yAuKW4G7~y*Drrw=B*o(c{ho3W>zk{Rr zTt$ENfgHra9KxX-#u2QqUFBni@fxo_iBmY0(>Q})@+*GLIh@ORoX-VZ)I1z_vAl#! zxr{5glIysh8@Q3*atpVzrT%W0zvK7Z!JXX2-Q2?;xR)FJZr}m=NB+daJj!D{&XYXH z^Sr<-{Eff!D*xaO-r{Xui4(^8HXo?}!>!K4Bl$7^<#WE|8zy-YuIu;ehW$t3`;5w> z4Z?a=k_BU_$7Vt%Vq%`I7WSJqUNE_OT4rQ6W@k?3;!@k^k@GSiCwZP%P%gy6EW%>^ zkRS1({eLW%;EX}xdM_n^!qP0q@~p_ptiq}+5l!&59A;Y<`53$Fb?Mkj^b#3!LjT$!m&`7Jkb3kzio=jA)O>aj3CcgefC%DnnP z-p>Op`@b+Qhvhq7FFqn4hyMI2U*}EU;%(OV z{OykXH|rROhw^OK!4vuW7vVTht<#$+tUW_%{(|CpFb z_{8;|LQculi^6$MC#PoyW@2V$VK(MqF7DeF`jb!2&jKvSLTs2MtY1`)vODAwa!IbV zUKzP8%dtEwurjN#Dyy+3YqK6d=Jl^x=kBfxyZL8jn z?b(rYZQoq~yQ+6%5B6j)_GTY`&c5u=0UXHllS6xl$U`}d!#RSue{7F{GC^s z(d#UK%4Jf7akwtu;4R+f9p2@A{>=ychmZJ}|MDrH@i||zhU@IL{Dv2`Gva5Vz3(v+ zpSjMX$nP^MqcJ*Trwsc^z}V_>7@rB4h>4kmNtui@>@TI9im92F>6o4wn1xxHjoF!l zx!x^zz2=tl@}H#P`ECKZAdB%s7U#z-$xm3CWmuNwSdo=@XG<8@%5oJ}<%6eTd3Cu4 zYq2)#vL5TR0Xw9LixF&JpiS9nR}Wc@)QREXQ#?uRIUOpD0h_6n1sp71y7Uj3{F1NuAK$Qg`f&UR^@Hy*GNbT)M&;w@Vf~nLEXHOW#$|jat&I%GCMy`8pb=9oSS)=mme@6^RsiTFx~~_ zLVRg_HtE+#>aWy4mP@h}KVfN>VOc)0zvvmmcvVub%qmQ59%Z#&P4(KW!+OkfDvU!@ zxfz?Y1zWNe+psO$u>(7Dmita;xeL3qH~a8&_G5nz;1D*-8`?cg&YmfZ%P4s?$8api za{?!F5-0PD@5`MkmvVhgmuK)x&g5)<%};E1Q2Q3DFX9p|<8n^^D)eWiyo#&2hHJTw z>-jA=a~nIju6D|aD}-^}{cioW;kXU`zbdQwwBPa{`4bQE&YG~F<<9rd>L+-LFP4P; zpOG)Hd6{rM{VHGLWnSTL{GC^sElb$%pYk={;7#7*ZQkR3cC()c@;`jSfBBRz_=^AW zHQzE)gV4T*_Wzpit4Cu@#$p`CV|*rHLjI2_Yli#YQ0F~K{Fo(Jil4BmcI-?Z=21EI3arS= ztj14SleJizby%16*nkb$h%MNP?bv}`*p=Pbojur_pL1gNFwXtuTh7Noc`%1?C?EPB z+TrpDPH}z)E)DZ#ocef9;3Q7w6wa`HRriPK>IWx=@t+~jCN3D-{k^=4$#RBqPse)tJJ$2YpR9M7M_9%B$K;=R zoNX=d@A2W3`e~l!1^&Xzyu#mjm4EU&Z}28>@isqs5&CyWzRQ33nB}bZuiPkC*zTG9 zf-m`s|M4~7@GT=W4EvdFe+#&nku8tH4eHV47>vnSjLrB=!2dBZld!PI`wY25dls4B zDJ)OP)J(&4OwWwW#LUdXY>eakV{^&5nU^2101L7(i?Aq*@k5@QA0ChYY!T*lDfLfS znq^szji0hM>+;L!;kfnX$o|jMP;SiR#-XX)j2ViA?OV#N*@kV|j^8&5 z{cSII;2_s)XE|ryaDETx4*Tz>-h*khrzj{(Q52@9Qsej0<>Lcrh>oc32ojI73xtND}nUDEd zfCX8Ig;|8f_#u-O4ec!@f5LJs&x)+XDy+to_ESTy%|ot(dUAa>V2VQF_>JXeY|ecJ z!+dBZx90ieVY_znU)Jj&cVcIDWjFR6Nj-<9w2Z$98Ze8e_IL%W~IPx*|`InsLn$+P7Mjl=eT zv<^m+qwsx3Wi&=-48~$?#$$Xwb-YA!VkTiyCT9w!WNIexIqCA=r;$OuWU(Ks+awS$}HC}rg z=H;hyP1a&<)?r=N<7YhU`(qo(BTt9pHv5ez=DbM6= z#`HX4t~`(P`F`^9^zph;ZYvr&pg4CJk2va%X2)>3;cz@@-qMAHD2cp-sCOb=3l(S zyS&F&slwyf1Nk9)?+DlLW6xKgsz2w%&f)Rrr95^*80XjW8$PvtgeGBm6`$9QBu8cx zMrAba_Ig}&xvlRZi!FC75%!x<{^(6;cVhXK;GTw4kR$~p;H&g3l4=2yJ!zBE^!$N4N&I-I|6EBqmw1K0_+Hto@}KOjzqjPOyvO_8w?EuB9?6gSgwOb#FZqi9 z@iim(U8jhAkC7Oe?=vc+GX`TZHsi9Y^Os0Y%p^?4f%<=bUzmTX)KfDJ(=r`1FyDV+ zyG(Ls)+`t5+2riZ!Cb7Roq6QE{DAqGp9NTuU8{!ka<5sK7lqY}uoz3Yzm$=qmk;eL zFIQk@^#0Dqw+ES z%;P-4lN?nk9QU+*o)@^v@{95%UgkpA_wVvme%L$od)`p8mKp9V>V+8wqz@|W*fF;dv;()c4ilLWthj%&S^*ZPsBu)@K7YVly`9uIOPLTFR}sqI76yJGnhOuoJtm zD~Gr~d&u+tbsfwJ#~G+Th=bp4$6*}KksQU*{DR{-fq(Z2?Vc!4VkwVDQ{<_f&KVqF zy_xbH&f|P8;KFy>ZjHQ_>$sj9xRKv-6F2jr{e3S_G_HH(13bv=mBKh5k`MDJf96S^ z<{6&lIbPsJPIdfVuCL$Kk9wT@L%zlvyve(~$NT)7518X+=*L6((Yxh~LOq%Hg*;b( z!I%7xulbe{ye_!3V7SiSm!orx{l=E#G9KeIA^*pu9Qs9=cgf`BOu>{)#VTb(JJQPO zxH)~ePBO`vnT1(d)B9a=$h&KXwfswYCOiBRj=xYol`UL<$-S>+vHB7&p@|#NC$f!>we(Ck=gX$4|K5nYdZy!=W%qn0%Zkc#1>3 zjy#d))X(z*f8j;WxBpA>WnST9_u1d&tNepE+z+nF^R9&RbwmD(cX*fgc%SLJgmKO3 zb(DwdkNJep_?$2JlCSuhZy8BHBJ+JtalB}9bjDyz#$sG1U_$fX zaqhI=5^_nF;wLQ4GAz#uti;N!!ubAgQceDp)mekrqlEs{mg}${KVy9^S{|;`CUP^j zVjH$)dv;-0c4H6rWH0t+AAZhH-Ou~U{W*w3IErIAj^jCzlR1S`Ih`|Dv{>l(OnDaL zv&7aJje6A#NT+8H+Yk`c$Gwu@ z00(g}hj18&GgF(;|E$cx(Uy#txXVuT~JTEY5iE#X1{) z#nep0JflN@)5#f_k(rr|Ihl*O`2q7WKMSxBQ|Mojck6Ws$NxzFm=Ruu`X_Q}mSI^| zWDPE|zglu_*5SH$%Y6@7ef0)x#7e!wb=^d6#@5brOS#*Ta360iw|S@aI?9>!yR+PE zXXsxSxd(f)7kl#y&%^r4{kX7W*v|lYAO~>>hqIXLdz3tyIopT*jFHE394BxRCvz${ zd%XHm&g^^WX34Yp6~E>j&gDGL=K|(6eoN(LT+UTo&9z*|_1wVC+`{smL;n+-ciYv! z!8uiokJ^7lM`MP^h+V{}&U8pb!K9E))nm+=^%37D8kn2LYcZyGr*(=h`x za)j~9EYFx7+LcAlo+0FH@+j+9G46TQe{CMlcM-WLi}6Et>=yR-v0Q>Bxg%e=&y4(qZWKVyA1WFt0VQ#NCBw&1=dVLV#N-Mfc=w~^bj z9ow@5JFzpnvKzaz7yIx{k}!S)jWhTqzvdjy<3cXs zQZC~PuHqUN>KWRzPF~NA{Fa-!g7NNh3(_YUwGV2ASYr{CT9x9xfixiC8uT@re!*o=o8LQ z200@$F$;70e@%{enYo#l`B{JkS%^Ok2-kaIxd@B07)#a;{U|Pf%o6XGvlPp+9Luu; zE3y)+vKl{Sbxt+zwdC5Y!@8`;{pLjj`K!;vxHgg-vk9BCC0nsI+p!b7uq%78CwsFm z`*8pVaR}p#4(%H)kMcORpl_&8R-ejg{E{>IHRo_HPZ^IWC&KgGSYDq$qrTXBOSz1T zmWK1bLSD%=+`!G;%I~;?ySUhS+$Znn0shFJc!-C2gvWT2XLy$9__@cCU*wDYmGuXP z`CrQW*RQBwWjy2cr+kyQ`4{i-J|FQhpYUHkWz+HD_|N4Re98a#ni2h7`^euBk>tpX z!l?toyooADV|2z~Y{p?+#$$XYU?L`G3Z`T#re=C(WM<}IP7WLx+8aMbFrRvU7U1A- z!t#$YhH)#Z9&=Ere=L_^DVAm##_AfjFDsX0G5e_?S7aqt=KG#ESCgCBuDV=;DMzV2YgOTDad$m8bET`%wQOVf|U^ zvpI(gxR8sun8Q8aSt>8%a<1S?uHtI0YhW?&& zoTBb;2Q2@Q2YHA`c!DQ+il=#w7x^oTJI)pPH~!A6{DXh;8n5#PZ}K+p@*eN=Z$98Z ze8@-qu3vbZdn&)+M(@A*PmbXKD-jvf-_eofD14t$8J#isWLP*48&`zm{~ zT+a!tpOA@}gh`onTBZ@J65<~q?6OL_3+THovVXc)Uz@>b1-+suwE{?xz8)+ zmcRBm^?{s^CmiS2yLqU7L;WMUI6r0ymf|NY%`z;<@~prne~0m|C|6-s)?iK6Vr|xC zJ$}aeY`{jGJ0grvQ@I(NvjtnRHQTa}?^RjrKG#XT3%jv9d$1S#@N=$N6WTK`eXzg! z01o634(CW-jS}YRk+6A$G3sMEfs;6eQ#pgPIGfw_Z>~I#3%HPrxR^U^w^ZIXDl}|` zyozhMj_bLRo4JK;{9iey=jDT6hJLqjAN$^VJGhH`_yhNHzjp4I5Aa7GqR-pDRgd6xg2H1$zfL+2QPlgX$B<839!rkRc#O}4 z{2vps=MUjHN#$hBxg?BJ3OOZHGcD6GJu@&PGcyabG8?nM)8}b&%DI@Ed6^_FkoMsDVNL&J7$lZN@XMSUx`F|qI4*e>tjPVV7e?&E$Q;7>fvEk2)q zR6fRxzIX4Ge1>Ovj+gl-za0?H^L6<)|Kc6qM z!oKh4=z`Fmh+da`k2%fX$Z`}$W94<>II-l|jKjE$&#V2zd0cFMC00+uluX5_|Aqah zk<&6gGcY4FF$=RYv-|$W$zgxF)N?aG3$V!IFdhZvLj2eFx4%C$EH9#7l*RZVvw1&l zak;(wVoAA!Tt+U>3arRVtjsE`%4)36IL57}Ja|Z$7q#Tttjl_=&jyULB#c)hxe1%G zIa{(7TeB_O@xqj_zbkX3=HVyqBA&=rS z-{0|tyv@8EFHhhkPUdue$#agk;$djd9QC=J$N7vnE%dX$^S?-aF_&;DmvK2)a3xpq zzYO8{tL3VW)79@6tW)2>jr^9I+1B%`ZSr=0$M5+jX6VNr`3LUhKJMp_@9NrhNIuLX z{Fx^>%sB0Je$J>rx1V$Jue`*|e0eLh^Q!y@ukkvkd0e_7-{f@l6aId`ul^4o@n1gW zGd^d%mSGF&K++7>_56UqU(Rmtp^j{)#nep4^!)PsFfTL689C7LFW(96$g1Aam8m{AdZse`*p&wi1tz77HyW8a*+{xYi zfqVHQ5AiUM@EDKt1W&TuSD`(pVwSNxB!`G#*f&H0Jo{a_Ipi3z_B;}}JL zpIOyo$T1n437CjUnT*Mqf`1vuRB~#jVOq{j68f87&d5y6!o1AKf-J&f{E(|WKFysI z`umA`IaXi;&x0$=RaljuvKH&{GuCGVHe@4~pBs+fRBp!RY{AxS!?tYC4(!P8?8!d- z!SVXaTaCk&bYYwas1M{24&^Wo=LnAG7>?s>=Xs+1uyE+_RCzjQaux^73+v65=W#w4 za1j@Co9&j%E4Y$-JkPpjy-KUXarS!tw9$H-7<+zLzD@p)k-CJ(``z*$?&Uu2=K&t% zPdvooj&nr*!~OWUe3G^Eh4XYqKFgBsH^11=P22xw`E}l6N9*5_?{b^RiGSore9WN> z!g!3}GxZmI$ya>Cw~Xj@=17dpD2&RR_8(J@%{S_C$4joef^rdFRxc)h%o6OceP!gbEXULSUaTlr zW>r?>r>xFeJYu{CJI*EJTKZ;~?`cnl=ZlT4Ki&UTn#s+1zHeB+mE4+b*p}_tfgRb2 zo!Nz5*^S-VgFV@ceK=rIIM4m${_pCX?r~s<++b$t=SX=JM{^9vaS|tUD!2H2<}`U0 zFBs>qH~!ClRH`5!*wV?N=(e9C8h&ezV<-^W7x-l)H21n(n%>%Q=w9Ep(`h3_*eqcJ)o z<_V7<1zg9m)#ETO<1s!H`rf~U^8Yy7eIl70#r{*tX;|3tqFSCoJtNyK3;oY5XJJ-G zvt2ehJ99EO^Dr+zU_Rz&O#3S+7h+)+VNrg_kN7})KbA|f6w9z2%d;x0vGVfJ?;3JV z)?$3^tRpvILpEY##%>e#*Gz8CR&32SY|9S(`KNH-?ksmRb$?q)9Q{U8^W_sRQtfCt&e zdPn5S-d}Z0KF$+7$yv5LE1%UB z%%6Yc$9%$n`IN8tA73+q&$+zENQ}%VjLK*{q<=Bx7S8wiVd1_UM?F3hFd=Vie~ap2 z-V7ZQOlo-wretcSWjdy324-YxuPi6GAzsTtjNl&!j6r?d9EqfW_=bb5yrc*+>|ZYl8qaN^)jss`)jM-o}Z`> zjT6@Es@{#=*^^VO-%sw(``?EB50;0pr};5L9?4N0%`Z5HV>yl!IEm9ZonJD|`p}Nq za#nf1ynqY&VXLtIH}ag3AupF#aW&U)9rI2P^Js&-k>7H?-`V@OURZC7`VRK+diyT< z2kzzDZDIcImw)0N*WnTQ7=Pw*p5!T><{6&ldH%v*d6`!@NPDl!fACLUXI0n5&gh}v zx72U*4)5|F@AJd*VLm>RAM;;6Na(F%ly)3ZpR=W3#9E9#@Xf z1Wd^JwZnW$A}3=?{<=Jj&k_6knQ1MbI3#SJLC(l5%(W>j&n9PQ4(4PY&Q2KC&ns8W z73Nm~xgd+aTfbmv--mLv8sWSYmp^6+mSicGW*L@c1y*DwR%TT`(7)<()2N~SGu>Be zsn=m$)?-W0GaAX&H;3(;$<5i~-TG|Bwrt1t?7%km-&y|D{h+Jdjjde|J>>7SqnF&9 zp({wuJsqkSB5yOIbccp2?c(v*jbF!|~?G^VrLJ z3*~RPh)cPQ%ejIpxrS@Gj_bLB`yB6Ec@sBt3%7C`xAS}M!9xgZE_Q?nN6A$qy zdpeIN|B1f`hd8jr^7odW7RfWMoF+`;5xy++y5g%JG`Q-M{j&yQ*wwxU5+2riZ#XQW*4_NfOuw4PUAPcd`yY=`XKVor~U@4YnIj(b@ z9jv5YnblaGby%16*sN_BkL=%vb~jcZ?0Y>wRd1%=oax7e?RvStwNh`*e&$p>XSKzQ+YF8 zX!mq^24`_LzkX-Su>M?m9v5(saa$r!T@%*No+`9!nfkUgp+3a=Yt+|qJ-_89ZsvCG z;{oRNyH7vL2l*2Z@d%Hy_3hA}6Y@!(;+c2r4G;H`v+@N_NgK}JFY>Rv%-?yHfASh{ z@Fq|13i~T$UX)7~@;%G%bC&t|ME;jg`HU~}gzZ1w9ektSRgTaz)Zb%NMrT~cXFAXK z|0gG6QYL2_re%6&WF}^2R_0+|e!zUp&jKvSweHJ><)SRc5BU*`Gp@&jlJbssuQ$tO zSeE6u-Q!;cxuo~uSCT8U8b4(X)?#heVO@T1f1kh8VP1%gi*@8ch4fDCB z+={K)hHcr7?b(4Hc}aUa%U#%&-PoNyIDJ=W$LI184&!jn$Pw-%_4kJPI$He;j^S92 z<9JSBZ`%)!5cW4+{Y$R4e3m?$U-4_s;aoO-7W#3(yjY^Xl*_oBE4Yg5xSkuhk>7F? zH**WOavQgECwFl-_psdlFrItmecaCj{E3IS*8TgKe4HnEil;f-an8w^iiP`b8~3@( z>N~9W1AkY)#&*`fYx&l>Vcc(9{ug7P3iZ2kN89}^pL3r6kst9fwM3ffG52Q#h5=IGr6XhVwOB-lLuKl*{cb2!y-*G4Ra37EGC?g*Z`#T|@xY|MDrH@j37MTvgH|p&u{R=Uoc>`%iw&2))C4kroXn}5#+jVO2FJtrB=bF2UFA8J z_w)a%BzeR0!C{s!uzVrE;UX^P5++I>j#J-#db#=v{$#&v@h_ho6pYSOo&j|DFx%`svtN-kE%h&2}8NvMO z;QYTQM`lz;V|2z~OvYkt#$h~ubSj*$gmNM#VNxb%ck8E=Q!zEuaLhqEX>Mm%)y+@!@T@}`B;DjS%{_EhJF>5i}8iu+xSQ>&W~A&pRhE`upBF} zBCE0*Yp^D3u{P`QGuCGVHeplNGjE#9Ex6M8ZY{TATNWA{p5JtmJF^SBvO9aQ7kj^3 zeld(^e|Z20auECd9`5U<{f^;q^${G!v7EqpqeD9<%9A*mQ#h5=IGs`7g!ZkO5sp7o zeHI&<4`0i3IG+po4Ht1SmvR}Ga}`%}4cBrVcSR2U+ahn}Hg4zl+`*mP%L6QVBlPnp zxvTru5&0;O@n`NaU(U+sc%B{1vrF=2wpkd)_c!@>UgaOW!JE9ryS&c_{D%+uh->`c z_h0!bpYs*_>G%2+VLaZbzhxxfYuerUk19uFbjDyz#^V3cbl1^VR1E`%0r90vx;sU> zyIZ;&X{3=ZX=$VpP*S=CK?Foly1P@lL`fC#TkG2o{`0KgK67UF#F=xw+LO^RozxvN-GH z56A0Ftnl?mS>yHVhwJp}!mz#y#w)TCE3*o#vN~(C4(qZW>$3ru>C)93+D;lNjLKSj?TIZ*T)OTqnmzjXL#Ocx;Oi+<2 zOy{^3j_U|Lic@|5ZN=f?_8n2?E>m`RwF6}+Ek`Yp^Oh4EBO&2-GbjI6pT zJTH^Z%*xiARcGUe{D?W2n}wH#^N>$hvz~&w5Wn?)P*_j)K2cN`V{w*X>04pGrQS8m zu)6J))3tprdqrJ|m05*V*|k!5y;s*YSd+C_n{`;1^|;?W8|p@E%qDEg*4@H>HP_3$ z54X~h{Jw5$-G(3C2+wP$+p`0grU>Vwqwd5unZxV9i|)#9?9LvnH$H5qr|!ki*qi;> z`gT~pEe9GO#KAmWKFn{Z{+z=&oFh1rqd1ylILmc3R*&OZ^XTb*I??zfPUe@K%4v*! zC+yEmJ&UtBhhK3n=kXgZ;+&OXo`2{+`HZPW-%e~JijLK+?&R++HccpNW{9DVUO}nTF|@o*9^lnVE%InT^@`5%>GN zx19QS_rJV4!}+j3-@FdTv5@h?EW%>^&UIKym*$fDVLjz^1y*EbR$*0s%<8PcnykgY zt-p@0%X+NO``N?wlId-*q4Cx__k%Fc0&M2-=4`>1Y{j;0=6M}-Cw68Rc4asAWH0t+ zANJ)+>+i1z@R0GLy1cK;Ki9*!c6iwDk@~ggjnU)T+TVYeq$hIPJDc?P+|2&I|FcbRXR!@oemnKZN1=D? zg?f+P%Y8h^!#u|0Ji(JZ#nU{?bBs_ToWD!@3M={hY%|t{*Xb?ew|R$md7n>weKY-W z*ssUN|KJP0cfoEt43J;Jz3&cX*$BPe@d&B#@}b{Ct>`Qzh@l9cr?afOvYkw^Ny?I@dGAcLMCEjCSg)0V{)csYNlaY zrepedQLIgbsEH)2y3>lv0S;rqSKjkjP+wq`qa zB>_6p;Z^%PF!QQMiWXK_Bi<~Ll(MO^&OMd5Y2L@(tsF6U|6%WQvF8DGsc zT*vi1+Ah3)w&)+Ym1kau{oJN^FvprO{*&Ixv*xi|pVRyFd3`_^@VYsu5Al-ay8jin zbJX}T9_I<3I*hAMz1< zRtwup^LOy6@dK~JdYy7@G-QN$d+X#ch`a9cBB>f)y8IP)?v8eMA zQ|EU*#ny2dp9z?diJ08yNhHY)~V-{z~c6EX(q&z)Gyls{EKWSd;%bUG;Q*Hef?GW)n7L zGd5=n)^HwM>DO<3HBRla^c4k+0V|VsoPxfM8_U8Z& z8|FVokL5Uy=Oj+%ROWO)nW1NM4!`1D&f|R6c0JYM-`2Opfg$>Mq^5wAH9^?DCpI^B@9@a;Al*f3S z8U73V{~?FlzcU^`$MbypENuURzQ{|w%m~(ZO<$aE_{U`c&KII>L!I%7t z|L|YF<$sJYBR~LKkQda zy~=h!(XH8r?bw;!*qy!Dhke=OO%44 zKk#^bCS+nJVNzZ&&y+e9Q!@?IGCeaeBNzNH9Oo=LE3@+>=Kn7okDNLeb2AU~GCv<$ ze?eV{MOci*S%UK%=d!vyE3hIfu`;Xhmg7@h*I-T7Vr|x8J=SLfHezEoWivKs3%2AZ zY|Zve5j7n52BpG%xwG*u?8ffw!Je$_`CWbe)Yo{+(qVlwece6Ccwfs8)x$WP(>y*> zck%aCRvG`o_*jnPcsBC$8B_HP&g3l4pj+^*BH**UQ`MPeq-oc&xnY*}~zi=OqShnIn7{K6{>lFmhV?zu&-sF{_?qweeEom) z8@^?v&%=G^Jq}GCuJ5Qi8e=dPV>1rpGXWF6YdC{Zi zbR1;88Fgl6;fKu5k9f%Qa_U^n%{_rBi}@{=aRpa#HP>(**Yi7W+`*r?lfUp+9^jsz z!|^+&Pw_O*aB-?|+>XTy%U?8piI-W{dAY7{@Fs8bE+=OU>-$|l8n2?E> zgh`o<4gLRQGp5)d&PN)Lr)4^3W)^1Shs@58n1eZ)i@6yyK{$SSbw1|jV4n+BP#0nm z7UjBV;kcI2rC6HfSb>#Ug;lxGeA4=Qzq;`nti{@_%dTC*eI$9waQqq@Z^~wD&X)Xy zt=X3C*q$BuDLb$(V=ukW`}+Pm;W+mCUd_Df&xJ;|$JZ7t7Dp^O)kRu$}q(YktE8 zT*$>-$`xG6Rb0chT+a=BaVBhcqu#{txtUw|1Gn-=M)&t*<8i0)pSg>-d``%(dLQ@m z02eF|=jn((%40mq(>%koJje6Az{|YC>->$kd6)NipO5&MPxzF7@EMzV|9zof@ipUg z49EW;y(Vec?;?J`>za--JS-QD(HVm=8H=$Qhw=CU<1+yhF)@=eIa4q-(=r`5rwaFv z_dW_vah+%J_$@z=lvBUdxph9~X8{&uVSec6UrXwblZWF~URPjcR%JDQ%nl2}>$rw4 z>%Lb@*Jd5oWdoMCd{f=DZJ0*}=d*+Hj_kzFd~4oa^?Jvxr|!ki*qeRXkNr82gE)kr za~Own1V?fV$8tO;a3UvhGN*86xp3a6>gn&sIh$W`KEL4tZps&~^KbPsuH-jzi{NLaDD98qxXmNdq5xLAs*&Y9_I<3~Aq$oF!R? zrtNkx@Gq2Mv zURR4ezJ$xToU6HpYq^f=xq;tt6TjzXZs8By${(3CLpVR%^$zajE>^JIFZx&R;eH#|4A1dAFR+v2JZV)}&lTg>c%8rTHt+BOA2Oo8|Bm}q|G{T`&KG>iSA5MkEMz+w6Nc+0;>d6xip0o#pZ{ZY#$-S1iKjo{f>L39 z@%5mxp`-K)_lKm$*Sin@=J)uM8&Anp%)pGy%q+~xoXo{M?Cm_|*9BORg;UB3%jyA*Ov+BrI+r*zU;^T z9KeAb#K9cGq1=!ttbdpu&Ji5Ry{?DRdMw9r0w-}YTOSVB@t1lkr*S%GaW?1hE6(G5 ze$8*VfPZBPulGfIF_&;DzvVKX_IFi3^ZH(Gd>vQ%`eK7F>+dFP(v^CJ?Jmw5++zF( zUU)AY=gl79W_&w$@F(u#jKtyfxm*9jU%8L_d60*Al*f3Ar+J2Fd4ZRCg;#llH+gzU zIKOxFUEbpZKIBXH^(XpwKIJpM;7h*ZU;Kw}_`aX}{~x0;ulsX!9fL6$n~xHQ{fK-z zn80`QWeTQbD!%paTxoP#reh{%VOC~ic7DVhymu{J54m+7=4Cz>U_lmQVHRaE z#a4+sp){(>otuiqWkKi>ERPUIv` z<`jO(sr(>kSkDYSle4+Aet3MYp2zvDkTZ;njDK^Ez+vCU5Z$@A4k+Gq&Hyd88ln34iBPKI3x^&K=JGEB!bB z;amR42&2P&=siYdG)8Ak#$h}rU_vHl5+-FbCT9w!WNJQhoYU%bOwSC=$TMTYdCa6U zGYh-_6!z~!or6ER?w?ouRw&q6HBqAbReEX5sp!g@c>8_vg^p`pvad!Fr7 z)Q|mtdlg-k)mW4D*no}Lm`&K6pRhICvK`wqMU8MAJL=^5!n{*48@qVC!@aOSU3K0f z;rZQl5AMAY*3(D#Wj_w!Kn~*4CEBoG+-}#h( zuyKWOy*}43_>!+!$@<^uf0?ROc;AUICafnSBe9>)mx`?4=cRAMe52{;jKNrp$M{UZ zgiOT5Ov0p0#*|FQ49v*#uA3}6E3@%KX6HxD!JN#++|0vnTf=e6r+@RhE3B{h`PIBj z!*MBMd{d#&#q>6xcUxSSWNDV;71v99=jW=f2n7c^{~4yi(yXpZdBf zo3S}t@RsdLMQ&_<9 zo9KAVFg}yBIGc0$73cG7e!~SUZ2e31GA`!|b}br?&nmsu{}-;->$t#j-|0>Ko}0Oq z+qj)OIL-d<*3hnI zn7{KW|KJP0OvzMC%{0u}ChSK#-QE2#gU-kngTm`4tIoy``4Mw67jrWY-|=j(JS<# z@Nk4RdL7qu3xD8NZhQB*_3h9-9e!VXXTrBk_GkWp&$~=Dt-+$MtwTe!wk`e?pyzN!Vmu*lseNoP8IB`KHh*nTn}7 z>Sb6itxm_j_AjH(#GJnV%c4KzN6hhVIrg`nygDB{l?&S~tc$Q1i?akvu{4(#j`08g zmD3ft(t4}twqJzpRMQ{xs_UhuuEjdM?(qh?5u30Xo3jO5vK2pJ8~*Hb(A(+u?8q+c z%5Ln=p6ty&?92Wfz=0gZ!Q7J}yzV~NBRQJ8;)m;Mf}Y4poXjsdmD4z#GdPp8_!Z}J z9y>e?=XHUuR3V(dC3-2pD37y5r?B2r`ZUk*EYI;gFYqF-@G7tI27lvS-s2-CNgd{K zzhXH4zZ?IP&-sFX@gKh7ImhQe9l`x75+gGTqcS=NHVxNlOdX4rI)(Y2dlcpu-*`eM zW-_K=N~U5Ore!*2svOpvLFdq!bmn*C-06P)r+<%3?ejHK`FmvaSIauwHbE!S~9 zH*h1r=Vt!Et&H_?n9nx7oj);E{BZt$*1Px%_cG>};X2!|5AX<&@dQuu6wmN1&+$Aj z@FFkqGOsemnJ|y*`ZwOvnSJZpV%bv)iP9$zP5LMCEjCSgCXzdtX8{Z3*0 zf%|3}-QRNQb!KK^Hh#$L{D?W2i(i}#=P|F&$HFYaMLuV#gf7Wayx{zm(PdeI65sHFYi4X1bc;`grPd;OZN1z(#D$rfkOMeC0S-y&Bfn(s(O= z!q#lVwrt1tJY!xR^=193eyF?XR9;WrbPx7qFZN@9epoBacc3n=FSQ8wli|ikaui2% zEXQ#?Cvp;}Fr9f$)6+SFGdYWMIG6MJ*!8kNNA&X&%k*--Z@JvH!+x$YzLx9wd~~>e zHt6rz)$_jB+0B2O9`ErT`X}z>F7DcFQFpID#i?amt{1%RDDP5W^BZl#^x&kY*5-YPRtFbz3uqJD< zHe;6#*L7W8kM-GvseHapGhI7Zm|siXic406@lSMXwqtw#d?qZ{QFr2}?80vB&K2H2 zd+R>z$NtRi?*|RkgE*8UIhwgX2>07DI=k2DIKAF>KQcbi_#{r|49@0UzNjDe_ZwZq z>v54@%%!a9@#T62S8^3sa}C$BRD-a+4f;E7WHRV;%(mLeLmnr zKH~3e(I_0ZKlO8tO&MNaFZCo=PI&wOI& zm~8fMczzsR*7Y1u$7cd2WFkIZ5ayL!Pfs5@rB1`NOven&$V|-4EX>9anVlao2Xitv z^Dr;-u>f1Sj`F!)ix@A;)*dgeOR^M8vkc3!o4>PFQCDJRR%cDtVr|xC{dbQ$AB}ak zzTx_5rCalAlW-o}>h|owlug6qopfh*VOMrzcRuj%|DWmJ?8Cn7$Nn6^AsotK9L|v( z#nJqNE6jVG9?yxK#FGCD`}d`u%4wX=nS3=M9LG8OE6(G54$2f>N8jj$%-k$&Z;Aev z%eb5?xQgqzp5JjJH*qt6~(NU-{Czz;uAjQpM1vWe8CEx z!}jaC5BzKVE&pSLNnyE&jKuf&KSp6xMq>=dWGu$#!xrJVCDId}-y}LIlQB6{FeOtn z9kaF!>&>7uF*CDp+t1usu=u{m3CRI9LDEBy&SO%~2~8~u&t+UfS}z>e(1XFj*K zi|)#9?7^Pw#Xfv(do?}{^JwR|4D|RQ4(1RJ<>ws6;T*wH9Lov(pPw_BtiR+m&g5d( z$yd7b{V>n@dJ&iKrq2bv_aH2{%J^!Qd=}2bT0PD0_iWJLaU(bJdv0Me=Y6aGk=r=S zeI)LdaJ}y_zK;iah&}s<t%i z%=h^}MqyM&V|4C%5%xQ#j>XuF!}v_ZCN0AA;(8q=F+Qnnn0IoWf+;z?bU3bQbUJ2W zMrLLfW@X8RVg0#vUT%3C)|+1!U_lmQ5%%sC-Y<*m5-iD5EX{H(&s+t<{#Vh}_%W;V zX~Zz!+WMTIo9dD%JimeQ6y6UT>PEcZEyo3 zt!ILs$Vr^c?Qg=oUR!>u@#&nwSxnF&%x8|C%lTZ)C0xp7T+S6-$<-Wh{cH7l&NseM zmvLYIUT@`(+{W#E;Q2fCE>^UjU-cgD%76pox*xc@xJi~e8}JVlz;F!U-K{i!#8}(1pfZje|n|k5^+j+oxjg0 zjLIgCdoRh4GTQ6ic%V z%dtEwaC+fzT(4vd)-qm)^;n+`*pL}*zp;L~BiwJA>K0wX{O0(5yq3mWu?^d@9ow@L zyYgq(Uw7SupRqUlurK>_AO~?Uhj182a3n`@G{^7@j^#K;Y8=kzL_LX9xo}xHE;IB@ z&SEcrzkH6K%Xw_#>y!EVYcAj-F5$Oa#^qeafnKj`^jhX{yf^6YxQSc%Be!uof8tL5 z%w62gUwG8NTkX+%xsUCihvRxcA7sVu;dmBzJsvfF%KVS(6FkXRpM~rGv_8YL?BqC~ z*B5z(*Lj0C`5Wu@2=lt5@9{n#@)0Zj6_zjI{_}_NKlzfc_?mz7A6~KFZ*_IYCBm2C z_(fzS_Ozex>;EwdqcJ*TFeYO$HsdfZBEH?wV@aGtm7AGwX&nZbI0(m(ST?&UsavHW5E&~}dLM|Z>VJE>3cG-tc6&g%2L zz$9l_f-m{%UHksT z-}+y^<$sJYHSA9$HuL?%$ohYb!l+#0`~T5(40i4p_CIQwaKDLfJOL9j5fd{BlQJ2T zbCdO^)Kx2n?WERen3n07o*9^tnVFp*aY>(W|H!TLFh2{i2tTl&#dL9&WGR+r8J1-^ zR^XH#;e1rmm05+WU9UCu%l_dw zsavs>*I{ejhHcr7@r#80Yp*--igP)S^Z7Nu;Q}t?i~8ZXF4Bv+giE=c z+y4stu|g*r6wdQ1y_##djvKgYDLm|E8-|)Pmx;RU)G|RFa%kwMSucWK; zV^(JkCiZ)hHFYgE^ZBw*{X1{%b77v%Jl=wNH-!1N)}Oj>4*NWef8u)WY`ml8I`LNI zu-;Gg>T02f_`XRG<2~7npRo`7vLA;e2xAL?V{|3Y z8>`20JST7xCvytF-ilw@q2FO z58TQhxt%|=#qe-Ef6>44zSsLceSimfh_gNah(5|XWy1M6u6J7Qls?TfJj?UE%qzUg zYrMgm{EfGGn|FAR_xYGl_&cBS4?g1yj`2Fk;5z@u_#6Jqw~Xlfi;?&qqcAF?F*>u2 z4Cf`bj>8Wap95S+iFCmZ;Xb$fM0kD@h$n5<1 zK)B9x=$y>Q{Cwm0i3;h<1;c(6)x}txCAcJI*zayT!t#yQ1j~ASr2Q_hE3z`HuqvzZ zW7c3T)@B{nV|_N@s!?GcP4wd}p_}WrY{w4l%xp!&>!`c##ihPq_nGd^KJ3eW?9Yjg z!yr9`L-{#Ja3n`@3=fYE`!QDk=YDbV<8YoIdVGq<-}rsWuUm%4XB(fxub6RXSnquO zHNW8kF5*&-9TT3nQm^7_uH#hSZ%-dF%wvP`joifVxrIM)D}UrRZs!i}s2-TZ~W zau4@%9}n;#5AiUM@Fn2`@!LO#L{sY zj~_5GZ}|EtsZPceOvzMC&9qF<3|#O1C9}@LY+Nud>~9WzSm)LGSbzmth{aigC0UAz z$A|To*A-Zil~|3{S(9~Gm-Sem4cL&4*_6%LoCRG^t@I~s%{FYu_Wa)W@jK~H*_mC~ zmEG8rz1W+5*q8m-p946Mnf$!sU_FFG`8nfm5663y9?dZv%W<5{lwKDz^i0m?H(bcY zT*eh#!?j$;_1wVkxQXBM`NS~)AN4lw;7|OOd$^bTd4LCbh=+NE$9aM$**Q{p|39tI z@Ep(c0x$9sBen>y`ztz=<9l7-pQZT@*&ryV@rk-yllPjwe|WpqCm`I+v+ zz8vBABdS_%fboGG#KCN3xuJR(N3gZ?{lI>YGd`Y^IGNKqgN5wpY(0m+Ti<-0c3L>E zSy&GB)?TReCKqa1*z1E4OnOf8itV=X>=&?&kp>k7N1-PqLN$ zI{7l}?-}D~d5-5f^v`hLxS%ic60dM_n{XXo)7RO5df3h_eVcc9m-qO9kNB8R_>=Yh zsh{yVU+^Vg@iqVEKYYV~`IZr8h5b&NFBnlrVq`{RbjD^J#$}cs;eF-7yqEQ zaXWwFPM-0;)XD4N{*7=QAE_Vav&V9Wc$CL@f~Og=Y&idC^*NsB1zzMOUglL^<8`k1 zD$M7muAMIQ9i79!Ki$*!`G61kh>!V%zw;^kI39oMe{BD`e!;18!v4O}iRXrS{jH~! z5B;y6?tSY&9btAj-tRFo-{=1rh0z$Du~^IJn8eW^Fg_D7Armn%lQ1ch^Nsy^-8t-M zD&wh{jv1KrTv#r<{)jo4i@BMH`MAvWSVR|N36^9jmgeDk;W(GoL>x;E=@t^KH{>+`Dnb7S3{tvF?VSZ{0HhH1^ao$kPn?8M{+ z!}ZizcVRd7VL$fgK(26o4%5Tg*tg{&9hurAiSA5Mk{FiT;$NNU4Ibr`I^L<8V48~?0#$`Ny!1zqSL`=%$Ou>{)#WYOIi1)&A z$)Gc`yz3~l&cdwB#t)gDAF=tOu-;rcH`jU}%C8HsFjM(^yv6h)>nWj2u?)+xJS(v> ztFS7oaoqUub$AV3i)9ywdDqqbe7)XCH)SjK@pok|d404t-j?mzfrqWXlg{k-a=Yqo z?9OAS!}Zfs_hCN{#z9@7jO}mRSfIR-7m~{nepwVL$A`q9)w<_*K!@#^E+mdrGG8)@F4f`8I z$6{>8;Rj5_#7x3uOwO~me~GD$r(wcG;XJ3;8JLj=x`%n?84>)@cy@looXo}C%)`7a zwLGk+ur9{pEXlv}hk2FJF$;t)rzcuZ1--p?xbIccm05*VS&h|MgZr(omQE5goUb~% zE*r2BBl`c1Cb}t`u{m3^6+dBXwqZNA=b(3A2kXu&!tv{@yRa*}afs*j&^_6UQ>>@2 zo}&loWqOGIoV$&W(xW++6FG^KIfYX>jTiiW*$h3CbNChKG0)1d{~dk}=V!6;rCiRH zT*I|I>iHY>Mg6_r%K~bMRoMPc{WEv5n8)|(eT?NgIj9G@Zywdhc$_DAifR3x zew3EsIzMN8sP$aX7kP49jL!s2$iz&- zG4?NoPRUeE&9qF%^vuAF%*4#h!fJkAD4SmFb)H@4U_KV)%Hd)E_iqlzqmc2!EW+X} z!ICV+(k#QWjJP&jFBNqaR%JDQ%o?ou?s3nrt?O`N&M@!#x(WCD`n8$<%JFZZTe20~ zvOPa#7j|V2_GB-9#{J&c`{)$w!hZMD{W*XGIf!SwhwE~v9?sDm!!J0N<2iv7If=!* z{uVZzJ)(>J9ls=cd@vid)cF}GzizzKE0ncEq6#C<`Ev{G0x8$=66D$ znps6A>x)J(&)Ovm)hz>Lhq%*^k+WYte>_amK?xtN=InUDEdfCaf^V|cw4)jcAD!pq~Wi@`x>a59HY`Q7TtFErc#_t|yGd5=nw&Evj%{FYy_Uyop z{FI&9gzgHDg$6{>8VO+-J2aFOYY&W^@$0jn~!}Xg)CuK4wX9}idDyCz4HryJvlUZkB zR({Cr%)y+T<@vewdR<5tW>FU7Ha{mC@B|l+nwq-kZU`KZ1##-UJi?J;n|D^2d@owzNUhK_&?9Txl%poiiBdmY8 z9>Kf?!}UK-PvF>kVO|sUBu4h{HdFO9&R}Xk=Q>Z%=Qmuy#azOrT*-q+7@;2}AF7NR^AMha`vE)zTI6u*Uuxz2QAJ6o2 z_O|>h{hD{ZkNu6{3LRneeC+oaXxG(vd44k|LG_^?ceXC>zRLqdB@b7 z9Jkmy4&yQ&6EGnYGYOM2Ia4wf)3C4Kb4jl=FcUK~3$rpCvoi;CG8c0*A2T>^`E>yn zWFfvWuOhk_AJ-1YtE6t^_?OmYSeE5D*Y#IHr+pL7to-@VS~bJufkj}PEL4&v-6VSR)3P`>c|VR|@U8Xu`gaWu#93%)h~ zae4xWmkjS8lk`H@#T5M|r*j5d+t0{D!}Dhw|F3j7PIL7<&ga)$z=d4I*$2Y&m*|yx z^!c!zZ;dbG@^{N|6<2c&*Yb_^ZP4FwBRBDTZszqYVP4Z}2Dcjjk=wX~KXVs%^B4Zg zJ>1KE+|L6%$U{8BqddVg?>rdhd0t=OMMf(bj^`D9jn{dDog0Mpq(2nAZ9Hn%@cg^_ z9`Ex3A9AYaKYKUs_4-1;;%olHH;iq2|LOM@gzZP>`;5lujKNrp&6iuk^W*6vhr|9Q z&~fL=UC7CrE}O$X5(3zjoJATb1*0KG9UA^ z01L4&i*Ve!@b$`n=26^u36^9j&TyYEr?Vdk^WK*^tf!*!*UoblU6s{XgSA+cO&?P&ao<+|(7*pK~L{Aif>eET!V_+jU3h#tz%IneV)=n;Ax zHy#Vu*Eo-l=R{8CQp-=%(>a4PIfq#ih2!&;p3C|CnhUsy$&ZEoT%woqTQ1{r*75zJ zTAsJs_*$;x2L9_jY}A|hJvVa;f8bXB$Zg!t9sG$q8EtOZpI`K^JZ-+$dBFHV{%*WY z>~MaL8$ZF5Jk4_~dpvCKg1*R0yv!-y7q99YtnTwUZ|gg3nmMfZu71FWe8Q*vgU|S! zFZhztPK5RTrT^wXe8ac=j}aDz;}VhY@qI>RZ|je)V=@-wFfKn}d?sK*Hgg_R1Nr zz>2KI%KVr$xP5bY{^})RUUiH&WMekr4?l$ETj?bBv$cNZe$`gDX9rgD{`sly%pUB^ zf&A}OnAc$aIY)6c$FSV#u>3eZp6h3ac~8`JE!UE*Io0FS*vKA#J?kjuE7MYDzLXO*tiJoH+!W}4TmHugi^6pf`JLy& z_W!3RcwdgHqca9~jttAk(y`gv>nE;`$M{UhL`=*iOvdC)!IVtJ)J(&4%*YPrky&S9 zR({Cr%)y+@#k|bV0xZZvEX*P-%6O^5c`LIk9Pi@BYkFTUrLX({)H1pp%d;XYvkI%T z25Yhw>$D2nZ>Srw37fJ7Tk#Xdy%5fG8{Li_*pZ#snO)eGKhz4Zm+ra;d+{^&W`7Rg zAP(UvUx$9K_nPNOJ%(R!0wZ4x`xBLujh{^(&d-;6Iw!UX`V@FKlN5 zmlz-7`n+sEmK$HeRb0(AT+4O5pQMbaG~*2`V24dA}{j_ud&D6Fz*}sCU5f&@A4k&dH;E!AMz2O@F|o0 z9JcdJKj%xn;%Dabw@z9!T<2{{hu7U(#xpYu$9X)5{;O`-uUvY8$MfiX%+G?1k`HS@uF6Fme#^qee zHC)FH{Ei#BiQjWGf8bVb<9k`c{_oVgxSPLn5BD+djc`0xxep&SewfF3o|kx;S2)}C zaZTUg9OHNNJ>KUdKIKlIYy78v#^;=GeNiuj`^FpNx7LOGV4FhWI7C{)#nep0bWG0- z%*ag4%q+~x54rufFz-Q^!*R=LJQwrundM%wfboKi?(;$l>*6f&&IDoorFBooVZg1h z{qn{uu`;W$DrZ^#V_k!_Sci34kM+6F_1;i7W)n7LGd5=nw&Ev@(K=i|t#vzgU~<=M zC;cfqvkSYj8@sayd$QNN$8U$@HiZ3*_vZi(;$RNtaIW+GSf7N~)fnSna4g4hJST7> zCvh^TaTZTR4(IFcA|o36nAzlQRWVGBwjMEz>bQ2m3xzCY_ZZGCMzFPUdBP7GPl(WigguNtR|( z=d-LX#|o^-O03Lkti`Rqo@@CaoX`5k8?X@@vk9BAIXABh&u^()@e{UY8@6L7c4k+0 zV|Vso%71J`?vML*ANPra`Y@01D39|5Pw_O*@EkAlGOzJEZ}2zX;vL>)l!;;gtN8x< zed7=Km_Pcy(i6SmNw^OG(0}r@@ypf1U3>cst4oGpEm)d1@YyXBZmBU+e$)mI)q) z$0L3h&g008#^{W}n2g2u7@Kh!pIyy=023Qe!uR93 zdg?wbYP`SxiUT;1U6Y0LbdVm*Asoix9L+Ht%bni$Pt;%Y8&2Y6{?Rh*pJ{qJXK)s0 za}F19As2BmmoVd#F#jyf$yFX-!*yKGAGn#@_#=PfF7D(ux& zKIaR*<{SRYjGq5izw$mcg84^e6dp?*UJs(`XpF`87@Khzm+_c@QKNT{d77Hf1w5XA8DsYqnuqW<3}7cSqfcU+_zIW;ga^FZN-_7h!(= z^*|2d5Dw)q4(DigEE}%BYv%X0@yYy_)A_gi=xjZQb2*>0ykA|Y7jcHq|6Qz?aG3X* zFMJ=mtDpO?@c2ru;ySM925$7cO?nHr^GE)~o!rIU+{67mz=O>CD(wF}tn72N6MEe! zX}l~?c-|?V<~g3{1zzMO{?4nslQ$f<8~Qf?;9vZk5BZ3X`HZhw<8|1sfAxQS%LvQE zeKQirn?8z;%4m$v7>vo?p7#sm8$YXm=XJjC@f7@!5qwTh8l9HunUR^9m1FXT?dcXZqwBK) zKW9U3vVKi;E4F1k`?ZrU>UE~t2VsA8HQt>)SmHnXRrh82(qVkCZtT80LXYHb>or#I z(c|?5CLbQo!-@K9e#0-bhu7I}^%PEJ{I_9!%Gs_t#+zBMd3qt2a4BEc5A$E9>zUt5 zy_y4!|DZQ;6E|}UCq)YL-KKxy9)9S!?AHhRGY|1FkMJmu@wTrUlSBy1J7qkJZtzFg zzh{k~=OzBeft|y2*T)908o$O{yvuw1llS?U|Kk%r<3D`Cmwd$xeqZyA{+G4lhV6T+ zBdiGP8Ih3~nNb;y(ce98f5p%-8H?{Rm*W#p=hi)(SILa0U`l?-R7}k@OvenOCt zoXo}C%**^N$U-d4A}q?{EWwg|;yf*_U+ePvV;(;i_IE{HnblaGpRopOvNpR#4#%;s zuFtmp!~8$j4f&1fo9bq~bSg~WLbqfqwr0`+1Pb z{GYO)^&uYSFFeAdeC+k;xIV#CJj-)D&$;&ZW&Jy^@)~dO7H{(ov-!KRM18`3Eu#PM z_@8WFI_!_X^-d#^%{Tm)r`-1=tqjYF%qWb?XpF&FjLo?39{2To zJRP6^Iv+oa5wX_=1cnSq&@nOT^X*%+}xxDIyN54nuz zW*+8cJ{Dvl7GYHL+v0QB${Mf0^}df@O@GD)Y{bTF!lrD-=Im#GwbbAEJ&4x&knMWp zbF?}b@5nFsCA+e+-_z`+Tf1(bn13JRec6xw`4tCnAj`ZLj{i_Sob`-1;b`Myc&9>m zpEpiVghuH|}8wA@X4 zGZz`(s&{fX_i!H%@)sWCah~QGp5;X6$vJ(V7x^2{bO_sb*nRGX@teHG(H+8Zyshu@ z9`Ex3Z#oa3>F4~1FIda_)*Zg@{h#r-jJPV?ry?;j&v}0sL(l&*tY0i0oADT*37C+H z-G>srYbIe*CTB{1$W%XsGtWSEKff<>JyG@r(XXgduIdyL4VP58AeimRs7Gh!c zOc{>%SfATj+;~Zr;+OHm`gdblrCM|Z_pdLh1+;F5db)%x|ym z;`cib>O*Yg_Y4X;504r@#^XH6tck;XPwO*W@BLgkkDoJso)>tLm-rhm^D3|N25<8Y z@A3iv;v+ucGrr(UzT&^u_h0>%sgi{4jPCElVlXCSv7YJT=(vo}1Wd?8JhnU>$0YiF ze!vt=$q$)|shNgpnSmLZnaTZMy{tMLbF!kp|NWHtj2C1f7UnWPzb&SVvjj`B6dSni z%jmK!&&Wx`{;r@uVJV*jR7qE6b$-SgtjSue%Z6;krfkNRY{j;0$7KEvtiA5Qj@;HH z9M3OxXSOXE#(UKc+tzQCB#!|}bOFY^ko@)~dOCU5Z` z|KNT8&4+x#vbg+-t5D^?8mP- zfP*-gLphAYIf|n>mg6{{6F8AI{9W)j@7mu(Pu5d8jng@Uy-hz$&*ogt<9sgQA}(eY z*ZUds%TzsFCo4Rjp;+jZdKFXnzV2GRj@is_gWkj~+{$g-&K>-bKXE5_aX0sHFE`u{ z=gB_3p9gr5KlAWAQ-%B85q*@$c!DRn&gcD}(r5WA&+!5;vWC~q-}Gf(;dS2RE#BrG z-sL_1$%lNz$NV3k@F}11K)P^zr+eN0&v?$qVSm2Wk=BI!YGi)zz7fA^7>{Z^I%6;v zV>1p5IIrUCLe85cgTneGG@giw`972K114t*retbnW>#incIM#y^kMnA^b>u<|1r*M zJRkG3APX~ThA^L^x;RU)BSpHZ&j^jCj6FG?`e7!tHSJuNABbwyS||#3t-xKQz@X*ov*$&veBThx4_)@eWKnD~xy2UD%b~*n>TJ#P9t~v48s* zAD1I+?{wn>j1S~4kC#amuH)l+n8$~61V?fd$8bC+aWYrL58E?UPvdmX;7rcu94_P{ zF5%LgVY`;;$3rNi@o(7mgL-l#`APFwYMf6uaAXUr9*->3I;yyyL_ zC+g$+1dn?DX?=!g`71B-5`SZcF=4;n&^LLTcX*e7@&W(Hr+miee8HD|#W(zy|1r|K zaQ;MQ6h>tz7q$V|M1`V#hm=&ddBPz(Op{A}q$@{D>tv+53dDx*W^1607h>*L`)p-1>c{*ZVnQ zO&zyDIIrvIdaTa|{G1Khh)vj>E!dK6*p}_so*mhV{ZfbXsNe9DlIgk-pnar6#9EaI@ z4(DFH*yoVa4WZS2Y=+JIl^|$vfMq!GaU@~ zsr~wA9%jB8VLOlNan8RJ`ZO09ANDqE=W>0{;}>|58~r`)W&Jy^@j7qv7H@N$pa0y^ z_xK0z^8x?nLq0wn_Qw-_$$ojJ|6xiGH6+nSv>q-T!qn4cSO$RBM_6MfEf&2?j_Y~Ue%YWmauYXm3%Btn z?&L1+=3egODL;QXpbzqA9^%Kv!~OG!KE`T3$NYpo$urFBdON4j^CExaWnSSmUgr(o z;%(mHUH-}Ye88yl!u7er{qmvlNBke3@F}11IbZN4U-1q9brBZhM=ZfoEX}g4z)GylH~vn&ny$fGti!sj$IqG4=d5q?eWpgni~0FY z6Wx?8*pl1-4#&B*Zo_tL&tc}*Q9t){hEDnmc4imG?HcCaL-%BF_GLddz8|I^qz7{d zzdaNlPwsv1XyesOhU@%m{m6Z2vVN?m>S>(L8Jx+7=C?>M;ZiQ+_bmQ>xK7vVbzIL5 zrNa7c)?2upHJrac>7Crg-Q2^y+{gVq_-@?q1CIDKEccM{!%X75IigSSG)w#Xzu70@ zx~Qqod%T&xq`T=W`YNyU23MHwj=sk~_$MFmAs_KE|Hr3%#^?NpFZqhm%Y^;$M*qhM z8^U=Nk&zgg(HWDm*}?ouyt}U%Psl_}!lX>b1U?t|XUOk;hRgG6;b$-U0tjqdr$VP0+W^B%u z%x}4Ebvw3a2hR7o`yF*Be#yFizSu=~Wl#2EZ}#C}4&^Y8;%JUx|MFo!j??2gffM;P zCv%18P1Q3vle74d{jpFl;&)ue0i6`aCZ%PuB4G@A@jQv2_1%e6H&oEav^kJ^d#iFixp( zU-?@JOQUX_%H#{Jv~@oq?H{nOT^X4V>?J^liUiSWp*c4(ne` zf5Z|j$t{(_dUqHX&XaP+%kyJa;3uresb1eJ>A&NK>#3@4JUtw*>Uuz&&`oW}bkDEp z@!G7%2K<~2*@%tVgiYU#R}S0NLbqfqwqYOBbyw<=ykFcQ@UgeYwc?^w$L( zhXHyZ2XhFAayUnDBu8;Hr#r95>G7PviCk)ZCh5uimQy&D(>a4PIg7J7hjTff3%H0& z_#KZ`3CCq#l5ifZF}{xL`2#mFrr*y@;(Xd{d<(a-yW_K67xuiL^iJ;LZua)P1G<~% z9ny#St??uJ{-$u<9MdOwl4suOc^C90{>I;Vjs4w6Z|Ix6#c}=)>W;q4Klmpf@Gt(& zM|{jD%;)>I?W>3FdS?7NU+@)QGlJg_h|H*r##nrh@fe>8nTUzm-0RR-$0xb*lx*Pl z=2Gjl9B29rIwLbNGqW%&voSk!Feh^{H}fzr^RobNE)Dy!pf1Yd{D`Gknu~q?T27be z$E?6lSdo=kg>8JD^r=4W^95?@+HBxHRZrLF3cuI$xo*ft96K@G@0;r8Y{k}W%l54Q zS-1~$(Oub%-8tWJ?5TUR5Bsq{H~G2706ma{IG95?l;abH<1|c<;OK2(`^M<8Tx`9@ z>52S?#r%9@vi_D+IE{@=H&f5zLf8KsJ)euXm`k{n-|@Q77hR^8a|Ks&6|*FAKh{sJ zS0eu>WS#N#?CZMRpf_?8H**WOavMLd8IJ#~pTd6s(RjJ-VLf*0U0iQ}@6-EvfQR`D zk8_aqJf%o|6<>31gK#|G>R6pZNA!PnBk_>wqUflM&KQiz)Srj>#MPH4$dkNrpvD{dHpY_i?A4rvjj`BG|Tf7 zR%R7`%FkGXwOEIBS&#MEh>h8l&DfkR*pjW-nr+yY?bx0j*pZ$11xNV5_T6-M_Fzx; zW*_!re-2n>^Uq9d@ zKIRiXEGAi-VNKIOebdwrsOHlJJKO6C$;gkOwUZr%q+~xY|PFaEZ98EH;>NCe9X@REXYDE z!lEp}QY_6fEX%EyTS-^uNS`BBMOWpg?{uGe=J~aa*I_-T@V@kO-H?sgn8i)kR5xc! zrp^|wgVwq&*F6d29du_NUmuQZ7u}WJ*o%GGmtS!J2XYVx^X&F8{~>xPhjBPZaui2% z3=6oAjnm^ffw!D@?OTTP;~V3XIGNvakm;uB>72otoWr@C$3Q(%ntGR}2xsL1k12=FZH*qt!ayy4)3(McF_i!%{@DLBPdy8-!kLg*y-*vTB z*xnmF?eQ}_%dg*t^Y6Ug+BB?3>TbbH#((1#{?2Q>$q1>!`rOf-U1xvl`+Vv?^q0

gk0AqtXC5K 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

IG95?l*2fJqdA7-Sn| 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

3^F7iDsQRE$#$C2amea2@preI1o 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 literal 0 HcmV?d00001 diff --git a/examples/distribute_graphsage/model.py b/examples/distribute_graphsage/model.py new file mode 100644 index 0000000..145a979 --- /dev/null +++ b/examples/distribute_graphsage/model.py @@ -0,0 +1,130 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import paddle +import paddle.fluid as fluid + + +def copy_send(src_feat, dst_feat, edge_feat): + return src_feat["h"] + + +def mean_recv(feat): + return fluid.layers.sequence_pool(feat, pool_type="average") + + +def sum_recv(feat): + return fluid.layers.sequence_pool(feat, pool_type="sum") + + +def max_recv(feat): + return fluid.layers.sequence_pool(feat, pool_type="max") + + +def lstm_recv(feat): + hidden_dim = 128 + forward, _ = fluid.layers.dynamic_lstm( + input=feat, size=hidden_dim * 4, use_peepholes=False) + output = fluid.layers.sequence_last_step(forward) + return output + + +def graphsage_mean(gw, feature, hidden_size, act, name): + msg = gw.send(copy_send, nfeat_list=[("h", feature)]) + neigh_feature = gw.recv(msg, mean_recv) + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_meanpool(gw, + feature, + hidden_size, + act, + name, + inner_hidden_size=512): + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + msg = gw.send(copy_send, nfeat_list=[("h", neigh_feature)]) + neigh_feature = gw.recv(msg, mean_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_maxpool(gw, + feature, + hidden_size, + act, + name, + inner_hidden_size=512): + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + msg = gw.send(copy_send, nfeat_list=[("h", neigh_feature)]) + neigh_feature = gw.recv(msg, max_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_lstm(gw, feature, hidden_size, act, name): + inner_hidden_size = 128 + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + + hidden_dim = 128 + forward_proj = fluid.layers.fc(input=neigh_feature, + size=hidden_dim * 4, + bias_attr=False, + name="lstm_proj") + msg = gw.send(copy_send, nfeat_list=[("h", forward_proj)]) + neigh_feature = gw.recv(msg, lstm_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output diff --git a/examples/distribute_graphsage/reader.py b/examples/distribute_graphsage/reader.py new file mode 100644 index 0000000..9c230cc --- /dev/null +++ b/examples/distribute_graphsage/reader.py @@ -0,0 +1,148 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import numpy as np +import pickle as pkl +import paddle +import paddle.fluid as fluid +import socket +import pgl +import time + +from pgl.utils import mp_reader +from pgl.utils.logger import log +from pgl import redis_graph + + +def node_batch_iter(nodes, node_label, batch_size): + """node_batch_iter + """ + perm = np.arange(len(nodes)) + np.random.shuffle(perm) + start = 0 + while start < len(nodes): + index = perm[start:start + batch_size] + start += batch_size + yield nodes[index], node_label[index] + + +def traverse(item): + """traverse + """ + if isinstance(item, list) or isinstance(item, np.ndarray): + for i in iter(item): + for j in traverse(i): + yield j + else: + yield item + + +def flat_node_and_edge(nodes, eids): + """flat_node_and_edge + """ + nodes = list(set(traverse(nodes))) + eids = list(set(traverse(eids))) + return nodes, eids + + +def worker(batch_info, graph_wrapper, samples): + """Worker + """ + + def work(): + """work + """ + redis_configs = [{ + "host": socket.gethostbyname(socket.gethostname()), + "port": 7430 + }, ] + graph = redis_graph.RedisGraph("sub_graph", redis_configs, 64) + first = True + for batch_train_samples, batch_train_labels in batch_info: + start_nodes = batch_train_samples + nodes = start_nodes + eids = [] + eid2edges = {} + for max_deg in samples: + pred, pred_eid = graph.sample_predecessor( + start_nodes, max_degree=max_deg, return_eids=True) + for _dst, _srcs, _eids in zip(start_nodes, pred, pred_eid): + for _src, _eid in zip(_srcs, _eids): + eid2edges[_eid] = (_src, _dst) + + last_nodes = nodes + nodes = [nodes, pred] + eids = [eids, pred_eid] + nodes, eids = flat_node_and_edge(nodes, eids) + # Find new nodes + start_nodes = list(set(nodes) - set(last_nodes)) + if len(start_nodes) == 0: + break + + subgraph = graph.subgraph( + nodes=nodes, eid=eids, edges=[eid2edges[e] for e in eids]) + sub_node_index = subgraph.reindex_from_parrent_nodes( + batch_train_samples) + feed_dict = graph_wrapper.to_feed(subgraph) + feed_dict["node_label"] = np.expand_dims( + np.array( + batch_train_labels, dtype="int64"), -1) + feed_dict["node_index"] = sub_node_index + yield feed_dict + + return work + + +def multiprocess_graph_reader(graph_wrapper, + samples, + node_index, + batch_size, + node_label, + num_workers=4): + """multiprocess_graph_reader + """ + + def parse_to_subgraph(rd): + """parse_to_subgraph + """ + + def work(): + """work + """ + last = time.time() + for data in rd(): + this = time.time() + feed_dict = data + now = time.time() + last = now + yield feed_dict + + return work + + def reader(): + """reader""" + batch_info = list( + node_batch_iter( + node_index, node_label, batch_size=batch_size)) + block_size = int(len(batch_info) / num_workers + 1) + reader_pool = [] + for i in range(num_workers): + reader_pool.append( + worker(batch_info[block_size * i:block_size * (i + 1)], + graph_wrapper, samples)) + multi_process_sample = mp_reader.multiprocess_reader( + reader_pool, use_pipe=True, queue_size=1000) + r = parse_to_subgraph(multi_process_sample) + return paddle.reader.buffered(r, 1000) + + return reader() diff --git a/examples/distribute_graphsage/requirements.txt b/examples/distribute_graphsage/requirements.txt new file mode 100644 index 0000000..bfc094c --- /dev/null +++ b/examples/distribute_graphsage/requirements.txt @@ -0,0 +1,3 @@ +scipy +redis==2.10.6 +redis-py-cluster==1.3.6 diff --git a/examples/distribute_graphsage/train.py b/examples/distribute_graphsage/train.py new file mode 100644 index 0000000..cb62acf --- /dev/null +++ b/examples/distribute_graphsage/train.py @@ -0,0 +1,265 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import argparse +import time + +import numpy as np +import scipy.sparse as sp +from sklearn.preprocessing import StandardScaler + +import pgl +from pgl.utils.logger import log +from pgl.utils import paddle_helper +import paddle +import paddle.fluid as fluid +import reader +from model import graphsage_mean, graphsage_meanpool,\ + graphsage_maxpool, graphsage_lstm + + +def load_data(): + """ + data from https://github.com/matenure/FastGCN/issues/8 + reddit.npz: https://drive.google.com/open?id=19SphVl_Oe8SJ1r87Hr5a6znx3nJu1F2J + reddit_index_label is preprocess from reddit.npz without feats key. + """ + data_dir = os.path.dirname(os.path.abspath(__file__)) + data = np.load(os.path.join(data_dir, "data/reddit_index_label.npz")) + + num_class = 41 + + train_label = data['y_train'] + val_label = data['y_val'] + test_label = data['y_test'] + + train_index = data['train_index'] + val_index = data['val_index'] + test_index = data['test_index'] + + return { + "train_index": train_index, + "train_label": train_label, + "val_label": val_label, + "val_index": val_index, + "test_index": test_index, + "test_label": test_label, + "num_class": 41 + } + + +def build_graph_model(graph_wrapper, num_class, k_hop, graphsage_type, + hidden_size): + node_index = fluid.layers.data( + "node_index", shape=[None], dtype="int64", append_batch_size=False) + + node_label = fluid.layers.data( + "node_label", shape=[None, 1], dtype="int64", append_batch_size=False) + + #feature = fluid.layers.gather(feature, graph_wrapper.node_feat['feats']) + feature = graph_wrapper.node_feat['feats'] + feature.stop_gradient = True + + for i in range(k_hop): + if graphsage_type == 'graphsage_mean': + feature = graphsage_mean( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_mean_%s" % i) + elif graphsage_type == 'graphsage_meanpool': + feature = graphsage_meanpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_meanpool_%s" % i) + elif graphsage_type == 'graphsage_maxpool': + feature = graphsage_maxpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s" % i) + elif graphsage_type == 'graphsage_lstm': + feature = graphsage_lstm( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s" % i) + else: + raise ValueError("graphsage type %s is not" + " implemented" % graphsage_type) + + feature = fluid.layers.gather(feature, node_index) + logits = fluid.layers.fc(feature, + num_class, + act=None, + name='classification_layer') + proba = fluid.layers.softmax(logits) + + loss = fluid.layers.softmax_with_cross_entropy( + logits=logits, label=node_label) + loss = fluid.layers.mean(loss) + acc = fluid.layers.accuracy(input=proba, label=node_label, k=1) + return loss, acc + + +def run_epoch(batch_iter, + exe, + program, + prefix, + model_loss, + model_acc, + epoch, + log_per_step=100): + batch = 0 + total_loss = 0. + total_acc = 0. + total_sample = 0 + start = time.time() + for batch_feed_dict in batch_iter(): + batch += 1 + batch_loss, batch_acc = exe.run(program, + fetch_list=[model_loss, model_acc], + feed=batch_feed_dict) + + if batch % log_per_step == 0: + log.info("Batch %s %s-Loss %s %s-Acc %s" % + (batch, prefix, batch_loss, prefix, batch_acc)) + + num_samples = len(batch_feed_dict["node_index"]) + total_loss += batch_loss * num_samples + total_acc += batch_acc * num_samples + total_sample += num_samples + end = time.time() + + log.info("%s Epoch %s Loss %.5lf Acc %.5lf Speed(per batch) %.5lf sec" % + (prefix, epoch, total_loss / total_sample, + total_acc / total_sample, (end - start) / batch)) + + +def main(args): + data = load_data() + log.info("preprocess finish") + log.info("Train Examples: %s" % len(data["train_index"])) + log.info("Val Examples: %s" % len(data["val_index"])) + log.info("Test Examples: %s" % len(data["test_index"])) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_program = fluid.Program() + startup_program = fluid.Program() + samples = [] + if args.samples_1 > 0: + samples.append(args.samples_1) + if args.samples_2 > 0: + samples.append(args.samples_2) + + with fluid.program_guard(train_program, startup_program): + graph_wrapper = pgl.graph_wrapper.GraphWrapper( + "sub_graph", + fluid.CPUPlace(), + node_feat=[('feats', [None, 602], np.dtype('float32'))]) + model_loss, model_acc = build_graph_model( + graph_wrapper, + num_class=data["num_class"], + hidden_size=args.hidden_size, + graphsage_type=args.graphsage_type, + k_hop=len(samples)) + + test_program = train_program.clone(for_test=True) + + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=args.lr) + adam.minimize(model_loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + + train_iter = reader.multiprocess_graph_reader( + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['train_index'], + node_label=data["train_label"]) + + val_iter = reader.multiprocess_graph_reader( + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['val_index'], + node_label=data["val_label"]) + + test_iter = reader.multiprocess_graph_reader( + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['test_index'], + node_label=data["test_label"]) + + for epoch in range(args.epoch): + run_epoch( + train_iter, + program=train_program, + exe=exe, + prefix="train", + model_loss=model_loss, + model_acc=model_acc, + log_per_step=1, + epoch=epoch) + + run_epoch( + val_iter, + program=test_program, + exe=exe, + prefix="val", + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + run_epoch( + test_iter, + program=test_program, + prefix="test", + exe=exe, + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='graphsage') + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument( + "--normalize", action='store_true', help="normalize features") + parser.add_argument( + "--symmetry", action='store_true', help="undirect graph") + parser.add_argument("--graphsage_type", type=str, default="graphsage_mean") + parser.add_argument("--sample_workers", type=int, default=10) + parser.add_argument("--epoch", type=int, default=10) + parser.add_argument("--hidden_size", type=int, default=128) + parser.add_argument("--batch_size", type=int, default=128) + parser.add_argument("--lr", type=float, default=0.01) + parser.add_argument("--samples_1", type=int, default=25) + parser.add_argument("--samples_2", type=int, default=10) + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/gat/README.md b/examples/gat/README.md index 6b18dcc..573316e 100644 --- a/examples/gat/README.md +++ b/examples/gat/README.md @@ -26,24 +26,25 @@ def gat_layer(graph_wrapper, node_feature, hidden_size): return output ``` + ### Datasets The datasets contain three citation networks: CORA, PUBMED, CITESEER. The details for these three datasets can be found in the [paper](https://arxiv.org/abs/1609.02907). ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| -| --- | --- | --- |---| -| Cora | ~83% | 0.0188s | 0.0175s | -| Pubmed | ~78% | 0.0449s | 0.0295s | -| Citeseer | ~70% | 0.0275 | 0.0253s | +| Dataset | Accuracy | +| --- | --- | +| Cora | ~83% | +| Pubmed | ~78% | +| Citeseer | ~70% | ### How to run diff --git a/examples/gat/train.py b/examples/gat/train.py index 0446f02..3449488 100644 --- a/examples/gat/train.py +++ b/examples/gat/train.py @@ -68,7 +68,7 @@ def main(args): node_index = fluid.layers.data( "node_index", shape=[None, 1], - dtype="int32", + dtype="int64", append_batch_size=False) node_label = fluid.layers.data( "node_label", @@ -111,7 +111,7 @@ def main(args): for epoch in range(200): if epoch >= 3: t0 = time.time() - feed_dict["node_index"] = np.array(train_index, dtype="int32") + feed_dict["node_index"] = np.array(train_index, dtype="int64") feed_dict["node_label"] = np.array(train_label, dtype="int64") train_loss, train_acc = exe.run(train_program, feed=feed_dict, @@ -121,7 +121,7 @@ def main(args): time_per_epoch = 1.0 * (time.time() - t0) dur.append(time_per_epoch) - feed_dict["node_index"] = np.array(val_index, dtype="int32") + feed_dict["node_index"] = np.array(val_index, dtype="int64") feed_dict["node_label"] = np.array(val_label, dtype="int64") val_loss, val_acc = exe.run(test_program, feed=feed_dict, @@ -132,7 +132,7 @@ def main(args): "Train Loss: %f " % train_loss + "Train Acc: %f " % train_acc + "Val Loss: %f " % val_loss + "Val Acc: %f " % val_acc) - feed_dict["node_index"] = np.array(test_index, dtype="int32") + feed_dict["node_index"] = np.array(test_index, dtype="int64") feed_dict["node_label"] = np.array(test_label, dtype="int64") test_loss, test_acc = exe.run(test_program, feed=feed_dict, diff --git a/examples/gcn/README.md b/examples/gcn/README.md index c56c604..1a1cf4f 100644 --- a/examples/gcn/README.md +++ b/examples/gcn/README.md @@ -26,18 +26,18 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| -| --- | --- | --- |---| -| Cora | ~81% | 0.0106s | 0.0104s | -| Pubmed | ~79% | 0.0210s | 0.0154s | -| Citeseer | ~71% | 0.0175s | 0.0177s | +| Dataset | Accuracy | +| --- | --- | +| Cora | ~81% | +| Pubmed | ~79% | +| Citeseer | ~71% | ### How to run diff --git a/examples/gcn/train.py b/examples/gcn/train.py index 6dfef67..7a1aaf3 100644 --- a/examples/gcn/train.py +++ b/examples/gcn/train.py @@ -70,7 +70,7 @@ def main(args): node_index = fluid.layers.data( "node_index", shape=[None, 1], - dtype="int32", + dtype="int64", append_batch_size=False) node_label = fluid.layers.data( "node_label", @@ -113,7 +113,7 @@ def main(args): for epoch in range(200): if epoch >= 3: t0 = time.time() - feed_dict["node_index"] = np.array(train_index, dtype="int32") + feed_dict["node_index"] = np.array(train_index, dtype="int64") feed_dict["node_label"] = np.array(train_label, dtype="int64") train_loss, train_acc = exe.run(train_program, feed=feed_dict, @@ -123,7 +123,7 @@ def main(args): if epoch >= 3: time_per_epoch = 1.0 * (time.time() - t0) dur.append(time_per_epoch) - feed_dict["node_index"] = np.array(val_index, dtype="int32") + feed_dict["node_index"] = np.array(val_index, dtype="int64") feed_dict["node_label"] = np.array(val_label, dtype="int64") val_loss, val_acc = exe.run(test_program, feed=feed_dict, @@ -134,7 +134,7 @@ def main(args): "Train Loss: %f " % train_loss + "Train Acc: %f " % train_acc + "Val Loss: %f " % val_loss + "Val Acc: %f " % val_acc) - feed_dict["node_index"] = np.array(test_index, dtype="int32") + feed_dict["node_index"] = np.array(test_index, dtype="int64") feed_dict["node_label"] = np.array(test_label, dtype="int64") test_loss, test_acc = exe.run(test_program, feed=feed_dict, diff --git a/examples/ges/README.md b/examples/ges/README.md new file mode 100644 index 0000000..5636cb1 --- /dev/null +++ b/examples/ges/README.md @@ -0,0 +1,22 @@ +# PGL Examples for GES +[Graph Embedding with Side Information](https://arxiv.org/pdf/1803.02349.pdf) is an algorithmic framework for representational learning on graphs. Given any graph, it can learn continuous feature representations for the nodes, which can then be used for various downstream machine learning tasks. Based on PGL, we reproduce ges algorithms. +## Datasets +The datasets contain two networks: [BlogCatalog](http://socialcomputing.asu.edu/datasets/BlogCatalog3). +## Dependencies +- paddlepaddle>=1.6 +- pgl>=1.0.0 + +## How to run + +For examples, train ges on cora dataset. +```sh +# train deepwalk in distributed mode. +sh gpu_run.sh +``` + +## Hyperparameters +- dataset: The citation dataset "BlogCatalog". +- hidden_size: Hidden size of the embedding. +- lr: Learning rate. +- neg_num: Number of negative samples. +- epoch: Number of training epoch. diff --git a/examples/ges/gpu_run.sh b/examples/ges/gpu_run.sh new file mode 100755 index 0000000..2eca3a6 --- /dev/null +++ b/examples/ges/gpu_run.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +export FLAGS_sync_nccl_allreduce=1 +export FLAGS_eager_delete_tensor_gb=0 +export FLAGS_fraction_of_gpu_memory_to_use=1 +export NCCL_DEBUG=INFO +export NCCL_IB_GID_INDEX=3 +export GLOG_v=1 +export GLOG_logtostderr=1 + +num_nodes=10312 +num_embedding=10351 +num_sample_workers=20 + +# build train_data +rm -rf train_data && mkdir -p train_data +cd train_data +seq 0 $((num_nodes-1)) | shuf | split -l $((num_nodes/num_sample_workers+1)) +cd - + +python3 gpu_train.py --output_path ./output --epoch 100 --walk_len 40 --win_size 5 --neg_num 5 --batch_size 128 --hidden_size 128 \ + --num_nodes $num_nodes --num_embedding $num_embedding --num_sample_workers $num_sample_workers --steps_per_save 2000 --dataset "BlogCatalog" diff --git a/examples/ges/gpu_train.py b/examples/ges/gpu_train.py new file mode 100644 index 0000000..62fcf35 --- /dev/null +++ b/examples/ges/gpu_train.py @@ -0,0 +1,314 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" gpu_train +""" +import argparse +import time +import os +import glob + +import numpy as np +import paddle.fluid as F +import paddle.fluid.layers as L +from pgl.utils.logger import log +from pgl.graph import Graph +from pgl.sample import graph_alias_sample_table +from pgl import data_loader + +import mp_reader +from reader import GESReader +from model import GESModel + + +def get_file_list(path): + """get_file_list + """ + filelist = [] + if os.path.isfile(path): + filelist = [path] + elif os.path.isdir(path): + filelist = [ + os.path.join(dp, f) + for dp, dn, filenames in os.walk(path) for f in filenames + ] + else: + raise ValueError(path + " not supported") + return filelist + + +def build_graph(num_nodes, edge_path, output_path, undigraph=True): + """ build_graph + """ + edge_file = os.path.join(output_path, "edge.npy") + edge_weight_file = os.path.join(output_path, "edge_weight.npy") + alias_file = os.path.join(output_path, "alias.npy") + events_file = os.path.join(output_path, "events.npy") + if os.path.isfile(edge_file): + edges = np.load(edge_file) + edge_feat = dict() + if os.path.isfile(edge_weight_file): + log.info("Loading weight from cache") + edge_feat["weight"] = np.load(edge_weight_file, allow_pickle=True) + node_feat = dict() + if os.path.isfile(alias_file): + log.info("Loading alias from cache") + node_feat["alias"] = np.load(alias_file, allow_pickle=True) + if os.path.isfile(events_file): + log.info("Loading events from cache") + node_feat["events"] = np.load(events_file, allow_pickle=True) + else: + filelist = get_file_list(edge_path) + edges, edge_weight = [], [] + log.info("Reading edge files") + for name in filelist: + with open(name) as inf: + for line in inf: + slots = line.strip("\n").split() + edges.append([slots[0], slots[1]]) + if len(slots) > 2: + edge_weight.append(slots[2]) + edges = np.array(edges, dtype="int64") + assert num_nodes > edges.max( + ), "Node id in any edges should be smaller then num_nodes!" + + log.info("Read edge files done.") + edge_feat = dict() + node_feat = dict() + if len(edge_weight) == len(edges): + edge_feat["weight"] = np.array(edge_weight, dtype="float32") + + if undigraph is True: + edges = np.concatenate([edges, edges[:, [1, 0]]], 0) + if "weight" in edge_feat: + edge_feat["weight"] = np.concatenate( + [edge_feat["weight"], edge_feat["weight"]], + 0).astype("float64") + + graph = Graph(num_nodes, edges, node_feat, edge_feat=edge_feat) + log.info("Build graph done") + graph.outdegree() + log.info("Build graph index done") + if "weight" in graph.edge_feat and "alias" not in graph.node_feat and "events" not in graph.node_feat: + graph.node_feat["alias"], graph.node_feat[ + "events"] = graph_alias_sample_table(graph, "weight") + log.info( + "Build graph alias sample table done, and saving alias & evnets cache" + ) + np.save(alias_file, graph.node_feat["alias"]) + np.save(events_file, graph.node_feat["events"]) + return graph + + +def optimization(base_lr, loss, train_steps, optimizer='adam'): + """ optimization + """ + decayed_lr = L.polynomial_decay(base_lr, train_steps, 0.0001) + + if optimizer == 'sgd': + optimizer = F.optimizer.SGD( + decayed_lr, + regularization=F.regularizer.L2DecayRegularizer( + regularization_coeff=0.0025)) + elif optimizer == 'adam': + # dont use gpu's lazy mode + optimizer = F.optimizer.Adam(decayed_lr) + else: + raise ValueError + + log.info('learning rate:%f' % (base_lr)) + optimizer.minimize(loss) + + +def build_gen_func(args, graph, node_feat): + """ build_gen_func + """ + num_sample_workers = args.num_sample_workers + + if args.walkpath_files is None: + walkpath_files = [None for _ in range(num_sample_workers)] + else: + files = get_file_list(args.walkpath_files) + walkpath_files = [[] for i in range(num_sample_workers)] + for idx, f in enumerate(files): + walkpath_files[idx % num_sample_workers].append(f) + + if args.train_files is None: + train_files = [None for _ in range(num_sample_workers)] + else: + files = get_file_list(args.train_files) + train_files = [[] for i in range(num_sample_workers)] + for idx, f in enumerate(files): + train_files[idx % num_sample_workers].append(f) + + gen_func_pool = [ + GESReader( + graph, + node_feat, + batch_size=args.batch_size, + walk_len=args.walk_len, + win_size=args.win_size, + neg_num=args.neg_num, + neg_sample_type=args.neg_sample_type, + walkpath_files=walkpath_files[i], + train_files=train_files[i]) for i in range(num_sample_workers) + ] + if num_sample_workers == 1: + gen_func = gen_func_pool[0] + else: + gen_func = mp_reader.multiprocess_reader( + gen_func_pool, use_pipe=True, queue_size=100) + return gen_func + + +def get_parallel_exe(program, loss): + """ get_parallel_exe + """ + exec_strategy = F.ExecutionStrategy() + exec_strategy.num_threads = 1 #2 for fp32 4 for fp16 + exec_strategy.use_experimental_executor = True + exec_strategy.num_iteration_per_drop_scope = 10 #important shit + + build_strategy = F.BuildStrategy() + build_strategy.enable_inplace = True + build_strategy.memory_optimize = True + build_strategy.remove_unnecessary_lock = True + + #return compiled_prog + train_exe = F.ParallelExecutor( + use_cuda=True, + loss_name=loss.name, + build_strategy=build_strategy, + exec_strategy=exec_strategy, + main_program=program) + return train_exe + + +def train(train_exe, exe, program, loss, node2vec_pyreader, args, train_steps): + """ train + """ + trainer_id = int(os.getenv("PADDLE_TRAINER_ID", "0")) + step = 0 + while True: + try: + begin_time = time.time() + loss_val, = train_exe.run(fetch_list=[loss]) + log.info("step %s: loss %.5f speed: %.5f s/step" % + (step, np.mean(loss_val), time.time() - begin_time)) + step += 1 + except F.core.EOFException: + node2vec_pyreader.reset() + + if (step % args.steps_per_save == 0 or + step == train_steps) and trainer_id == 0: + + model_save_dir = args.output_path + model_path = os.path.join(model_save_dir, str(step)) + if not os.path.exists(model_save_dir): + os.makedirs(model_save_dir) + F.io.save_params(exe, model_path, program) + + if step == train_steps: + break + + +def test_gen_speed(gen_func): + """ test_gen_speed + """ + cur_time = time.time() + for idx, _ in enumerate(gen_func()): + log.info("iter %s: %s s" % (idx, time.time() - cur_time)) + cur_time = time.time() + if idx == 100: + break + + +def main(args): + """ main + """ + import logging + log.setLevel(logging.DEBUG) + log.info("start") + + if args.dataset is not None: + if args.dataset == "BlogCatalog": + graph = data_loader.BlogCatalogDataset().graph + else: + raise ValueError(args.dataset + " dataset doesn't exists") + log.info("Load buildin BlogCatalog dataset done.") + node_feat = np.expand_dims(graph.node_feat["group_id"].argmax(-1), + -1) + graph.num_nodes + args.num_nodes = graph.num_nodes + args.num_embedding = graph.num_nodes + graph.node_feat[ + "group_id"].shape[-1] + else: + graph = build_graph(args.num_nodes, args.edge_path, args.output_path) + node_feat = np.load(args.node_feat_npy) + + model = GESModel(args.num_embedding, node_feat.shape[1] + 1, + args.hidden_size, args.neg_num, False, 2) + pyreader = model.pyreader + loss = model.forward() + num_devices = len(F.cuda_places()) + + train_steps = int(args.num_nodes * args.epoch / args.batch_size / + num_devices) + log.info("Train steps: %s" % train_steps) + optimization(args.lr * num_devices, loss, train_steps, args.optimizer) + + place = F.CUDAPlace(0) + exe = F.Executor(place) + exe.run(F.default_startup_program()) + + gen_func = build_gen_func(args, graph, node_feat) + + pyreader.decorate_tensor_provider(gen_func) + pyreader.start() + train_prog = F.default_main_program() + train_exe = get_parallel_exe(train_prog, loss) + train(train_exe, exe, train_prog, loss, pyreader, args, train_steps) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Deepwalk') + parser.add_argument("--hidden_size", type=int, default=64) + parser.add_argument("--lr", type=float, default=0.025) + parser.add_argument("--neg_num", type=int, default=5) + parser.add_argument("--epoch", type=int, default=100) + parser.add_argument("--batch_size", type=int, default=128) + parser.add_argument("--walk_len", type=int, default=40) + parser.add_argument("--win_size", type=int, default=5) + parser.add_argument("--output_path", type=str, default="output") + parser.add_argument("--num_sample_workers", type=int, default=1) + parser.add_argument("--steps_per_save", type=int, default=3000) + parser.add_argument("--num_nodes", type=int, default=10000) + parser.add_argument("--num_embedding", type=int, default=10000) + parser.add_argument("--edge_path", type=str, default="./graph_data") + parser.add_argument("--walkpath_files", type=str, default=None) + parser.add_argument("--train_files", type=str, default="./train_data") + parser.add_argument("--node_feat_npy", type=str, default="./feat.npy") + parser.add_argument("--dataset", type=str, default=None) + parser.add_argument( + "--neg_sample_type", + type=str, + default="average", + choices=["average", "outdegree"]) + parser.add_argument( + "--optimizer", + type=str, + required=False, + choices=['adam', 'sgd'], + default="adam") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/ges/model.py b/examples/ges/model.py new file mode 100644 index 0000000..1fce05e --- /dev/null +++ b/examples/ges/model.py @@ -0,0 +1,222 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + GES model file. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals +import math + +import paddle.fluid.layers as L +import paddle.fluid as F + + +def split_embedding(input, + dict_size, + hidden_size, + initializer, + name, + num_part=16, + is_sparse=False, + learning_rate=1.0): + """ split_embedding + """ + _part_size = hidden_size // num_part + if hidden_size % num_part != 0: + _part_size += 1 + output_embedding = [] + p_num = 0 + while hidden_size > 0: + _part_size = min(_part_size, hidden_size) + hidden_size -= _part_size + print("part", p_num, "size=", (dict_size, _part_size)) + part_embedding = L.embedding( + input=input, + size=(dict_size, _part_size), + is_sparse=is_sparse, + is_distributed=False, + param_attr=F.ParamAttr( + name=name + '_part%s' % p_num, + initializer=initializer, + learning_rate=learning_rate)) + p_num += 1 + output_embedding.append(part_embedding) + return L.concat(output_embedding, -1) + + +class GESModel(object): + """ GESModel + """ + + def __init__(self, + num_nodes, + num_featuers, + hidden_size=16, + neg_num=5, + is_sparse=False, + num_part=1): + self.pyreader = L.py_reader( + capacity=70, + shapes=[[-1, 1, num_featuers, 1], + [-1, neg_num + 1, num_featuers, 1]], + dtypes=['int64', 'int64'], + lod_levels=[0, 0], + name='train', + use_double_buffer=True) + + self.num_nodes = num_nodes + self.num_featuers = num_featuers + self.neg_num = neg_num + self.embed_init = F.initializer.TruncatedNormal(scale=1.0 / + math.sqrt(hidden_size)) + self.is_sparse = is_sparse + self.num_part = num_part + self.hidden_size = hidden_size + self.loss = None + + def forward(self): + """ forward + """ + src, dst = L.read_file(self.pyreader) + + if self.is_sparse: + # sparse mode use 2 dims input. + src = L.reshape(src, [-1, 1]) + dst = L.reshape(dst, [-1, 1]) + + src_embed = split_embedding(src, self.num_nodes, self.hidden_size, + self.embed_init, "weight", self.num_part, + self.is_sparse) + + dst_embed = split_embedding(dst, self.num_nodes, self.hidden_size, + self.embed_init, "weight", self.num_part, + self.is_sparse) + + if self.is_sparse: + src_embed = L.reshape( + src_embed, [-1, 1, self.num_featuers, self.hidden_size]) + dst_embed = L.reshape( + dst_embed, + [-1, self.neg_num + 1, self.num_featuers, self.hidden_size]) + + src_embed = L.reduce_mean(src_embed, 2) + dst_embed = L.reduce_mean(dst_embed, 2) + + logits = L.matmul( + src_embed, dst_embed, + transpose_y=True) # [batch_size, 1, neg_num+1] + + pos_label = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", 1) + neg_label = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 0) + label = L.concat([pos_label, neg_label], -1) + + pos_weight = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", self.neg_num) + neg_weight = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 1) + weight = L.concat([pos_weight, neg_weight], -1) + + weight.stop_gradient = True + label.stop_gradient = True + + loss = L.sigmoid_cross_entropy_with_logits(logits, label) + loss = loss * weight + loss = L.reduce_mean(loss) + loss = loss * ((self.neg_num + 1) / 2 / self.neg_num) + loss.persistable = True + self.loss = loss + return loss + + +class EGESModel(GESModel): + """ EGESModel + """ + + def forward(self): + """ forward + """ + src, dst = L.read_file(self.pyreader) + + src_id = L.slice(src, [0, 1, 2, 3], [0, 0, 0, 0], + [int(math.pow(2, 30)) - 1, 1, 1, 1]) + dst_id = L.slice(dst, [0, 1, 2, 3], [0, 0, 0, 0], + [int(math.pow(2, 30)) - 1, self.neg_num + 1, 1, 1]) + + if self.is_sparse: + # sparse mode use 2 dims input. + src = L.reshape(src, [-1, 1]) + dst = L.reshape(dst, [-1, 1]) + + # [b, 1, f, h] + src_embed = split_embedding(src, self.num_nodes, self.hidden_size, + self.embed_init, "weight", self.num_part, + self.is_sparse) + + # [b, n+1, f, h] + dst_embed = split_embedding(dst, self.num_nodes, self.hidden_size, + self.embed_init, "weight", self.num_part, + self.is_sparse) + + if self.is_sparse: + src_embed = L.reshape( + src_embed, [-1, 1, self.num_featuers, self.hidden_size]) + dst_embed = L.reshape( + dst_embed, + [-1, self.neg_num + 1, self.num_featuers, self.hidden_size]) + + # [b, 1, 1, f] + src_weight = L.softmax( + L.embedding( + src_id, [self.num_nodes, self.num_featuers], + param_attr=F.ParamAttr(name="alpha"))) + # [b, n+1, 1, f] + dst_weight = L.softmax( + L.embedding( + dst_id, [self.num_nodes, self.num_featuers], + param_attr=F.ParamAttr(name="alpha"))) + + # [b, 1, h] + src_sum = L.squeeze(L.matmul(src_weight, src_embed), axes=[2]) + # [b, n+1, h] + dst_sum = L.squeeze(L.matmul(dst_weight, dst_embed), axes=[2]) + + logits = L.matmul( + src_sum, dst_sum, transpose_y=True) # [batch_size, 1, neg_num+1] + + pos_label = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", 1) + neg_label = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 0) + label = L.concat([pos_label, neg_label], -1) + + pos_weight = L.fill_constant_batch_size_like(logits, [-1, 1, 1], + "float32", self.neg_num) + neg_weight = L.fill_constant_batch_size_like( + logits, [-1, 1, self.neg_num], "float32", 1) + weight = L.concat([pos_weight, neg_weight], -1) + + weight.stop_gradient = True + label.stop_gradient = True + + loss = L.sigmoid_cross_entropy_with_logits(logits, label) + loss = loss * weight + loss = L.reduce_mean(loss) + loss = loss * ((self.neg_num + 1) / 2 / self.neg_num) + loss.persistable = True + self.loss = loss + return loss diff --git a/examples/ges/mp_reader.py b/examples/ges/mp_reader.py new file mode 100644 index 0000000..d4df899 --- /dev/null +++ b/examples/ges/mp_reader.py @@ -0,0 +1,145 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Optimized Multiprocessing Reader for PaddlePaddle +""" +import multiprocessing +import numpy as np +import time + +import paddle.fluid as fluid +import pyarrow + + +def _serialize_serializable(obj): + """Serialize Feed Dict + """ + return {"type": type(obj), "data": obj.__dict__} + + +def _deserialize_serializable(obj): + """Deserialize Feed Dict + """ + + val = obj["type"].__new__(obj["type"]) + val.__dict__.update(obj["data"]) + return val + + +context = pyarrow.default_serialization_context() + +context.register_type( + object, + "object", + custom_serializer=_serialize_serializable, + custom_deserializer=_deserialize_serializable) + + +def serialize_data(data): + """serialize_data""" + return pyarrow.serialize(data, context=context).to_buffer().to_pybytes() + + +def deserialize_data(data): + """deserialize_data""" + return pyarrow.deserialize(data, context=context) + + +def multiprocess_reader(readers, use_pipe=True, queue_size=1000): + """ + multiprocess_reader use python multi process to read data from readers + and then use multiprocess.Queue or multiprocess.Pipe to merge all + data. The process number is equal to the number of input readers, each + process call one reader. + Multiprocess.Queue require the rw access right to /dev/shm, some + platform does not support. + you need to create multiple readers first, these readers should be independent + to each other so that each process can work independently. + An example: + .. code-block:: python + reader0 = reader(["file01", "file02"]) + reader1 = reader(["file11", "file12"]) + reader1 = reader(["file21", "file22"]) + reader = multiprocess_reader([reader0, reader1, reader2], + queue_size=100, use_pipe=False) + """ + + assert type(readers) is list and len(readers) > 0 + + def _read_into_queue(reader, queue): + """read_into_queue""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None") + queue.put(serialize_data(sample)) + queue.put(serialize_data(None)) + + def queue_reader(): + """queue_reader""" + queue = multiprocessing.Queue(queue_size) + for reader in readers: + p = multiprocessing.Process( + target=_read_into_queue, args=(reader, queue)) + p.start() + + reader_num = len(readers) + finish_num = 0 + while finish_num < reader_num: + sample = deserialize_data(queue.get()) + if sample is None: + finish_num += 1 + else: + yield sample + + def _read_into_pipe(reader, conn): + """read_into_pipe""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None!") + conn.send(serialize_data(sample)) + conn.send(serialize_data(None)) + conn.close() + + def pipe_reader(): + """pipe_reader""" + conns = [] + for reader in readers: + parent_conn, child_conn = multiprocessing.Pipe() + conns.append(parent_conn) + p = multiprocessing.Process( + target=_read_into_pipe, args=(reader, child_conn)) + p.start() + + reader_num = len(readers) + finish_num = 0 + conn_to_remove = [] + finish_flag = np.zeros(len(conns), dtype="int32") + while finish_num < reader_num: + for conn_id, conn in enumerate(conns): + if finish_flag[conn_id] > 0: + continue + buff = conn.recv() + now = time.time() + sample = deserialize_data(buff) + out = time.time() - now + if sample is None: + finish_num += 1 + conn.close() + finish_flag[conn_id] = 1 + else: + yield sample + + if use_pipe: + return pipe_reader + else: + return queue_reader diff --git a/examples/ges/reader.py b/examples/ges/reader.py new file mode 100644 index 0000000..cd2d9d2 --- /dev/null +++ b/examples/ges/reader.py @@ -0,0 +1,153 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Reader file. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +import time +import io +import os + +import numpy as np +import paddle +from pgl.utils.logger import log +from pgl.sample import node2vec_sample +from pgl.sample import deepwalk_sample +from pgl.sample import alias_sample +from pgl.graph_kernel import skip_gram_gen_pair +from pgl.graph_kernel import alias_sample_build_table + + +class GESReader(object): + """ GESReader + """ + + def __init__(self, + graph, + node_feat, + batch_size=512, + walk_len=40, + win_size=5, + neg_num=5, + train_files=None, + walkpath_files=None, + neg_sample_type="average"): + """ + Args: + walkpath_files: if is not None, read walk path from walkpath_files + """ + self.graph = graph + self.node_feat = node_feat + self.batch_size = batch_size + self.walk_len = walk_len + self.win_size = win_size + self.neg_num = neg_num + self.train_files = train_files + self.walkpath_files = walkpath_files + self.neg_sample_type = neg_sample_type + + def walk_from_files(self): + """ walk_from_files + """ + bucket = [] + while True: + for filename in self.walkpath_files: + with io.open(filename) as inf: + for line in inf: + walk = [int(x) for x in line.strip('\n\t').split('\t')] + bucket.append(walk) + if len(bucket) == self.batch_size: + yield bucket + bucket = [] + if len(bucket): + yield bucket + + def walk_from_graph(self): + """ walk_from_graph + """ + + def node_generator(): + """ node_generator + """ + if self.train_files is None: + while True: + for nodes in self.graph.node_batch_iter(self.batch_size): + yield nodes + else: + nodes = [] + while True: + for filename in self.train_files: + with io.open(filename) as inf: + for line in inf: + node = int(line.strip('\n\t')) + nodes.append(node) + if len(nodes) == self.batch_size: + yield nodes + nodes = [] + if len(nodes): + yield nodes + + if "alias" in self.graph.node_feat and "events" in self.graph.node_feat: + log.info("Deepwalk using alias sample") + for nodes in node_generator(): + if "alias" in self.graph.node_feat and "events" in self.graph.node_feat: + walks = deepwalk_sample(self.graph, nodes, self.walk_len, + "alias", "events") + else: + walks = deepwalk_sample(self.graph, nodes, self.walk_len) + yield walks + + def walk_generator(self): + """ walk_generator + """ + if self.walkpath_files is not None: + for i in self.walk_from_files(): + yield i + else: + for i in self.walk_from_graph(): + yield i + + def __call__(self): + np.random.seed(os.getpid()) + if self.neg_sample_type == "outdegree": + outdegree = self.graph.outdegree() + distribution = 1. * outdegree / outdegree.sum() + alias, events = alias_sample_build_table(distribution) + max_len = int(self.batch_size * self.walk_len * ( + (1 + self.win_size) - 0.3)) + for walks in self.walk_generator(): + src, pos = [], [] + for walk in walks: + s, p = skip_gram_gen_pair(walk, self.win_size) + src.extend(s), pos.extend(p) + src = np.array(src, dtype=np.int64), + pos = np.array(pos, dtype=np.int64) + src, pos = np.reshape(src, [-1, 1, 1]), np.reshape(pos, [-1, 1, 1]) + + if src.shape[0] == 0: + continue + neg_sample_size = [len(pos), self.neg_num, 1] + if self.neg_sample_type == "average": + negs = self.graph.sample_nodes(neg_sample_size) + elif self.neg_sample_type == "outdegree": + negs = alias_sample(neg_sample_size, alias, events) + # [batch_size, 1, 1] [batch_size, neg_num+1, 1] + dst = np.concatenate([pos, negs], 1) + src_feat = np.concatenate([src, self.node_feat[src[:, :, 0]]], -1) + dst_feat = np.concatenate([dst, self.node_feat[dst[:, :, 0]]], -1) + src_feat, dst_feat = np.expand_dims(src_feat, -1), np.expand_dims( + dst_feat, -1) + yield src_feat[:max_len], dst_feat[:max_len] diff --git a/examples/graphsage/README.md b/examples/graphsage/README.md index 6eb17f6..449aaf8 100644 --- a/examples/graphsage/README.md +++ b/examples/graphsage/README.md @@ -12,17 +12,23 @@ The reddit dataset should be downloaded from the following links and placed in d ### Dependencies -- sklearn -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### How to run To train a GraphSAGE model on Reddit Dataset, you can just run + ``` python train.py --use_cuda --epoch 10 --graphsage_type graphsage_mean --normalize --symmetry ``` +If you want to train a GraphSAGE model with multiple GPUs, you can just run + +``` +CUDA_VISIBLE_DEVICES=0,1 python train_multi.py --use_cuda --epoch 10 --graphsage_type graphsage_mean --normalize --symmetry --num_trainer 2 +``` + #### Hyperparameters - epoch: Number of epochs default (10) diff --git a/examples/graphsage/reader.py b/examples/graphsage/reader.py index f05bfab..abc3fe8 100644 --- a/examples/graphsage/reader.py +++ b/examples/graphsage/reader.py @@ -17,12 +17,15 @@ import paddle import paddle.fluid as fluid import pgl import time +from pgl.utils import mp_reader from pgl.utils.logger import log import train import time def node_batch_iter(nodes, node_label, batch_size): + """node_batch_iter + """ perm = np.arange(len(nodes)) np.random.shuffle(perm) start = 0 @@ -33,6 +36,8 @@ def node_batch_iter(nodes, node_label, batch_size): def traverse(item): + """traverse + """ if isinstance(item, list) or isinstance(item, np.ndarray): for i in iter(item): for j in traverse(i): @@ -42,13 +47,21 @@ def traverse(item): def flat_node_and_edge(nodes, eids): + """flat_node_and_edge + """ nodes = list(set(traverse(nodes))) eids = list(set(traverse(eids))) return nodes, eids -def worker(batch_info, graph, samples): +def worker(batch_info, graph, graph_wrapper, samples): + """Worker + """ + def work(): + """work + """ + first = True for batch_train_samples, batch_train_labels in batch_info: start_nodes = batch_train_samples nodes = start_nodes @@ -65,11 +78,14 @@ def worker(batch_info, graph, samples): if len(start_nodes) == 0: break - feed_dict = {} - feed_dict["nodes"] = [int(n) for n in nodes] - feed_dict["eids"] = [int(e) for e in eids] - feed_dict["node_label"] = [int(n) for n in batch_train_labels] - feed_dict["node_index"] = [int(n) for n in batch_train_samples] + subgraph = graph.subgraph(nodes=nodes, eid=eids) + sub_node_index = subgraph.reindex_from_parrent_nodes( + batch_train_samples) + feed_dict = graph_wrapper.to_feed(subgraph) + feed_dict["node_label"] = np.expand_dims( + np.array( + batch_train_labels, dtype="int64"), -1) + feed_dict["node_index"] = sub_node_index yield feed_dict return work @@ -82,26 +98,28 @@ def multiprocess_graph_reader(graph, batch_size, node_label, num_workers=4): + """multiprocess_graph_reader + """ + def parse_to_subgraph(rd): + """parse_to_subgraph + """ + def work(): + """work + """ + last = time.time() for data in rd(): - nodes = data["nodes"] - eids = data["eids"] - batch_train_labels = data["node_label"] - batch_train_samples = data["node_index"] - subgraph = graph.subgraph(nodes=nodes, eid=eids) - sub_node_index = subgraph.reindex_from_parrent_nodes( - batch_train_samples) - feed_dict = graph_wrapper.to_feed(subgraph) - feed_dict["node_label"] = np.expand_dims( - np.array( - batch_train_labels, dtype="int64"), -1) - feed_dict["node_index"] = sub_node_index + this = time.time() + feed_dict = data + now = time.time() + last = now yield feed_dict return work def reader(): + """reader""" batch_info = list( node_batch_iter( node_index, node_label, batch_size=batch_size)) @@ -110,9 +128,9 @@ def multiprocess_graph_reader(graph, for i in range(num_workers): reader_pool.append( worker(batch_info[block_size * i:block_size * (i + 1)], graph, - samples)) - multi_process_sample = paddle.reader.multiprocess_reader( - reader_pool, use_pipe=False) + graph_wrapper, samples)) + multi_process_sample = mp_reader.multiprocess_reader( + reader_pool, use_pipe=True, queue_size=1000) r = parse_to_subgraph(multi_process_sample) return paddle.reader.buffered(r, 1000) @@ -121,7 +139,10 @@ def multiprocess_graph_reader(graph, def graph_reader(graph, graph_wrapper, samples, node_index, batch_size, node_label): + """graph_reader""" + def reader(): + """reader""" for batch_train_samples, batch_train_labels in node_batch_iter( node_index, node_label, batch_size=batch_size): start_nodes = batch_train_samples diff --git a/examples/graphsage/train.py b/examples/graphsage/train.py index 5d5bca2..fa19463 100644 --- a/examples/graphsage/train.py +++ b/examples/graphsage/train.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import os import argparse import time @@ -34,8 +35,9 @@ def load_data(normalize=True, symmetry=True): reddit_adj.npz: https://drive.google.com/open?id=174vb0Ws7Vxk_QTUtxqTgDHSQ4El4qDHt reddit.npz: https://drive.google.com/open?id=19SphVl_Oe8SJ1r87Hr5a6znx3nJu1F2J """ - data = np.load("data/reddit.npz") - adj = sp.load_npz("data/reddit_adj.npz") + data_dir = os.path.dirname(os.path.abspath(__file__)) + data = np.load(os.path.join(data_dir, "data/reddit.npz")) + adj = sp.load_npz(os.path.join(data_dir, "data/reddit_adj.npz")) if symmetry: adj = adj + adj.T adj = adj.tocoo() @@ -64,7 +66,7 @@ def load_data(normalize=True, symmetry=True): num_nodes=feature.shape[0], edges=list(zip(src, dst)), node_feat={"index": np.arange( - 0, len(feature), dtype="int32")}) + 0, len(feature), dtype="int64")}) return { "graph": graph, @@ -82,7 +84,7 @@ def load_data(normalize=True, symmetry=True): def build_graph_model(graph_wrapper, num_class, k_hop, graphsage_type, hidden_size, feature): node_index = fluid.layers.data( - "node_index", shape=[None], dtype="int32", append_batch_size=False) + "node_index", shape=[None], dtype="int64", append_batch_size=False) node_label = fluid.layers.data( "node_label", shape=[None, 1], dtype="int64", append_batch_size=False) @@ -198,7 +200,9 @@ def main(args): hide_batch_size=False) graph_wrapper = pgl.graph_wrapper.GraphWrapper( - "sub_graph", place, node_feat=data['graph'].node_feat_info()) + "sub_graph", + fluid.CPUPlace(), + node_feat=data['graph'].node_feat_info()) model_loss, model_acc = build_graph_model( graph_wrapper, num_class=data["num_class"], diff --git a/examples/graphsage/train_multi.py b/examples/graphsage/train_multi.py new file mode 100644 index 0000000..8a1e799 --- /dev/null +++ b/examples/graphsage/train_multi.py @@ -0,0 +1,369 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import argparse +import time + +import sys +import traceback +import numpy as np +import scipy.sparse as sp +from sklearn.preprocessing import StandardScaler + +import pgl +from pgl.utils.logger import log +from pgl.utils import paddle_helper +import paddle +import paddle.fluid as fluid +import reader +from model import graphsage_mean, graphsage_meanpool,\ + graphsage_maxpool, graphsage_lstm + + +def load_data(normalize=True, symmetry=True): + """ + data from https://github.com/matenure/FastGCN/issues/8 + reddit_adj.npz: https://drive.google.com/open?id=174vb0Ws7Vxk_QTUtxqTgDHSQ4El4qDHt + reddit.npz: https://drive.google.com/open?id=19SphVl_Oe8SJ1r87Hr5a6znx3nJu1F2J + """ + data_dir = os.path.dirname(os.path.abspath(__file__)) + data = np.load(os.path.join(data_dir, "data/reddit.npz")) + adj = sp.load_npz(os.path.join(data_dir, "data/reddit_adj.npz")) + if symmetry: + adj = adj + adj.T + adj = adj.tocoo() + src = adj.row + dst = adj.col + + num_class = 41 + + train_label = data['y_train'] + val_label = data['y_val'] + test_label = data['y_test'] + + train_index = data['train_index'] + val_index = data['val_index'] + test_index = data['test_index'] + + feature = data["feats"].astype("float32") + + if normalize: + scaler = StandardScaler() + scaler.fit(feature[train_index]) + feature = scaler.transform(feature) + + log.info("Feature shape %s" % (repr(feature.shape))) + graph = pgl.graph.Graph( + num_nodes=feature.shape[0], + edges=list(zip(src, dst)), + node_feat={"feat": feature.astype("float32")}) + + return { + "graph": graph, + "train_index": train_index, + "train_label": train_label, + "val_label": val_label, + "val_index": val_index, + "test_index": test_index, + "test_label": test_label, + "num_class": 41 + } + + +def build_graph_model(graph_wrapper, num_class, k_hop, graphsage_type, + hidden_size): + """build_graph_model""" + node_index = fluid.layers.data( + "node_index", shape=[None], dtype="int64", append_batch_size=False) + + node_label = fluid.layers.data( + "node_label", shape=[None, 1], dtype="int64", append_batch_size=False) + + feature = graph_wrapper.node_feat["feat"] + + for i in range(k_hop): + if graphsage_type == 'graphsage_mean': + feature = graphsage_mean( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_mean_%s" % i) + elif graphsage_type == 'graphsage_meanpool': + feature = graphsage_meanpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_meanpool_%s" % i) + elif graphsage_type == 'graphsage_maxpool': + feature = graphsage_maxpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s" % i) + elif graphsage_type == 'graphsage_lstm': + feature = graphsage_lstm( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s" % i) + else: + raise ValueError("graphsage type %s is not" + " implemented" % graphsage_type) + + feature = fluid.layers.gather(feature, node_index) + logits = fluid.layers.fc(feature, + num_class, + act=None, + name='classification_layer') + proba = fluid.layers.softmax(logits) + + loss = fluid.layers.softmax_with_cross_entropy( + logits=logits, label=node_label) + loss = fluid.layers.mean(loss) + acc = fluid.layers.accuracy(input=proba, label=node_label, k=1) + return loss, acc + + +def to_multidevice(batch_iter, num_trainer): + """to_multidevice""" + batch_dict = [] + for batch in batch_iter(): + batch_dict.append(batch) + if len(batch_dict) == num_trainer: + yield batch_dict + batch_dict = [] + + if len(batch_dict) > 0: + log.warning("The batch (%s) can't fill all device (%s)" + "which will be discarded." % + (len(batch_dict), num_trainer)) + + +def run_epoch(batch_iter, + exe, + program, + prefix, + model_loss, + model_acc, + epoch, + log_per_step=100, + num_trainer=1): + """run_epoch""" + batch = 0 + total_loss = 0. + total_acc = 0. + total_sample = 0 + start = time.time() + if num_trainer > 1: + batch_iter = to_multidevice(batch_iter, num_trainer) + else: + batch_iter = batch_iter() + + for batch_feed_dict in batch_iter: + batch += 1 + if num_trainer > 1: + batch_loss, batch_acc = exe.run( + fetch_list=[model_loss.name, model_acc.name], + feed=batch_feed_dict) + + batch_loss = np.mean(batch_loss) + batch_acc = np.mean(batch_acc) + else: + batch_loss, batch_acc = exe.run( + program, + fetch_list=[model_loss.name, model_acc.name], + feed=batch_feed_dict) + + if batch % log_per_step == 0: + log.info("Batch %s %s-Loss %s %s-Acc %s" % + (batch, prefix, batch_loss, prefix, batch_acc)) + + if num_trainer > 1: + num_samples = sum( + [len(batch["node_index"]) for batch in batch_feed_dict]) + else: + num_samples = len(batch_feed_dict["node_index"]) + total_loss += batch_loss * num_samples + total_acc += batch_acc * num_samples + total_sample += num_samples + end = time.time() + + log.info("%s Epoch %s Loss %.5lf Acc %.5lf Speed(per batch) %.5lf sec" % + (prefix, epoch, total_loss / total_sample, + total_acc / total_sample, (end - start) / batch)) + + +def main(args): + """main""" + data = load_data(args.normalize, args.symmetry) + log.info("preprocess finish") + log.info("Train Examples: %s" % len(data["train_index"])) + log.info("Val Examples: %s" % len(data["val_index"])) + log.info("Test Examples: %s" % len(data["test_index"])) + log.info("Num nodes %s" % data["graph"].num_nodes) + log.info("Num edges %s" % data["graph"].num_edges) + log.info("Average Degree %s" % np.mean(data["graph"].indegree())) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_program = fluid.Program() + startup_program = fluid.Program() + samples = [] + if args.samples_1 > 0: + samples.append(args.samples_1) + if args.samples_2 > 0: + samples.append(args.samples_2) + + with fluid.program_guard(train_program, startup_program): + graph_wrapper = pgl.graph_wrapper.GraphWrapper( + "sub_graph", + fluid.CPUPlace(), + node_feat=data['graph'].node_feat_info()) + + model_loss, model_acc = build_graph_model( + graph_wrapper, + num_class=data["num_class"], + hidden_size=args.hidden_size, + graphsage_type=args.graphsage_type, + k_hop=len(samples)) + + test_program = train_program.clone(for_test=True) + + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=args.lr) + adam.minimize(model_loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + if args.num_trainer > 1: + build_strategy = fluid.BuildStrategy() + build_strategy.remove_unnecessary_lock = False + build_strategy.enable_sequential_execution = True + + train_exe = fluid.ParallelExecutor( + use_cuda=args.use_cuda, + main_program=train_program, + build_strategy=build_strategy, + loss_name=model_loss.name) + else: + train_exe = exe + + if args.sample_workers > 1: + train_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['train_index'], + node_label=data["train_label"]) + else: + train_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['train_index'], + node_label=data["train_label"]) + + if args.sample_workers > 1: + val_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['val_index'], + node_label=data["val_label"]) + else: + val_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['val_index'], + node_label=data["val_label"]) + + if args.sample_workers > 1: + test_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['test_index'], + node_label=data["test_label"]) + else: + test_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['test_index'], + node_label=data["test_label"]) + + for epoch in range(args.epoch): + run_epoch( + train_iter, + program=train_program, + exe=train_exe, + prefix="train", + model_loss=model_loss, + model_acc=model_acc, + num_trainer=args.num_trainer, + epoch=epoch) + + run_epoch( + val_iter, + program=test_program, + exe=exe, + prefix="val", + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + run_epoch( + test_iter, + program=test_program, + prefix="test", + exe=exe, + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='graphsage') + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument( + "--normalize", action='store_true', help="normalize features") + parser.add_argument( + "--symmetry", action='store_true', help="undirect graph") + parser.add_argument("--graphsage_type", type=str, default="graphsage_mean") + parser.add_argument("--sample_workers", type=int, default=5) + parser.add_argument("--epoch", type=int, default=10) + parser.add_argument("--hidden_size", type=int, default=128) + parser.add_argument("--batch_size", type=int, default=128) + parser.add_argument("--num_trainer", type=int, default=1) + parser.add_argument("--lr", type=float, default=0.01) + parser.add_argument("--samples_1", type=int, default=25) + parser.add_argument("--samples_2", type=int, default=10) + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/graphsage/train_scale.py b/examples/graphsage/train_scale.py new file mode 100644 index 0000000..31a615f --- /dev/null +++ b/examples/graphsage/train_scale.py @@ -0,0 +1,357 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Multi-GPU settings +""" +import argparse +import time + +import numpy as np +import scipy.sparse as sp +from sklearn.preprocessing import StandardScaler + +import pgl +from pgl.utils.logger import log +from pgl.utils import paddle_helper +import paddle +import paddle.fluid as fluid +import reader +from model import graphsage_mean, graphsage_meanpool,\ + graphsage_maxpool, graphsage_lstm + + +def fixed_offset(data, num_nodes, scale): + """Test + """ + len_data = len(data) + len_per_part = int(len_data / scale) + offset = np.arange(0, scale, dtype="int64") + offset = offset * num_nodes + offset = np.repeat(offset, len_per_part) + if len(data.shape) > 1: + data += offset.reshape([-1, 1]) + else: + data += offset + + +def load_data(normalize=True, symmetry=True, scale=1): + """ + data from https://github.com/matenure/FastGCN/issues/8 + reddit_adj.npz: https://drive.google.com/open?id=174vb0Ws7Vxk_QTUtxqTgDHSQ4El4qDHt + reddit.npz: https://drive.google.com/open?id=19SphVl_Oe8SJ1r87Hr5a6znx3nJu1F2J + """ + data = np.load("data/reddit.npz") + adj = sp.load_npz("data/reddit_adj.npz") + if symmetry: + adj = adj + adj.T + adj = adj.tocoo() + src = adj.row.reshape([-1, 1]) + dst = adj.col.reshape([-1, 1]) + edges = np.hstack([src, dst]) + + num_class = 41 + + train_label = data['y_train'] + val_label = data['y_val'] + test_label = data['y_test'] + + train_index = data['train_index'] + val_index = data['val_index'] + test_index = data['test_index'] + + feature = data["feats"].astype("float32") + + if normalize: + scaler = StandardScaler() + scaler.fit(feature[train_index]) + feature = scaler.transform(feature) + + if scale > 1: + num_nodes = feature.shape[0] + feature = np.tile(feature, [scale, 1]) + train_label = np.tile(train_label, [scale]) + val_label = np.tile(val_label, [scale]) + test_label = np.tile(test_label, [scale]) + edges = np.tile(edges, [scale, 1]) + fixed_offset(edges, num_nodes, scale) + train_index = np.tile(train_index, [scale]) + fixed_offset(train_index, num_nodes, scale) + val_index = np.tile(val_index, [scale]) + fixed_offset(val_index, num_nodes, scale) + test_index = np.tile(test_index, [scale]) + fixed_offset(test_index, num_nodes, scale) + + log.info("Feature shape %s" % (repr(feature.shape))) + + graph = pgl.graph.Graph( + num_nodes=feature.shape[0], + edges=edges, + node_feat={ + "index": np.arange( + 0, len(feature), dtype="int64"), + "feature": feature + }) + + return { + "graph": graph, + "train_index": train_index, + "train_label": train_label, + "val_label": val_label, + "val_index": val_index, + "test_index": test_index, + "test_label": test_label, + "feature": feature, + "num_class": 41 + } + + +def build_graph_model(graph_wrapper, num_class, k_hop, graphsage_type, + hidden_size, feature): + """Test""" + node_index = fluid.layers.data( + "node_index", shape=[None], dtype="int64", append_batch_size=False) + + node_label = fluid.layers.data( + "node_label", shape=[None, 1], dtype="int64", append_batch_size=False) + + for i in range(k_hop): + if graphsage_type == 'graphsage_mean': + feature = graphsage_mean( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_mean_%s % i") + elif graphsage_type == 'graphsage_meanpool': + feature = graphsage_meanpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_meanpool_%s % i") + elif graphsage_type == 'graphsage_maxpool': + feature = graphsage_maxpool( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s % i") + elif graphsage_type == 'graphsage_lstm': + feature = graphsage_lstm( + graph_wrapper, + feature, + hidden_size, + act="relu", + name="graphsage_maxpool_%s % i") + else: + raise ValueError("graphsage type %s is not" + " implemented" % graphsage_type) + + feature = fluid.layers.gather(feature, node_index) + logits = fluid.layers.fc(feature, + num_class, + act=None, + name='classification_layer') + proba = fluid.layers.softmax(logits) + + loss = fluid.layers.softmax_with_cross_entropy( + logits=logits, label=node_label) + loss = fluid.layers.mean(loss) + acc = fluid.layers.accuracy(input=proba, label=node_label, k=1) + return loss, acc + + +def run_epoch(batch_iter, + exe, + program, + prefix, + model_loss, + model_acc, + epoch, + log_per_step=100): + """Test""" + batch = 0 + total_loss = 0. + total_acc = 0. + total_sample = 0 + start = time.time() + for batch_feed_dict in batch_iter(): + batch += 1 + batch_loss, batch_acc = exe.run(program, + fetch_list=[model_loss, model_acc], + feed=batch_feed_dict) + + if batch % log_per_step == 0: + log.info("Batch %s %s-Loss %s %s-Acc %s" % + (batch, prefix, batch_loss, prefix, batch_acc)) + + num_samples = len(batch_feed_dict["node_index"]) + total_loss += batch_loss * num_samples + total_acc += batch_acc * num_samples + total_sample += num_samples + end = time.time() + + log.info("%s Epoch %s Loss %.5lf Acc %.5lf Speed(per batch) %.5lf sec" % + (prefix, epoch, total_loss / total_sample, + total_acc / total_sample, (end - start) / batch)) + + +def main(args): + """Test """ + data = load_data(args.normalize, args.symmetry, args.scale) + log.info("preprocess finish") + log.info("Train Examples: %s" % len(data["train_index"])) + log.info("Val Examples: %s" % len(data["val_index"])) + log.info("Test Examples: %s" % len(data["test_index"])) + log.info("Num nodes %s" % data["graph"].num_nodes) + log.info("Num edges %s" % data["graph"].num_edges) + log.info("Average Degree %s" % np.mean(data["graph"].indegree())) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_program = fluid.Program() + startup_program = fluid.Program() + + samples = [] + if args.samples_1 > 0: + samples.append(args.samples_1) + if args.samples_2 > 0: + samples.append(args.samples_2) + + with fluid.program_guard(train_program, startup_program): + graph_wrapper = pgl.graph_wrapper.GraphWrapper( + "sub_graph", + fluid.CPUPlace(), + node_feat=data['graph'].node_feat_info()) + + model_loss, model_acc = build_graph_model( + graph_wrapper, + num_class=data["num_class"], + feature=graph_wrapper.node_feat["feature"], + hidden_size=args.hidden_size, + graphsage_type=args.graphsage_type, + k_hop=len(samples)) + + test_program = train_program.clone(for_test=True) + + if args.sample_workers > 1: + train_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['train_index'], + node_label=data["train_label"]) + else: + train_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['train_index'], + node_label=data["train_label"]) + + if args.sample_workers > 1: + val_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['val_index'], + node_label=data["val_label"]) + else: + val_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['val_index'], + node_label=data["val_label"]) + + if args.sample_workers > 1: + test_iter = reader.multiprocess_graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + num_workers=args.sample_workers, + batch_size=args.batch_size, + node_index=data['test_index'], + node_label=data["test_label"]) + else: + test_iter = reader.graph_reader( + data['graph'], + graph_wrapper, + samples=samples, + batch_size=args.batch_size, + node_index=data['test_index'], + node_label=data["test_label"]) + + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=args.lr) + adam.minimize(model_loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + + for epoch in range(args.epoch): + run_epoch( + train_iter, + program=train_program, + exe=exe, + prefix="train", + model_loss=model_loss, + model_acc=model_acc, + epoch=epoch) + + run_epoch( + val_iter, + program=test_program, + exe=exe, + prefix="val", + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + run_epoch( + test_iter, + program=test_program, + prefix="test", + exe=exe, + model_loss=model_loss, + model_acc=model_acc, + log_per_step=10000, + epoch=epoch) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='graphsage') + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument( + "--normalize", action='store_true', help="normalize features") + parser.add_argument( + "--symmetry", action='store_true', help="undirect graph") + parser.add_argument("--graphsage_type", type=str, default="graphsage_mean") + parser.add_argument("--sample_workers", type=int, default=5) + parser.add_argument("--epoch", type=int, default=10) + parser.add_argument("--hidden_size", type=int, default=128) + parser.add_argument("--batch_size", type=int, default=128) + parser.add_argument("--lr", type=float, default=0.01) + parser.add_argument("--samples_1", type=int, default=25) + parser.add_argument("--samples_2", type=int, default=10) + parser.add_argument("--scale", type=int, default=1) + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/line/README.md b/examples/line/README.md new file mode 100644 index 0000000..abbe0d4 --- /dev/null +++ b/examples/line/README.md @@ -0,0 +1,55 @@ +# PGL Examples for LINE +[LINE](http://www.www2015.it/documents/proceedings/proceedings/p1067.pdf) is an algorithmic framework for embedding very large-scale information networks. It is suitable to a variety of networks including directed, undirected, binary or weighted edges. Based on PGL, we reproduce LINE algorithms and reach the same level of indicators as the paper. + +## Datasets +[Flickr network](http://socialnetworks.mpi-sws.org/data-imc2007.html) is a social network, which contains 1715256 nodes and 22613981 edges. + +You can dowload data from [here](http://socialnetworks.mpi-sws.org/data-imc2007.html). + +Flickr network contains four files: +* flickr-groupmemberships.txt.gz +* flickr-groups.txt.gz +* flickr-links.txt.gz +* flickr-users.txt.gz + +After downloading the data,uncompress them, let's say, in **./data/flickr/** . Note that the current directory is the root directory of LINE model. + +Then you can run the below command to preprocess the data. +```sh +python data_process.py +``` + +Then it will produce three files in **./data/flickr/** directory: +* nodes.txt +* edges.txt +* nodes_label.txt + + +## Dependencies +- paddlepaddle>=1.6 +- pgl + +## How to run + +For examples, use gpu to train LINE on Flickr dataset. +```sh +# multiclass task example +python line.py --use_cuda --order first_order --data_path ./data/flickr/ --save_dir ./checkpoints/model/ + +python multi_class.py --ckpt_path ./checkpoints/model/model_eopch_20 --percent 0.5 + +``` + +## Hyperparameters + +- -use_cuda: Use gpu if assign use_cuda. +- -order: LINE with First_order Proximity or Second_order Proximity +- -percent: The percentage of data as training data + +### Experiment results +Dataset|model|Task|Metric|PGL Result|Reported Result +--|--|--|--|--|-- +Flickr|LINE with first_order|multi-label classification|MacroF1|0.626|0.627 +Flickr|LINE with first_order|multi-label classification|MicroF1|0.637|0.639 +Flickr|LINE with second_order|multi-label classification|MacroF1|0.615|0.621 +Flickr|LINE with second_order|multi-label classification|MicroF1|0.630|0.635 diff --git a/examples/line/data_loader.py b/examples/line/data_loader.py new file mode 100644 index 0000000..58a118a --- /dev/null +++ b/examples/line/data_loader.py @@ -0,0 +1,233 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This file provides the Dataset for LINE model. +""" +import os +import io +import sys +import numpy as np + +from pgl import graph +from pgl.utils.logger import log + + +class FlickrDataset(object): + """Flickr dataset implementation + + Args: + name: The name of the dataset. + + symmetry_edges: Whether to create symmetry edges. + + self_loop: Whether to contain self loop edges. + + train_percentage: The percentage of nodes to be trained in multi class task. + + Attributes: + graph: The :code:`Graph` data object. + + num_groups: Number of classes. + + train_index: The index for nodes in training set. + + test_index: The index for nodes in validation set. + """ + + def __init__(self, + data_path, + symmetry_edges=False, + self_loop=False, + train_percentage=0.5): + self.path = data_path + # self.name = name + self.num_groups = 5 + self.symmetry_edges = symmetry_edges + self.self_loop = self_loop + self.train_percentage = train_percentage + self._load_data() + + def _load_data(self): + edge_path = os.path.join(self.path, 'edges.txt') + node_path = os.path.join(self.path, 'nodes.txt') + nodes_label_path = os.path.join(self.path, 'nodes_label.txt') + + all_edges = [] + edges_weight = [] + + with io.open(node_path) as inf: + num_nodes = len(inf.readlines()) + + node_feature = np.zeros((num_nodes, self.num_groups)) + + with io.open(nodes_label_path) as inf: + for line in inf: + # group_id means the label of the node + node_id, group_id = line.strip('\n').split(',') + node_id = int(node_id) - 1 + labels = group_id.split(' ') + for i in labels: + node_feature[node_id][int(i) - 1] = 1 + + node_degree_list = [1 for _ in range(num_nodes)] + + with io.open(edge_path) as inf: + for line in inf: + items = line.strip().split('\t') + if len(items) == 2: + u, v = int(items[0]), int(items[1]) + weight = 1 # binary weight, default set to 1 + else: + u, v, weight = int(items[0]), int(items[1]), float(items[ + 2]), + u, v = u - 1, v - 1 + all_edges.append((u, v)) + edges_weight.append(weight) + + if self.symmetry_edges: + all_edges.append((v, u)) + edges_weight.append(weight) + + # sum the weights of the same node as the outdegree + node_degree_list[u] += weight + + if self.self_loop: + for i in range(num_nodes): + all_edges.append((i, i)) + edges_weight.append(1.) + + all_edges = list(set(all_edges)) + self.graph = graph.Graph( + num_nodes=num_nodes, + edges=all_edges, + node_feat={"group_id": node_feature}) + + perm = np.arange(0, num_nodes) + np.random.shuffle(perm) + train_num = int(num_nodes * self.train_percentage) + self.train_index = perm[:train_num] + self.test_index = perm[train_num:] + + edge_distribution = np.array(edges_weight, dtype=np.float32) + self.edge_distribution = edge_distribution / np.sum(edge_distribution) + self.edge_sampling = AliasSampling(prob=edge_distribution) + + node_dist = np.array(node_degree_list, dtype=np.float32) + node_negative_distribution = np.power(node_dist, 0.75) + self.node_negative_distribution = node_negative_distribution / np.sum( + node_negative_distribution) + self.node_sampling = AliasSampling(prob=node_negative_distribution) + + self.node_index = {} + self.node_index_reversed = {} + for index, e in enumerate(self.graph.edges): + self.node_index[e[0]] = index + self.node_index_reversed[index] = e[0] + + def fetch_batch(self, + batch_size=16, + K=10, + edge_sampling='alias', + node_sampling='alias'): + """Fetch batch data from dataset. + """ + if edge_sampling == 'numpy': + edge_batch_index = np.random.choice( + self.graph.num_edges, + size=batch_size, + p=self.edge_distribution) + elif edge_sampling == 'alias': + edge_batch_index = self.edge_sampling.sampling(batch_size) + elif edge_sampling == 'uniform': + edge_batch_index = np.random.randint( + 0, self.graph.num_edges, size=batch_size) + u_i = [] + u_j = [] + label = [] + for edge_index in edge_batch_index: + edge = self.graph.edges[edge_index] + u_i.append(edge[0]) + u_j.append(edge[1]) + label.append(1) + for i in range(K): + while True: + if node_sampling == 'numpy': + negative_node = np.random.choice( + self.graph.num_nodes, + p=self.node_negative_distribution) + elif node_sampling == 'alias': + negative_node = self.node_sampling.sampling() + elif node_sampling == 'uniform': + negative_node = np.random.randint(0, + self.graph.num_nodes) + + # make sure the sampled node has no edge with the source node + if not self.graph.has_edges_between( + np.array( + [self.node_index_reversed[negative_node]]), + np.array([self.node_index_reversed[edge[0]]])): + break + u_i.append(edge[0]) + u_j.append(negative_node) + label.append(-1) + u_i = np.array([u_i], dtype=np.int64).T + u_j = np.array([u_j], dtype=np.int64).T + label = np.array(label, dtype=np.float32) + return u_i, u_j, label + + +class AliasSampling: + """Implemention of Alias-Method + + This is an implementation of Alias-Method for sampling efficiently from + a discrete probability distribution. + + Reference: https://en.wikipedia.org/wiki/Alias_method + + Args: + prob: The discrete probability distribution. + + """ + + def __init__(self, prob): + self.n = len(prob) + self.U = np.array(prob) * self.n + self.K = [i for i in range(len(prob))] + overfull, underfull = [], [] + for i, U_i in enumerate(self.U): + if U_i > 1: + overfull.append(i) + elif U_i < 1: + underfull.append(i) + while len(overfull) and len(underfull): + i, j = overfull.pop(), underfull.pop() + self.K[j] = i + self.U[i] = self.U[i] - (1 - self.U[j]) + if self.U[i] > 1: + overfull.append(i) + elif self.U[i] < 1: + underfull.append(i) + + def sampling(self, n=1): + """Sampling. + """ + x = np.random.rand(n) + i = np.floor(self.n * x) + y = self.n * x - i + i = i.astype(np.int64) + res = [i[k] if y[k] < self.U[i[k]] else self.K[i[k]] for k in range(n)] + if n == 1: + return res[0] + else: + return res diff --git a/examples/line/data_process.py b/examples/line/data_process.py new file mode 100644 index 0000000..d81a5c7 --- /dev/null +++ b/examples/line/data_process.py @@ -0,0 +1,137 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This file preprocess the FlickrDataset for LINE model. +""" +import argparse +import operator +import os + + +def process_data(groupsMemberships_file, flickr_links_file, users_label_file, + edges_file, users_file): + """Preprocess flickr network dataset. + + Args: + groupsMemberships_file: flickr-groupmemberships.txt file, + each line is a pair (user, group), which indicates a user belongs to a group. + + flickr_links_file: flickr-links.txt file, + each line is a pair (user, user), which indicates + the two users have a relationship. + + users_label_file: each line is a pair (user, list of group), + each user may belong to multiple groups. + + edges_file: each line is a pair (user, user), which indicates + the two users have a relationship. It filters some unused edges. + + users_file: each line is a int number, which indicates the ID of a user. + """ + group2users = {} + with open(groupsMemberships_file, 'r') as f: + for line in f: + user, group = line.strip().split() + try: + group2users[int(group)].append(user) + except: + group2users[int(group)] = [user] + + # counting how many users belong to every group + group2usersNum = {} + for key, item in group2users.items(): + group2usersNum[key] = len(item) + + groups_sorted_by_usersNum = sorted( + group2usersNum.items(), key=operator.itemgetter(1), reverse=True) + + # the paper only need the 5 groups with the largest number of users + label = 1 # remapping the 5 groups from 1 to 5 + users_label = {} + for i in range(5): + users_list = group2users[groups_sorted_by_usersNum[i][0]] + for user in users_list: + # one user may have multi-labels + try: + users_label[user].append(label) + except: + users_label[user] = [label] + label += 1 + + # remapping the users IDs to make the IDs from 0 to N + userID2nodeID = {} + count = 1 + for key in sorted(users_label.keys()): + userID2nodeID[key] = count + count += 1 + + with open(users_label_file, 'w') as writer: + for key in sorted(users_label.keys()): + line = ' '.join([str(i) for i in users_label[key]]) + writer.write(str(userID2nodeID[key]) + ',' + line + '\n') + + # produce edges file + with open(flickr_links_file, 'r') as reader, open(edges_file, + 'w') as writer: + for line in reader: + src, dst = line.strip().split('\t') + # filter unused user IDs + if src in users_label and dst in users_label: + # remapping the users IDs + src = userID2nodeID[src] + dst = userID2nodeID[dst] + + writer.write(str(src) + '\t' + str(dst) + '\n') + + # produce nodes file + with open(users_file, 'w') as writer: + for i in range(1, 1 + len(userID2nodeID)): + writer.write(str(i) + '\n') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='LINE') + parser.add_argument( + '--groupmemberships', + type=str, + default='./data/flickr/flickr-groupmemberships.txt', + help='groupmemberships of flickr dataset') + + parser.add_argument( + '--flickr_links', + type=str, + default='./data/flickr/flickr-links.txt', + help='the flickr-links.txt file for training') + + parser.add_argument( + '--nodes_label', + type=str, + default='./data/flickr/nodes_label.txt', + help='nodes (users) label file for training') + + parser.add_argument( + '--edges', + type=str, + default='./data/flickr/edges.txt', + help='the result edges (links) file for training') + + parser.add_argument( + '--nodes', + type=str, + default='./data/flickr/nodes.txt', + help='the nodes (users) file for training') + + args = parser.parse_args() + process_data(args.groupmemberships, args.flickr_links, args.nodes_label, + args.edges, args.nodes) diff --git a/examples/line/line.py b/examples/line/line.py new file mode 100644 index 0000000..a6e17f6 --- /dev/null +++ b/examples/line/line.py @@ -0,0 +1,197 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This file implement the training process of LINE model. +""" + +import time +import argparse +import random +import os +import numpy as np + +import pgl +import paddle.fluid as fluid +import paddle.fluid.layers as fl +from pgl.utils.logger import log + +from data_loader import FlickrDataset + + +def make_dir(path): + """Create directory if path is not existed. + + Args: + path: The directory that wants to create. + """ + try: + os.makedirs(path) + except: + if not os.path.isdir(path): + raise + + +def set_seed(seed): + """Set global random seed. + """ + random.seed(seed) + np.random.seed(seed) + + +def build_model(args, graph): + """Build LINE model. + + Args: + args: The hyperparameters for configure. + + graph: The :code:`Graph` data object. + + """ + u_i = fl.data( + name='u_i', shape=[None, 1], dtype='int64', append_batch_size=False) + u_j = fl.data( + name='u_j', shape=[None, 1], dtype='int64', append_batch_size=False) + + label = fl.data( + name='label', shape=[None], dtype='float32', append_batch_size=False) + + lr = fl.data( + name='learning_rate', + shape=[1], + dtype='float32', + append_batch_size=False) + + u_i_embed = fl.embedding( + input=u_i, + size=[graph.num_nodes, args.embed_dim], + param_attr='shared_w') + + if args.order == 'first_order': + u_j_embed = fl.embedding( + input=u_j, + size=[graph.num_nodes, args.embed_dim], + param_attr='shared_w') + elif args.order == 'second_order': + u_j_embed = fl.embedding( + input=u_j, + size=[graph.num_nodes, args.embed_dim], + param_attr='context_w') + else: + raise ValueError("order should be first_order or second_order, not %s" + % (args.order)) + + inner_product = fl.reduce_sum(u_i_embed * u_j_embed, dim=1) + + loss = -1 * fl.reduce_mean(fl.logsigmoid(label * inner_product)) + optimizer = fluid.optimizer.RMSPropOptimizer(learning_rate=lr) + train_op = optimizer.minimize(loss) + + return loss, optimizer + + +def main(args): + """The main funciton for training LINE model. + """ + make_dir(args.save_dir) + set_seed(args.seed) + + dataset = FlickrDataset(args.data_path) + + log.info('num nodes in graph: %d' % dataset.graph.num_nodes) + log.info('num edges in graph: %d' % dataset.graph.num_edges) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + + main_program = fluid.default_main_program() + startup_program = fluid.default_startup_program() + + # build model here + with fluid.program_guard(main_program, startup_program): + loss, opt = build_model(args, dataset.graph) + + exe = fluid.Executor(place) + exe.run(startup_program) #initialize the parameters of the network + + batchrange = int(dataset.graph.num_edges / args.batch_size) + T = batchrange * args.epochs + for epoch in range(args.epochs): + for b in range(batchrange): + lr = max(args.lr * (1 - (batchrange * epoch + b) / T), 0.0001) + + u_i, u_j, label = dataset.fetch_batch( + batch_size=args.batch_size, + K=args.neg_sample_size, + edge_sampling=args.sample_method, + node_sampling=args.sample_method) + + feed_dict = { + 'u_i': u_i, + 'u_j': u_j, + 'label': label, + 'learning_rate': lr + } + + ret_loss = exe.run(main_program, + feed=feed_dict, + fetch_list=[loss], + return_numpy=True) + + if b % 500 == 0: + log.info("Epoch %d | Step %d | Loss %f | lr: %f" % + (epoch, b, ret_loss[0], lr)) + + # save parameters in every epoch + log.info("saving persistables parameters...") + fluid.io.save_persistables(exe, + os.path.join(args.save_dir, "model_epoch_%d" + % (epoch + 1)), main_program) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='LINE') + parser.add_argument( + '--data_path', + type=str, + default='./data/flickr/', + help='dataset for training') + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument("--epochs", type=int, default=20, help='total epochs') + parser.add_argument("--seed", type=int, default=1667, help='random seed') + parser.add_argument("--lr", type=float, default=0.01, help='learning rate') + parser.add_argument( + "--neg_sample_size", + type=int, + default=5, + help='negative samplle number') + parser.add_argument("--save_dir", type=str, default="./checkpoints/model") + parser.add_argument("--batch_size", type=int, default=32) + parser.add_argument( + "--embed_dim", + type=int, + default=128, + help='the dimension of node embedding') + parser.add_argument( + "--sample_method", + type=str, + default="alias", + help='negative sample method (uniform, numpy, alias)') + parser.add_argument( + "--order", + type=str, + default="first_order", + help='the order of neighbors (first_order, second_order)') + + args = parser.parse_args() + + main(args) diff --git a/examples/line/multi_class.py b/examples/line/multi_class.py new file mode 100644 index 0000000..3f191f2 --- /dev/null +++ b/examples/line/multi_class.py @@ -0,0 +1,286 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This file provides the multi class task for testing the embedding +learned by LINE model. +""" +import argparse +import time +import math +import os +import random + +import numpy as np +import sklearn.metrics +from sklearn.metrics import f1_score + +import pgl +from pgl.utils import op +import paddle.fluid as fluid +import paddle.fluid.layers as l +from pgl.utils.logger import log +from data_loader import FlickrDataset + + +def set_seed(seed): + """Set global random seed. + """ + random.seed(seed) + np.random.seed(seed) + + +def node_classify_model(graph, + num_labels, + embed_dim=16, + name='node_classify_task'): + """Build node classify model. + + Args: + graph: The :code:`Graph` data object. + + num_labels: The number of labels. + + embed_dim: The dimension of embedding. + + name: The name of the model. + """ + pyreader = l.py_reader( + capacity=70, + shapes=[[-1, 1], [-1, num_labels]], + dtypes=['int64', 'float32'], + lod_levels=[0, 0], + name=name + '_pyreader', + use_double_buffer=True) + nodes, labels = l.read_file(pyreader) + embed_nodes = l.embedding( + input=nodes, size=[graph.num_nodes, embed_dim], param_attr='shared_w') + embed_nodes.stop_gradient = True + logits = l.fc(input=embed_nodes, size=num_labels) + loss = l.sigmoid_cross_entropy_with_logits(logits, labels) + loss = l.reduce_mean(loss) + prob = l.sigmoid(logits) + topk = l.reduce_sum(labels, -1) + return { + 'pyreader': pyreader, + 'loss': loss, + 'prob': prob, + 'labels': labels, + 'topk': topk + } + # return pyreader, loss, prob, labels, topk + + +def node_classify_generator(graph, + all_nodes=None, + batch_size=512, + epoch=1, + shuffle=True): + """Data generator for node classify. + + Args: + graph: The :code:`Graph` data object. + + all_nodes: the total number of nodes. + + batch_size: batch size for training. + + epoch: The number of epochs. + + shuffle: Random shuffle of data. + """ + + if all_nodes is None: + all_nodes = np.arange(graph.num_nodes) + + def batch_nodes_generator(shuffle=shuffle): + """Batch nodes generator. + """ + perm = np.arange(len(all_nodes), dtype=np.int64) + if shuffle: + np.random.shuffle(perm) + start = 0 + while start < len(all_nodes): + yield all_nodes[perm[start:start + batch_size]] + start += batch_size + + def wrapper(): + """Wrapper function. + """ + for _ in range(epoch): + for batch_nodes in batch_nodes_generator(): + batch_nodes_expanded = np.expand_dims(batch_nodes, + -1).astype(np.int64) + batch_labels = graph.node_feat['group_id'][batch_nodes].astype( + np.float32) + yield [batch_nodes_expanded, batch_labels] + + return wrapper + + +def topk_f1_score(labels, + probs, + topk_list=None, + average="macro", + threshold=None): + """Calculate top K F1 score. + """ + assert topk_list is not None or threshold is not None, "one of topklist and threshold should not be None" + if threshold is not None: + preds = probs > threshold + else: + preds = np.zeros_like(labels, dtype=np.int64) + for idx, (prob, topk) in enumerate(zip(np.argsort(probs), topk_list)): + preds[idx][prob[-int(topk):]] = 1 + return f1_score(labels, preds, average=average) + + +def main(args): + """The main funciton for nodes classify task. + """ + set_seed(args.seed) + log.info(args) + dataset = FlickrDataset(args.data_path, train_percentage=args.percent) + + train_steps = (len(dataset.train_index) // args.batch_size) * args.epochs + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + train_prog = fluid.Program() + test_prog = fluid.Program() + startup_prog = fluid.Program() + + with fluid.program_guard(train_prog, startup_prog): + with fluid.unique_name.guard(): + train_model = node_classify_model( + dataset.graph, + dataset.num_groups, + embed_dim=args.embed_dim, + name='train') + + lr = l.polynomial_decay(args.lr, train_steps, 0.0001) + adam = fluid.optimizer.Adam(lr) + adam.minimize(train_model['loss']) + with fluid.program_guard(test_prog, startup_prog): + with fluid.unique_name.guard(): + test_model = node_classify_model( + dataset.graph, + dataset.num_groups, + embed_dim=args.embed_dim, + name='test') + test_prog = test_prog.clone(for_test=True) + exe = fluid.Executor(place) + exe.run(startup_prog) + + train_model['pyreader'].decorate_tensor_provider( + node_classify_generator( + dataset.graph, + dataset.train_index, + batch_size=args.batch_size, + epoch=args.epochs)) + test_model['pyreader'].decorate_tensor_provider( + node_classify_generator( + dataset.graph, + dataset.test_index, + batch_size=args.batch_size, + epoch=1)) + + def existed_params(var): + """existed_params + """ + if not isinstance(var, fluid.framework.Parameter): + return False + return os.path.exists(os.path.join(args.ckpt_path, var.name)) + + fluid.io.load_vars( + exe, args.ckpt_path, main_program=train_prog, predicate=existed_params) + step = 0 + prev_time = time.time() + train_model['pyreader'].start() + + while 1: + try: + train_loss_val, train_probs_val, train_labels_val, train_topk_val = exe.run( + train_prog, + fetch_list=[ + train_model['loss'], train_model['prob'], + train_model['labels'], train_model['topk'] + ], + return_numpy=True) + train_macro_f1 = topk_f1_score(train_labels_val, train_probs_val, + train_topk_val, "macro", + args.threshold) + train_micro_f1 = topk_f1_score(train_labels_val, train_probs_val, + train_topk_val, "micro", + args.threshold) + step += 1 + log.info("Step %d " % step + "Train Loss: %f " % train_loss_val + + "Train Macro F1: %f " % train_macro_f1 + + "Train Micro F1: %f " % train_micro_f1) + except fluid.core.EOFException: + train_model['pyreader'].reset() + break + + test_model['pyreader'].start() + test_probs_vals, test_labels_vals, test_topk_vals = [], [], [] + while 1: + try: + test_loss_val, test_probs_val, test_labels_val, test_topk_val = exe.run( + test_prog, + fetch_list=[ + test_model['loss'], test_model['prob'], + test_model['labels'], test_model['topk'] + ], + return_numpy=True) + test_probs_vals.append( + test_probs_val), test_labels_vals.append(test_labels_val) + test_topk_vals.append(test_topk_val) + except fluid.core.EOFException: + test_model['pyreader'].reset() + test_probs_array = np.concatenate(test_probs_vals) + test_labels_array = np.concatenate(test_labels_vals) + test_topk_array = np.concatenate(test_topk_vals) + test_macro_f1 = topk_f1_score( + test_labels_array, test_probs_array, test_topk_array, + "macro", args.threshold) + test_micro_f1 = topk_f1_score( + test_labels_array, test_probs_array, test_topk_array, + "micro", args.threshold) + log.info("\t\tStep %d " % step + "Test Loss: %f " % + test_loss_val + "Test Macro F1: %f " % test_macro_f1 + + "Test Micro F1: %f " % test_micro_f1) + break + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='LINE') + parser.add_argument( + '--data_path', + type=str, + default='./data/flickr/', + help='dataset for training') + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument("--epochs", type=int, default=10) + parser.add_argument("--seed", type=int, default=1667) + parser.add_argument( + "--lr", type=float, default=0.025, help='learning rate') + parser.add_argument("--embed_dim", type=int, default=128) + parser.add_argument("--batch_size", type=int, default=256) + parser.add_argument("--threshold", type=float, default=None) + parser.add_argument( + "--percent", + type=float, + default=0.5, + help="the percentage of data as training data") + parser.add_argument( + "--ckpt_path", type=str, default="./checkpoints/model/model_epoch_0/") + args = parser.parse_args() + main(args) diff --git a/examples/sgc/README.md b/examples/sgc/README.md new file mode 100644 index 0000000..92fc546 --- /dev/null +++ b/examples/sgc/README.md @@ -0,0 +1,35 @@ +# PGL Examples for SGC + +[Simplifying Graph Convolutional Networks \(SGC\)](https://arxiv.org/pdf/1902.07153.pdf) is a powerful neural network designed for machine learning on graphs. Based on PGL, we reproduce SGC algorithms and reach the same level of indicators as the paper in citation network benchmarks. + +### Datasets + +The datasets contain three citation networks: CORA, PUBMED, CITESEER. The details for these three datasets can be found in the [paper](https://arxiv.org/abs/1609.02907). + +### Dependencies + +- paddlepaddle 1.5 +- pgl + +### Performance + +We train our models for 200 epochs and report the accuracy on the test dataset. + +| Dataset | Accuracy | Speed with paddle 1.5
(epoch time)| +| --- | --- | ---| +| Cora | 0.818 (paper: 0.810) | 0.0015s | +| Pubmed | 0.788 (paper: 0.789) | 0.0015s | +| Citeseer | 0.719 (paper: 0.719) | 0.0015s | + + +### How to run + +For examples, use gpu to train SGC on cora dataset. +``` +python sgc.py --dataset cora --use_cuda +``` + +#### Hyperparameters + +- dataset: The citation dataset "cora", "citeseer", "pubmed". +- use_cuda: Use gpu if assign use_cuda. diff --git a/examples/sgc/sgc.py b/examples/sgc/sgc.py new file mode 100644 index 0000000..85ec685 --- /dev/null +++ b/examples/sgc/sgc.py @@ -0,0 +1,271 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This file implement the training process of SGC model with StaticGraphWrapper. +""" + +import os +import argparse +import numpy as np +import random +import time + +import pgl +from pgl import data_loader +from pgl.utils.logger import log +from pgl.utils import paddle_helper +import paddle.fluid as fluid + + +def load(name): + """Load dataset.""" + if name == 'cora': + dataset = data_loader.CoraDataset() + elif name == "pubmed": + dataset = data_loader.CitationDataset("pubmed", symmetry_edges=False) + elif name == "citeseer": + dataset = data_loader.CitationDataset("citeseer", symmetry_edges=False) + else: + raise ValueError(name + " dataset doesn't exists") + return dataset + + +def expand_data_dim(dataset): + """Expand the dimension of data.""" + train_index = dataset.train_index + train_label = np.expand_dims(dataset.y[train_index], -1) + train_index = np.expand_dims(train_index, -1) + + val_index = dataset.val_index + val_label = np.expand_dims(dataset.y[val_index], -1) + val_index = np.expand_dims(val_index, -1) + + test_index = dataset.test_index + test_label = np.expand_dims(dataset.y[test_index], -1) + test_index = np.expand_dims(test_index, -1) + + return { + 'train_index': train_index, + 'train_label': train_label, + 'val_index': val_index, + 'val_label': val_label, + 'test_index': test_index, + 'test_label': test_label, + } + + +def MessagePassing(gw, feature, num_layers, norm=None): + """Precomputing message passing. + """ + + def send_src_copy(src_feat, dst_feat, edge_feat): + """send_src_copy + """ + return src_feat["h"] + + for _ in range(num_layers): + if norm is not None: + feature = feature * norm + + msg = gw.send(send_src_copy, nfeat_list=[("h", feature)]) + + feature = gw.recv(msg, "sum") + + if norm is not None: + feature = feature * norm + + return feature + + +def pre_gather(features, name_prefix, node_index_val): + """Get features with respect to node index. + """ + node_index, init = paddle_helper.constant( + "%s_node_index" % (name_prefix), dtype='int32', value=node_index_val) + logits = fluid.layers.gather(features, node_index) + + return logits, init + + +def calculate_loss(name, np_cached_h, node_label_val, num_classes, args): + """Calculate loss function. + """ + initializer = [] + const_cached_h, init = paddle_helper.constant( + "const_%s_cached_h" % name, dtype='float32', value=np_cached_h) + initializer.append(init) + + node_label, init = paddle_helper.constant( + "%s_node_label" % (name), dtype='int64', value=node_label_val) + initializer.append(init) + + output = fluid.layers.fc(const_cached_h, + size=num_classes, + bias_attr=args.bias, + name='fc') + + loss, probs = fluid.layers.softmax_with_cross_entropy( + logits=output, label=node_label, return_softmax=True) + loss = fluid.layers.mean(loss) + + acc = None + if name != 'train': + acc = fluid.layers.accuracy(input=probs, label=node_label, k=1) + + return { + 'loss': loss, + 'acc': acc, + 'probs': probs, + 'initializer': initializer + } + + +def main(args): + """"Main function.""" + dataset = load(args.dataset) + + # normalize + indegree = dataset.graph.indegree() + norm = np.zeros_like(indegree, dtype="float32") + norm[indegree > 0] = np.power(indegree[indegree > 0], -0.5) + dataset.graph.node_feat["norm"] = np.expand_dims(norm, -1) + + data = expand_data_dim(dataset) + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + precompute_program = fluid.Program() + startup_program = fluid.Program() + train_program = fluid.Program() + val_program = train_program.clone(for_test=True) + test_program = train_program.clone(for_test=True) + + # precompute message passing and gather + initializer = [] + with fluid.program_guard(precompute_program, startup_program): + gw = pgl.graph_wrapper.StaticGraphWrapper( + name="graph", place=place, graph=dataset.graph) + + cached_h = MessagePassing( + gw, + gw.node_feat["words"], + num_layers=args.num_layers, + norm=gw.node_feat['norm']) + + train_cached_h, init = pre_gather(cached_h, 'train', + data['train_index']) + initializer.append(init) + val_cached_h, init = pre_gather(cached_h, 'val', data['val_index']) + initializer.append(init) + test_cached_h, init = pre_gather(cached_h, 'test', data['test_index']) + initializer.append(init) + + exe = fluid.Executor(place) + gw.initialize(place) + for init in initializer: + init(place) + + # get train features, val features and test features + np_train_cached_h, np_val_cached_h, np_test_cached_h = exe.run( + precompute_program, + feed={}, + fetch_list=[train_cached_h, val_cached_h, test_cached_h], + return_numpy=True) + + initializer = [] + with fluid.program_guard(train_program, startup_program): + with fluid.unique_name.guard(): + train_handle = calculate_loss('train', np_train_cached_h, + data['train_label'], + dataset.num_classes, args) + initializer += train_handle['initializer'] + adam = fluid.optimizer.Adam( + learning_rate=args.lr, + regularization=fluid.regularizer.L2DecayRegularizer( + regularization_coeff=args.weight_decay)) + adam.minimize(train_handle['loss']) + + with fluid.program_guard(val_program, startup_program): + with fluid.unique_name.guard(): + val_handle = calculate_loss('val', np_val_cached_h, + data['val_label'], dataset.num_classes, + args) + initializer += val_handle['initializer'] + + with fluid.program_guard(test_program, startup_program): + with fluid.unique_name.guard(): + test_handle = calculate_loss('test', np_test_cached_h, + data['test_label'], + dataset.num_classes, args) + initializer += test_handle['initializer'] + + exe.run(startup_program) + for init in initializer: + init(place) + + dur = [] + for epoch in range(args.epochs): + if epoch >= 3: + t0 = time.time() + train_loss_t = exe.run(train_program, + feed={}, + fetch_list=[train_handle['loss']], + return_numpy=True)[0] + + if epoch >= 3: + time_per_epoch = 1.0 * (time.time() - t0) + dur.append(time_per_epoch) + + val_loss_t, val_acc_t = exe.run( + val_program, + feed={}, + fetch_list=[val_handle['loss'], val_handle['acc']], + return_numpy=True) + + log.info("Epoch %d " % epoch + "(%.5lf sec) " % np.mean( + dur) + "Train Loss: %f " % train_loss_t + "Val Loss: %f " % + val_loss_t + "Val Acc: %f " % val_acc_t) + + test_loss_t, test_acc_t = exe.run( + test_program, + feed={}, + fetch_list=[test_handle['loss'], test_handle['acc']], + return_numpy=True) + log.info("Test Accuracy: %f" % test_acc_t) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='SGC') + parser.add_argument( + "--dataset", + type=str, + default="cora", + help="dataset (cora, pubmed, citeseer)") + parser.add_argument("--use_cuda", action='store_true', help="use_cuda") + parser.add_argument( + "--seed", type=int, default=1667, help="global random seed") + parser.add_argument("--lr", type=float, default=0.2, help="learning rate") + parser.add_argument( + "--weight_decay", + type=float, + default=0.000005, + help="Weight for L2 loss") + parser.add_argument( + "--bias", action='store_true', default=False, help="flag to use bias") + parser.add_argument( + "--epochs", type=int, default=200, help="number of training epochs") + parser.add_argument( + "--num_layers", type=int, default=2, help="number of SGC layers") + args = parser.parse_args() + log.info(args) + main(args) diff --git a/examples/static_gat/README.md b/examples/static_gat/README.md index bab075f..1071e27 100644 --- a/examples/static_gat/README.md +++ b/examples/static_gat/README.md @@ -11,7 +11,7 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance @@ -19,11 +19,11 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| examples/gat | Improvement | -| --- | --- | --- |---| --- | --- | -| Cora | ~83% | 0.0145s | 0.0119s | 0.0175s | 1.47x | -| Pubmed | ~78% | 0.0352s | 0.0193s |0.0295s | 1.53x | -| Citeseer | ~70% | 0.0148s | 0.0124s |0.0253s | 2.04x | +| Dataset | Accuracy | epoch time | examples/gat | Improvement | +| --- | --- | --- | --- | --- | +| Cora | ~83% | 0.0119s | 0.0175s | 1.47x | +| Pubmed | ~78% | 0.0193s |0.0295s | 1.53x | +| Citeseer | ~70% | 0.0124s |0.0253s | 2.04x | ### How to run diff --git a/examples/static_gat/train.py b/examples/static_gat/train.py index 42c2da8..3fa38a1 100644 --- a/examples/static_gat/train.py +++ b/examples/static_gat/train.py @@ -84,7 +84,7 @@ def main(args): initializer = [] with fluid.program_guard(train_program, startup_program): train_node_index, init = paddle_helper.constant( - "train_node_index", dtype="int32", value=train_index) + "train_node_index", dtype="int64", value=train_index) initializer.append(init) train_node_label, init = paddle_helper.constant( @@ -103,7 +103,7 @@ def main(args): with fluid.program_guard(val_program, startup_program): val_node_index, init = paddle_helper.constant( - "val_node_index", dtype="int32", value=val_index) + "val_node_index", dtype="int64", value=val_index) initializer.append(init) val_node_label, init = paddle_helper.constant( @@ -119,7 +119,7 @@ def main(args): with fluid.program_guard(test_program, startup_program): test_node_index, init = paddle_helper.constant( - "test_node_index", dtype="int32", value=test_index) + "test_node_index", dtype="int64", value=test_index) initializer.append(init) test_node_label, init = paddle_helper.constant( diff --git a/examples/static_gcn/README.md b/examples/static_gcn/README.md index 9e87d51..cabd9cf 100644 --- a/examples/static_gcn/README.md +++ b/examples/static_gcn/README.md @@ -10,7 +10,7 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail ### Dependencies -- paddlepaddle>=1.4 (The speed can be faster in 1.5.) +- paddlepaddle>=1.6 - pgl ### Performance @@ -18,12 +18,11 @@ The datasets contain three citation networks: CORA, PUBMED, CITESEER. The detail We train our models for 200 epochs and report the accuracy on the test dataset. -| Dataset | Accuracy | Speed with paddle 1.4
(epoch time) | Speed with paddle 1.5
(epoch time)| examples/gcn | Improvement | -| --- | --- | --- |---| --- | --- | -| Cora | ~81% | 0.0053s | 0.0047s | 0.0104s | 2.21x | -| Pubmed | ~79% | 0.0105s | 0.0049s |0.0154s | 3.14x | -| Citeseer | ~71% | 0.0051s | 0.0045s |0.0177s | 3.93x | - +| Dataset | Accuracy | epoch time | examples/gcn | Improvement | +| --- | --- | --- | --- | --- | +| Cora | ~81% | 0.0047s | 0.0104s | 2.21x | +| Pubmed | ~79% | 0.0049s |0.0154s | 3.14x | +| Citeseer | ~71% | 0.0045s |0.0177s | 3.93x | ### How to run diff --git a/examples/static_gcn/train.py b/examples/static_gcn/train.py index f01435d..4c9724e 100644 --- a/examples/static_gcn/train.py +++ b/examples/static_gcn/train.py @@ -85,7 +85,7 @@ def main(args): initializer = [] with fluid.program_guard(train_program, startup_program): train_node_index, init = paddle_helper.constant( - "train_node_index", dtype="int32", value=train_index) + "train_node_index", dtype="int64", value=train_index) initializer.append(init) train_node_label, init = paddle_helper.constant( @@ -104,7 +104,7 @@ def main(args): with fluid.program_guard(val_program, startup_program): val_node_index, init = paddle_helper.constant( - "val_node_index", dtype="int32", value=val_index) + "val_node_index", dtype="int64", value=val_index) initializer.append(init) val_node_label, init = paddle_helper.constant( @@ -120,7 +120,7 @@ def main(args): with fluid.program_guard(test_program, startup_program): test_node_index, init = paddle_helper.constant( - "test_node_index", dtype="int32", value=test_index) + "test_node_index", dtype="int64", value=test_index) initializer.append(init) test_node_label, init = paddle_helper.constant( diff --git a/examples/strucvec/README.md b/examples/strucvec/README.md new file mode 100644 index 0000000..b23c10a --- /dev/null +++ b/examples/strucvec/README.md @@ -0,0 +1,44 @@ +## PGL Examples For Struc2Vec +[Struc2vec](https://arxiv.org/abs/1704.03165) is is a concept of symmetry in which network nodes are identified according to the network structure and their relationship to other nodes. A novel and flexible framework for learning latent representations is proposed in the paper of struc2vec. We reproduce Struc2vec algorithm in the PGL. +## DataSet +The paper of use air-traffic network to valid algorithm of Struc2vec. +The each edge in the dataset indicate that having one flight between the airports. Using the the connection between the airports to predict the level of activity. The following dataset will be used to valid the algorithm accuracy.Data collected from the Bureau of Transportation Statistics2 from January to October, 2016. The network has 1,190 nodes, 13,599 edges (diameter is 8). [Link](https://www.transtats.bts.gov/) + +- usa-airports.edgelist +- labels-usa-airports.txt + +## Dependencies +If use want to use the struc2vec model in pgl, please install the gensim, pathos, fastdtw additional. +- paddlepaddle>=1.6 +- pgl +- gensim +- pathos +- fastdtw + +## How to use +For examples, we want to train and valid the Struc2vec model on American airpot dataset +> python struc2vec.py --edge_file data/usa-airports.edgelist --label_file data/labels-usa-airports.txt --train True --valid True --opt2 True + +## Hyperparameters +| Args| Meaning| +| ------------- | ------------- | +| edge_file | input file name for edges| +| label_file | input file name for node label| +| emb_file | input file name for node label| +| walk_depth| The step3 for random walk| +| opt1| The flag to open optimization 1 to reduce time cost| +| opt2| The flag to open optimization 2 to reduce time cost| +| w2v_emb_size| The dims of output the word2vec embedding| +| w2v_window_size| The context length of word2vec| +| w2v_epoch| The num of epoch to train the model.| +| train| The flag to run the struc2vec algorithm to get the w2v embedding| +| valid| The flag to use the w2v embedding to valid the classification result| +| num_class| The num of class in classification model to be trained| + +## Experiment results +| Dataset | Model | Metric | PGL Result | Paper repo Result | +| ------------- | ------------- |------------- |------------- |------------- | +| American airport dataset | Struc2vec without time cost optimization| ACC |0.6483|0.6340| +| American airport dataset | Struc2vec with optimization 1| ACC |0.6466|0.6242| +| American airport dataset | Struc2vec with optimization 2| ACC |0.6252|0.6241| +| American airport dataset | Struc2vec with optimization1&2| ACC |0.6226|0.6083| diff --git a/examples/strucvec/classify.py b/examples/strucvec/classify.py new file mode 100644 index 0000000..daaa87e --- /dev/null +++ b/examples/strucvec/classify.py @@ -0,0 +1,110 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +import paddle +import paddle.fluid as fluid + + +def build_lr_model(args): + """ + Build the LR model to train. + """ + emb_x = fluid.layers.data( + name="emb_x", dtype='float32', shape=[args.w2v_emb_size]) + label = fluid.layers.data(name="label_y", dtype='int64', shape=[1]) + logits = fluid.layers.fc(input=emb_x, + size=args.num_class, + act=None, + name='classification_layer') + proba = fluid.layers.softmax(logits) + loss = fluid.layers.softmax_with_cross_entropy(logits, label) + loss = fluid.layers.mean(loss) + acc = fluid.layers.accuracy(input=proba, label=label, k=1) + return loss, acc + + +def construct_feed_data(data): + """ + Construct the data to feed model. + """ + datas = [] + labels = [] + for sample in data: + if len(datas) < 16: + labels.append([sample[-1]]) + datas.append(sample[1:-1]) + else: + yield np.array(datas).astype(np.float32), np.array(labels).astype( + np.int64) + datas = [] + labels = [] + if len(datas) != 0: + yield np.array(datas).astype(np.float32), np.array(labels).astype( + np.int64) + + +def run_epoch(exe, data, program, stage, epoch, loss, acc): + """ + The epoch funtcion to run each epoch. + """ + print('start {} epoch of {}'.format(stage, epoch)) + all_loss = 0.0 + all_acc = 0.0 + all_samples = 0.0 + count = 0 + for datas, labels in construct_feed_data(data): + batch_loss, batch_acc = exe.run( + program, + fetch_list=[loss, acc], + feed={"emb_x": datas, + "label_y": labels}) + len_samples = len(datas) + all_loss = batch_loss * len_samples + all_acc = batch_acc * len_samples + all_samples += len_samples + count += 1 + print("pass:{}, epoch:{}, loss:{}, acc:{}".format(stage, epoch, batch_loss, + all_acc / (len_samples))) + + +def train_lr_model(args, data): + """ + The main function to run the lr model. + """ + data_nums = len(data) + train_data_nums = int(0.8 * data_nums) + train_data = data[:train_data_nums] + test_data = data[train_data_nums:] + + place = fluid.CPUPlace() + + train_program = fluid.Program() + startup_program = fluid.Program() + + with fluid.program_guard(train_program, startup_program): + loss, acc = build_lr_model(args) + test_program = train_program.clone(for_test=True) + + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=args.lr) + adam.minimize(loss) + + exe = fluid.Executor(place) + exe.run(startup_program) + + for epoch in range(0, args.epoch): + run_epoch(exe, train_data, train_program, "train", epoch, loss, acc) + print('-------------------') + run_epoch(exe, test_data, test_program, "valid", epoch, loss, acc) diff --git a/examples/strucvec/data_loader.py b/examples/strucvec/data_loader.py new file mode 100644 index 0000000..98cb932 --- /dev/null +++ b/examples/strucvec/data_loader.py @@ -0,0 +1,55 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +data_loader.py +""" +from pgl import graph +import numpy as np + + +class EdgeDataset(): + """ + The data load just read the edge file, at the same time reindex the source and destination. + """ + + def __init__(self, undirected=True, data_dir=""): + self._undirected = undirected + self._data_dir = data_dir + self._load_edge_data() + + def _load_edge_data(self): + node_sets = set() + edges = [] + with open(self._data_dir, "r") as f: + node_dict = dict() + for line in f: + src, dist = [ + int(data) for data in line.strip("\n\r").split(" ") + ] + if src not in node_dict: + node_dict[src] = len(node_dict) + 1 + src = node_dict[src] + if dist not in node_dict: + node_dict[dist] = len(node_dict) + 1 + dist = node_dict[dist] + node_sets.add(src) + node_sets.add(dist) + edges.append((src, dist)) + if self._undirected: + edges.append((dist, src)) + + num_nodes = len(node_sets) + self.graph = graph.Graph(num_nodes=num_nodes + 1, edges=edges) + self.nodes = np.array(list(node_sets)) + self.node_dict = node_dict diff --git a/examples/strucvec/requirements.txt b/examples/strucvec/requirements.txt new file mode 100644 index 0000000..a3e7c50 --- /dev/null +++ b/examples/strucvec/requirements.txt @@ -0,0 +1,3 @@ +gensim +pathos +fastdtw diff --git a/examples/strucvec/sklearn_classify.py b/examples/strucvec/sklearn_classify.py new file mode 100644 index 0000000..b2dde24 --- /dev/null +++ b/examples/strucvec/sklearn_classify.py @@ -0,0 +1,54 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import numpy as np +import sklearn +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score + +random_seed = 67 + + +def train_lr_l2_model(args, data): + """ + The main function to train lr model with l2 regularization. + """ + acc_list = [] + data = np.array(data) + data = data[data[:, 0].argsort()] + x_data = data[:, 1:-1] + y_data = data[:, -1] + for random_num in range(0, 10): + X_train, X_test, y_train, y_test = train_test_split( + x_data, + y_data, + test_size=0.2, + random_state=random_num + random_seed) + + # use the one vs rest to train the lr model with l2 + pred_test = [] + for i in range(0, args.num_class): + y_train_relabel = np.where(y_train == i, 1, 0) + y_test_relabel = np.where(y_test == i, 1, 0) + lr = LogisticRegression(C=10.0, random_state=0, max_iter=100) + lr.fit(X_train, y_train_relabel) + pred = lr.predict_proba(X_test) + pred_test.append(pred[:, -1].tolist()) + pred_test = np.array(pred_test) + pred_test = np.transpose(pred_test) + c_index = np.argmax(pred_test, axis=1) + acc = accuracy_score(y_test.flatten(), c_index) + acc_list.append(acc) + print("pass:{}-acc:{}".format(random_num, acc)) + print("the avg acc is {}".format(np.mean(acc_list))) diff --git a/examples/strucvec/struc2vec.py b/examples/strucvec/struc2vec.py new file mode 100644 index 0000000..11c8707 --- /dev/null +++ b/examples/strucvec/struc2vec.py @@ -0,0 +1,545 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +struc2vec.py +""" +import argparse +import math +import random +import numpy as np +import pgl +from pgl import graph +from pgl.graph_kernel import alias_sample_build_table +from pgl.sample import alias_sample +from data_loader import EdgeDataset +from classify import train_lr_model +from sklearn_classify import train_lr_l2_model + + +def selectDegrees(degree_root, index_left, index_right, degree_left, + degree_right): + """ + Select the which degree to be next step. + """ + + if index_left == -1: + degree_now = degree_right + elif index_right == -1: + degree_now = degree_left + elif (abs(degree_left - degree_root) < abs(degree_right - degree_root)): + degree_now = degree_left + else: + degree_now = degree_right + + return degree_now + + +class StrucVecGraph(): + """ + The class wrapper the PGL graph, the class involve the funtions to implement struc2vec algorithm. + """ + + def __init__(self, graph, nodes, opt1, opt2, opt3, depth, num_walks, + walk_depth): + self.graph = graph + self.nodes = nodes + self.opt1 = opt1 + self.opt2 = opt2 + self.opt3 = opt3 + self.num_walks = num_walks + self.walk_depth = walk_depth + self.tag = args.tag + self.degree_list = dict() + self.degree2nodes = dict() + self.node2degree = dict() + self.distance = dict() + self.degrees_sorted = None + self.layer_distance = dict() + self.layer_message = dict() + self.layer_norm_distance = dict() + self.sample_alias = dict() + self.sample_events = dict() + self.layer_node_weight_count = dict() + if opt3 == True: + self.depth = depth + else: + self.depth = 1000 + + def distance_func(self, a, b): + """ + The basic function to calculate the distance between two list with different length. + """ + ep = 0.5 + m = max(a, b) + ep + mi = min(a, b) + ep + return ((m / mi) - 1) + + def distance_opt1_func(self, a, b): + """ + The optimization function to calculate the distance between two list with list count. + """ + ep = 0.5 + m = max(a[0], b[0]) + ep + mi = min(a[0], b[0]) + ep + return ((m / mi) - 1) * max(a[1], b[1]) + + def add_degree_todict(self, node_id, degree, depth, opt1): + """ + output the degree of each node to a dict + """ + if node_id not in self.degree_list: + self.degree_list[node_id] = dict() + if depth not in self.degree_list[node_id]: + self.degree_list[node_id][depth] = None + if opt1: + degree = np.array(np.unique(degree, return_counts=True)).T + self.degree_list[node_id][depth] = degree + + def output_degree_with_depth(self, depth, opt1): + """ + according to the BFS to get the degree of each layer + """ + degree_dict = dict() + + for node in self.nodes: + start_node = node + cur_node = node + cur_dep = 0 + flag_visit = set() + while cur_node is not None and cur_dep < depth: + if not isinstance(cur_node, list): + cur_node = [cur_node] + filter_node = [] + for node in cur_node: + if node not in flag_visit: + flag_visit.add(node) + filter_node.append(node) + cur_node = filter_node + if len(cur_node) == 0: + break + outdegree = self.graph.outdegree(cur_node) + mask = (outdegree != 0) + if np.any(mask): + outdegree = np.sort(outdegree[mask]) + else: + break + # save the layer degree message to dict + self.add_degree_todict(start_node, outdegree[mask], cur_dep, + opt1) + succes = self.graph.successor(cur_node) + cur_node = [] + for succ in succes: + if isinstance(succ, np.ndarray): + cur_node.extend(succ.flatten().tolist()) + elif isinstance(succ, int): + cur_node.append(succ) + cur_node = list(set(cur_node)) + cur_dep += 1 + + def get_sim_neighbours(self, node, selected_num): + """ + Select the neighours by using the degree similiarity. + """ + degree = self.node2degree[node] + select_count = 0 + node_nbh_list = list() + for node_nbh in self.degree2nodes[degree]: + if node != node_nbh: + node_nbh_list.append(node_nbh) + select_count += 1 + if select_count > selected_num: + return node_nbh_list + degree_vec_len = len(self.degrees_sorted) + index_degree = self.degrees_sorted.index(degree) + + index_left = -1 + index_right = -1 + degree_left = -1 + degree_right = -1 + + if index_degree != -1 and index_degree >= 1: + index_left = index_degree - 1 + if index_degree != -1 and index_degree <= degree_vec_len - 2: + index_right = index_degree + 1 + if index_left == -1 and index_right == -1: + return node_nbh_list + if index_left != -1: + degree_left = self.degrees_sorted[index_left] + if index_right != -1: + degree_right = self.degrees_sorted[index_right] + select_degree = selectDegrees(degree, index_left, index_right, + degree_left, degree_right) + while True: + for node_nbh in self.degree2nodes[select_degree]: + if node_nbh != node: + node_nbh_list.append(node_nbh) + select_count += 1 + if select_count > selected_num: + return node_nbh_list + + if select_degree == degree_left: + if index_left >= 1: + index_left = index_left - 1 + else: + index_left = -1 + + else: + if index_right <= degree_vec_len - 2: + index_right += 1 + else: + index_right = -1 + + if index_left == -1 and index_right == -1: + return node_nbh_list + + if index_left != -1: + degree_left = self.degrees_sorted[index_left] + if index_right != -1: + degree_right = self.degrees_sorted[index_right] + select_degree = selectDegrees(degree, index_left, index_right, + degree_left, degree_right) + return node_nbh_list + + def calc_node_with_neighbor_dtw_opt2(self, src): + """ + Use the optimization algorithm to reduce the next steps range. + """ + from fastdtw import fastdtw + node_nbh_list = self.get_sim_neighbours(src, self.selected_nbh_nums) + distance = {} + for dist in node_nbh_list: + calc_layer_len = min(len(self.degree_list[src]), \ + len(self.degree_list[dist])) + distance_iteration = 0.0 + distance[src, dist] = {} + for layer in range(0, calc_layer_len): + src_layer = self.degree_list[src][layer] + dist_layer = self.degree_list[dist][layer] + weight, path = fastdtw( + src_layer, + dist_layer, + radius=1, + dist=self.distance_calc_func) + distance_iteration += weight + distance[src, dist][layer] = distance_iteration + return distance + + def calc_node_with_neighbor_dtw(self, src_index): + """ + No optimization algorithm to reduce the next steps range, just calculate distance of all path. + """ + from fastdtw import fastdtw + distance = {} + for dist_index in range(src_index + 1, self.graph.num_nodes - 1): + src = self.nodes[src_index] + dist = self.nodes[dist_index] + calc_layer_len = min(len(self.degree_list[src]), \ + len(self.degree_list[dist])) + distance_iteration = 0.0 + distance[src, dist] = {} + for layer in range(0, calc_layer_len): + src_layer = self.degree_list[src][layer] + dist_layer = self.degree_list[dist][layer] + weight, path = fastdtw( + src_layer, + dist_layer, + radius=1, + dist=self.distance_calc_func) + distance_iteration += weight + distance[src, dist][layer] = distance_iteration + return distance + + def calc_distances_between_nodes(self): + """ + Use the dtw algorithm to calculate the distance between nodes. + """ + from fastdtw import fastdtw + from pathos.multiprocessing import Pool + # decide use which algo to use + if self.opt1 == True: + self.distance_calc_func = self.distance_opt1_func + else: + self.distance_calc_func = self.distance_func + + dtws = [] + if self.opt2: + depth = 0 + for node in self.nodes: + if node in self.degree_list: + if depth in self.degree_list[node]: + degree = self.degree_list[node][depth] + if args.opt1: + degree = degree[0][0] + else: + degree = degree[0] + if degree not in self.degree2nodes: + self.degree2nodes[degree] = [] + if node not in self.node2degree: + self.node2degree[node] = degree + self.degree2nodes[degree].append(node) + # select the log(n) node to select data + degree_keys = self.degree2nodes.keys() + degree_keys = np.array(list(degree_keys), dtype='int') + self.degrees_sorted = list(np.sort(degree_keys)) + selected_nbh_nums = 2 * math.log(self.graph.num_nodes - 1, 2) + self.selected_nbh_nums = selected_nbh_nums + + pool = Pool(10) + dtws = pool.map(self.calc_node_with_neighbor_dtw_opt2, self.nodes) + pool.close() + pool.join() + else: + src_indices = range(0, self.graph.num_nodes - 2) + + pool = Pool(10) + dtws = pool.map(self.calc_node_with_neighbor_dtw, src_indices) + pool.close() + pool.join() + print('calc the dtw done.') + for dtw in dtws: + self.distance.update(dtw) + + def normlization_layer_weight(self): + """ + Normlation the distance between nodes, weight[1, 2, ....N] = distance[1, 2, ......N] / sum(distance) + """ + for sd_keys, layer_weight in self.distance.items(): + src, dist = sd_keys + layers, weights = layer_weight.keys(), layer_weight.values() + for layer, weight in zip(layers, weights): + if layer not in self.layer_distance: + self.layer_distance[layer] = {} + if layer not in self.layer_message: + self.layer_message[layer] = {} + self.layer_distance[layer][src, dist] = weight + + if src not in self.layer_message[layer]: + self.layer_message[layer][src] = [] + if dist not in self.layer_message[layer]: + self.layer_message[layer][dist] = [] + self.layer_message[layer][src].append(dist) + self.layer_message[layer][dist].append(src) + + # normalization the layer weight + for i in range(0, self.depth): + layer_weight = 0.0 + layer_count = 0 + if i not in self.layer_norm_distance: + self.layer_norm_distance[i] = {} + if i not in self.sample_alias: + self.sample_alias[i] = {} + if i not in self.sample_events: + self.sample_events[i] = {} + if i not in self.layer_message: + continue + for node in self.nodes: + if node not in self.layer_message[i]: + continue + nbhs = self.layer_message[i][node] + weights = [] + sum_weight = 0.0 + for dist in nbhs: + if (node, dist) in self.layer_distance[i]: + weight = self.layer_distance[i][node, dist] + else: + weight = self.layer_distance[i][dist, node] + weight = np.exp(-float(weight)) + weights.append(weight) + # norm the weight + sum_weight = sum(weights) + if sum_weight == 0.0: + sum_weight = 1.0 + weight_list = [weight / sum_weight for weight in weights] + self.layer_norm_distance[i][node] = weight_list + alias, events = alias_sample_build_table(np.array(weight_list)) + self.sample_alias[i][node] = alias + self.sample_events[i][node] = events + layer_weight += 1.0 + #layer_weight += sum(weight_list) + layer_count += len(weights) + layer_avg_weight = layer_weight / (1.0 * layer_count) + + self.layer_node_weight_count[i] = dict() + for node in self.nodes: + if node not in self.layer_norm_distance[i]: + continue + weight_list = self.layer_norm_distance[i][node] + node_cnt = 0 + for weight in weight_list: + if weight > layer_avg_weight: + node_cnt += 1 + self.layer_node_weight_count[i][node] = node_cnt + + def choose_neighbor_alias_method(self, node, layer): + """ + Choose the neighhor with strategy of random + """ + weight_list = self.layer_norm_distance[layer][node] + neighbors = self.layer_message[layer][node] + select_idx = alias_sample(1, self.sample_alias[layer][node], + self.sample_events[layer][node]) + return neighbors[select_idx[0]] + + def choose_layer_to_walk(self, node, layer): + """ + Choose the layer to random walk + """ + random_value = random.random() + higher_neigbours_nums = self.layer_node_weight_count[layer][node] + prob = math.log(higher_neigbours_nums + math.e) + prob = prob / (1.0 + prob) + if random_value > prob: + if layer > 0: + layer = layer - 1 + else: + if layer + 1 in self.layer_message and \ + node in self.layer_message[layer + 1]: + layer = layer + 1 + return layer + + def executor_random_walk(self, walk_process_id): + """ + The main function to execute the structual random walk + """ + nodes = self.nodes + random.shuffle(nodes) + walk_path_all_nodes = [] + for node in nodes: + walk_path = [] + walk_path.append(node) + layer = 0 + while len(walk_path) < self.walk_depth: + prop = random.random() + if prop < 0.3: + node = self.choose_neighbor_alias_method(node, layer) + walk_path.append(node) + else: + layer = self.choose_layer_to_walk(node, layer) + walk_path_all_nodes.append(walk_path) + return walk_path_all_nodes + + def random_walk_structual_sim(self): + """ + According to struct distance to walk the path + """ + from pathos.multiprocessing import Pool + print('start process struc2vec random walk.') + walks_process_ids = [i for i in range(0, self.num_walks)] + pool = Pool(10) + walks = pool.map(self.executor_random_walk, walks_process_ids) + pool.close() + pool.join() + + #save the final walk result + file_result = open(args.tag + "_walk_path", "w") + for walk in walks: + for walk_node in walk: + walk_node_str = " ".join([str(node) for node in walk_node]) + file_result.write(walk_node_str + "\n") + file_result.close() + print('process struc2vec random walk done.') + + +def learning_embedding_from_struc2vec(args): + """ + Learning the word2vec from the random path + """ + from gensim.models import Word2Vec + from gensim.models.word2vec import LineSentence + struc_walks = LineSentence(args.tag + "_walk_path") + model = Word2Vec(struc_walks, size=args.w2v_emb_size, window=args.w2v_window_size, iter=args.w2v_epoch, \ + min_count=0, hs=1, sg=1, workers=5) + model.wv.save_word2vec_format(args.emb_file) + + +def main(args): + """ + The main fucntion to run the algorithm struc2vec + """ + if args.train: + dataset = EdgeDataset( + undirected=args.undirected, data_dir=args.edge_file) + graph = StrucVecGraph(dataset.graph, dataset.nodes, args.opt1, args.opt2, args.opt3, args.depth,\ + args.num_walks, args.walk_depth) + graph.output_degree_with_depth(args.depth, args.opt1) + graph.calc_distances_between_nodes() + graph.normlization_layer_weight() + graph.random_walk_structual_sim() + learning_embedding_from_struc2vec(args) + file_label = open(args.label_file) + file_label_reindex = open(args.label_file + "_reindex", "w") + for line in file_label: + items = line.strip("\n\r").split(" ") + try: + items = [int(item) for item in items] + except: + continue + if items[0] not in dataset.node_dict: + continue + reindex = dataset.node_dict[items[0]] + file_label_reindex.write(str(reindex) + " " + str(items[1]) + "\n") + file_label_reindex.close() + + if args.valid: + emb_file = open(args.emb_file) + file_label_reindex = open(args.label_file + "_reindex") + label_dict = dict() + for line in file_label_reindex: + items = line.strip("\n\r").split(" ") + try: + label_dict[int(items[0])] = int(items[1]) + except: + continue + + data_for_train_valid = [] + for line in emb_file: + items = line.strip("\n\r").split(" ") + if len(items) <= 2: + continue + index = int(items[0]) + label = int(label_dict[index]) + sample = [] + sample.append(index) + feature_emb = items[1:] + feature_emb = [float(feature) for feature in feature_emb] + sample.extend(feature_emb) + sample.append(label) + data_for_train_valid.append(sample) + train_lr_l2_model(args, data_for_train_valid) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='struc2vec') + parser.add_argument("--edge_file", type=str, default="") + parser.add_argument("--label_file", type=str, default="") + parser.add_argument("--emb_file", type=str, default="w2v_emb") + parser.add_argument("--undirected", type=bool, default=True) + parser.add_argument("--depth", type=int, default=8) + parser.add_argument("--num_walks", type=int, default=10) + parser.add_argument("--walk_depth", type=int, default=80) + parser.add_argument("--opt1", type=bool, default=False) + parser.add_argument("--opt2", type=bool, default=False) + parser.add_argument("--opt3", type=bool, default=False) + parser.add_argument("--w2v_emb_size", type=int, default=128) + parser.add_argument("--w2v_window_size", type=int, default=10) + parser.add_argument("--w2v_epoch", type=int, default=5) + parser.add_argument("--train", type=bool, default=False) + parser.add_argument("--valid", type=bool, default=False) + parser.add_argument("--lr", type=float, default=0.0001) + parser.add_argument("--num_class", type=int, default=4) + parser.add_argument("--epoch", type=int, default=2000) + parser.add_argument("--tag", type=str, default="") + + args = parser.parse_args() + main(args) diff --git a/examples/unsup_graphsage/model.py b/examples/unsup_graphsage/model.py new file mode 100644 index 0000000..dea1f13 --- /dev/null +++ b/examples/unsup_graphsage/model.py @@ -0,0 +1,140 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""model.py""" +import paddle +import paddle.fluid as fluid + + +def copy_send(src_feat, dst_feat, edge_feat): + """copy_send""" + return src_feat["h"] + + +def mean_recv(feat): + """mean_recv""" + return fluid.layers.sequence_pool(feat, pool_type="average") + + +def sum_recv(feat): + """sum_recv""" + return fluid.layers.sequence_pool(feat, pool_type="sum") + + +def max_recv(feat): + """max_recv""" + return fluid.layers.sequence_pool(feat, pool_type="max") + + +def lstm_recv(feat): + """lstm_recv""" + hidden_dim = 128 + forward, _ = fluid.layers.dynamic_lstm( + input=feat, size=hidden_dim * 4, use_peepholes=False) + output = fluid.layers.sequence_last_step(forward) + return output + + +def graphsage_mean(gw, feature, hidden_size, act, name): + """graphsage_mean""" + msg = gw.send(copy_send, nfeat_list=[("h", feature)]) + neigh_feature = gw.recv(msg, mean_recv) + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_meanpool(gw, + feature, + hidden_size, + act, + name, + inner_hidden_size=512): + """graphsage_meanpool""" + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + msg = gw.send(copy_send, nfeat_list=[("h", neigh_feature)]) + neigh_feature = gw.recv(msg, mean_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_maxpool(gw, + feature, + hidden_size, + act, + name, + inner_hidden_size=512): + """graphsage_maxpool""" + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + msg = gw.send(copy_send, nfeat_list=[("h", neigh_feature)]) + neigh_feature = gw.recv(msg, max_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output + + +def graphsage_lstm(gw, feature, hidden_size, act, name): + """graphsage_lstm""" + inner_hidden_size = 128 + neigh_feature = fluid.layers.fc(feature, inner_hidden_size, act="relu") + + hidden_dim = 128 + forward_proj = fluid.layers.fc(input=neigh_feature, + size=hidden_dim * 4, + bias_attr=False, + name="lstm_proj") + msg = gw.send(copy_send, nfeat_list=[("h", forward_proj)]) + neigh_feature = gw.recv(msg, lstm_recv) + neigh_feature = fluid.layers.fc(neigh_feature, + hidden_size, + act=act, + name=name + '_r') + + self_feature = feature + self_feature = fluid.layers.fc(self_feature, + hidden_size, + act=act, + name=name + '_l') + output = fluid.layers.concat([self_feature, neigh_feature], axis=1) + output = fluid.layers.l2_normalize(output, axis=1) + return output diff --git a/examples/unsup_graphsage/reader.py b/examples/unsup_graphsage/reader.py new file mode 100644 index 0000000..a0c8e4a --- /dev/null +++ b/examples/unsup_graphsage/reader.py @@ -0,0 +1,214 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""reader.py""" +import os +import numpy as np +import pickle as pkl +import paddle +import paddle.fluid as fluid +import pgl +import time +from pgl.utils.logger import log +from pgl.utils import mp_reader + + +def batch_iter(data, batch_size): + """batch_iter""" + src, dst, eid = data + perm = np.arange(len(eid)) + np.random.shuffle(perm) + start = 0 + while start < len(src): + index = perm[start:start + batch_size] + start += batch_size + yield src[index], dst[index], eid[index] + + +def traverse(item): + """traverse""" + if isinstance(item, list) or isinstance(item, np.ndarray): + for i in iter(item): + for j in traverse(i): + yield j + else: + yield item + + +def flat_node_and_edge(nodes, eids): + """flat_node_and_edge""" + nodes = list(set(traverse(nodes))) + eids = list(set(traverse(eids))) + return nodes, eids + + +def graph_reader(num_layers, + graph_wrappers, + data, + batch_size, + samples, + num_workers, + feed_name_list, + use_pyreader=False, + graph=None, + predict=False): + """graph_reader + """ + assert num_layers == len(samples), "Must be unified number of layers!" + if num_workers > 1: + return multiprocess_graph_reader( + num_layers, + graph_wrappers, + data, + batch_size, + samples, + num_workers, + feed_name_list, + use_pyreader, + graph=graph, + predict=predict) + + batch_info = list(batch_iter(data, batch_size=batch_size)) + work = worker( + num_layers, + batch_info, + graph_wrappers, + samples, + feed_name_list, + use_pyreader, + graph=graph, + predict=predict) + + def reader(): + """reader""" + for batch in work(): + yield batch + + return reader + #return paddle.reader.buffered(reader, 100) + + +def worker(num_layers, batch_info, graph_wrappers, samples, feed_name_list, + use_pyreader, graph, predict): + """worker + """ + pid = os.getppid() + np.random.seed((int(time.time() * 10000) + pid) % 65535) + + graphs = [graph, graph] + + def work(): + """work + """ + feed_dict = {} + ind = 0 + perm = np.arange(0, len(batch_info)) + np.random.shuffle(perm) + for p in perm: + batch_src, batch_dst, batch_eid = batch_info[p] + ind += 1 + ind_start = time.time() + try: + nodes = start_nodes = np.concatenate([batch_src, batch_dst], 0) + eids = [] + layer_nodes, layer_eids = [], [] + for layer_idx in reversed(range(num_layers)): + if len(start_nodes) == 0: + layer_nodes = [nodes] + layer_nodes + layer_eids = [eids] + layer_eids + continue + pred_nodes, pred_eids = graphs[ + layer_idx].sample_predecessor( + start_nodes, samples[layer_idx], return_eids=True) + last_nodes = nodes + nodes, eids = flat_node_and_edge([nodes, pred_nodes], + [eids, pred_eids]) + layer_nodes = [nodes] + layer_nodes + layer_eids = [eids] + layer_eids + # Find new nodes + start_nodes = list(set(nodes) - set(last_nodes)) + if predict is False: + eids = (batch_eid * 2 + 1).tolist() + (batch_eid * 2 + ).tolist() + layer_eids[0] = list(set(layer_eids[0]) - set(eids)) + + # layer_nodes[0]: use first layer nodes as all subgraphs' nodes + subgraph = graphs[0].subgraph( + nodes=layer_nodes[0], eid=layer_eids[0]) + node_feat = np.array(layer_nodes[0], dtype="int64") + subgraph.node_feat["index"] = node_feat + + except Exception as e: + print(e) + if len(feed_dict) > 0: + yield feed_dict + continue + feed_dict = graph_wrappers[0].to_feed(subgraph) + + # only reindex from first subgraph + sub_src_idx = subgraph.reindex_from_parrent_nodes(batch_src) + sub_dst_idx = subgraph.reindex_from_parrent_nodes(batch_dst) + + feed_dict["src_index"] = sub_src_idx.astype("int64") + feed_dict["dst_index"] = sub_dst_idx.astype("int64") + if predict: + feed_dict["node_id"] = batch_src.astype("int64") + + if use_pyreader: + yield [feed_dict[name] for name in feed_name_list] + else: + yield feed_dict + + return work + + +def multiprocess_graph_reader(num_layers, graph_wrappers, data, batch_size, + samples, num_workers, feed_name_list, + use_pyreader, graph, predict): + """ multiprocess_graph_reader + """ + + def parse_to_subgraph(rd): + """ parse_to_subgraph + """ + + def work(): + """ work + """ + for data in rd(): + yield data + + return work + + def reader(): + """ reader + """ + batch_info = list(batch_iter(data, batch_size=batch_size)) + log.info("The size of batch:%d" % (len(batch_info))) + block_size = int(len(batch_info) / num_workers + 1) + reader_pool = [] + for i in range(num_workers): + reader_pool.append( + worker(num_layers, batch_info[block_size * i:block_size * ( + i + 1)], graph_wrappers, samples, feed_name_list, + use_pyreader, graph, predict)) + use_pipe = True + multi_process_sample = mp_reader.multiprocess_reader( + reader_pool, use_pipe=use_pipe) + r = parse_to_subgraph(multi_process_sample) + if use_pipe: + return paddle.reader.buffered(r, 5 * num_workers) + else: + return r + + return reader() diff --git a/examples/unsup_graphsage/sample.txt b/examples/unsup_graphsage/sample.txt new file mode 100644 index 0000000..731d556 --- /dev/null +++ b/examples/unsup_graphsage/sample.txt @@ -0,0 +1,2000 @@ +265 1599 +979 1790 +650 1488 +638 1310 +962 1916 +239 1958 +103 1763 +918 1874 +599 1924 +47 1691 +272 1978 +550 1583 +163 1142 +561 1458 +211 1447 +188 1529 +983 1039 +68 1923 +715 1900 +657 1555 +338 1937 +379 1409 +19 1978 +224 1420 +755 1499 +618 1172 +766 1294 +401 1188 +89 1257 +149 1048 +835 1526 +358 1858 +218 1187 +227 1022 +530 1643 +197 1255 +529 1672 +960 1558 +519 1176 +433 1093 +347 1495 +572 1877 +505 1047 +988 1587 +125 1249 +555 1942 +614 1586 +836 1681 +628 1076 +28 1693 +519 1398 +133 1136 +883 1493 +158 1441 +568 1928 +723 1585 +488 1331 +719 1471 +265 1113 +174 1799 +722 1226 +744 1467 +807 1075 +839 1393 +664 1380 +689 1552 +36 1864 +211 1611 +90 1444 +819 1428 +241 1551 +746 1599 +72 1098 +712 1787 +54 1575 +677 1485 +289 1007 +289 1079 +907 1144 +7 1983 +655 1272 +638 1047 +849 1957 +492 1278 +453 1304 +657 1807 +367 1002 +141 1346 +688 1450 +984 1749 +255 1240 +156 1625 +731 1051 +211 1922 +165 1805 +765 1054 +794 1555 +709 1747 +822 1099 +805 1774 +422 1240 +728 1679 +55 1299 +314 1808 +781 1689 +558 1605 +707 1110 +510 1705 +956 1064 +568 1132 +267 1257 +868 1269 +690 1453 +858 1602 +826 1373 +338 1650 +335 1453 +458 1340 +0 1818 +729 1694 +25 1816 +679 1109 +323 1609 +614 1457 +342 1028 +436 1081 +932 1139 +190 1821 +808 1623 +717 1267 +950 1265 +177 1956 +97 1380 +500 1744 +232 1582 +119 1015 +656 1462 +730 1007 +860 1142 +771 1989 +784 1623 +976 1084 +770 1642 +527 1515 +784 1943 +527 1578 +718 1396 +942 1089 +661 1705 +787 1800 +893 1932 +849 1395 +758 1482 +424 1148 +873 1470 +896 1333 +465 1021 +137 1507 +718 1027 +7 1045 +285 1932 +371 1468 +51 1692 +249 1358 +898 1858 +688 1213 +419 1289 +328 1326 +764 1786 +142 1399 +905 1738 +976 1295 +715 1537 +994 1393 +479 1291 +165 1560 +308 1446 +691 1728 +779 1162 +320 1989 +745 1579 +586 1426 +142 1517 +45 1317 +657 1339 +191 1780 +801 1216 +124 1414 +344 1717 +682 1383 +216 1891 +24 1759 +207 1080 +707 1699 +212 1606 +902 1435 +525 1174 +349 1299 +380 1840 +265 1294 +352 1390 +439 1410 +984 1481 +423 1499 +261 1484 +70 1033 +192 1909 +36 1960 +823 1109 +132 1418 +992 1257 +126 1548 +872 1488 +287 1645 +108 1836 +990 1314 +450 1119 +132 1549 +0 1003 +748 1373 +841 1475 +75 1987 +880 1458 +447 1443 +122 1385 +209 1022 +74 1724 +355 1688 +742 1892 +900 1092 +48 1220 +525 1221 +817 1010 +957 1212 +713 1558 +504 1851 +84 1860 +695 1187 +326 1524 +33 1647 +864 1637 +905 1637 +280 1617 +47 1034 +781 1137 +792 1319 +901 1850 +183 1511 +571 1725 +111 1957 +222 1030 +794 1169 +147 1973 +588 1789 +24 1581 +597 1471 +106 1786 +432 1146 +447 1325 +521 1444 +968 1417 +13 1075 +521 1478 +853 1294 +550 1550 +673 1426 +150 1684 +369 1737 +994 1038 +601 1397 +616 1400 +958 1028 +279 1177 +920 1180 +878 1584 +661 1852 +225 1631 +793 1401 +507 1289 +177 1818 +551 1836 +473 1065 +723 1383 +337 1938 +81 1601 +62 1139 +928 1853 +122 1946 +260 1289 +541 1378 +934 1069 +52 1311 +689 1420 +307 1862 +811 1691 +636 1885 +405 1883 +337 1132 +645 1261 +969 1224 +823 1106 +727 1066 +763 1126 +54 1168 +677 1750 +699 1223 +744 1183 +343 1883 +152 1440 +534 1665 +79 1853 +272 1581 +92 1309 +756 1884 +460 1305 +595 1868 +469 1904 +552 1067 +422 1318 +673 1843 +403 1174 +224 1445 +181 1566 +389 1618 +936 1479 +80 1002 +291 1611 +776 1201 +57 1495 +397 1053 +807 1810 +763 1374 +648 1054 +869 1432 +169 1083 +891 1318 +270 1200 +833 1663 +970 1653 +363 1637 +188 1192 +116 1751 +110 1035 +204 1216 +524 1995 +914 1426 +289 1814 +357 1521 +366 1808 +176 1775 +650 1959 +775 1062 +781 1712 +396 1798 +725 1577 +864 1497 +540 1188 +321 1623 +995 1622 +719 1299 +72 1656 +348 1728 +141 1547 +722 1095 +64 1689 +747 1143 +892 1758 +381 1463 +693 1199 +89 1555 +576 1313 +253 1809 +878 1466 +954 1776 +365 1366 +716 1351 +707 1441 +325 1167 +63 1385 +430 1225 +479 1159 +13 1185 +731 1653 +373 1529 +271 1904 +631 1111 +114 1758 +502 1983 +685 1261 +719 1932 +1 1646 +738 1698 +432 1294 +197 1463 +293 1626 +434 1457 +315 1481 +552 1877 +100 1103 +294 1569 +689 1377 +84 1142 +631 1935 +87 1508 +560 1358 +5 1787 +65 1877 +114 1948 +536 1435 +223 1753 +494 1230 +139 1335 +55 1306 +481 1253 +326 1662 +7 1171 +663 1992 +353 1586 +693 1397 +70 1498 +902 1897 +729 1627 +838 1296 +9 1528 +633 1988 +216 1535 +813 1534 +528 1061 +130 1705 +889 1019 +278 1810 +937 1399 +286 1498 +166 1574 +725 1506 +202 1018 +306 1420 +553 1717 +755 1731 +561 1619 +147 1981 +862 1065 +349 1219 +573 1137 +336 1871 +473 1511 +342 1051 +983 1181 +798 1663 +197 1930 +164 1477 +954 1083 +695 1879 +964 1046 +638 1817 +404 1886 +927 1211 +554 1115 +88 1417 +345 1165 +383 1551 +412 1484 +305 1532 +57 1380 +171 1550 +15 1082 +941 1507 +199 1774 +787 1953 +125 1398 +336 1958 +640 1851 +251 1127 +740 1306 +302 1217 +786 1014 +706 1811 +835 1851 +978 1262 +629 1944 +429 1202 +714 1954 +153 1381 +103 1759 +268 1286 +346 1808 +420 1343 +947 1467 +668 1857 +833 1736 +600 1008 +137 1649 +452 1985 +480 1545 +212 1182 +150 1726 +784 1217 +362 1595 +763 1365 +68 1395 +195 1041 +92 1599 +314 1397 +971 1003 +606 1914 +711 1706 +699 1056 +119 1593 +367 1476 +725 1098 +432 1234 +684 1255 +469 1606 +440 1086 +200 1848 +294 1144 +449 1888 +376 1225 +796 1352 +767 1447 +713 1845 +223 1333 +119 1797 +752 1927 +627 1464 +279 1488 +40 1562 +62 1149 +771 1058 +600 1911 +625 1164 +366 1416 +714 1530 +513 1935 +419 1485 +963 1665 +459 1648 +977 1522 +890 1521 +931 1566 +622 1838 +158 1958 +848 1520 +357 1275 +43 1440 +404 1772 +788 1930 +841 1832 +845 1281 +516 1121 +423 1130 +86 1619 +863 1928 +195 1789 +167 1944 +589 1093 +146 1206 +74 1133 +819 1445 +678 1004 +752 1725 +366 1604 +903 1738 +882 1858 +561 1195 +436 1980 +77 1894 +353 1879 +561 1166 +989 1964 +624 1013 +572 1704 +272 1077 +509 1242 +770 1001 +279 1392 +621 1924 +542 1766 +555 1951 +577 1598 +531 1148 +806 1401 +497 1115 +872 1309 +387 1880 +430 1485 +295 1175 +400 1774 +941 1522 +336 1032 +806 1873 +576 1422 +566 1974 +241 1847 +215 1645 +670 1804 +831 1834 +734 1091 +16 1641 +952 1975 +299 1587 +442 1032 +702 1341 +570 1405 +633 1651 +444 1731 +980 1774 +381 1729 +900 1661 +875 1274 +968 1095 +894 1805 +683 1961 +130 1549 +963 1350 +817 1864 +190 1281 +91 1657 +208 1194 +621 1911 +447 1338 +538 1343 +234 1534 +765 1920 +632 1263 +96 1090 +121 1659 +47 1975 +856 1354 +601 1061 +480 1236 +808 1487 +866 1999 +861 1892 +667 1124 +425 1307 +90 1002 +725 1337 +134 1749 +272 1587 +567 1276 +43 1332 +715 1084 +967 1477 +62 1731 +244 1540 +317 1112 +893 1108 +242 1443 +688 1544 +937 1475 +761 1912 +994 1219 +827 1193 +420 1966 +109 1691 +482 1767 +564 1146 +372 1215 +954 1348 +422 1045 +987 1040 +471 1247 +919 1824 +190 1615 +874 1879 +251 1198 +611 1575 +121 1733 +596 1950 +791 1492 +504 1201 +153 1680 +719 1967 +964 1095 +889 1106 +732 1770 +967 1631 +351 1061 +912 1835 +911 1925 +501 1502 +810 1406 +948 1718 +928 1080 +384 1940 +330 1301 +143 1081 +412 1649 +686 1840 +178 1544 +266 1121 +528 1714 +296 1156 +220 1753 +726 1679 +126 1416 +364 1424 +625 1539 +721 1708 +805 1639 +384 1157 +553 1693 +570 1877 +511 1984 +774 1254 +354 1949 +823 1162 +281 1204 +657 1774 +578 1943 +902 1764 +859 1063 +543 1845 +815 1052 +430 1118 +22 1210 +477 1586 +872 1692 +478 1943 +630 1850 +928 1247 +893 1126 +757 1774 +133 1275 +740 1101 +117 1200 +931 1120 +259 1184 +16 1782 +447 1131 +637 1498 +472 1859 +760 1877 +303 1511 +903 1074 +795 1227 +398 1450 +28 1339 +428 1891 +476 1680 +934 1409 +78 1737 +467 1075 +126 1830 +0 1421 +783 1357 +584 1061 +139 1166 +122 1768 +735 1219 +202 1684 +867 1405 +619 1176 +843 1833 +553 1239 +287 1080 +373 1780 +65 1816 +227 1871 +45 1701 +38 1281 +46 1077 +911 1708 +137 1478 +20 1550 +822 1631 +831 1527 +13 1001 +509 1096 +31 1751 +196 1123 +379 1614 +777 1288 +364 1222 +478 1070 +460 1580 +986 1340 +696 1498 +679 1139 +713 1343 +91 1691 +602 1696 +377 1770 +253 1021 +957 1179 +500 1423 +487 1281 +821 1652 +180 1122 +443 1247 +583 1289 +676 1258 +781 1693 +718 1500 +832 1662 +555 1029 +575 1595 +145 1801 +471 1769 +491 1388 +269 1241 +159 1428 +631 1698 +478 1268 +925 1141 +583 1096 +759 1592 +967 1352 +862 1444 +119 1991 +534 1602 +526 1226 +880 1614 +236 1615 +448 1600 +752 1041 +25 1127 +445 1853 +414 1058 +127 1913 +512 1080 +158 1522 +787 1287 +664 1744 +914 1335 +899 1630 +187 1279 +951 1942 +884 1777 +529 1937 +395 1590 +478 1066 +790 1518 +286 1614 +640 1528 +882 1707 +102 1303 +716 1794 +919 1605 +859 1759 +236 1321 +858 1608 +732 1506 +435 1263 +93 1508 +813 1260 +640 1668 +607 1185 +402 1039 +943 1569 +523 1415 +511 1786 +637 1934 +10 1885 +507 1375 +544 1988 +709 1537 +342 1717 +324 1393 +216 1090 +788 1753 +362 1308 +64 1576 +811 1726 +555 1636 +944 1715 +259 1251 +141 1888 +48 1290 +570 1331 +957 1104 +223 1233 +494 1531 +423 1433 +151 1266 +704 1002 +694 1685 +740 1001 +174 1537 +947 1359 +49 1891 +875 1386 +274 1621 +918 1610 +631 1564 +961 1960 +702 1642 +871 1489 +384 1642 +932 1559 +886 1097 +842 1143 +950 1971 +83 1986 +944 1135 +168 1923 +900 1611 +684 1389 +540 1749 +123 1265 +673 1617 +952 1921 +767 1401 +696 1941 +868 1536 +515 1953 +438 1757 +430 1411 +661 1193 +527 1882 +147 1145 +225 1101 +710 1671 +579 1255 +30 1920 +906 1298 +333 1635 +214 1127 +362 1189 +878 1530 +808 1842 +419 1559 +861 1291 +743 1043 +333 1257 +186 1604 +141 1957 +751 1236 +573 1937 +908 1460 +627 1155 +726 1885 +332 1888 +267 1040 +28 1660 +194 1200 +971 1788 +861 1122 +582 1397 +176 1091 +397 1678 +730 1307 +309 1860 +881 1255 +701 1068 +750 1103 +755 1843 +834 1786 +900 1837 +433 1601 +897 1464 +593 1661 +451 1638 +953 1101 +122 1123 +220 1792 +35 1933 +726 1751 +715 1411 +662 1307 +197 1322 +125 1658 +478 1700 +772 1881 +547 1822 +910 1280 +924 1933 +79 1740 +466 1567 +53 1768 +500 1502 +572 1048 +751 1194 +18 1187 +374 1480 +158 1135 +712 1686 +171 1466 +25 1036 +144 1847 +664 1937 +301 1129 +641 1880 +147 1709 +885 1911 +631 1910 +338 1914 +628 1257 +909 1333 +970 1790 +971 1691 +260 1724 +693 1946 +857 1056 +918 1053 +612 1838 +479 1407 +626 1359 +273 1709 +633 1008 +364 1434 +393 1873 +294 1300 +657 1988 +355 1639 +635 1468 +914 1350 +916 1148 +305 1381 +131 1748 +756 1484 +758 1203 +825 1062 +152 1209 +441 1164 +63 1885 +864 1797 +165 1036 +124 1548 +246 1053 +810 1398 +127 1091 +277 1028 +860 1069 +700 1933 +338 1962 +211 1770 +809 1483 +489 1507 +123 1382 +669 1030 +180 1996 +972 1922 +723 1670 +647 1683 +422 1440 +391 1204 +178 1071 +421 1598 +729 1466 +339 1403 +419 1326 +407 1011 +479 1867 +722 1076 +662 1802 +110 1438 +759 1868 +22 1458 +725 1648 +958 1753 +814 1656 +673 1044 +962 1020 +475 1523 +882 1513 +802 1227 +863 1121 +772 1677 +714 1072 +112 1047 +422 1664 +419 1718 +60 1864 +570 1683 +536 1673 +581 1789 +894 1074 +739 1311 +805 1863 +861 1750 +55 1748 +47 1833 +101 1108 +872 1008 +926 1907 +909 1021 +53 1233 +617 1349 +674 1909 +507 1567 +855 1723 +690 1171 +973 1859 +686 1210 +49 1435 +146 1915 +357 1620 +208 1724 +76 1583 +133 1191 +619 1426 +190 1497 +228 1868 +365 1144 +360 1770 +329 1142 +672 1408 +91 1997 +986 1299 +654 1333 +93 1475 +146 1307 +62 1772 +502 1058 +382 1427 +181 1739 +74 1104 +170 1684 +466 1861 +147 1747 +162 1027 +499 1903 +813 1621 +591 1379 +227 1518 +110 1999 +781 1791 +415 1744 +257 1846 +942 1601 +628 1696 +317 1001 +27 1681 +80 1078 +794 1279 +330 1237 +830 1994 +728 1673 +204 1943 +295 1422 +159 1499 +207 1019 +110 1497 +439 1526 +201 1323 +620 1723 +501 1157 +305 1604 +878 1784 +483 1653 +262 1539 +21 1967 +191 1836 +199 1821 +500 1910 +232 1499 +104 1750 +868 1607 +288 1013 +434 1368 +874 1055 +870 1257 +219 1143 +990 1924 +70 1764 +207 1575 +1 1364 +405 1498 +414 1507 +65 1704 +868 1415 +256 1962 +886 1425 +834 1587 +770 1842 +74 1070 +778 1750 +550 1592 +484 1948 +669 1401 +610 1909 +480 1784 +182 1147 +842 1670 +272 1923 +371 1407 +574 1985 +978 1300 +369 1286 +884 1459 +322 1261 +456 1418 +261 1718 +330 1708 +83 1249 +473 1188 +542 1281 +551 1262 +801 1288 +372 1574 +676 1927 +44 1222 +190 1020 +284 1513 +866 1845 +828 1977 +620 1854 +288 1086 +367 1606 +71 1770 +114 1316 +571 1850 +224 1272 +406 1095 +902 1571 +576 1886 +576 1562 +767 1443 +644 1201 +295 1009 +944 1751 +90 1708 +663 1042 +283 1708 +758 1027 +851 1684 +537 1204 +271 1697 +541 1885 +973 1218 +694 1904 +822 1999 +194 1872 +276 1297 +909 1886 +312 1706 +516 1473 +844 1236 +62 1617 +366 1866 +127 1474 +743 1215 +286 1096 +87 1795 +69 1711 +757 1530 +333 1844 +257 1796 +515 1491 +66 1851 +117 1510 +18 1967 +553 1979 +267 1060 +99 1321 +861 1155 +506 1067 +944 1727 +964 1171 +329 1159 +856 1018 +858 1931 +765 1617 +951 1457 +903 1184 +241 1717 +285 1533 +320 1286 +409 1400 +924 1999 +719 1501 +14 1550 +866 1246 +86 1987 +868 1551 +620 1495 +285 1918 +810 1733 +754 1871 +755 1418 +394 1528 +839 1856 +927 1964 +321 1381 +758 1337 +635 1986 +404 1038 +854 1124 +600 1507 +342 1517 +756 1567 +498 1350 +944 1048 +481 1899 +904 1335 +412 1492 +218 1021 +636 1556 +417 1354 +116 1960 +173 1267 +525 1086 +312 1389 +973 1064 +619 1103 +987 1394 +447 1188 +862 1969 +930 1485 +419 1157 +756 1787 +860 1821 +58 1662 +353 1437 +345 1290 +753 1889 +412 1688 +37 1319 +753 1201 +136 1253 +949 1592 +459 1756 +976 1522 +450 1868 +936 1384 +393 1653 +385 1936 +704 1840 +616 1709 +786 1438 +291 1830 +848 1112 +975 1595 +967 1231 +741 1672 +160 1217 +254 1634 +530 1610 +0 1445 +170 1236 +164 1316 +127 1330 +302 1627 +953 1449 +156 1583 +784 1210 +226 1551 +397 1325 +564 1825 +42 1027 +725 1612 +114 1802 +483 1384 +684 1352 +463 1908 +978 1226 +445 1217 +800 1969 +556 1274 +49 1049 +777 1808 +732 1982 +749 1590 +574 1433 +462 1515 +637 1702 +344 1224 +489 1586 +45 1242 +755 1144 +716 1293 +319 1595 +831 1657 +154 1562 +396 1814 +657 1704 +442 1405 +898 1698 +970 1287 +967 1068 +25 1761 +211 1183 +691 1905 +466 1116 +99 1521 +834 1871 +408 1809 +8 1007 +483 1336 +485 1896 +849 1467 +192 1341 +779 1801 +678 1596 +276 1051 +709 1252 +759 1656 +27 1621 +273 1911 +697 1898 +450 1995 +688 1717 +52 1966 +920 1957 +437 1549 +533 1627 +130 1315 +392 1676 +73 1886 +650 1254 +352 1079 +165 1930 +388 1236 +426 1370 +625 1648 +457 1858 +17 1109 +926 1431 +853 1530 +90 1766 +586 1275 +894 1244 +331 1469 +447 1183 +132 1167 +230 1198 +501 1240 +440 1100 +58 1665 +85 1864 +913 1448 +738 1041 +486 1012 +162 1767 +877 1060 +10 1485 +514 1807 +224 1453 +781 1340 +311 1645 +720 1837 +259 1252 +54 1174 +788 1926 +375 1440 +23 1880 +977 1632 +389 1445 +38 1508 +517 1927 +798 1598 +483 1391 +541 1788 +46 1329 +816 1758 +158 1317 +900 1577 +369 1255 +227 1795 +37 1630 +813 1565 +965 1663 +953 1963 +503 1221 +223 1064 +161 1498 +717 1855 +527 1349 +773 1813 +522 1630 +767 1275 +582 1305 +541 1563 +79 1403 +794 1544 +74 1161 +548 1543 +18 1739 +516 1516 +697 1422 +259 1840 +195 1273 +412 1222 +571 1301 +203 1914 +420 1256 +327 1277 +894 1315 +929 1302 +773 1429 +302 1309 +488 1728 +403 1256 +549 1342 +940 1764 +524 1226 +409 1076 +233 1421 +753 1667 +664 1257 +359 1079 +291 1973 +199 1373 +654 1498 +645 1074 +481 1607 +432 1852 +692 1206 +498 1726 +586 1249 +555 1338 +107 1563 +473 1300 +51 1031 +345 1236 +757 1907 +548 1088 +680 1430 +349 1468 +435 1451 +884 1301 +683 1645 +280 1388 +84 1393 +585 1561 +86 1338 +261 1972 +941 1523 +306 1697 +718 1192 +930 1121 +726 1639 +617 1399 +939 1184 +511 1084 +832 1662 +377 1881 +371 1725 +393 1653 +415 1528 +254 1572 +927 1447 +848 1355 +797 1983 +613 1417 +127 1835 +715 1471 +974 1999 +355 1178 +675 1820 +415 1601 +593 1186 +648 1907 +922 1931 +859 1828 +110 1809 +547 1809 +944 1841 +106 1446 +635 1762 +866 1431 +199 1373 +595 1454 +991 1626 +903 1720 +989 1465 +509 1506 +168 1653 +742 1892 +644 1457 +972 1046 +87 1807 +79 1596 +24 1470 +313 1732 +772 1976 +226 1146 +835 1835 +107 1057 +430 1719 +203 1810 +643 1477 +30 1918 +889 1216 +750 1501 +180 1660 +71 1463 +966 1588 +261 1858 +829 1804 +774 1379 +342 1765 +328 1943 +296 1939 +937 1444 +628 1407 +0 1977 +233 1097 +359 1438 +910 1911 +963 1026 +942 1483 +706 1997 +682 1974 +900 1513 +298 1463 +893 1855 +322 1360 +604 1122 +948 1091 +828 1158 +682 1198 +466 1781 +661 1031 +884 1744 +891 1299 +688 1266 +89 1325 +3 1026 +299 1861 +413 1062 +775 1812 +560 1926 +799 1473 +936 1445 +537 1718 +591 1680 +202 1140 +906 1163 +977 1709 +482 1904 +345 1181 +486 1502 +445 1292 +305 1328 +87 1851 +803 1197 +94 1937 +574 1546 +643 1302 +704 1633 +536 1238 +329 1663 +737 1969 +663 1278 +335 1416 +873 1390 +705 1607 +139 1436 +740 1904 +974 1321 +338 1350 +694 1456 +779 1035 +639 1238 +603 1768 +245 1363 +390 1329 +141 1680 +483 1613 +226 1632 +820 1303 +424 1655 +54 1618 +399 1297 +130 1295 +169 1996 +78 1455 +525 1409 +741 1860 +887 1664 +347 1878 +391 1343 +66 1243 +287 1876 +35 1750 +492 1261 +789 1404 +917 1041 +937 1756 +69 1239 +218 1981 +142 1382 +882 1052 +757 1290 +178 1593 +962 1504 +781 1090 +648 1912 +207 1551 +472 1372 +937 1427 +37 1270 +511 1721 +208 1491 +299 1193 +167 1718 +781 1100 +689 1177 +732 1202 +852 1665 +556 1152 +256 1908 +261 1473 +918 1941 +755 1786 +77 1062 +208 1633 +451 1502 +181 1513 +311 1571 +240 1404 +470 1720 +913 1239 +947 1553 +706 1158 +215 1968 +912 1213 +684 1117 +560 1825 +787 1083 +764 1654 +566 1252 +238 1959 +953 1954 +985 1437 +835 1434 +88 1896 +469 1447 +655 1672 +760 1631 +919 1516 +683 1698 +811 1123 +911 1961 +302 1273 +344 1399 +89 1289 +936 1236 +395 1575 +417 1981 +10 1115 +878 1839 +213 1171 +484 1475 +460 1901 +708 1299 +320 1544 +965 1375 +451 1144 +116 1959 +143 1384 +843 1051 +368 1953 +994 1141 +704 1641 +385 1729 +240 1851 +967 1306 +719 1878 +726 1439 +550 1613 +261 1660 +550 1511 +154 1782 +12 1087 +328 1120 +618 1763 +422 1667 +519 1854 +639 1719 +942 1705 +814 1893 +576 1491 +139 1499 +422 1956 +95 1082 +676 1262 +287 1965 +60 1867 +713 1444 +435 1021 +606 1042 +86 1891 +58 1035 +311 1320 +140 1463 +82 1415 +756 1991 +505 1140 +510 1982 +701 1579 +428 1787 +388 1279 +446 1709 +222 1060 +550 1363 +798 1691 +219 1181 +137 1225 +828 1955 +721 1417 +82 1675 +854 1649 +203 1355 +352 1560 +582 1633 +118 1858 +771 1304 +321 1251 +392 1206 +958 1070 +684 1713 +939 1999 +592 1726 +56 1867 +592 1988 +736 1842 +958 1559 +989 1906 +183 1749 +462 1407 +294 1890 +771 1725 +1 1897 +49 1062 +124 1558 +575 1327 +506 1243 +154 1403 +672 1573 +423 1160 +222 1950 +67 1904 +664 1802 +585 1438 +327 1353 +284 1803 +369 1251 +291 1294 +61 1509 +551 1861 +938 1061 +765 1678 +509 1323 +145 1822 +887 1975 +768 1646 +610 1140 +690 1793 +763 1262 +96 1287 +837 1876 +632 1819 +747 1141 +71 1442 +561 1709 +290 1050 +514 1106 +87 1416 +762 1666 +83 1070 +467 1271 +7 1152 +472 1509 +861 1016 +913 1109 +934 1154 +288 1197 +175 1244 +588 1960 +316 1946 +543 1882 +359 1614 +465 1779 +892 1726 +695 1531 +542 1461 +288 1190 +966 1558 +736 1064 +997 1750 +885 1427 +888 1064 +342 1553 +77 1234 +845 1636 +407 1181 +354 1114 +670 1836 +69 1065 +12 1432 +982 1944 +837 1518 +231 1274 +2 1155 +423 1136 +377 1012 +353 1203 +257 1205 +350 1753 +479 1238 +324 1619 +705 1382 +236 1249 +695 1195 +213 1906 +231 1368 +819 1392 +509 1785 +661 1546 +210 1123 +873 1301 +363 1029 +216 1998 +240 1351 +667 1195 +515 1136 +230 1779 +385 1750 +574 1432 +435 1830 +804 1902 +249 1360 +303 1158 +969 1732 +249 1526 +159 1575 +139 1833 +347 1342 +661 1731 +887 1859 +19 1001 +748 1763 +829 1878 +828 1086 +835 1791 +895 1387 +326 1003 +568 1049 +485 1750 +760 1171 +414 1394 +987 1379 +851 1857 +8 1594 +76 1655 +363 1189 +90 1630 +976 1005 +57 1457 +886 1166 +29 1658 +543 1710 +379 1142 +499 1112 +177 1843 +746 1808 +454 1523 +676 1465 +762 1980 +309 1286 +74 1330 +359 1949 +781 1590 +874 1658 +455 1770 +790 1487 +651 1249 +855 1143 +386 1439 +298 1007 +2 1028 +217 1428 +318 1191 +968 1588 +5 1329 +625 1475 +140 1718 +401 1543 +936 1260 +311 1625 +711 1886 +832 1395 +114 1259 +782 1156 +434 1891 +539 1855 +448 1748 +199 1518 +735 1380 +908 1798 +301 1759 +876 1155 +63 1637 +739 1461 +558 1305 +533 1177 +801 1914 +97 1422 +423 1377 +920 1775 +215 1512 +691 1628 +905 1824 +540 1573 +567 1285 +573 1665 diff --git a/examples/unsup_graphsage/train.py b/examples/unsup_graphsage/train.py new file mode 100644 index 0000000..b5655d6 --- /dev/null +++ b/examples/unsup_graphsage/train.py @@ -0,0 +1,389 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""train.py +""" +import argparse +import time +import glob +import os + +import numpy as np + +import pgl +from pgl.utils.logger import log +from pgl.utils import paddle_helper +import paddle +import paddle.fluid as fluid +import tqdm + +import reader +import model + + +def get_layer(layer_type, gw, feature, hidden_size, act, name, is_test=False): + """get_layer""" + return getattr(model, layer_type)(gw, feature, hidden_size, act, name) + + +def load_pos_neg(data_path): + """load_pos_neg""" + train_eid = [] + train_src = [] + train_dst = [] + with open(data_path) as f: + eid = 0 + for idx, line in tqdm.tqdm(enumerate(f)): + src, dst = line.strip().split('\t') + train_src.append(int(src)) + train_dst.append(int(dst)) + train_eid.append(int(eid)) + eid += 1 + # concate the the pos data and neg data + train_eid = np.array(train_eid, dtype="int64") + train_src = np.array(train_src, dtype="int64") + train_dst = np.array(train_dst, dtype="int64") + + returns = {"train_data": (train_src, train_dst, train_eid), } + return returns + + +def binary_op(u_embed, v_embed, binary_op_type): + """binary_op""" + if binary_op_type == "Average": + edge_embed = (u_embed + v_embed) / 2 + elif binary_op_type == "Hadamard": + edge_embed = u_embed * v_embed + elif binary_op_type == "Weighted-L1": + edge_embed = fluid.layers.abs(u_embed - v_embed) + elif binary_op_type == "Weighted-L2": + edge_embed = (u_embed - v_embed) * (u_embed - v_embed) + else: + raise ValueError(binary_op_type + " binary_op_type doesn't exists") + return edge_embed + + +class RetDict(object): + """RetDict""" + pass + + +def build_graph_model(args): + """build_graph_model""" + node_feature_info = [('index', [None], np.dtype('int64'))] + + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + graph_wrappers = [] + feed_list = [] + + graph_wrappers.append( + pgl.graph_wrapper.GraphWrapper( + "layer_0", fluid.CPUPlace(), node_feat=node_feature_info)) + #edge_feat=[("f", [None, 1], "float32")])) + + num_embed = args.num_nodes + + num_layers = args.num_layers + + src_index = fluid.layers.data( + "src_index", shape=[None], dtype="int64", append_batch_size=False) + + dst_index = fluid.layers.data( + "dst_index", shape=[None], dtype="int64", append_batch_size=False) + + feature = fluid.layers.embedding( + input=fluid.layers.reshape(graph_wrappers[0].node_feat['index'], + [-1, 1]), + size=(num_embed + 1, args.hidden_size), + is_sparse=args.is_sparse, + is_distributed=args.is_distributed) + + features = [feature] + ret_dict = RetDict() + ret_dict.graph_wrappers = graph_wrappers + edge_data = [src_index, dst_index] + feed_list.extend(edge_data) + ret_dict.feed_list = feed_list + + for i in range(num_layers): + if i == num_layers - 1: + act = None + else: + act = "leaky_relu" + feature = get_layer( + args.layer_type, + graph_wrappers[0], + feature, + args.hidden_size, + act, + name="%s_%s" % (args.layer_type, i)) + features.append(feature) + + src_feat = fluid.layers.gather(features[-1], src_index) + src_feat = fluid.layers.fc(src_feat, + args.hidden_size, + bias_attr=None, + param_attr=fluid.ParamAttr(name="feat")) + dst_feat = fluid.layers.gather(features[-1], dst_index) + dst_feat = fluid.layers.fc(dst_feat, + args.hidden_size, + bias_attr=None, + param_attr=fluid.ParamAttr(name="feat")) + if args.phase == "predict": + node_id = fluid.layers.data( + "node_id", shape=[None, 1], dtype="int64", append_batch_size=False) + ret_dict.src_feat = src_feat + ret_dict.dst_feat = dst_feat + ret_dict.id = node_id + return ret_dict + + batch_size = args.batch_size + batch_negative_label = fluid.layers.reshape( + fluid.layers.range(0, batch_size, 1, "int64"), [-1, 1]) + batch_negative_label = fluid.layers.one_hot(batch_negative_label, + batch_size) + batch_loss_weight = (batch_negative_label * + (batch_size - 2) + 1.0) / (batch_size - 1) + batch_loss_weight.stop_gradient = True + batch_negative_label = batch_negative_label + batch_negative_label = fluid.layers.cast( + batch_negative_label, dtype="float32") + batch_negative_label.stop_gradient = True + + cos_theta = fluid.layers.matmul(src_feat, dst_feat, transpose_y=True) + + # Calc Loss + loss = fluid.layers.sigmoid_cross_entropy_with_logits( + x=cos_theta, label=batch_negative_label) + loss = loss * batch_loss_weight + #loss = fluid.layers.reduce_sum(loss, -1) + loss = fluid.layers.mean(loss) + + # Calc AUC + proba = fluid.layers.sigmoid(cos_theta) + proba = fluid.layers.reshape(proba, [-1, 1]) + proba = fluid.layers.concat([proba * -1 + 1, proba], axis=1) + gold_label = fluid.layers.reshape(batch_negative_label, [-1, 1]) + gold_label = fluid.layers.cast(gold_label, "int64") + auc, batch_auc_out, [batch_stat_pos, batch_stat_neg, stat_pos, stat_neg] = \ + fluid.layers.auc(input=proba, label=gold_label, curve='ROC', ) + + ret_dict.loss = loss + ret_dict.auc = batch_auc_out + return ret_dict + + +def run_epoch( + py_reader, + exe, + program, + prefix, + model_dict, + epoch, + batch_size, + log_per_step=100, + save_per_step=10000, ): + """run_epoch""" + batch = 0 + start = time.time() + + batch_end = time.time() + + for batch_feed_dict in py_reader(): + if prefix == "train": + if batch_feed_dict["src_index"].shape[0] != batch_size: + log.warning( + 'batch_feed_dict["src_index"].shape[0] != 1024, continue') + continue + batch_start = time.time() + batch += 1 + batch_loss, batch_auc = exe.run( + program, + feed=batch_feed_dict, + fetch_list=[model_dict.loss.name, model_dict.auc.name]) + + batch_end = time.time() + if batch % log_per_step == 0: + log.info( + "Batch %s %s-Loss %s \t %s-Auc %s \t Speed(per batch) %.5lf sec" + % (batch, prefix, np.mean(batch_loss), prefix, + np.mean(batch_auc), batch_end - batch_start)) + if batch != 0 and batch % save_per_step == 0: + fluid.io.save_params( + exe, dirname='checkpoint', main_program=program) + fluid.io.save_params(exe, dirname='checkpoint', main_program=program) + + +def run_predict_epoch(py_reader, + exe, + program, + prefix, + model_dict, + num_nodes, + hidden_size, + log_per_step=100): + """run_predict_epoch""" + batch = 0 + start = time.time() + #use the parallel executor to speed up + batch_end = time.time() + all_feat = np.zeros((num_nodes, hidden_size), dtype="float32") + + for batch_feed_dict in tqdm.tqdm(py_reader()): + batch_start = time.time() + batch += 1 + batch_src_feat, batch_id = exe.run( + program, + feed=batch_feed_dict, + fetch_list=[model_dict.src_feat.name, model_dict.id.name]) + + for ind, id in enumerate(batch_id): + all_feat[id] = batch_src_feat[ind] + np.save("emb.npy", all_feat) + + +def main(args): + """main""" + place = fluid.CUDAPlace(0) if args.use_cuda else fluid.CPUPlace() + exe = fluid.Executor(place) + + train_program = fluid.Program() + startup_program = fluid.Program() + + with fluid.program_guard(train_program, startup_program): + ret_dict = build_graph_model(args=args) + + val_program = train_program.clone(for_test=True) + if args.phase == "train": + with fluid.program_guard(train_program, startup_program): + adam = fluid.optimizer.Adam(learning_rate=args.lr) + adam.minimize(ret_dict.loss) + # reset the place according to role of parameter server + exe.run(startup_program) + + with open(args.data_path) as f: + log.info("Begin Load Graph") + src = [] + dst = [] + for idx, line in tqdm.tqdm(enumerate(f)): + s, d = line.strip().split() + src.append(s) + dst.append(d) + dst.append(s) + src.append(d) + src = np.array(src, dtype="int64").reshape(-1, 1) + dst = np.array(dst, dtype="int64").reshape(-1, 1) + edges = np.hstack([src, dst]) + + log.info("Begin Build Index") + ret_dict.graph = pgl.graph.Graph(num_nodes=args.num_nodes, edges=edges) + ret_dict.graph.indegree() + log.info("End Build Index") + + if args.phase == "train": + #just the worker, load the sample + data = load_pos_neg(args.data_path) + + feed_name_list = [var.name for var in ret_dict.feed_list] + train_iter = reader.graph_reader( + args.num_layers, + ret_dict.graph_wrappers, + batch_size=args.batch_size, + data=data['train_data'], + samples=args.samples, + num_workers=args.sample_workers, + feed_name_list=feed_name_list, + use_pyreader=args.use_pyreader, + graph=ret_dict.graph) + + # get PyReader + for epoch in range(args.epoch): + epoch_start = time.time() + try: + run_epoch( + train_iter, + program=train_program, + exe=exe, + prefix="train", + model_dict=ret_dict, + epoch=epoch, + batch_size=args.batch_size, + log_per_step=10) + epoch_end = time.time() + print("Epoch: {0}, Train total expend: {1} ".format( + epoch, epoch_end - epoch_start)) + except Exception as e: + log.info("Run Epoch Error %s" % e) + fluid.io.save_params( + exe, + dirname=args.checkpoint + '_%s' % epoch, + main_program=train_program) + + log.info("EPOCH END") + + log.info("RUN FINISH") + elif args.phase == "predict": + fluid.io.load_params( + exe, + dirname=args.checkpoint + '_%s' % args.epoch, + main_program=val_program) + test_src = np.arange(0, args.num_nodes, dtype="int64") + feed_name_list = [var.name for var in ret_dict.feed_list] + predict_iter = reader.graph_reader( + args.num_layers, + ret_dict.graph_wrappers, + batch_size=args.batch_size, + data=(test_src, test_src, test_src, test_src), + samples=args.samples, + num_workers=args.sample_workers, + feed_name_list=feed_name_list, + use_pyreader=args.use_pyreader, + graph=ret_dict.graph, + predict=True) + run_predict_epoch( + predict_iter, + program=val_program, + exe=exe, + prefix="predict", + hidden_size=args.hidden_size, + model_dict=ret_dict, + num_nodes=args.num_nodes, + log_per_step=100) + log.info("EPOCH END") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='graphsage') + parser.add_argument( + "--use_cuda", action='store_true', help="use_cuda", default=False) + parser.add_argument("--layer_type", type=str, default="graphsage_mean") + parser.add_argument("--epoch", type=int, default=1) + parser.add_argument("--hidden_size", type=int, default=128) + parser.add_argument("--batch_size", type=int, default=1024) + parser.add_argument("--lr", type=float, default=0.001) + parser.add_argument("--num_layers", type=int, default=2) + parser.add_argument("--data_path", type=str, required=True) + parser.add_argument("--checkpoint", type=str, default="model_ckpt") + parser.add_argument("--cache_path", type=str, default="./tmp") + parser.add_argument("--phase", type=str, default="train") + parser.add_argument("--digraph", action='store_true', default=False) + parser.add_argument('--samples', nargs='+', type=int, default=[10, 10]) + parser.add_argument("--sample_workers", type=int, default=10) + parser.add_argument("--num_nodes", type=int, required=True) + parser.add_argument("--is_sparse", action='store_true', default=False) + parser.add_argument("--is_distributed", action='store_true', default=False) + parser.add_argument("--real_graph", action='store_true', default=True) + parser.add_argument("--use_pyreader", action='store_true', default=False) + args = parser.parse_args() + log.info(args) + main(args) diff --git a/pgl/__init__.py b/pgl/__init__.py index ea39deb..15c23cc 100644 --- a/pgl/__init__.py +++ b/pgl/__init__.py @@ -13,8 +13,9 @@ # limitations under the License. """Generate pgl apis """ -__version__ = "0.1.0.beta" +__version__ = "1.0.0" from pgl import layers from pgl import graph_wrapper from pgl import graph from pgl import data_loader +from pgl import contrib diff --git a/pgl/contrib/__init__.py b/pgl/contrib/__init__.py new file mode 100644 index 0000000..5dcd918 --- /dev/null +++ b/pgl/contrib/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Generate Contrib api +""" + +from pgl.contrib import heter_graph +from pgl.contrib import heter_graph_wrapper diff --git a/pgl/contrib/heter_graph.py b/pgl/contrib/heter_graph.py new file mode 100644 index 0000000..b82bf46 --- /dev/null +++ b/pgl/contrib/heter_graph.py @@ -0,0 +1,203 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + This package implement Heterogeneous Graph structure for handling Heterogeneous graph data. +""" +import numpy as np +import pickle as pkl +import time +import pgl.graph_kernel as graph_kernel +from pgl import graph + +__all__ = ['HeterGraph'] + + +def _hide_num_nodes(shape): + """Set the first dimension as unknown + """ + shape = list(shape) + shape[0] = None + return shape + + +class HeterGraph(object): + """Implementation of graph structure in pgl + + This is a simple implementation of heterogeneous graph structure in pgl + + Args: + num_nodes_every_type: dict, number of nodes for every node type + + edges_every_type: dict, every element is a list of (u, v) tuples. + + node_feat_every_type: features for every node type. + + Examples: + .. code-block:: python + + import numpy as np + num_nodes_every_type = {'type1':3,'type2':4, 'type3':2} + edges_every_type = { + ('type1','type2', 'edges_type1'): [(0,1), (1,2)], + ('type1', 'type3', 'edges_type2'): [(1,2), (3,1)], + } + node_feat_every_type = { + 'type1': {'features1': np.random.randn(3, 4), + 'features2': np.random.randn(3, 4)}, + 'type2': {'features3': np.random.randn(4, 4)}, + 'type3': {'features1': np.random.randn(2, 4), + 'features2': np.random.randn(2, 4)} + } + edges_feat_every_type = { + ('type1','type2','edges_type1'): {'h': np.random.randn(2, 4)}, + ('type1', 'type3', 'edges_type2'): {'h':np.random.randn(2, 4)}, + } + + g = heter_graph.HeterGraph( + num_nodes_every_type=num_nodes_every_type, + edges_every_type=edges_every_type, + node_feat_every_type=node_feat_every_type, + edge_feat_every_type=edges_feat_every_type) + + """ + + def __init__(self, + num_nodes_every_type, + edges_every_type, + node_feat_every_type=None, + edge_feat_every_type=None): + + self._num_nodes_dict = num_nodes_every_type + self._edges_dict = edges_every_type + if node_feat_every_type is not None: + self._node_feat = node_feat_every_type + else: + self._node_feat = {} + + if edge_feat_every_type is not None: + self._edge_feat = edge_feat_every_type + else: + self._edge_feat = {} + + self._multi_graph = {} + for key, value in self._edges_dict.items(): + if not self._node_feat: + node_feat = None + else: + node_feat = self._node_feat[key[0]] + + if not self._edge_feat: + edge_feat = None + else: + edge_feat = self._edge_feat[key] + + self._multi_graph[key] = graph.Graph( + num_nodes=self._num_nodes_dict[key[1]], + edges=value, + node_feat=node_feat, + edge_feat=edge_feat) + + def __getitem__(self, edge_type): + """__getitem__ + """ + return self._multi_graph[edge_type] + + def meta_path_random_walk(self, start_node, edge_types, meta_path, + max_depth): + """Meta path random walk sampling. + + Args: + start_nodes: int, node to begin random walk. + edge_types: list, the edge types to be sampled. + meta_path: 'user-item-user' + max_depth: the max length of every walk. + """ + edges_type_list = [] + node_type_list = meta_path.split('-') + for i in range(1, len(node_type_list)): + edges_type_list.append( + (node_type_list[i - 1], node_type_list[i], edge_types[i - 1])) + + no_neighbors_flag = False + walk = [start_node] + for i in range(max_depth): + for e_type in edges_type_list: + cur_node = [walk[-1]] + nxt_node = self._multi_graph[e_type].sample_successor( + cur_node, max_degree=1) # list of np.array + nxt_node = nxt_node[0] + if len(nxt_node) == 0: + no_neighbors_flag = True + break + else: + walk.append(nxt_node.tolist()[0]) + + if no_neighbors_flag: + break + + return walk + + def node_feat_info(self): + """Return the information of node feature for HeterGraphWrapper. + + This function return the information of node features of all node types. And this + function is used to help constructing HeterGraphWrapper + + Return: + A dict of list of tuple (name, shape, dtype) for all given node feature. + + """ + node_feat_info = {} + for node_type_name, feat_dict in self._node_feat.items(): + tmp_node_feat_info = [] + for feat_name, feat in feat_dict.items(): + full_name = feat_name + tmp_node_feat_info.append( + (full_name, _hide_num_nodes(feat.shape), feat.dtype)) + node_feat_info[node_type_name] = tmp_node_feat_info + + return node_feat_info + + def edge_feat_info(self): + """Return the information of edge feature for HeterGraphWrapper. + + This function return the information of edge features of all edge types. And this + function is used to help constructing HeterGraphWrapper + + Return: + A dict of list of tuple (name, shape, dtype) for all given edge feature. + + """ + edge_feat_info = {} + for edge_type_name, feat_dict in self._edge_feat.items(): + tmp_edge_feat_info = [] + for feat_name, feat in feat_dict.items(): + full_name = feat_name + tmp_edge_feat_info.append( + (full_name, _hide_num_nodes(feat.shape), feat.dtype)) + edge_feat_info[edge_type_name] = tmp_edge_feat_info + return edge_feat_info + + def edge_types_info(self): + """Return the information of all edge types. + + Return: + A list of tuple ('srctype','dsttype', 'edges_type') for all edge types. + + """ + edge_types_info = [] + for key, _ in self._edges_dict.items(): + edge_types_info.append(key) + + return edge_types_info diff --git a/pgl/contrib/heter_graph_wrapper.py b/pgl/contrib/heter_graph_wrapper.py new file mode 100644 index 0000000..27937c1 --- /dev/null +++ b/pgl/contrib/heter_graph_wrapper.py @@ -0,0 +1,234 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This package provides interface to help building static computational graph +for PaddlePaddle. +""" + +import warnings +import numpy as np +import paddle.fluid as fluid + +from pgl.utils import op +from pgl.utils import paddle_helper +from pgl.utils.logger import log +from pgl.graph_wrapper import GraphWrapper + +ALL = "__ALL__" + + +def is_all(arg): + """is_all + """ + return isinstance(arg, str) and arg == ALL + + +class BipartiteGraphWrapper(GraphWrapper): + """Implement a bipartite graph wrapper that creates a graph data holders. + """ + + def __init__(self, name, place, node_feat=[], edge_feat=[]): + super(BipartiteGraphWrapper, self).__init__(name, place, node_feat, + edge_feat) + + def send(self, + message_func, + src_nfeat_list=None, + dst_nfeat_list=None, + efeat_list=None): + """Send message from all src nodes to dst nodes. + + The UDF message function should has the following format. + + .. code-block:: python + + def message_func(src_feat, dst_feat, edge_feat): + ''' + Args: + src_feat: the node feat dict attached to the src nodes. + dst_feat: the node feat dict attached to the dst nodes. + edge_feat: the edge feat dict attached to the + corresponding (src, dst) edges. + + Return: + It should return a tensor or a dictionary of tensor. And each tensor + should have a shape of (num_edges, dims). + ''' + pass + + Args: + message_func: UDF function. + src_nfeat_list: a list of tuple (name, tensor) for src nodes + dst_nfeat_list: a list of tuple (name, tensor) for dst nodes + efeat_list: a list of names or tuple (name, tensor) + + Return: + A dictionary of tensor representing the message. Each of the values + in the dictionary has a shape (num_edges, dim) which should be collected + by :code:`recv` function. + """ + if efeat_list is None: + efeat_list = {} + if src_nfeat_list is None: + src_nfeat_list = {} + if dst_nfeat_list is None: + dst_nfeat_list = {} + + src, dst = self.edges + src_feat = {} + for feat in src_nfeat_list: + if isinstance(feat, str): + src_feat[feat] = self.node_feat[feat] + else: + name, tensor = feat + src_feat[name] = tensor + + dst_feat = {} + for feat in dst_nfeat_list: + if isinstance(feat, str): + dst_feat[feat] = self.node_feat[feat] + else: + name, tensor = feat + dst_feat[name] = tensor + + efeat = {} + for feat in efeat_list: + if isinstance(feat, str): + efeat[feat] = self.edge_feat[feat] + else: + name, tensor = feat + efeat[name] = tensor + + src_feat = op.read_rows(src_feat, src) + dst_feat = op.read_rows(dst_feat, dst) + msg = message_func(src_feat, dst_feat, efeat) + + return msg + + +class HeterGraphWrapper(object): + """Implement a heterogeneous graph wrapper that creates a graph data holders + that attributes and features in the heterogeneous graph. + And we provide interface :code:`to_feed` to help converting :code:`Graph` + data into :code:`feed_dict`. + + Args: + name: The heterogeneous graph data prefix + + place: fluid.CPUPlace or fluid.GPUPlace(n) indicating the + device to hold the graph data. + + node_feat: A dict of list of tuples that decribe the details of node + feature tenosr. Each tuple mush be (name, shape, dtype) + and the first dimension of the shape must be set unknown + (-1 or None) or we can easily use :code:`HeterGraph.node_feat_info()` + to get the node_feat settings. + + edge_feat: A dict of list of tuples that decribe the details of edge + feature tenosr. Each tuple mush be (name, shape, dtype) + and the first dimension of the shape must be set unknown + (-1 or None) or we can easily use :code:`HeterGraph.edge_feat_info()` + to get the edge_feat settings. + + Examples: + .. code-block:: python + + import paddle.fluid as fluid + import numpy as np + num_nodes_every_type = {'type1':3,'type2':4, 'type3':2} + edges_every_type = { + ('type1','type2', 'edges_type1'): [(0,1), (1,2)], + ('type1', 'type3', 'edges_type2'): [(1,2), (3,1)], + } + node_feat_every_type = { + 'type1': {'features1': np.random.randn(3, 4), + 'features2': np.random.randn(3, 4)}, + 'type2': {'features3': np.random.randn(4, 4)}, + 'type3': {'features1': np.random.randn(2, 4), + 'features2': np.random.randn(2, 4)} + } + edges_feat_every_type = { + ('type1','type2','edges_type1'): {'h': np.random.randn(2, 4)}, + ('type1', 'type3', 'edges_type2'): {'h':np.random.randn(2, 4)}, + } + + g = heter_graph.HeterGraph( + num_nodes_every_type=num_nodes_every_type, + edges_every_type=edges_every_type, + node_feat_every_type=node_feat_every_type, + edge_feat_every_type=edges_feat_every_type) + + + place = fluid.CPUPlace() + + gw = pgl.heter_graph_wrapper.HeterGraphWrapper( + name='heter_graph', + place = place, + edge_types = g.edge_types_info(), + node_feat=g.node_feat_info(), + edge_feat=g.edge_feat_info()) + """ + + def __init__(self, name, place, edge_types, node_feat={}, edge_feat={}): + self.__data_name_prefix = name + self._place = place + self._edge_types = edge_types + self._multi_gw = {} + for edge_type in self._edge_types: + type_name = self.__data_name_prefix + '/' + edge_type[ + 0] + '_' + edge_type[1] + if node_feat: + n_feat = node_feat[edge_type[0]] + else: + n_feat = {} + + if edge_feat: + e_feat = edge_feat[edge_type] + else: + e_feat = {} + + self._multi_gw[edge_type] = BipartiteGraphWrapper( + name=type_name, + place=self._place, + node_feat=n_feat, + edge_feat=e_feat) + + def to_feed(self, heterGraph, edge_types_list=ALL): + """Convert the graph into feed_dict. + + This function helps to convert graph data into feed dict + for :code:`fluid.Excecutor` to run the model. + + Args: + heterGraph: the :code:`HeterGraph` data object + edge_types_list: the edge types list to be fed + + Return: + A dictinary contains data holder names and its coresponding data. + """ + multi_graphs = heterGraph._multi_graph + if is_all(edge_types_list): + edge_types_list = self._edge_types + + feed_dict = {} + for edge_type in edge_types_list: + feed_d = self._multi_gw[edge_type].to_feed(multi_graphs[edge_type]) + feed_dict.update(feed_d) + + return feed_dict + + def __getitem__(self, edge_type): + """__getitem__ + """ + return self._multi_gw[edge_type] diff --git a/pgl/data_loader.py b/pgl/data_loader.py index 93d89e5..fb0e107 100644 --- a/pgl/data_loader.py +++ b/pgl/data_loader.py @@ -20,7 +20,6 @@ import io import sys import numpy as np import pickle as pkl -import networkx as nx from pgl import graph from pgl.utils.logger import log @@ -91,6 +90,7 @@ class CitationDataset(object): def _load_data(self): """Load data """ + import networkx as nx objnames = ['x', 'y', 'tx', 'ty', 'allx', 'ally', 'graph'] objects = [] for i in range(len(objnames)): @@ -98,7 +98,7 @@ class CitationDataset(object): 'rb') as f: objects.append(_pickle_load(f)) - x, y, tx, ty, allx, ally, _graph = tuple(objects) + x, y, tx, ty, allx, ally, _graph = objects test_idx_reorder = _parse_index_file("{}/ind.{}.test.index".format( self.path, self.name)) test_idx_range = np.sort(test_idx_reorder) diff --git a/pgl/graph.py b/pgl/graph.py index f341363..8af2038 100644 --- a/pgl/graph.py +++ b/pgl/graph.py @@ -114,25 +114,41 @@ class Graph(object): self._edge_feat = {} if isinstance(edges, np.ndarray): - if edges.dtype != "int32": - edges = edges.astype("int32") + if edges.dtype != "int64": + edges = edges.astype("int64") else: - edges = np.array(edges, dtype="int32") + edges = np.array(edges, dtype="int64") self._edges = edges self._num_nodes = num_nodes if len(edges) == 0: - # check emtpy edges - src, dst = np.array([], dtype="int32"), np.array([], dtype="int32") - else: - src = edges[:, 0] - dst = edges[:, 1] + raise ValueError("The Graph have no edges.") + + self._adj_src_index = None + self._adj_dst_index = None + + @property + def adj_src_index(self): + """Return an EdgeIndex object for src. + """ + if self._adj_src_index is None: + self._adj_src_index = EdgeIndex( + u=self._edges[:, 0], + v=self._edges[:, 1], + num_nodes=self._num_nodes) + return self._adj_src_index - self._adj_src_index = EdgeIndex( - u=src, v=dst, num_nodes=self._num_nodes) - self._adj_dst_index = EdgeIndex( - u=dst, v=src, num_nodes=self._num_nodes) + @property + def adj_dst_index(self): + """Return an EdgeIndex object for dst. + """ + if self._adj_dst_index is None: + self._adj_dst_index = EdgeIndex( + u=self._edges[:, 1], + v=self._edges[:, 0], + num_nodes=self._num_nodes) + return self._adj_dst_index @property def edge_feat(self): @@ -180,16 +196,16 @@ class Graph(object): if sort_by not in ["src", "dst"]: raise ValueError("sort_by should be in 'src' or 'dst'.") if sort_by == 'src': - src, dst, eid = self._adj_src_index.triples() + src, dst, eid = self.adj_src_index.triples() else: - dst, src, eid = self._adj_dst_index.triples() + dst, src, eid = self.adj_dst_index.triples() return src, dst, eid @property def nodes(self): """Return all nodes id from 0 to :code:`num_nodes - 1` """ - return np.arange(self._num_nodes, dtype="int32") + return np.arange(self._num_nodes, dtype="int64") def indegree(self, nodes=None): """Return the indegree of the given nodes @@ -204,9 +220,9 @@ class Graph(object): A numpy.ndarray as the given nodes' indegree. """ if nodes is None: - return self._adj_dst_index.degree + return self.adj_dst_index.degree else: - return self._adj_dst_index.degree[nodes] + return self.adj_dst_index.degree[nodes] def outdegree(self, nodes=None): """Return the outdegree of the given nodes. @@ -221,9 +237,9 @@ class Graph(object): A numpy.array as the given nodes' outdegree. """ if nodes is None: - return self._adj_src_index.degree + return self.adj_src_index.degree else: - return self._adj_src_index.degree[nodes] + return self.adj_src_index.degree[nodes] def successor(self, nodes=None, return_eids=False): """Find successor of given nodes. @@ -273,17 +289,21 @@ class Graph(object): """ if nodes is None: if return_eids: - return self._adj_src_index.v, self._adj_src_index.eid + return self.adj_src_index.v, self.adj_src_index.eid else: - return self._adj_src_index.v + return self.adj_src_index.v else: if return_eids: - return self._adj_src_index.v[nodes], self._adj_src_index.eid[ + return self.adj_src_index.v[nodes], self.adj_src_index.eid[ nodes] else: - return self._adj_src_index.v[nodes] + return self.adj_src_index.v[nodes] - def sample_successor(self, nodes, max_degree, return_eids=False): + def sample_successor(self, + nodes, + max_degree, + return_eids=False, + shuffle=False): """Sample successors of given nodes. Args: @@ -304,26 +324,20 @@ class Graph(object): node_succ = self.successor(nodes, return_eids=return_eids) if return_eids: node_succ, node_succ_eid = node_succ + if nodes is None: nodes = self.nodes - sample_succ, sample_succ_eid = [], [] - for i in range(len(nodes)): - max_size = min(max_degree, len(node_succ[i])) - if max_size == 0: - sample_succ.append([]) - if return_eids: - sample_succ_eid.append([]) - else: - ind = np.random.choice( - len(node_succ[i]), max_size, replace=False) - sample_succ.append(node_succ[i][ind]) - if return_eids: - sample_succ_eid.append(node_succ_eid[i][ind]) + node_succ = node_succ.tolist() + if return_eids: - return sample_succ, sample_succ_eid + node_succ_eid = node_succ_eid.tolist() + + if return_eids: + return graph_kernel.sample_subset_with_eid( + node_succ, node_succ_eid, max_degree, shuffle) else: - return sample_succ + return graph_kernel.sample_subset(node_succ, max_degree, shuffle) def predecessor(self, nodes=None, return_eids=False): """Find predecessor of given nodes. @@ -373,17 +387,21 @@ class Graph(object): """ if nodes is None: if return_eids: - return self._adj_dst_index.v, self._adj_dst_index.eid + return self.adj_dst_index.v, self.adj_dst_index.eid else: - return self._adj_dst_index.v + return self.adj_dst_index.v else: if return_eids: - return self._adj_dst_index.v[nodes], self._adj_dst_index.eid[ + return self.adj_dst_index.v[nodes], self.adj_dst_index.eid[ nodes] else: - return self._adj_dst_index.v[nodes] + return self.adj_dst_index.v[nodes] - def sample_predecessor(self, nodes, max_degree, return_eids=False): + def sample_predecessor(self, + nodes, + max_degree, + return_eids=False, + shuffle=False): """Sample predecessor of given nodes. Args: @@ -407,24 +425,16 @@ class Graph(object): if nodes is None: nodes = self.nodes - sample_pred, sample_pred_eid = [], [] - for i in range(len(nodes)): - max_size = min(max_degree, len(node_pred[i])) - if max_size == 0: - sample_pred.append([]) - if return_eids: - sample_pred_eid.append([]) - else: - ind = np.random.choice( - len(node_pred[i]), max_size, replace=False) - sample_pred.append(node_pred[i][ind]) - if return_eids: - sample_pred_eid.append(node_pred_eid[i][ind]) + node_pred = node_pred.tolist() + + if return_eids: + node_pred_eid = node_pred_eid.tolist() if return_eids: - return sample_pred, sample_pred_eid + return graph_kernel.sample_subset_with_eid( + node_pred, node_pred_eid, max_degree, shuffle) else: - return sample_pred + return graph_kernel.sample_subset(node_pred, max_degree, shuffle) def node_feat_info(self): """Return the information of node feature for GraphWrapper. @@ -500,19 +510,21 @@ class Graph(object): (key, _hide_num_nodes(value.shape), value.dtype)) return edge_feat_info - def subgraph(self, nodes, eid): + def subgraph(self, nodes, eid=None, edges=None): """Generate subgraph with nodes and edge ids. This function will generate a :code:`pgl.graph.Subgraph` object and copy all corresponding node and edge features. Nodes and edges will - be reindex from 0. + be reindex from 0. Eid and edges can't both be None. WARNING: ALL NODES IN EID MUST BE INCLUDED BY NODES Args: nodes: Node ids which will be included in the subgraph. - eid: Edge ids which will be included in the subgraph. + eid (optional): Edge ids which will be included in the subgraph. + + edges (optional): Edge(src, dst) list which will be included in the subgraph. Return: A :code:`pgl.graph.Subgraph` object. @@ -522,11 +534,22 @@ class Graph(object): for ind, node in enumerate(nodes): reindex[node] = ind - eid = np.array(eid, dtype="int32") - sub_edges = graph_kernel.map_edges(eid, self._edges, reindex) + if eid is None and edges is None: + raise ValueError("Eid and edges can't be None at the same time.") + + if edges is None: + edges = self._edges[eid] + else: + edges = np.array(edges, dtype="int64") + + sub_edges = graph_kernel.map_edges( + np.arange( + len(edges), dtype="int64"), edges, reindex) sub_edge_feat = {} for key, value in self._edge_feat.items(): + if eid is None: + raise ValueError("Eid can not be None with edge features.") sub_edge_feat[key] = value[eid] sub_node_feat = {} @@ -554,7 +577,7 @@ class Graph(object): Return: Batch iterator """ - perm = np.arange(self._num_nodes, dtype="int32") + perm = np.arange(self._num_nodes, dtype="int64") if shuffle: np.random.shuffle(perm) start = 0 @@ -644,7 +667,7 @@ class Graph(object): break succ = self.successor(cur_nodes) sample_index = np.floor( - np.random.rand(outdegree.shape[0]) * outdegree).astype("int32") + np.random.rand(outdegree.shape[0]) * outdegree).astype("int64") nxt_cur_nodes = [] for s, ind, walk_id in zip(succ, sample_index, cur_walk_ids): @@ -677,8 +700,8 @@ class Graph(object): cur_walk_ids = np.arange(0, len(nodes)) cur_nodes = np.array(nodes) - prev_nodes = np.array([-1] * len(nodes), dtype="int32") - prev_succs = np.array([[]] * len(nodes), dtype="int32") + prev_nodes = np.array([-1] * len(nodes), dtype="int64") + prev_succs = np.array([[]] * len(nodes), dtype="int64") for l in range(max_depth): # select the walks not end outdegree = self.outdegree(cur_nodes) @@ -693,7 +716,7 @@ class Graph(object): break cur_succs = self.successor(cur_nodes) num_nodes = cur_nodes.shape[0] - nxt_nodes = np.zeros(num_nodes, dtype="int32") + nxt_nodes = np.zeros(num_nodes, dtype="int64") for idx, (succ, prev_succ, walk_id, prev_node) in enumerate( zip(cur_succs, prev_succs, cur_walk_ids, prev_nodes)): diff --git a/pgl/graph_kernel.pyx b/pgl/graph_kernel.pyx index 58095c3..a911deb 100644 --- a/pgl/graph_kernel.pyx +++ b/pgl/graph_kernel.pyx @@ -26,20 +26,20 @@ from libc.stdlib cimport rand, RAND_MAX @cython.boundscheck(False) @cython.wraparound(False) -def build_index(np.ndarray[np.int32_t, ndim=1] u, - np.ndarray[np.int32_t, ndim=1] v, - int num_nodes): +def build_index(np.ndarray[np.int64_t, ndim=1] u, + np.ndarray[np.int64_t, ndim=1] v, + long long num_nodes): """Building Edge Index """ - cdef int i - cdef int h=len(u) - cdef int n_size = num_nodes - cdef np.ndarray[np.int32_t, ndim=1] degree = np.zeros([n_size], dtype=np.int32) - cdef np.ndarray[np.int32_t, ndim=1] count = np.zeros([n_size], dtype=np.int32) - cdef np.ndarray[np.int32_t, ndim=1] _tmp_v = np.zeros([h], dtype=np.int32) - cdef np.ndarray[np.int32_t, ndim=1] _tmp_u = np.zeros([h], dtype=np.int32) - cdef np.ndarray[np.int32_t, ndim=1] _tmp_eid = np.zeros([h], dtype=np.int32) - cdef np.ndarray[np.int32_t, ndim=1] indptr = np.zeros([n_size + 1], dtype=np.int32) + cdef long long i + cdef long long h=len(u) + cdef long long n_size = num_nodes + cdef np.ndarray[np.int64_t, ndim=1] degree = np.zeros([n_size], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] count = np.zeros([n_size], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] _tmp_v = np.zeros([h], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] _tmp_u = np.zeros([h], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] _tmp_eid = np.zeros([h], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] indptr = np.zeros([n_size + 1], dtype=np.int64) with nogil: for i in xrange(h): @@ -64,16 +64,16 @@ def build_index(np.ndarray[np.int32_t, ndim=1] u, @cython.boundscheck(False) @cython.wraparound(False) -def map_edges(np.ndarray[np.int32_t, ndim=1] eid, - np.ndarray[np.int32_t, ndim=2] edges, +def map_edges(np.ndarray[np.int64_t, ndim=1] eid, + np.ndarray[np.int64_t, ndim=2] edges, reindex): """Mapping edges by given dictionary """ - cdef unordered_map[int, int] m = reindex - cdef int i = 0 - cdef int h = len(eid) - cdef np.ndarray[np.int32_t, ndim=2] r_edges = np.zeros([h, 2], dtype=np.int32) - cdef int j + cdef unordered_map[long long, long long] m = reindex + cdef long long i = 0 + cdef long long h = len(eid) + cdef np.ndarray[np.int64_t, ndim=2] r_edges = np.zeros([h, 2], dtype=np.int64) + cdef long long j with nogil: for i in xrange(h): j = eid[i] @@ -86,31 +86,33 @@ def map_edges(np.ndarray[np.int32_t, ndim=1] eid, def map_nodes(nodes, reindex): """Mapping nodes by given dictionary """ - cdef unordered_map[int, int] m = reindex - cdef int i = 0 - cdef int h = len(nodes) - cdef np.ndarray[np.int32_t, ndim=1] new_nodes = np.zeros([h], dtype=np.int32) - cdef int j - for i in xrange(h): - j = nodes[i] - new_nodes[i] = m[j] + cdef np.ndarray[np.int64_t, ndim=1] t_nodes = np.array(nodes, dtype=np.int64) + cdef unordered_map[long long, long long] m = reindex + cdef long long i = 0 + cdef long long h = len(nodes) + cdef np.ndarray[np.int64_t, ndim=1] new_nodes = np.zeros([h], dtype=np.int64) + cdef long long j + with nogil: + for i in xrange(h): + j = t_nodes[i] + new_nodes[i] = m[j] return new_nodes @cython.boundscheck(False) @cython.wraparound(False) -def node2vec_sample(np.ndarray[np.int32_t, ndim=1] succ, - np.ndarray[np.int32_t, ndim=1] prev_succ, int prev_node, +def node2vec_sample(np.ndarray[np.int64_t, ndim=1] succ, + np.ndarray[np.int64_t, ndim=1] prev_succ, long long prev_node, float p, float q): """Fast implement of node2vec sampling """ - cdef int i + cdef long long i cdef succ_len = len(succ) cdef prev_succ_len = len(prev_succ) cdef vector[float] probs cdef float prob_sum = 0 - cdef unordered_set[int] prev_succ_set + cdef unordered_set[long long] prev_succ_set for i in xrange(prev_succ_len): prev_succ_set.insert(prev_succ[i]) @@ -127,9 +129,177 @@ def node2vec_sample(np.ndarray[np.int32_t, ndim=1] succ, cdef float rand_num = float(rand())/RAND_MAX * prob_sum - cdef int sample_succ = 0 + cdef long long sample_succ = 0 for i in xrange(succ_len): rand_num -= probs[i] if rand_num <= 0: sample_succ = succ[i] return sample_succ + +@cython.boundscheck(False) +@cython.wraparound(False) +def subset_choose_index(long long s_size, + np.ndarray[ndim=1, dtype=np.int64_t] nid, + np.ndarray[ndim=1, dtype=np.int64_t] rnd, + np.ndarray[ndim=1, dtype=np.int64_t] buff_nid, + long long offset): + cdef long long n_size = len(nid) + cdef long long i + cdef long long j + cdef unordered_map[long long, long long] m + with nogil: + for i in xrange(s_size): + j = rnd[offset + i] % n_size + if j >= i: + buff_nid[offset + i] = nid[j] if m.find(j) == m.end() else nid[m[j]] + m[j] = i if m.find(i) == m.end() else m[i] + else: + buff_nid[offset + i] = buff_nid[offset + j] + buff_nid[offset + j] = nid[i] if m.find(i) == m.end() else nid[m[i]] + + +@cython.boundscheck(False) +@cython.wraparound(False) +def subset_choose_index_eid(long long s_size, + np.ndarray[ndim=1, dtype=np.int64_t] nid, + np.ndarray[ndim=1, dtype=np.int64_t] eid, + np.ndarray[ndim=1, dtype=np.int64_t] rnd, + np.ndarray[ndim=1, dtype=np.int64_t] buff_nid, + np.ndarray[ndim=1, dtype=np.int64_t] buff_eid, + long long offset): + cdef long long n_size = len(nid) + cdef long long i + cdef long long j + cdef unordered_map[long long, long long] m + with nogil: + for i in xrange(s_size): + j = rnd[offset + i] % n_size + if j >= i: + if m.find(j) == m.end(): + buff_nid[offset + i], buff_eid[offset + i] = nid[j], eid[j] + else: + buff_nid[offset + i], buff_eid[offset + i] = nid[m[j]], eid[m[j]] + m[j] = i if m.find(i) == m.end() else m[i] + else: + buff_nid[offset + i], buff_eid[offset + i] = buff_nid[offset + j], buff_eid[offset + j] + if m.find(i) == m.end(): + buff_nid[offset + j], buff_eid[offset + j] = nid[i], eid[i] + else: + buff_nid[offset + j], buff_eid[offset + j] = nid[m[i]], eid[m[i]] + +@cython.boundscheck(False) +@cython.wraparound(False) +def sample_subset(list nids, long long maxdegree, shuffle=False): + cdef np.ndarray[ndim=1, dtype=np.int64_t] buff_index + cdef long long buff_size, sample_size + cdef long long total_buff_size = 0 + cdef long long inc = 0 + cdef list output = [] + for inc in xrange(len(nids)): + buff_size = len(nids[inc]) + if buff_size > maxdegree: + total_buff_size += maxdegree + elif shuffle: + total_buff_size += buff_size + cdef np.ndarray[ndim=1, dtype=np.int64_t] buff_nid = np.zeros([total_buff_size], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] rnd = np.random.randint(0, np.iinfo(np.int64).max, + dtype=np.int64, size=total_buff_size) + + cdef long long offset = 0 + for inc in xrange(len(nids)): + buff_size = len(nids[inc]) + if not shuffle and buff_size <= maxdegree: + output.append(nids[inc]) + else: + sample_size = buff_size if buff_size <= maxdegree else maxdegree + subset_choose_index(sample_size, nids[inc], rnd, buff_nid, offset) + output.append(buff_nid[offset:offset+sample_size]) + offset += sample_size + return output + +@cython.boundscheck(False) +@cython.wraparound(False) +def sample_subset_with_eid(list nids, list eids, long long maxdegree, shuffle=False): + cdef np.ndarray[ndim=1, dtype=np.int64_t] buff_index + cdef long long buff_size, sample_size + cdef long long total_buff_size = 0 + cdef long long inc = 0 + cdef list output = [] + cdef list output_eid = [] + for inc in xrange(len(nids)): + buff_size = len(nids[inc]) + if buff_size > maxdegree: + total_buff_size += maxdegree + elif shuffle: + total_buff_size += buff_size + cdef np.ndarray[ndim=1, dtype=np.int64_t] buff_nid = np.zeros([total_buff_size], dtype=np.int64) + cdef np.ndarray[ndim=1, dtype=np.int64_t] buff_eid = np.zeros([total_buff_size], dtype=np.int64) + cdef np.ndarray[np.int64_t, ndim=1] rnd = np.random.randint(0, np.iinfo(np.int64).max, + dtype=np.int64, size=total_buff_size) + + cdef long long offset = 0 + for inc in xrange(len(nids)): + buff_size = len(nids[inc]) + if not shuffle and buff_size <= maxdegree: + output.append(nids[inc]) + output_eid.append(eids[inc]) + else: + sample_size = buff_size if buff_size <= maxdegree else maxdegree + subset_choose_index_eid(sample_size, nids[inc], eids[inc], rnd, buff_nid, buff_eid, offset) + output.append(buff_nid[offset:offset+sample_size]) + output_eid.append(buff_eid[offset:offset+sample_size]) + offset += sample_size + return output, output_eid + +@cython.boundscheck(False) +@cython.wraparound(False) +def skip_gram_gen_pair(vector[long long] walk, long win_size=5): + cdef vector[long long] src + cdef vector[long long] dst + cdef long long l = len(walk) + cdef long long real_win_size, left, right, i + cdef np.ndarray[np.int64_t, ndim=1] rnd = np.random.randint(1, win_size+1, + dtype=np.int64, size=l) + with nogil: + for i in xrange(l): + real_win_size = rnd[i] + left = i - real_win_size + if left < 0: + left = 0 + right = i + real_win_size + if right >= l: + right = l - 1 + for j in xrange(left, right+1): + if walk[i] == walk[j]: + continue + src.push_back(walk[i]) + dst.push_back(walk[j]) + return src, dst + +@cython.boundscheck(False) +@cython.wraparound(False) +def alias_sample_build_table(np.ndarray[np.float64_t, ndim=1] probs): + cdef long long l = len(probs) + cdef np.ndarray[np.float64_t, ndim=1] alias = probs * l + cdef np.ndarray[np.int64_t, ndim=1] events = np.zeros(l, dtype=np.int64) + + cdef vector[long long] larger_num, smaller_num + cdef long long i, s_i, l_i + with nogil: + for i in xrange(l): + if alias[i] > 1: + larger_num.push_back(i) + elif alias[i] < 1: + smaller_num.push_back(i) + + while smaller_num.size() > 0 and larger_num.size() > 0: + s_i = smaller_num.back() + l_i = larger_num.back() + smaller_num.pop_back() + events[s_i] = l_i + alias[l_i] -= (1 - alias[s_i]) + if alias[l_i] <= 1: + larger_num.pop_back() + if alias[l_i] < 1: + smaller_num.push_back(l_i) + return alias, events diff --git a/pgl/graph_wrapper.py b/pgl/graph_wrapper.py index 42cc6c2..d41d09c 100644 --- a/pgl/graph_wrapper.py +++ b/pgl/graph_wrapper.py @@ -97,7 +97,6 @@ class BaseGraphWrapper(object): self._indegree = None self._edge_uniq_dst = None self._edge_uniq_dst_count = None - self._bucketing_index = None self._node_ids = None def send(self, message_func, nfeat_list=None, efeat_list=None): @@ -188,7 +187,7 @@ class BaseGraphWrapper(object): output = recv( dst=self._edges_dst, uniq_dst=self._edge_uniq_dst, - bucketing_index=self._bucketing_index, + bucketing_index=self._edge_uniq_dst_count, msg=msg, reduce_function=reduce_function, node_ids=self._node_ids) @@ -200,7 +199,7 @@ class BaseGraphWrapper(object): Return: A tuple of Tensor (src, dst). Src and dst are both - tensor with shape (num_edges, ) and dtype int32. + tensor with shape (num_edges, ) and dtype int64. """ return self._edges_src, self._edges_dst @@ -209,7 +208,7 @@ class BaseGraphWrapper(object): """Return a variable of number of nodes Return: - A variable with shape (1,) as the number of nodes in int32. + A variable with shape (1,) as the number of nodes in int64. """ return self._num_nodes @@ -237,7 +236,7 @@ class BaseGraphWrapper(object): """Return the indegree tensor for all nodes. Return: - A tensor of shape (num_nodes, ) in int32. + A tensor of shape (num_nodes, ) in int64. """ return self._indegree @@ -312,6 +311,8 @@ class StaticGraphWrapper(BaseGraphWrapper): nodes = graph.nodes uniq_dst = nodes[indegree > 0] uniq_dst_count = indegree[indegree > 0] + uniq_dst_count = np.cumsum(uniq_dst_count, dtype='int32') + uniq_dst_count = np.insert(uniq_dst_count, 0, 0) edge_feat = {} @@ -323,56 +324,46 @@ class StaticGraphWrapper(BaseGraphWrapper): self.__create_graph_edge_feat(edge_feat, self._initializers) self._edges_src, init = paddle_helper.constant( - dtype="int32", + dtype="int64", value=src, - name=self.__data_name_prefix + '_edges_src') + name=self.__data_name_prefix + '/edges_src') self._initializers.append(init) self._edges_dst, init = paddle_helper.constant( - dtype="int32", + dtype="int64", value=dst, - name=self.__data_name_prefix + '_edges_dst') + name=self.__data_name_prefix + '/edges_dst') self._initializers.append(init) self._num_nodes, init = paddle_helper.constant( - dtype="int32", + dtype="int64", hide_batch_size=False, value=np.array([graph.num_nodes]), - name=self.__data_name_prefix + '_num_nodes') + name=self.__data_name_prefix + '/num_nodes') self._initializers.append(init) self._edge_uniq_dst, init = paddle_helper.constant( - name=self.__data_name_prefix + "_uniq_dst", - dtype="int32", + name=self.__data_name_prefix + "/uniq_dst", + dtype="int64", value=uniq_dst) self._initializers.append(init) self._edge_uniq_dst_count, init = paddle_helper.constant( - name=self.__data_name_prefix + "_uniq_dst_count", + name=self.__data_name_prefix + "/uniq_dst_count", dtype="int32", value=uniq_dst_count) self._initializers.append(init) - bucket_value = np.expand_dims( - np.arange( - 0, len(dst), dtype="int32"), -1) - self._bucketing_index, init = paddle_helper.lod_constant( - name=self.__data_name_prefix + "_bucketing_index", - dtype="int32", - lod=list(uniq_dst_count), - value=bucket_value) - self._initializers.append(init) - - node_ids_value = np.arange(0, graph.num_nodes, dtype="int32") + node_ids_value = np.arange(0, graph.num_nodes, dtype="int64") self._node_ids, init = paddle_helper.constant( - name=self.__data_name_prefix + "_node_ids", - dtype="int32", + name=self.__data_name_prefix + "/node_ids", + dtype="int64", value=node_ids_value) self._initializers.append(init) self._indegree, init = paddle_helper.constant( - name=self.__data_name_prefix + "_indegree", - dtype="int32", + name=self.__data_name_prefix + "/indegree", + dtype="int64", value=indegree) self._initializers.append(init) @@ -384,7 +375,8 @@ class StaticGraphWrapper(BaseGraphWrapper): node_feat_dtype = node_feat_value.dtype self._node_feat_tensor_dict[ node_feat_name], init = paddle_helper.constant( - name=self.__data_name_prefix + '_' + node_feat_name, + name=self.__data_name_prefix + '/node_feat/' + + node_feat_name, dtype=node_feat_dtype, value=node_feat_value) collector.append(init) @@ -397,7 +389,8 @@ class StaticGraphWrapper(BaseGraphWrapper): edge_feat_dtype = edge_feat_value.dtype self._edge_feat_tensor_dict[ edge_feat_name], init = paddle_helper.constant( - name=self.__data_name_prefix + '_' + edge_feat_name, + name=self.__data_name_prefix + '/edge_feat/' + + edge_feat_name, dtype=edge_feat_dtype, value=edge_feat_value) collector.append(init) @@ -483,6 +476,8 @@ class GraphWrapper(BaseGraphWrapper): def __init__(self, name, place, node_feat=[], edge_feat=[]): super(GraphWrapper, self).__init__() + # collect holders for PyReader + self._holder_list = [] self.__data_name_prefix = name self._place = place self.__create_graph_attr_holders() @@ -498,78 +493,78 @@ class GraphWrapper(BaseGraphWrapper): """Create data holders for graph attributes. """ self._edges_src = fluid.layers.data( - self.__data_name_prefix + '_edges_src', + self.__data_name_prefix + '/edges_src', shape=[None], append_batch_size=False, - dtype="int32", + dtype="int64", stop_gradient=True) self._edges_dst = fluid.layers.data( - self.__data_name_prefix + '_edges_dst', + self.__data_name_prefix + '/edges_dst', shape=[None], append_batch_size=False, - dtype="int32", + dtype="int64", stop_gradient=True) self._num_nodes = fluid.layers.data( - self.__data_name_prefix + '_num_nodes', + self.__data_name_prefix + '/num_nodes', shape=[1], append_batch_size=False, - dtype='int32', + dtype='int64', stop_gradient=True) self._edge_uniq_dst = fluid.layers.data( - self.__data_name_prefix + "_uniq_dst", + self.__data_name_prefix + "/uniq_dst", shape=[None], append_batch_size=False, - dtype="int32", + dtype="int64", stop_gradient=True) self._edge_uniq_dst_count = fluid.layers.data( - self.__data_name_prefix + "_uniq_dst_count", + self.__data_name_prefix + "/uniq_dst_count", shape=[None], append_batch_size=False, dtype="int32", stop_gradient=True) - self._bucketing_index = fluid.layers.data( - self.__data_name_prefix + "_bucketing_index", - shape=[None, 1], - append_batch_size=False, - dtype="int32", - lod_level=1, - stop_gradient=True) self._node_ids = fluid.layers.data( - self.__data_name_prefix + "_node_ids", + self.__data_name_prefix + "/node_ids", shape=[None], append_batch_size=False, - dtype="int32", + dtype="int64", stop_gradient=True) self._indegree = fluid.layers.data( - self.__data_name_prefix + "_indegree", + self.__data_name_prefix + "/indegree", shape=[None], append_batch_size=False, - dtype="int32", + dtype="int64", stop_gradient=True) + self._holder_list.extend([ + self._edges_src, self._edges_dst, self._num_nodes, + self._edge_uniq_dst, self._edge_uniq_dst_count, self._node_ids, + self._indegree + ]) def __create_graph_node_feat_holders(self, node_feat_name, node_feat_shape, node_feat_dtype): """Create data holders for node features. """ feat_holder = fluid.layers.data( - self.__data_name_prefix + '_' + node_feat_name, + self.__data_name_prefix + '/node_feat/' + node_feat_name, shape=node_feat_shape, append_batch_size=False, dtype=node_feat_dtype, stop_gradient=True) self._node_feat_tensor_dict[node_feat_name] = feat_holder + self._holder_list.append(feat_holder) def __create_graph_edge_feat_holders(self, edge_feat_name, edge_feat_shape, edge_feat_dtype): """Create edge holders for edge features. """ feat_holder = fluid.layers.data( - self.__data_name_prefix + '_' + edge_feat_name, + self.__data_name_prefix + '/edge_feat/' + edge_feat_name, shape=edge_feat_shape, append_batch_size=False, dtype=edge_feat_dtype, stop_gradient=True) self._edge_feat_tensor_dict[edge_feat_name] = feat_holder + self._holder_list.append(feat_holder) def to_feed(self, graph): """Convert the graph into feed_dict. @@ -590,6 +585,8 @@ class GraphWrapper(BaseGraphWrapper): nodes = graph.nodes uniq_dst = nodes[indegree > 0] uniq_dst_count = indegree[indegree > 0] + uniq_dst_count = np.cumsum(uniq_dst_count, dtype='int32') + uniq_dst_count = np.insert(uniq_dst_count, 0, 0) edge_feat = {} @@ -597,21 +594,27 @@ class GraphWrapper(BaseGraphWrapper): edge_feat[key] = value[eid] node_feat = graph.node_feat - feed_dict[self.__data_name_prefix + '_edges_src'] = src - feed_dict[self.__data_name_prefix + '_edges_dst'] = dst - feed_dict[self.__data_name_prefix + '_num_nodes'] = graph.num_nodes - feed_dict[self.__data_name_prefix + '_uniq_dst'] = uniq_dst - feed_dict[self.__data_name_prefix + '_uniq_dst_count'] = uniq_dst_count - feed_dict[self.__data_name_prefix + '_node_ids'] = graph.nodes - feed_dict[self.__data_name_prefix + '_indegree'] = indegree - feed_dict[self.__data_name_prefix + '_bucketing_index'] = \ - fluid.create_lod_tensor(np.expand_dims(np.arange(0, len(dst), dtype="int32"), -1), - [list(uniq_dst_count)], self._place) + feed_dict[self.__data_name_prefix + '/edges_src'] = src + feed_dict[self.__data_name_prefix + '/edges_dst'] = dst + feed_dict[self.__data_name_prefix + '/num_nodes'] = np.array( + graph.num_nodes) + feed_dict[self.__data_name_prefix + '/uniq_dst'] = uniq_dst + feed_dict[self.__data_name_prefix + '/uniq_dst_count'] = uniq_dst_count + feed_dict[self.__data_name_prefix + '/node_ids'] = graph.nodes + feed_dict[self.__data_name_prefix + '/indegree'] = indegree for key in self._node_feat_tensor_dict: - feed_dict[self.__data_name_prefix + '_' + key] = node_feat[key] + feed_dict[self.__data_name_prefix + '/node_feat/' + + key] = node_feat[key] for key in self._edge_feat_tensor_dict: - feed_dict[self.__data_name_prefix + '_' + key] = edge_feat[key] + feed_dict[self.__data_name_prefix + '/edge_feat/' + + key] = edge_feat[key] return feed_dict + + @property + def holder_list(self): + """Return the holder list. + """ + return self._holder_list diff --git a/pgl/layers/conv.py b/pgl/layers/conv.py index a1dabdd..804534a 100644 --- a/pgl/layers/conv.py +++ b/pgl/layers/conv.py @@ -53,7 +53,7 @@ def gcn(gw, feature, hidden_size, activation, name, norm=None): feature = fluid.layers.fc(feature, size=hidden_size, bias_attr=False, - name=name) + param_attr=fluid.ParamAttr(name=name)) if norm is not None: feature = feature * norm @@ -67,7 +67,7 @@ def gcn(gw, feature, hidden_size, activation, name, norm=None): output = fluid.layers.fc(output, size=hidden_size, bias_attr=False, - name=name) + param_attr=fluid.ParamAttr(name=name)) if norm is not None: output = output * norm @@ -152,7 +152,7 @@ def gat(gw, ft = fluid.layers.fc(feature, hidden_size * num_heads, bias_attr=False, - name=name + '_weight') + param_attr=fluid.ParamAttr(name=name + '_weight')) left_a = fluid.layers.create_parameter( shape=[num_heads, hidden_size], dtype='float32', diff --git a/pgl/layers/set2set.py b/pgl/layers/set2set.py new file mode 100644 index 0000000..18d65fa --- /dev/null +++ b/pgl/layers/set2set.py @@ -0,0 +1,93 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This package implements common layers to help building pooling operators. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals + +import paddle.fluid as F +import paddle.fluid.layers as L + +import pgl + + +class Set2Set(object): + """Implementation of set2set pooling operator. + + This is an implementation of the paper ORDER MATTERS: SEQUENCE TO SEQUENCE + FOR SETS (https://arxiv.org/pdf/1511.06391.pdf). + """ + + def __init__(self, input_dim, n_iters, n_layers): + """ + Args: + input_dim: hidden size of input data. + n_iters: number of set2set iterations. + n_layers: number of lstm layers. + """ + self.input_dim = input_dim + self.output_dim = 2 * input_dim + self.n_iters = n_iters + + # this's set2set n_layers, lstm n_layers = 1 + self.n_layers = n_layers + + def forward(self, feat): + """ + Args: + feat: input feature with shape [batch, n_edges, dim]. + + Return: + output_feat: output feature of set2set pooling with shape [batch, 2*dim]. + """ + + seqlen = 1 + h = L.fill_constant_batch_size_like( + feat, [1, self.n_layers, self.input_dim], "float32", 0) + h = L.transpose(h, [1, 0, 2]) + c = h + + # [seqlen, batch, dim] + q_star = L.fill_constant_batch_size_like( + feat, [1, seqlen, self.output_dim], "float32", 0) + q_star = L.transpose(q_star, [1, 0, 2]) + + for _ in range(self.n_iters): + + # q [seqlen, batch, dim] + # h [layer, batch, dim] + q, h, c = L.lstm( + q_star, + h, + c, + seqlen, + self.input_dim, + self.n_layers, + is_bidirec=False) + + # e [batch, seqlen, n_edges] + e = L.matmul(L.transpose(q, [1, 0, 2]), feat, transpose_y=True) + # alpha [batch, seqlen, n_edges] + alpha = L.softmax(e) + + # readout [batch, seqlen, dim] + readout = L.matmul(alpha, feat) + readout = L.transpose(readout, [1, 0, 2]) + + # q_star [seqlen, batch, dim + dim] + q_star = L.concat([q, readout], -1) + + return L.squeeze(q_star, [0]) diff --git a/pgl/redis_graph.py b/pgl/redis_graph.py new file mode 100644 index 0000000..ae6ae1a --- /dev/null +++ b/pgl/redis_graph.py @@ -0,0 +1,478 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""redis_graph""" + +import pgl +import redis +from redis import BlockingConnectionPool, StrictRedis +from redis._compat import b, unicode, bytes, long, basestring +from rediscluster.nodemanager import NodeManager +from rediscluster.crc import crc16 +from collections import OrderedDict +import threading +import numpy as np +import time +import json +import pgl.graph as pgraph +import pickle as pkl +from pgl.utils.logger import log +import pgl.graph_kernel as graph_kernel + + +def encode(value): + """ + Return a bytestring representation of the value. + This method is copied from Redis' connection.py:Connection.encode + """ + if isinstance(value, bytes): + return value + elif isinstance(value, (int, long)): + value = b(str(value)) + elif isinstance(value, float): + value = b(repr(value)) + elif not isinstance(value, basestring): + value = unicode(value) + if isinstance(value, unicode): + value = value.encode('utf-8') + return value + + +def crc16_hash(data): + """crc16_hash""" + return crc16(encode(data)) + + +LUA_SCRIPT = """ +math.randomseed(tonumber(ARGV[1])) + +local function permute(tab, count, bucket_size) + local n = #tab / bucket_size + local o_ret = {} + local o_dict = {} + for i = 1, count do + local j = math.random(i, n) + o_ret[i] = string.sub(tab, (i - 1) * bucket_size + 1, i * bucket_size) + if j > count then + if o_dict[j] ~= nil then + o_ret[i], o_dict[j] = o_dict[j], o_ret[i] + else + o_dict[j], o_ret[i] = o_ret[i], string.sub(tab, (j - 1) * bucket_size + 1, j * bucket_size) + end + end + end + return table.concat(o_ret) +end + +local bucket_size = 16 +local ret = {} +local sample_size = tonumber(ARGV[2]) +for i=1, #ARGV - 2 do + local tab = redis.call("HGET", KEYS[1], ARGV[i + 2]) + if tab then + if #tab / bucket_size <= sample_size then + ret[i] = tab + else + ret[i] = permute(tab, sample_size, bucket_size) + end + else + ret[i] = tab + end +end +return ret +""" + + +class RedisCluster(object): + """RedisCluster""" + + def __init__(self, startup_nodes): + self.nodemanager = NodeManager(startup_nodes=startup_nodes) + self.nodemanager.initialize() + self.redis_worker = {} + for node, config in self.nodemanager.nodes.items(): + rdp = BlockingConnectionPool( + host=config["host"], port=config["port"]) + self.redis_worker[node] = { + "worker": StrictRedis( + connection_pool=rdp, decode_responses=False), + "type": config["server_type"] + } + + def get(self, key): + """get""" + slot = self.nodemanager.keyslot(key) + node = np.random.choice(self.nodemanager.slots[slot]) + worker = self.redis_worker[node['name']] + if worker["type"] == "slave": + worker["worker"].execute_command("READONLY") + return worker["worker"].get(key) + + def hmget(self, key, fields): + """hmget""" + while True: + retry = 0 + try: + slot = self.nodemanager.keyslot(key) + node = np.random.choice(self.nodemanager.slots[slot]) + worker = self.redis_worker[node['name']] + if worker["type"] == "slave": + worker["worker"].execute_command("READONLY") + ret = worker["worker"].hmget(key, fields) + break + except Exception as e: + retry += 1 + if retry > 5: + raise e + print("RETRY hmget after 1 sec. Retry Time %s" % retry) + time.sleep(1) + return ret + + def hmget_sample(self, key, fields, sample): + """hmget_sample""" + while True: + retry = 0 + try: + slot = self.nodemanager.keyslot(key) + node = np.random.choice(self.nodemanager.slots[slot]) + worker = self.redis_worker[node['name']] + if worker["type"] == "slave": + worker["worker"].execute_command("READONLY") + func = worker["worker"].register_script(LUA_SCRIPT) + ret = func( + keys=[key], + args=[np.random.randint(4294967295), sample] + fields) + break + except Exception as e: + retry += 1 + if retry > 5: + raise e + print("RETRY hmget_sample after 1 sec. Retry Time %s" % retry) + time.sleep(1) + return ret + + +def hmget_sample_helper(rs, query, num_parts, sample_size): + """hmget_sample_helper""" + buff = [b""] * len(query) + part_dict = {} + part_ind_dict = {} + for ind, q in enumerate(query): + part = crc16_hash(q) % num_parts + part = "part-%s" % part + if part not in part_dict: + part_dict[part] = [] + part_ind_dict[part] = [] + part_dict[part].append(q) + part_ind_dict[part].append(ind) + + def worker(_key, _value, _buff, _rs, _part_ind_dict, _sample_size): + """worker""" + response = _rs.hmget_sample(_key, _value, _sample_size) + for res, ind in zip(response, _part_ind_dict[_key]): + buff[ind] = res + + def hmget(_part_dict, _rs, _buff, _part_ind_dict, _sample_size): + """hmget""" + key_value = list(_part_dict.items()) + np.random.shuffle(key_value) + for key, value in key_value: + worker(key, value, _buff, _rs, _part_ind_dict, _sample_size) + + hmget(part_dict, rs, buff, part_ind_dict, sample_size) + return buff + + +def hmget_helper(rs, query, num_parts): + """hmget_helper""" + buff = [b""] * len(query) + part_dict = {} + part_ind_dict = {} + for ind, q in enumerate(query): + part = crc16_hash(q) % num_parts + part = "part-%s" % part + if part not in part_dict: + part_dict[part] = [] + part_ind_dict[part] = [] + part_dict[part].append(q) + part_ind_dict[part].append(ind) + + def worker(_key, _value, _buff, _rs, _part_ind_dict): + """worker""" + response = _rs.hmget(_key, _value) + for res, ind in zip(response, _part_ind_dict[_key]): + buff[ind] = res + + def hmget(_part_dict, _rs, _buff, _part_ind_dict): + """hmget""" + key_value = list(_part_dict.items()) + np.random.shuffle(key_value) + for key, value in key_value: + worker(key, value, _buff, _rs, _part_ind_dict) + + hmget(part_dict, rs, buff, part_ind_dict) + return buff + + +class RedisGraph(pgraph.Graph): + """RedisGraph""" + + def __init__(self, name, redis_config, num_parts): + self._rs = RedisCluster(startup_nodes=redis_config) + self.num_parts = num_parts + self._name = name + self._num_nodes = None + self._num_edges = None + self._node_feat_info = None + self._edge_feat_info = None + self._node_feat_dtype = None + self._edge_feat_dtype = None + self._node_feat_shape = None + self._edge_feat_shape = None + + @property + def num_nodes(self): + """num_nodes""" + if self._num_nodes is None: + self._num_nodes = int(self._rs.get("num_nodes")) + return self._num_nodes + + @property + def num_edges(self): + """num_edges""" + if self._num_edges is None: + self._num_edges = int(self._rs.get("num_edges")) + return self._num_edges + + def node_feat_info(self): + """node_feat_info""" + if self._node_feat_info is None: + buff = self._rs.get("nf:infos") + self._node_feat_info = json.loads(buff.decode()) + return self._node_feat_info + + def node_feat_dtype(self, key): + """node_feat_dtype""" + if self._node_feat_dtype is None: + self._node_feat_dtype = {} + for key, _, dtype in self.node_feat_info(): + self._node_feat_dtype[key] = dtype + return self._node_feat_dtype[key] + + def node_feat_shape(self, key): + """node_feat_shape""" + if self._node_feat_shape is None: + self._node_feat_shape = {} + for key, shape, _ in self.node_feat_info(): + self._node_feat_shape[key] = shape + return self._node_feat_shape[key] + + def edge_feat_shape(self, key): + """edge_feat_shape""" + if self._edge_feat_shape is None: + self._edge_feat_shape = {} + for key, shape, _ in self.edge_feat_info(): + self._edge_feat_shape[key] = shape + return self._edge_feat_shape[key] + + def edge_feat_dtype(self, key): + """edge_feat_dtype""" + if self._edge_feat_dtype is None: + self._edge_feat_dtype = {} + for key, _, dtype in self.edge_feat_info(): + self._edge_feat_dtype[key] = dtype + return self._edge_feat_dtype[key] + + def edge_feat_info(self): + """edge_feat_info""" + if self._edge_feat_info is None: + buff = self._rs.get("ef:infos") + self._edge_feat_info = json.loads(buff.decode()) + return self._edge_feat_info + + def sample_predecessor(self, nodes, max_degree, return_eids=False): + """sample_predecessor""" + query = ["d:%s" % n for n in nodes] + rets = hmget_sample_helper(self._rs, query, self.num_parts, max_degree) + v = [] + eid = [] + for buff in rets: + if buff is None: + v.append(np.array([], dtype="int64")) + eid.append(np.array([], dtype="int64")) + else: + npret = np.frombuffer( + buff, dtype="int64").reshape([-1, 2]).astype("int64") + v.append(npret[:, 0]) + eid.append(npret[:, 1]) + if return_eids: + return np.array(v), np.array(eid) + else: + return np.array(v) + + def sample_successor(self, nodes, max_degree, return_eids=False): + """sample_successor""" + query = ["s:%s" % n for n in nodes] + rets = hmget_sample_helper(self._rs, query, self.num_parts, max_degree) + v = [] + eid = [] + for buff in rets: + if buff is None: + v.append(np.array([], dtype="int64")) + eid.append(np.array([], dtype="int64")) + else: + npret = np.frombuffer( + buff, dtype="int64").reshape([-1, 2]).astype("int64") + v.append(npret[:, 0]) + eid.append(npret[:, 1]) + if return_eids: + return np.array(v), np.array(eid) + else: + return np.array(v) + + def predecessor(self, nodes, return_eids=False): + """predecessor""" + query = ["d:%s" % n for n in nodes] + ret = hmget_helper(self._rs, query, self.num_parts) + v = [] + eid = [] + for buff in ret: + if buff is not None: + npret = np.frombuffer( + buff, dtype="int64").reshape([-1, 2]).astype("int64") + v.append(npret[:, 0]) + eid.append(npret[:, 1]) + else: + v.append(np.array([], dtype="int64")) + eid.append(np.array([], dtype="int64")) + if return_eids: + return np.array(v), np.array(eid) + else: + return np.array(v) + + def successor(self, nodes, return_eids=False): + """successor""" + query = ["s:%s" % n for n in nodes] + ret = hmget_helper(self._rs, query, self.num_parts) + v = [] + eid = [] + for buff in ret: + if buff is not None: + npret = np.frombuffer( + buff, dtype="int64").reshape([-1, 2]).astype("int64") + v.append(npret[:, 0]) + eid.append(npret[:, 1]) + else: + v.append(np.array([], dtype="int64")) + eid.append(np.array([], dtype="int64")) + if return_eids: + return np.array(v), np.array(eid) + else: + return np.array(v) + + def get_edges_by_id(self, eids): + """get_edges_by_id""" + queries = ["e:%s" % e for e in eids] + ret = hmget_helper(self._rs, queries, self.num_parts) + o = np.asarray(ret, dtype="int64") + dst = o % self.num_nodes + src = o // self.num_nodes + data = np.hstack( + [src.reshape([-1, 1]), dst.reshape([-1, 1])]).astype("int64") + return data + + def get_node_feat_by_id(self, key, nodes): + """get_node_feat_by_id""" + queries = ["nf:%s:%i" % (key, nid) for nid in nodes] + ret = hmget_helper(self._rs, queries, self.num_parts) + ret = b"".join(ret) + data = np.frombuffer(ret, dtype=self.node_feat_dtype(key)) + data = data.reshape(self.node_feat_shape(key)) + return data + + def get_edge_feat_by_id(self, key, eids): + """get_edge_feat_by_id""" + queries = ["ef:%s:%i" % (key, e) for e in eids] + ret = hmget_helper(self._rs, queries, self.num_parts) + ret = b"".join(ret) + data = np.frombuffer(ret, dtype=self.edge_feat_dtype(key)) + data = data.reshape(self.edge_feat_shape(key)) + return data + + def subgraph(self, nodes, eid, edges=None): + """Generate subgraph with nodes and edge ids. + + This function will generate a :code:`pgl.graph.Subgraph` object and + copy all corresponding node and edge features. Nodes and edges will + be reindex from 0. + + WARNING: ALL NODES IN EID MUST BE INCLUDED BY NODES + + Args: + nodes: Node ids which will be included in the subgraph. + + eid: Edge ids which will be included in the subgraph. + + Return: + A :code:`pgl.graph.Subgraph` object. + """ + reindex = {} + + for ind, node in enumerate(nodes): + reindex[node] = ind + + if edges is None: + edges = self.get_edges_by_id(eid) + else: + edges = np.array(edges, dtype="int64") + + sub_edges = graph_kernel.map_edges( + np.arange( + len(edges), dtype="int64"), edges, reindex) + + sub_edge_feat = {} + for key, _, _ in self.edge_feat_info(): + sub_edge_feat[key] = self.get_edge_feat_by_id(key, eid) + + sub_node_feat = {} + for key, _, _ in self.node_feat_info(): + sub_node_feat[key] = self.get_node_feat_by_id(key, nodes) + + subgraph = pgraph.SubGraph( + num_nodes=len(nodes), + edges=sub_edges, + node_feat=sub_node_feat, + edge_feat=sub_edge_feat, + reindex=reindex) + return subgraph + + def node_batch_iter(self, batch_size, shuffle=True): + """Node batch iterator + + Iterate all node by batch. + + Args: + batch_size: The batch size of each batch of nodes. + + shuffle: Whether shuffle the nodes. + + Return: + Batch iterator + """ + perm = np.arange(self.num_nodes, dtype="int64") + if shuffle: + np.random.shuffle(perm) + start = 0 + while start < self._num_nodes: + yield perm[start:start + batch_size] + start += batch_size diff --git a/pgl/sample.py b/pgl/sample.py new file mode 100644 index 0000000..176c32b --- /dev/null +++ b/pgl/sample.py @@ -0,0 +1,253 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + This package implement graph sampling algorithm. +""" +import time +import copy + +import numpy as np +import pgl +from pgl.utils.logger import log +from pgl import graph_kernel + +__all__ = ['graphsage_sample', 'node2vec_sample', 'deepwalk_sample'] + + +def edge_hash(src, dst): + """edge_hash + """ + return src * 100000007 + dst + + +def graphsage_sample(graph, nodes, samples, ignore_edges=[]): + """Implement of graphsage sample. + + Reference paper: https://cs.stanford.edu/~jure/pubs/node2vec-kdd16.pdf. + + Args: + graph: A pgl graph instance + nodes: Sample starting from nodes + samples: A list, number of neighbors in each layer + ignore_edges: list of edge(src, dst) will be ignored. + + Return: + A list of subgraphs + """ + start = time.time() + num_layers = len(samples) + start_nodes = nodes + nodes = list(start_nodes) + eids, edges = [], [] + nodes_set = set(nodes) + layer_nodes, layer_eids, layer_edges = [], [], [] + ignore_edge_set = set([edge_hash(src, dst) for src, dst in ignore_edges]) + + for layer_idx in reversed(range(num_layers)): + if len(start_nodes) == 0: + layer_nodes = [nodes] + layer_nodes + layer_eids = [eids] + layer_eids + layer_edges = [edges] + layer_edges + continue + batch_pred_nodes, batch_pred_eids = graph.sample_predecessor( + start_nodes, samples[layer_idx], return_eids=True) + log.debug("sample_predecessor time: %s" % (time.time() - start)) + start = time.time() + last_nodes_set = nodes_set + + nodes, eids = copy.copy(nodes), copy.copy(eids) + edges = copy.copy(edges) + nodes_set, eids_set = set(nodes), set(eids) + for srcs, dst, pred_eids in zip(batch_pred_nodes, start_nodes, + batch_pred_eids): + for src, eid in zip(srcs, pred_eids): + if edge_hash(src, dst) in ignore_edge_set: + continue + if eid not in eids_set: + eids.append(eid) + edges.append([src, dst]) + eids_set.add(eid) + if src not in nodes_set: + nodes.append(src) + nodes_set.add(src) + layer_edges = [edges] + layer_edges + start_nodes = list(nodes_set - last_nodes_set) + layer_nodes = [nodes] + layer_nodes + layer_eids = [eids] + layer_eids + log.debug("flat time: %s" % (time.time() - start)) + start = time.time() + # Find new nodes + + feed_dict = {} + + subgraphs = [] + for i in range(num_layers): + subgraphs.append( + graph.subgraph( + nodes=layer_nodes[0], eid=layer_eids[i], edges=layer_edges[i])) + # only for this task + subgraphs[i].node_feat["index"] = np.array( + layer_nodes[0], dtype="int64") + log.debug("subgraph time: %s" % (time.time() - start)) + + return subgraphs + + +def alias_sample(size, alias, events): + """Implement of alias sample. + Args: + size: Output shape. + alias: The alias table build by `alias_sample_build_table`. + events: The events table build by `alias_sample_build_table`. + + Return: + samples: The generated random samples. + """ + rand_num = np.random.uniform(0.0, len(alias), size) + idx = rand_num.astype("int64") + uni = rand_num - idx + flags = (uni >= alias[idx]) + idx[flags] = events[idx][flags] + return idx + + +def graph_alias_sample_table(graph, edge_weight_name): + """Build alias sample table for weighted deepwalk. + Args: + graph: The input graph + edge_weight_name: The name of edge weight in edge_feat. + + Return: + Alias sample tables for each nodes. + """ + edge_weight = graph.edge_feat[edge_weight_name] + _, eids_array = graph.successor(return_eids=True) + alias_array, events_array = [], [] + for eids in eids_array: + probs = edge_weight[eids] + probs /= np.sum(probs) + alias, events = graph_kernel.alias_sample_build_table(probs) + alias_array.append(alias), events_array.append(events) + alias_array, events_array = np.array(alias_array), np.array(events_array) + return alias_array, events_array + + +def deepwalk_sample(graph, nodes, max_depth, alias_name=None, + events_name=None): + """Implement of random walk. + + This function get random walks path for given nodes and depth. + + Args: + nodes: Walk starting from nodes + max_depth: Max walking depth + + Return: + A list of walks. + """ + walk = [] + # init + for node in nodes: + walk.append([node]) + + cur_walk_ids = np.arange(0, len(nodes)) + cur_nodes = np.array(nodes) + for l in range(max_depth): + # select the walks not end + cur_succs = graph.successor(cur_nodes) + mask = [len(succ) > 0 for succ in cur_succs] + + if np.any(mask): + cur_walk_ids = cur_walk_ids[mask] + cur_nodes = cur_nodes[mask] + cur_succs = cur_succs[mask] + else: + # stop when all nodes have no successor + break + + if alias_name is not None and events_name is not None: + sample_index = [ + alias_sample([1], graph.node_feat[alias_name][node], + graph.node_feat[events_name][node])[0] + for node in cur_nodes + ] + else: + outdegree = [len(cur_succ) for cur_succ in cur_succs] + sample_index = np.floor( + np.random.rand(cur_succs.shape[0]) * outdegree).astype("int64") + + nxt_cur_nodes = [] + for s, ind, walk_id in zip(cur_succs, sample_index, cur_walk_ids): + walk[walk_id].append(s[ind]) + nxt_cur_nodes.append(s[ind]) + cur_nodes = np.array(nxt_cur_nodes) + return walk + + +def node2vec_sample(graph, nodes, max_depth, p=1.0, q=1.0): + """Implement of node2vec random walk. + + Reference paper: https://cs.stanford.edu/~jure/pubs/node2vec-kdd16.pdf. + + Args: + graph: A pgl graph instance + nodes: Walk starting from nodes + max_depth: Max walking depth + p: Return parameter + q: In-out parameter + + Return: + A list of walks. + """ + if p == 1.0 and q == 1.0: + return deepwalk_sample(graph, nodes, max_depth) + + walk = [] + # init + for node in nodes: + walk.append([node]) + + cur_walk_ids = np.arange(0, len(nodes)) + cur_nodes = np.array(nodes) + prev_nodes = np.array([-1] * len(nodes), dtype="int64") + prev_succs = np.array([[]] * len(nodes), dtype="int64") + for l in range(max_depth): + # select the walks not end + cur_succs = graph.successor(cur_nodes) + + mask = [len(succ) > 0 for succ in cur_succs] + if np.any(mask): + cur_walk_ids = cur_walk_ids[mask] + cur_nodes = cur_nodes[mask] + prev_nodes = prev_nodes[mask] + prev_succs = prev_succs[mask] + cur_succs = cur_succs[mask] + else: + # stop when all nodes have no successor + break + num_nodes = cur_nodes.shape[0] + nxt_nodes = np.zeros(num_nodes, dtype="int64") + + for idx, ( + succ, prev_succ, walk_id, prev_node + ) in enumerate(zip(cur_succs, prev_succs, cur_walk_ids, prev_nodes)): + + sampled_succ = graph_kernel.node2vec_sample(succ, prev_succ, + prev_node, p, q) + walk[walk_id].append(sampled_succ) + nxt_nodes[idx] = sampled_succ + + prev_nodes, prev_succs = cur_nodes, cur_succs + cur_nodes = nxt_nodes + return walk diff --git a/pgl/tests/deepwalk/test_alias_sample.py b/pgl/tests/deepwalk/test_alias_sample.py new file mode 100644 index 0000000..c14ba5a --- /dev/null +++ b/pgl/tests/deepwalk/test_alias_sample.py @@ -0,0 +1,69 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""test_alias_sample""" +import argparse +import time +import unittest +from collections import Counter + +import numpy as np + +from pgl.graph_kernel import alias_sample_build_table +from pgl.sample import alias_sample + + +class AliasSampleTest(unittest.TestCase): + """AliasSampleTest + """ + + def setUp(self): + pass + + def test_speed(self): + """test_speed + """ + + num = 1000 + size = [10240, 1, 5] + probs = np.random.uniform(0.0, 1.0, [num]) + probs /= np.sum(probs) + + start = time.time() + alias, events = alias_sample_build_table(probs) + for i in range(100): + alias_sample(size, alias, events) + alias_sample_time = time.time() - start + + start = time.time() + for i in range(100): + np.random.choice(num, size, p=probs) + np_sample_time = time.time() - start + self.assertTrue(alias_sample_time < np_sample_time) + + def test_resut(self): + """test_result + """ + size = [450000] + num = 10 + probs = np.arange(1, num).astype(np.float64) + probs /= np.sum(probs) + alias, events = alias_sample_build_table(probs) + ret = alias_sample(size, alias, events) + cnt = Counter(ret) + sort_cnt_keys = [x[1] for x in sorted(zip(cnt.values(), cnt.keys()))] + self.assertEqual(sort_cnt_keys, np.arange(0, num - 1).tolist()) + + +if __name__ == '__main__': + unittest.main() diff --git a/pgl/tests/test_redis_graph.py b/pgl/tests/test_redis_graph.py new file mode 100644 index 0000000..6d2601d --- /dev/null +++ b/pgl/tests/test_redis_graph.py @@ -0,0 +1,56 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""test_redis_graph""" +import time +import unittest +import json +import os + +import numpy as np +from pgl.redis_graph import RedisGraph + + +class RedisGraphTest(unittest.TestCase): + """RedisGraphTest + """ + + def setUp(self): + config_path = os.path.join( + os.path.abspath(os.path.dirname(__file__)), + 'test_redis_graph_conf.json') + with open(config_path) as inf: + config = json.load(inf) + redis_configs = [config["redis"], ] + self.graph = RedisGraph( + "reddit-graph", redis_configs, num_parts=config["num_parts"]) + + def test_random_seed(self): + """test_random_seed + """ + np.random.seed(1) + data1 = self.graph.sample_predecessor(range(1000), max_degree=5) + data1 = [nid for nodes in data1 for nid in nodes] + np.random.seed(1) + data2 = self.graph.sample_predecessor(range(1000), max_degree=5) + data2 = [nid for nodes in data2 for nid in nodes] + np.random.seed(3) + data3 = self.graph.sample_predecessor(range(1000), max_degree=5) + data3 = [nid for nodes in data3 for nid in nodes] + + self.assertEqual(data1, data2) + self.assertNotEqual(data2, data3) + + +if __name__ == '__main__': + unittest.main() diff --git a/pgl/tests/test_redis_graph_conf.json b/pgl/tests/test_redis_graph_conf.json new file mode 100644 index 0000000..c334656 --- /dev/null +++ b/pgl/tests/test_redis_graph_conf.json @@ -0,0 +1,8 @@ +{ + "redis": + { + "host": "10.86.54.13", + "port": "7003" + }, + "num_parts": 64 +} diff --git a/pgl/tests/test_sample.py b/pgl/tests/test_sample.py new file mode 100644 index 0000000..6eadb65 --- /dev/null +++ b/pgl/tests/test_sample.py @@ -0,0 +1,68 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + This package implement graph sampling algorithm. +""" +import unittest +import os +import json + +import numpy as np +from pgl.redis_graph import RedisGraph +from pgl.sample import graphsage_sample +from pgl.sample import node2vec_sample + + +class SampleTest(unittest.TestCase): + """SampleTest + """ + + def setUp(self): + config_path = os.path.join( + os.path.abspath(os.path.dirname(__file__)), + 'test_redis_graph_conf.json') + with open(config_path) as inf: + config = json.load(inf) + redis_configs = [config["redis"], ] + self.graph = RedisGraph( + "reddit-graph", redis_configs, num_parts=config["num_parts"]) + + def test_graphsage_sample(self): + """test_graphsage_sample + """ + eids = np.random.choice(self.graph.num_edges, 1000) + edges = self.graph.get_edges_by_id(eids) + nodes = [n for edge in edges for n in edge] + ignore_edges = edges.tolist() + edges[:, [1, 0]].tolist() + + np.random.seed(1) + subgraphs = graphsage_sample(self.graph, nodes, [10, 10], []) + + np.random.seed(1) + subgraphs_ignored = graphsage_sample(self.graph, nodes, [10, 10], + ignore_edges) + + self.assertEqual(subgraphs[0].num_nodes, + subgraphs_ignored[0].num_nodes) + self.assertGreaterEqual(subgraphs[0].num_edges, + subgraphs_ignored[0].num_edges) + + def test_node2vec_sample(self): + """test_node2vec_sample + """ + walks = node2vec_sample(self.graph, range(10), 3) + + +if __name__ == '__main__': + unittest.main() diff --git a/pgl/tests/test_set2set.py b/pgl/tests/test_set2set.py new file mode 100644 index 0000000..f0572c1 --- /dev/null +++ b/pgl/tests/test_set2set.py @@ -0,0 +1,67 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" + Comment. +""" +from __future__ import division +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals +import unittest + +import paddle.fluid as F +import paddle.fluid.layers as L + +from pgl.layers.set2set import Set2Set + + +def paddle_easy_run(model_func, data): + prog = F.Program() + startup_prog = F.Program() + with F.program_guard(prog, startup_prog): + ret = model_func() + place = F.CUDAPlace(0) + exe = F.Executor(place) + exe.run(startup_prog) + return exe.run(prog, fetch_list=ret, feed=data) + + +class Set2SetTest(unittest.TestCase): + """Set2SetTest + """ + + def test_graphsage_sample(self): + """test_graphsage_sample + """ + import numpy as np + + def model_func(): + s2s = Set2Set(5, 1, 3) + h0 = L.data( + name='h0', + shape=[2, 10, 5], + dtype='float32', + append_batch_size=False) + h1 = s2s.forward(h0) + return h1, + + data = {"h0": np.random.rand(2, 10, 5).astype("float32")} + h1, = paddle_easy_run(model_func, data) + + self.assertEqual(h1.shape[0], 2) + self.assertEqual(h1.shape[1], 10) + + +if __name__ == "__main__": + unittest.main() diff --git a/pgl/utils/mp_reader.py b/pgl/utils/mp_reader.py new file mode 100644 index 0000000..9f26a60 --- /dev/null +++ b/pgl/utils/mp_reader.py @@ -0,0 +1,152 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Optimized Multiprocessing Reader for PaddlePaddle +""" +import logging +log = logging.getLogger(__name__) +import multiprocessing +import copy +try: + import ujson as json +except: + log.info("ujson not install, fail back to use json instead") + import json +import numpy as np +import time +import paddle.fluid as fluid + + +def serialize_data(data): + """serialize_data""" + if data is None: + return None + return numpy_serialize_data(data) #, ensure_ascii=False) + + +def numpy_serialize_data(data): + """serialize_data""" + ret_data = {} + for key in data: + if isinstance(data[key], np.ndarray): + ret_data[key] = (data[key].tobytes(), list(data[key].shape), + "%s" % data[key].dtype) + else: + ret_data[key] = data[key] + return ret_data + + +def numpy_deserialize_data(data): + """deserialize_data""" + if data is None: + return None + for key in data: + if isinstance(data[key], tuple): + value = np.frombuffer( + data[key][0], dtype=data[key][2]).reshape(data[key][1]) + data[key] = value + return data + + +def deserialize_data(data): + """deserialize_data""" + return numpy_deserialize_data(data) + + +def multiprocess_reader(readers, use_pipe=True, queue_size=1000, pipe_size=10): + """ + multiprocess_reader use python multi process to read data from readers + and then use multiprocess.Queue or multiprocess.Pipe to merge all + data. The process number is equal to the number of input readers, each + process call one reader. + Multiprocess.Queue require the rw access right to /dev/shm, some + platform does not support. + you need to create multiple readers first, these readers should be independent + to each other so that each process can work independently. + An example: + .. code-block:: python + reader0 = reader(["file01", "file02"]) + reader1 = reader(["file11", "file12"]) + reader1 = reader(["file21", "file22"]) + reader = multiprocess_reader([reader0, reader1, reader2], + queue_size=100, use_pipe=False) + """ + + assert type(readers) is list and len(readers) > 0 + + def _read_into_queue(reader, queue): + """read_into_queue""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None") + queue.put(serialize_data(sample)) + queue.put(serialize_data(None)) + + def queue_reader(): + """queue_reader""" + queue = multiprocessing.Queue(queue_size) + for reader in readers: + p = multiprocessing.Process( + target=_read_into_queue, args=(reader, queue)) + p.start() + + reader_num = len(readers) + finish_num = 0 + while finish_num < reader_num: + sample = deserialize_data(queue.get()) + if sample is None: + finish_num += 1 + else: + yield sample + + def _read_into_pipe(reader, conn, max_pipe_size): + """read_into_pipe""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None!") + conn.send(serialize_data(sample)) + conn.send(serialize_data(None)) + conn.close() + + def pipe_reader(): + """pipe_reader""" + conns = [] + for reader in readers: + parent_conn, child_conn = multiprocessing.Pipe() + conns.append(parent_conn) + p = multiprocessing.Process( + target=_read_into_pipe, args=(reader, child_conn, pipe_size)) + p.start() + + reader_num = len(readers) + finish_num = 0 + conn_to_remove = [] + finish_flag = np.zeros(len(conns), dtype="int32") + while finish_num < reader_num: + for conn_id, conn in enumerate(conns): + if finish_flag[conn_id] > 0: + continue + if conn.poll(0.01): + buff = conn.recv() + sample = deserialize_data(buff) + if sample is None: + finish_num += 1 + conn.close() + finish_flag[conn_id] = 1 + else: + yield sample + + if use_pipe: + return pipe_reader + else: + return queue_reader diff --git a/pgl/utils/mt_reader.py b/pgl/utils/mt_reader.py new file mode 100644 index 0000000..3a1aad4 --- /dev/null +++ b/pgl/utils/mt_reader.py @@ -0,0 +1,79 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Optimized Multithreading Reader for PaddlePaddle +""" +import logging +log = logging.getLogger(__name__) +import threading +import queue +import copy +import numpy as np +import time +import paddle.fluid as fluid + + +def multithreading_reader(readers, queue_size=1000): + """ + multithreading_reader use python multi thread to read data from readers + and then use queue to merge all + data. The process number is equal to the number of input readers, each + process call one reader. + CPU usage rate won't go over 100% with GIL. + you need to create multiple readers first, these readers should be independent + to each other so that each process can work independently. + An example: + .. code-block:: python + reader0 = reader(["file01", "file02"]) + reader1 = reader(["file11", "file12"]) + reader1 = reader(["file21", "file22"]) + reader = multithreading_reader([reader0, reader1, reader2], + queue_size=100) + """ + + assert type(readers) is list and len(readers) > 0 + + def _read_into_queue(reader, queue): + """read_into_queue""" + for sample in reader(): + if sample is None: + raise ValueError("sample has None") + queue.put(sample) + queue.put(None) + + def queue_reader(): + """queue_reader""" + output_queue = queue.Queue(queue_size) + thread_pool = [] + thread_num = 0 + for reader in readers: + p = threading.Thread( + target=_read_into_queue, args=(reader, output_queue)) + p.daemon = True + p.start() + thread_pool.append(p) + thread_num += 1 + + while True: + ret = output_queue.get() + if ret is not None: + yield ret + else: + thread_num -= 1 + if thread_num == 0: + break + + for thread in thread_pool: + thread.join() + + return queue_reader diff --git a/pgl/utils/paddle_helper.py b/pgl/utils/paddle_helper.py index ecea364..f1e53ae 100644 --- a/pgl/utils/paddle_helper.py +++ b/pgl/utils/paddle_helper.py @@ -223,5 +223,25 @@ def scatter_add(input, index, updates): Same type and shape as input. """ - output = fluid.layers.scatter(input, index, updates, overwrite=False) + output = fluid.layers.scatter(input, index, updates, mode='add') + return output + + +def scatter_max(input, index, updates): + """Scatter max updates to input by given index. + + Adds sparse updates to input variables. + + Args: + input: Input tensor to be updated + + index: Slice index + + updates: Must have same type as input. + + Return: + Same type and shape as input. + """ + + output = fluid.layers.scatter(input, index, updates, mode='max') return output diff --git a/requirements.txt b/requirements.txt index b8b9367..4a13b16 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,6 @@ -numpy >= 1.14.5 +numpy >= 1.16.4 cython >= 0.25.2 + +#paddlepaddle + +redis-py-cluster diff --git a/setup.py b/setup.py index 3a720b1..f0b808a 100755 --- a/setup.py +++ b/setup.py @@ -16,10 +16,35 @@ import os import sys import re import codecs -import numpy as np from setuptools import setup, find_packages -from setuptools.extension import Extension -from Cython.Build import cythonize +from setuptools import Extension +from setuptools import dist +from setuptools.command.build_ext import build_ext as _build_ext + +try: + from Cython.Build import cythonize +except ImportError: + + def cythonize(*args, **kwargs): + """cythonize""" + from Cython.Build import cythonize + return cythonize(*args, **kwargs) + + +class CustomBuildExt(_build_ext): + """CustomBuildExt""" + + def finalize_options(self): + _build_ext.finalize_options(self) + # Prevent numpy from thinking it is still in its setup process: + __builtins__.__NUMPY_SETUP__ = False + import numpy + self.include_dirs.append(numpy.get_include()) + + +workdir = os.path.dirname(os.path.abspath(__file__)) +with open(os.path.join(workdir, './requirements.txt')) as f: + requirements = f.read().splitlines() cur_dir = os.path.abspath(os.path.dirname(__file__)) with open(os.path.join(cur_dir, 'README.md'), 'rb') as f: @@ -58,7 +83,6 @@ extensions = [ "pgl.graph_kernel", ["pgl/graph_kernel.pyx"], language="c++", - include_dirs=[np.get_include()], extra_compile_args=compile_extra_args, extra_link_args=link_extra_args, ), ] @@ -66,7 +90,6 @@ extensions = [ def get_package_data(path): files = [] - print(path) for root, dirnames, filenames in os.walk(path): for filename in filenames: files.append(os.path.join(root, filename)) @@ -83,9 +106,16 @@ setup( long_description_content_type='text/markdown', url="https://github.com/PaddlePaddle/PGL", package_data=package_data, + setup_requires=[ + 'setuptools>=18.0', + 'numpy>=1.16.4', + ], + install_requires=requirements, + cmdclass={'build_ext': CustomBuildExt}, packages=find_packages(), include_package_data=True, - ext_modules=cythonize(extensions), + #ext_modules=cythonize(extensions), + ext_modules=extensions, classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', diff --git a/tests/scatter_add_test.py b/tests/scatter_add_test.py new file mode 100644 index 0000000..04f4ef6 --- /dev/null +++ b/tests/scatter_add_test.py @@ -0,0 +1,40 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""scatter test cases""" + +import unittest + +import numpy as np +import paddle.fluid as fluid + + +class ScatterAddTest(unittest.TestCase): + """ScatterAddTest""" + + def test_scatter_add(self): + """test_scatter_add""" + with fluid.dygraph.guard(fluid.CPUPlace()): + input = fluid.dygraph.to_variable( + np.array( + [[1, 2], [5, 6]], dtype='float32'), ) + index = fluid.dygraph.to_variable(np.array([1, 1], dtype=np.int32)) + updates = fluid.dygraph.to_variable( + np.array( + [[3, 4], [3, 4]], dtype='float32'), ) + output = fluid.layers.scatter(input, index, updates, mode='add') + assert output.numpy().tolist() == [[1, 2], [11, 14]] + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unique_with_counts_test.py b/tests/unique_with_counts_test.py new file mode 100644 index 0000000..532843c --- /dev/null +++ b/tests/unique_with_counts_test.py @@ -0,0 +1,74 @@ +# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""unique with counts test""" + +import unittest + +import numpy as np +import paddle.fluid as fluid + + +class UniqueWithCountTest(unittest.TestCase): + """UniqueWithCountTest""" + + def _test_unique_with_counts_helper(self, input, output): + place = fluid.CPUPlace() + exe = fluid.Executor(place) + main_program = fluid.Program() + startup_program = fluid.Program() + with fluid.program_guard(main_program, startup_program): + x = fluid.layers.data( + name='input', + dtype='int64', + shape=[-1], + append_batch_size=False) + #x = fluid.assign(np.array([2, 3, 3, 1, 5, 3], dtype='int32')) + out, index, count = fluid.layers.unique_with_counts(x) + + out, index, count = exe.run( + main_program, + feed={'input': np.array( + input, dtype='int64'), }, + fetch_list=[out, index, count], + return_numpy=True, ) + out, index, count = out.tolist(), index.tolist(), count.tolist() + assert [out, index, count] == output + + def test_unique_with_counts(self): + """test_unique_with_counts""" + self._test_unique_with_counts_helper( + input=[1, 1, 2, 4, 4, 4, 7, 8, 8], + output=[ + [1, 2, 4, 7, 8], + [0, 0, 1, 2, 2, 2, 3, 4, 4], + [2, 1, 3, 1, 2], + ], ) + self._test_unique_with_counts_helper( + input=[1], + output=[ + [1], + [0], + [1], + ], ) + self._test_unique_with_counts_helper( + input=[1, 1], + output=[ + [1], + [0, 0], + [2], + ], ) + + +if __name__ == '__main__': + unittest.main() -- GitLab