diff --git a/.gitignore b/.gitignore
index 2691b61..1e2ced7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -159,8 +159,12 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
+# MacOS
+.DS_Store
+
# Checkpoints and influence outputs
checkpoints/
analyses/
data/
-*.pth
\ No newline at end of file
+*.pth
+*.pt
\ No newline at end of file
diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md
index 08c8d92..cb85859 100644
--- a/DOCUMENTATION.md
+++ b/DOCUMENTATION.md
@@ -1,5 +1,7 @@
# Kronfluence: Technical Documentation & FAQs
+For a detailed description of the methodology, see the [**paper**](https://arxiv.org/abs/2308.03296) *Studying Large Language Model Generalization with Influence Functions*.
+
## Requirements
Kronfluence has been tested on the following versions of [PyTorch](https://pytorch.org/):
@@ -10,7 +12,7 @@ Kronfluence has been tested on the following versions of [PyTorch](https://pytor
Kronfluence supports:
- Computing influence functions on selected PyTorch modules. At the moment, we support `nn.Linear` and `nn.Conv2d`;
-- Computing influence functions with several strategies: `identity`, `diagonal`, `KFAC`, and `EKFAC`;
+- Computing influence functions with several Hessian approximation strategies: `identity`, `diagonal`, `KFAC`, and `EKFAC`;
- Computing pairwise and self-influence scores.
> [!NOTE]
@@ -42,8 +44,8 @@ query_dataset = prepare_query_dataset()
**Define a Task.**
To compute influence scores, you need to define a [`Task`](https://github.com/pomonam/kronfluence/blob/main/kronfluence/task.py) class.
-This class encapsulates information about the trained model and how influence scores will be computed:
-(1) how to compute the training loss; (2) how to compute the measurement (f(θ) in the [paper](https://arxiv.org/abs/2308.03296));
+This class contains information about the trained model and how influence scores will be computed:
+(1) how to compute the training loss; (2) how to compute the measurable quantity (f(θ) in the [paper](https://arxiv.org/abs/2308.03296); see Equation 5);
(3) which modules to use for influence function computations; and (4) whether the model used [attention mask](https://huggingface.co/docs/transformers/en/glossary#attention-mask).
```python
@@ -59,6 +61,7 @@ class YourTask(Task):
model: nn.Module,
sample: bool = False,
) -> torch.Tensor:
+ # This will be used for computing the training gradient.
# TODO: Complete this method.
def compute_measurement(
@@ -66,6 +69,7 @@ class YourTask(Task):
batch: Any,
model: nn.Module,
) -> torch.Tensor:
+ # This will be used for computing the measurable quantity.
# TODO: Complete this method.
def tracked_modules(self) -> Optional[List[str]]:
@@ -129,7 +133,7 @@ scores = analyzer.compute_pairwise_scores(
...
```
-You can organize all factors and scores for the specific model with `factor_name` and `score_name`.
+You can organize all factors and scores for the specific model with `factors_name` and `scores_name`.
### FAQs
@@ -146,15 +150,15 @@ inspect `model.named_modules()` to determine what modules to use. You can specif
> [!NOTE]
> If the embedding layer for transformers are defined with `nn.Linear`, you must write
-> `task.tracked_modules` to avoid influence computations embedding matrices.
+> `task.tracked_modules` to avoid influence computations embedding matrices (it is too expensive).
**How should I implement Task.compute_train_loss?**
Implement the loss function used to train the model. Note that the function should return
the summed loss (over batches and tokens) and should not include regularizations.
**How should I implement Task.compute_measurement?**
-It depends on the analysis you would like to perform. Influence functions approximate the [local effect of downweighting/upweighting
-a data point on the query's measurable quantity](https://arxiv.org/abs/2209.05364). You can use the loss, [margin](https://arxiv.org/abs/2303.14186) (for classification),
+It depends on the analysis you would like to perform. Influence functions approximate the [effect of downweighting/upweighting
+a training data point on the query's measurable quantity](https://arxiv.org/abs/2209.05364). You can use the loss, [margin](https://arxiv.org/abs/2303.14186) (for classification),
or [conditional log-likelihood](https://arxiv.org/abs/2308.03296) (for language modeling).
**I encounter TrackedModuleNotFoundError when using DDP or FSDP.**
@@ -188,7 +192,7 @@ import torch
from kronfluence.arguments import FactorArguments
factor_args = FactorArguments(
- strategy="ekfac", # Choose from "identity", "diagonal", "KFAC", or "EKFAC".
+ strategy="ekfac", # Choose from "identity", "diagonal", "kfac", or "ekfac".
use_empirical_fisher=False,
immediate_gradient_removal=False,
ignore_bias=False,
@@ -217,8 +221,8 @@ analyzer.fit_all_factors(factors_name="initial_factor", dataset=train_dataset, f
```
You can change:
-- `strategy`: Selects the preconditioning strategy (`identity`, `diagonal`, `KFAC`, or `EKFAC`).
-- `use_empirical_fisher`: Determines whether to approximate the [empirical Fisher](https://arxiv.org/abs/1905.12558) (using actual labels from batch)
+- `strategy`: Selects the Hessian approximation strategy (`identity`, `diagonal`, `KFAC`, or `EKFAC`).
+- `use_empirical_fisher`: Determines whether to use the [empirical Fisher](https://arxiv.org/abs/1905.12558) (using actual labels from batch)
instead of the true Fisher (using sampled labels from model's predictions). It is recommended to be `False`.
- `immediate_gradient_removal`: Specifies whether to instantly set `param.grad = None` within module hooks. Generally,
recommended to be `False`, as it requires installing additional hooks. This should not affect the fitted factors, but
@@ -227,7 +231,7 @@ can potentially reduce peak memory.
### Fitting Covariance Matrices
-`KFAC` and `EKFAC` require computing the activation and pseudo-gradient covariance matrices.
+`KFAC` and `EKFAC` require computing the uncentered activation and pre-activation pseudo-gradient covariance matrices.
To fit covariance matrices, you can use `analyzer.fit_covariance_matrices`.
```python
# Fitting covariance matrices.
@@ -236,7 +240,7 @@ analyzer.fit_covariance_matrices(factors_name="initial_factor", dataset=train_da
covariance_matrices = analyzer.load_covariance_matrices(factors_name="initial_factor")
```
-You can tune:
+This step corresponds to Equation 16 in the paper. You can tune:
- `covariance_max_examples`: Controls the maximum number of data points for fitting covariance matrices. Setting it to `None`,
Kronfluence computes covariance matrices for all data points.
- `covariance_data_partition_size`: Number of data partitions to use for computing covariance matrices.
@@ -244,15 +248,13 @@ For example, when `covariance_data_partition_size = 2`, the dataset is split int
are separately computed for each chunk. These chunked covariance matrices are later aggregated. This is useful with GPU preemption as intermediate
covariance matrices will be saved in disk. It can be also helpful when launching multiple parallel jobs, where each GPU
can compute covariance matrices on some partitioned data (You can specify `target_data_partitions` in the parameter).
-This should not affect the quality of the fitted factors.
- `covariance_module_partition_size`: Number of module partitions to use for computing covariance matrices.
For example, when `covariance_module_partition_size = 2`, the module is split into 2 chunks and covariance matrices
are separately computed for each chunk. This is useful when the available GPU memory is limited (e.g., the total
covariance matrices cannot fit into memory). However, this will do multiple iterations over the dataset and can be slow.
-This should not affect the quality of the fitted factors.
- `activation_covariance_dtype`: `dtype` for computing activation covariance matrices. You can also use `torch.bfloat16`
or `torch.float16`.
-- `gradient_covariance_dtype`: `dtype` for computing activation covariance matrices. You can also use `torch.bfloat16`
+- `gradient_covariance_dtype`: `dtype` for computing pre-activation pseudo-gradient covariance matrices. You can also use `torch.bfloat16`
or `torch.float16`.
**Dealing with OOMs.** Here are some steps to fix Out of Memory (OOM) errors.
@@ -264,7 +266,7 @@ or `torch.float16`.
### Performing Eigendecomposition
-After computing the covariance matrices, `KFAC` and `EKFAC` require performing Eigendecomposition.
+After computing the covariance matrices, `KFAC` and `EKFAC` require performing eigendecomposition.
```python
# Performing Eigendecomposition.
@@ -273,13 +275,13 @@ analyzer.perform_eigendecomposition(factors_name="initial_factor", factor_args=f
eigen_factors = analyzer.load_eigendecomposition(factors_name="initial_factor")
```
-You can tune:
-- `eigendecomposition_dtype`: `dtype` for performing Eigendecomposition. You can also use `torch.float32`,
+This corresponds to Equation 18 in the paper. You can tune:
+- `eigendecomposition_dtype`: `dtype` for performing eigendecomposition. You can also use `torch.float32`,
but `torch.float64` is recommended.
### Fitting Lambda Matrices
-`EKFAC` and `diagonal` require computing the Lambda matrices for all modules.
+`EKFAC` and `diagonal` require computing the Lambda (eigenvalue) matrices for all modules.
```python
# Fitting Lambda matrices.
@@ -288,7 +290,7 @@ analyzer.fit_lambda_matrices(factors_name="initial_factor", dataset=train_datase
lambda_matrices = analyzer.load_lambda_matrices(factors_name="initial_factor")
```
-You can tune:
+This corresponds to Equation 20 in the paper. You can tune:
- `lambda_max_examples`: Controls the maximum number of data points for fitting Lambda matrices.
- `lambda_data_partition_size`: Number of data partitions to use for computing Lambda matrices.
- `lambda_module_partition_size`: Number of module partitions to use for computing Lambda matrices.
@@ -297,7 +299,7 @@ You can set `cached_activation_cpu_offload=True` to cache these activations in C
- `lambda_iterative_aggregate`: Whether to compute the Lambda matrices with for-loop instead of batched matrix multiplications.
This is helpful for reducing peak memory, as it avoids holding multiple copies of tensors with the same shape as the per-sample-gradient.
- `lambda_dtype`: `dtype` for computing Lambda matrices. You can also use `torch.bfloat16`
-or `torch.float16`, but `torch.float32` is generally recommended.
+or `torch.float16`.
**Dealing with OOMs.** Here are some steps to fix Out of Memory (OOM) errors.
@@ -312,7 +314,7 @@ or `torch.float16`, but `torch.float32` is generally recommended.
**I get different factors each time I run the code.**
This is expected as we sample labels from the model's prediction when computing covariance and Lambda matrices.
Using `use_empirical_fisher=True` could make the process more deterministic. Moreover, different hardware might compute
-different eigenvectors when performing Eigendecomposition.
+different eigenvectors when performing eigendecomposition.
**How should I select the batch size?**
You can use the largest possible batch size that does not result in OOM. Typically, the batch size for fitting Lambda
@@ -347,16 +349,14 @@ score_args = ScoreArguments(
- `damping`: A damping factor for the damped matrix-vector product. Uses a heuristic based on mean eigenvalues
(0.1 x mean eigenvalues) if None.
-- `immediate_gradient_removal`: Whether to immediately remove `param.grad` within a hook. This should be set to
-`False` in most cases.
+- `immediate_gradient_removal`: Whether to immediately remove `param.grad` within a hook.
- `data_partition_size`: Number of data partitions for computing influence scores.
- `module_partition_size`: Number of module partitions for computing influence scores.
- `per_module_score`: Whether to return a per-module influence scores. Instead of summing over influences across
all modules, this will keep track of intermediate module-wise scores.
-- `query_gradient_rank`: The rank for the query batching. If `None`, no query batching will be used.
-- `query_gradient_svd_dtype`: `dtype` for performing singular value decomposition (SVD) for query batch. You can use `torch.float32`,
-but `torch.float64` is recommended.
+- `query_gradient_rank`: The rank for the query batching (low-rank approximation to the query gradient; see Section 3.2.2). If `None`, no query batching will be used.
+- `query_gradient_svd_dtype`: `dtype` for performing singular value decomposition (SVD) for query batch. You can also use `torch.float32`.
- `cached_activation_cpu_offload`: Whether to offload cached activations to CPU.
- `score_dtype`: `dtype` for computing influence scores. You can use `torch.bfloat16` or `torch.float16`.
@@ -366,7 +366,7 @@ but `torch.float32` is recommended.
### Computing Influence Scores
-To compute pairwise influence scores, you can run:
+To compute pairwise influence scores (Equation 5 in the paper), you can run:
```python
# Computing pairwise influence scores.
analyzer.compute_pairwise_scores(scores_name="pairwise", factors_name="ekfac", score_args=score_args)
@@ -374,7 +374,7 @@ analyzer.compute_pairwise_scores(scores_name="pairwise", factors_name="ekfac", s
scores = analyzer.load_pairwise_scores(scores_name="pairwise")
```
-To compute self-influence scores, you can run:
+To compute self-influence scores (see Section 5.4 from [paper](https://arxiv.org/pdf/1703.04730.pdf)), you can run:
```python
# Computing pairwise influence scores.
analyzer.compute_self_scores(scores_name="self", factors_name="ekfac", score_args=score_args)
@@ -388,14 +388,14 @@ scores = analyzer.load_self_scores(scores_name="self")
3. Try using lower precision for `per_sample_gradient_dtype` and `score_dtype`.
4. Try setting `immediate_gradient_removal=True`.
5. Try setting `query_gradient_rank > 1`. The recommended values are `16`, `32`, `64`, `128`, and `256`. Note that query
-batching is only supported for computing pairwise influence scores.
+batching is only supported for computing pairwise influence scores, not self-infleucen scores.
6. Try setting `module_partition_size > 1`.
### FAQs
**Influence scores are very large in magnitude.**
Ideally, influence scores need to be divided by the total number of training data points. However, the code does
-not normalize the scores. If you would like, you can divide the scores with the total number of data points used to
+not normalize the scores. If you would like, you can divide the scores with the total number of data points (or tokens) used to
train the model.
## References
diff --git a/README.md b/README.md
index 85db38a..3756a4d 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,11 @@
+
+
+
+
@@ -19,7 +23,7 @@
---
-> **Kronfluence** is a repository designed to compute [influence functions](https://arxiv.org/abs/1703.04730) using [Kronecker-factored Approximate Curvature (KFAC)](https://arxiv.org/abs/1503.05671) or [Eigenvalue-corrected KFAC (EKFAC)](https://arxiv.org/abs/1806.03884).
+> **Kronfluence** is a research repository designed to compute [influence functions](https://arxiv.org/abs/1703.04730) using [Kronecker-factored Approximate Curvature (KFAC)](https://arxiv.org/abs/1503.05671) or [Eigenvalue-corrected KFAC (EKFAC)](https://arxiv.org/abs/1806.03884).
For a detailed description of the methodology, see the [**paper**](https://arxiv.org/abs/2308.03296) *Studying Large Language Model Generalization with Influence Functions*.
---
@@ -53,10 +57,10 @@ pip install -e .
Kronfluence supports influence computations on `nn.Linear` and `nn.Conv2d` modules. See the [**Technical Documentation**](https://github.com/pomonam/kronfluence/blob/main/DOCUMENTATION.md)
page for a comprehensive guide.
-### Examples
+### Learn More
-The [examples](https://github.com/pomonam/kronfluence/tree/main/examples) folder contains several examples on how to use Kronfluence.
-We plan to add more language model examples. **TL;DR** You need to prepare the trained model and datasets, and pass them into the `Analyzer`.
+The [examples](https://github.com/pomonam/kronfluence/tree/main/examples) folder contains several examples.
+We plan to add more examples in the future. **TL;DR** You need to prepare the trained model and datasets, and pass them into `Analyzer`.
```python
import torch
@@ -90,27 +94,27 @@ eval_dataset = torchvision.datasets.MNIST(
train=True,
)
-# Initialize the task with relevant loss and measurement.
+# Define the task.
task = MnistTask()
-# Prepare the model for influence computation with the specified task.
+# Prepare the model for influence computation.
model = prepare_model(model=model, task=task)
analyzer = Analyzer(analysis_name="mnist", model=model, task=task)
-# Fit all EKFAC factors for the given model on the training dataset.
-analyzer.fit_all_factors(factors_name="ekfac", dataset=train_dataset)
+# Fit all EKFAC factors for the given model.
+analyzer.fit_all_factors(factors_name="my_factors", dataset=train_dataset)
-# Compute all pairwise influence scores using the computed factors.
+# Compute all pairwise influence scores with the computed factors.
analyzer.compute_pairwise_scores(
- scores_name="pairwise_scores",
- factors_name="ekfac",
+ scores_name="my_scores",
+ factors_name="my_factors",
query_dataset=eval_dataset,
train_dataset=train_dataset,
per_device_query_batch_size=1024,
)
# Load the scores with dimension `len(eval_dataset) x len(train_dataset)`.
-scores = analyzer.load_pairwise_scores(scores_name="pairwise_scoeres")
+scores = analyzer.load_pairwise_scores(scores_name="my_scores")
```
## Contributing
diff --git a/examples/_test_requirements.txt b/examples/_test_requirements.txt
deleted file mode 100644
index ec96d22..0000000
--- a/examples/_test_requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-scikit-learn
-jupyter
-evaluate
\ No newline at end of file
diff --git a/examples/cifar/README.md b/examples/cifar/README.md
new file mode 100644
index 0000000..67b16d5
--- /dev/null
+++ b/examples/cifar/README.md
@@ -0,0 +1,57 @@
+# CIFAR-10 & ResNet-9 Example
+
+This directory contains scripts for training ResNet-9 on CIFAR-10. The pipeline is motivated from
+[TRAK repository](https://github.com/MadryLab/trak/blob/main/examples/cifar_quickstart.ipynb).
+
+## Training
+
+To train ResNet-9 on CIFAR-10 dataset, run the following command:
+```bash
+python train.py --dataset_dir ./data \
+ --checkpoint_dir ./checkpoints \
+ --train_batch_size 512 \
+ --eval_batch_size 1024 \
+ --learning_rate 0.4 \
+ --weight_decay 0.0001 \
+ --num_train_epochs 25 \
+ --seed 1004
+```
+
+## Computing Pairwise Influence Scores
+
+To obtain pairwise influence scores on 2000 query data points using `ekfac`, run the following command:
+```bash
+python analyze.py --query_batch_size 1000 \
+ --dataset_dir ./data \
+ --checkpoint_dir ./checkpoints \
+ --factor_strategy ekfac
+```
+You can also use `identity`, `diagonal`, and `kfac`. On A100 (80GB), it takes roughly 1.5 minutes to compute the
+pairwise scores (including computing EKFAC factors).
+
+## Mislabeled Data Detection
+
+We can use self-influence scores (see Section 5.4 for the [paper](https://arxiv.org/pdf/1703.04730.pdf)) to detect mislabeled examples.
+First, train the model with 10% of training examples mislabeled by running the following command:
+```bash
+python train.py --dataset_dir ./data \
+ --corrupt_percentage 0.1 \
+ --checkpoint_dir ./checkpoints \
+ --train_batch_size 512 \
+ --eval_batch_size 1024 \
+ --learning_rate 0.4 \
+ --weight_decay 0.0001 \
+ --num_train_epochs 25 \
+ --seed 1004
+```
+
+Then, compute self-influence scores with the following command:
+```bash
+python detect_mislabeled_dataset.py --dataset_dir ./data \
+ --corrupt_percentage 0.1 \
+ --checkpoint_dir ./checkpoints \
+ --factor_strategy ekfac
+```
+
+On A100 (80GB), it takes roughly 1.5 minutes to compute the self-influence scores.
+We can detect around 82% of mislabeled data points by inspecting 10% of the dataset (96% by inspecting 20%).
\ No newline at end of file
diff --git a/examples/cifar/analyze.py b/examples/cifar/analyze.py
new file mode 100644
index 0000000..8669924
--- /dev/null
+++ b/examples/cifar/analyze.py
@@ -0,0 +1,157 @@
+import argparse
+import logging
+import os
+from typing import Tuple
+
+import torch
+import torch.nn.functional as F
+from torch import nn
+
+from examples.cifar.pipeline import construct_resnet9, get_cifar10_dataset
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments
+from kronfluence.task import Task
+from kronfluence.utils.dataset import DataLoaderKwargs
+
+BATCH_TYPE = Tuple[torch.Tensor, torch.Tensor]
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Influence analysis on CIFAR-10 dataset.")
+
+ parser.add_argument(
+ "--corrupt_percentage",
+ type=float,
+ default=None,
+ help="Percentage of the training dataset to corrupt.",
+ )
+ parser.add_argument(
+ "--dataset_dir",
+ type=str,
+ default="./data",
+ help="A folder to download or load CIFAR-10 dataset.",
+ )
+ parser.add_argument(
+ "--checkpoint_dir",
+ type=str,
+ default="./checkpoints",
+ help="A path that is storing the final checkpoint of the model.",
+ )
+
+ parser.add_argument(
+ "--query_batch_size",
+ type=int,
+ default=1000,
+ help="Batch size for computing query gradients.",
+ )
+ parser.add_argument(
+ "--factor_strategy",
+ type=str,
+ default="ekfac",
+ help="Strategy to compute influence factors.",
+ )
+
+ args = parser.parse_args()
+
+ if args.checkpoint_dir is not None:
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+
+ return args
+
+
+class ClassificationTask(Task):
+ def compute_train_loss(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ sample: bool = False,
+ ) -> torch.Tensor:
+ inputs, labels = batch
+ logits = model(inputs)
+ if not sample:
+ return F.cross_entropy(logits, labels, reduction="sum")
+ with torch.no_grad():
+ probs = torch.nn.functional.softmax(logits, dim=-1)
+ sampled_labels = torch.multinomial(
+ probs,
+ num_samples=1,
+ ).flatten()
+ return F.cross_entropy(logits, sampled_labels.detach(), reduction="sum")
+
+ def compute_measurement(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ ) -> torch.Tensor:
+ # Copied from: https://github.com/MadryLab/trak/blob/main/trak/modelout_functions.py.
+ inputs, labels = batch
+ logits = model(inputs)
+
+ bindex = torch.arange(logits.shape[0]).to(device=logits.device, non_blocking=False)
+ logits_correct = logits[bindex, labels]
+
+ cloned_logits = logits.clone()
+ cloned_logits[bindex, labels] = torch.tensor(-torch.inf, device=logits.device, dtype=logits.dtype)
+
+ margins = logits_correct - cloned_logits.logsumexp(dim=-1)
+ return -margins.sum()
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.INFO)
+
+ # Prepare the dataset.
+ train_dataset = get_cifar10_dataset(
+ split="eval_train", corrupt_percentage=args.corrupt_percentage, dataset_dir=args.dataset_dir
+ )
+ eval_dataset = get_cifar10_dataset(split="valid", dataset_dir=args.dataset_dir)
+
+ # Prepare the trained model.
+ model = construct_resnet9()
+ model_name = "model"
+ if args.corrupt_percentage is not None:
+ model_name += "_corrupt_" + str(args.corrupt_percentage)
+ checkpoint_path = os.path.join(args.checkpoint_dir, f"{model_name}.pth")
+ if not os.path.isfile(checkpoint_path):
+ raise ValueError(f"No checkpoint found at {checkpoint_path}.")
+ model.load_state_dict(torch.load(checkpoint_path))
+
+ # Define task and prepare model.
+ task = ClassificationTask()
+ model = prepare_model(model, task)
+
+ analyzer = Analyzer(
+ analysis_name="cifar10",
+ model=model,
+ task=task,
+ )
+ # Configure parameters for DataLoader.
+ dataloader_kwargs = DataLoaderKwargs(num_workers=4)
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+
+ # Compute influence factors.
+ factor_args = FactorArguments(strategy=args.factor_strategy)
+ analyzer.fit_all_factors(
+ factors_name=args.factor_strategy,
+ dataset=train_dataset,
+ per_device_batch_size=None,
+ factor_args=factor_args,
+ overwrite_output_dir=False,
+ )
+ # Compute pairwise scores.
+ analyzer.compute_pairwise_scores(
+ scores_name=args.factor_strategy,
+ factors_name=args.factor_strategy,
+ query_dataset=eval_dataset,
+ query_indices=list(range(2000)),
+ train_dataset=train_dataset,
+ per_device_query_batch_size=args.query_batch_size,
+ overwrite_output_dir=False,
+ )
+ scores = analyzer.load_pairwise_scores(args.factor_strategy)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/cifar/detect_mislabeled_dataset.py b/examples/cifar/detect_mislabeled_dataset.py
new file mode 100644
index 0000000..efcd84f
--- /dev/null
+++ b/examples/cifar/detect_mislabeled_dataset.py
@@ -0,0 +1,117 @@
+import argparse
+import logging
+import os
+
+import torch
+
+from examples.cifar.analyze import ClassificationTask
+from examples.cifar.pipeline import construct_resnet9, get_cifar10_dataset
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments
+from kronfluence.utils.dataset import DataLoaderKwargs
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Detecting mislabeled CIFAR-10 data points.")
+
+ parser.add_argument(
+ "--corrupt_percentage",
+ type=float,
+ default=0.1,
+ help="Percentage of the training dataset to corrupt.",
+ )
+ parser.add_argument(
+ "--dataset_dir",
+ type=str,
+ default="./data",
+ help="A folder to download or load CIFAR-10 dataset.",
+ )
+ parser.add_argument(
+ "--checkpoint_dir",
+ type=str,
+ default="./checkpoints",
+ help="A path that is storing the final checkpoint of the model.",
+ )
+
+ parser.add_argument(
+ "--factor_strategy",
+ type=str,
+ default="ekfac",
+ help="Strategy to compute influence factors.",
+ )
+
+ args = parser.parse_args()
+
+ if args.checkpoint_dir is not None:
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+
+ return args
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.INFO)
+
+ # Prepare the dataset.
+ train_dataset = get_cifar10_dataset(
+ split="eval_train", corrupt_percentage=args.corrupt_percentage, dataset_dir=args.dataset_dir
+ )
+
+ # Prepare the trained model.
+ model = construct_resnet9()
+ model_name = "model"
+ if args.corrupt_percentage is not None:
+ model_name += "_corrupt_" + str(args.corrupt_percentage)
+ checkpoint_path = os.path.join(args.checkpoint_dir, f"{model_name}.pth")
+ if not os.path.isfile(checkpoint_path):
+ raise ValueError(f"No checkpoint found at {checkpoint_path}.")
+ model.load_state_dict(torch.load(checkpoint_path))
+
+ # Define task and prepare model.
+ task = ClassificationTask()
+ model = prepare_model(model, task)
+
+ analyzer = Analyzer(
+ analysis_name="mislabeled",
+ model=model,
+ task=task,
+ )
+ # Configure parameters for DataLoader.
+ dataloader_kwargs = DataLoaderKwargs(num_workers=4)
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+
+ # Compute influence factors.
+ factor_args = FactorArguments(strategy=args.factor_strategy)
+ analyzer.fit_all_factors(
+ factors_name=args.factor_strategy,
+ dataset=train_dataset,
+ per_device_batch_size=None,
+ factor_args=factor_args,
+ overwrite_output_dir=False,
+ )
+ # Compute self-influence scores.
+ analyzer.compute_self_scores(
+ scores_name=args.factor_strategy,
+ factors_name=args.factor_strategy,
+ train_dataset=train_dataset,
+ overwrite_output_dir=True,
+ )
+ scores = analyzer.load_pairwise_scores(args.factor_strategy)["all_modules"]
+
+ total_corrupt_size = int(args.corrupt_percentage * len(train_dataset))
+ corrupted_indices = list(range(int(args.corrupt_percentage * len(train_dataset))))
+ intervals = torch.arange(0.1, 1, 0.1)
+
+ accuracies = []
+ for interval in intervals:
+ interval = interval.item()
+ predicted_indices = torch.argsort(scores, descending=True)[: int(interval * len(train_dataset))]
+ predicted_indices = list(predicted_indices.numpy())
+ accuracies.append(len(set(predicted_indices) & set(corrupted_indices)) / total_corrupt_size)
+
+ logging.info(f"Inspect Interval: {list(intervals.numpy())}")
+ logging.info(f"Detection Accuracy: {accuracies}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/cifar/pipeline.py b/examples/cifar/pipeline.py
index 420d1fd..dd1f68e 100644
--- a/examples/cifar/pipeline.py
+++ b/examples/cifar/pipeline.py
@@ -33,7 +33,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor:
def construct_resnet9() -> nn.Module:
- # ResNet-9 architecture from: https://github.com/MadryLab/trak/blob/main/examples/cifar_quickstart.ipynb.
+ # ResNet-9 architecture from https://github.com/MadryLab/trak/blob/main/examples/cifar_quickstart.ipynb.
def conv_bn(
channels_in: int,
channels_out: int,
@@ -81,7 +81,7 @@ def get_cifar10_dataset(
assert split in ["train", "eval_train", "valid"]
normalize = torchvision.transforms.Normalize(mean=(0.4914, 0.4822, 0.4465), std=(0.247, 0.243, 0.261))
- if split in ["train", "eval_train"]:
+ if split == "train":
transform_config = torchvision.transforms.Compose(
[
torchvision.transforms.RandomCrop(32, padding=4),
diff --git a/examples/cifar/train.py b/examples/cifar/train.py
index 2228a21..1d76f79 100644
--- a/examples/cifar/train.py
+++ b/examples/cifar/train.py
@@ -1,6 +1,7 @@
import argparse
import logging
import os
+import time
from typing import Tuple
import numpy as np
@@ -10,7 +11,6 @@
from torch import nn
from torch.optim import lr_scheduler
from torch.utils import data
-from tqdm import tqdm
from examples.cifar.pipeline import construct_resnet9, get_cifar10_dataset
@@ -55,7 +55,7 @@ def parse_args():
parser.add_argument(
"--weight_decay",
type=float,
- default=0.001,
+ default=0.0001,
help="Weight decay to train the model.",
)
parser.add_argument(
@@ -92,7 +92,6 @@ def train(
num_train_epochs: int,
learning_rate: float,
weight_decay: float,
- disable_tqdm: bool = False,
) -> nn.Module:
train_dataloader = data.DataLoader(
dataset=dataset,
@@ -105,7 +104,7 @@ def train(
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=weight_decay)
iters_per_epoch = len(train_dataloader)
- lr_peak_epoch = num_train_epochs // 4
+ lr_peak_epoch = num_train_epochs // 5
lr_schedule = np.interp(
np.arange((num_train_epochs + 1) * iters_per_epoch),
[0, lr_peak_epoch * iters_per_epoch, num_train_epochs * iters_per_epoch],
@@ -113,22 +112,24 @@ def train(
)
scheduler = lr_scheduler.LambdaLR(optimizer, lr_schedule.__getitem__)
+ start_time = time.time()
model.train()
for epoch in range(num_train_epochs):
total_loss = 0.0
- with tqdm(train_dataloader, unit="batch", disable=disable_tqdm) as tepoch:
- for batch in tepoch:
- tepoch.set_description(f"Epoch {epoch}")
- model.zero_grad()
- inputs, labels = batch
- inputs, labels = inputs.to(DEVICE), labels.to(DEVICE)
- outputs = model(inputs)
- loss = F.cross_entropy(outputs, labels)
- loss.backward()
- optimizer.step()
- scheduler.step()
- total_loss += loss.detach().float()
- tepoch.set_postfix(loss=total_loss.item() / len(train_dataloader))
+ for batch in train_dataloader:
+ model.zero_grad()
+ inputs, labels = batch
+ inputs, labels = inputs.to(DEVICE), labels.to(DEVICE)
+ outputs = model(inputs)
+ loss = F.cross_entropy(outputs, labels)
+ loss.backward()
+ optimizer.step()
+ scheduler.step()
+ total_loss += loss.detach().float()
+ logging.info(f"Epoch {epoch + 1} - Averaged Loss: {total_loss / len(dataset)}")
+ end_time = time.time()
+ elapsed_time = end_time - start_time
+ logging.info(f"Completed training in {elapsed_time:.2f} seconds.")
return model
diff --git a/examples/glue/README.md b/examples/glue/README.md
new file mode 100644
index 0000000..12398a1
--- /dev/null
+++ b/examples/glue/README.md
@@ -0,0 +1,60 @@
+# GLUE & BERT Example
+
+This directory contains scripts for fine-tuning BERT on GLUE benchmark. The pipeline is motivated from [HuggingFace Example](https://github.com/huggingface/transformers/tree/main/examples/pytorch/text-classification).
+Please begin by installing necessary packages.
+```bash
+pip install -r requirements.txt
+```
+
+## Training
+
+To fine-tune BERT on some specific dataset, run the following command (we are using `SST2` dataset):
+```bash
+python train.py --dataset_name sst2 \
+ --checkpoint_dir ./checkpoints \
+ --train_batch_size 32 \
+ --eval_batch_size 32 \
+ --learning_rate 3e-05 \
+ --weight_decay 0.01 \
+ --num_train_epochs 3 \
+ --seed 1004
+```
+
+## Computing Pairwise Influence Scores
+
+To obtain a pairwise influence scores on maximum of 2000 query data points using `ekfac`, run the following command:
+```bash
+python analyze.py --dataset_name sst2 \
+ --query_batch_size 175 \
+ --train_batch_size 128 \
+ --checkpoint_dir ./checkpoints \
+ --factor_strategy ekfac
+```
+On A100 (80GB), it takes roughly 80 minutes to compute the pairwise scores for SST2 with around 900 query data points
+(including computing EKFAC factors).
+
+We can also use query batching (low-rank approximation to the query gradient; see Section 3.2.2 from the [paper](https://arxiv.org/pdf/2308.03296.pdf)) to compute influence scores with a
+larger query batch size.
+```bash
+python analyze.py --dataset_name sst2 \
+ --query_gradient_rank 32 \
+ --query_batch_size 436 \
+ --train_batch_size 256 \
+ --checkpoint_dir ./checkpoints \
+ --factor_strategy ekfac
+```
+Note that query batching is slower in this case (140 minutes in total), as the number of training data points is small and the cost of performing SVD dominates the overall cost.
+Assuming that you ran above two commands, `query_batching_analysis.py` contains code to compute the correlations between the full rank and low-rank scores.
+
+
+
+
+The averaged correlations between the low-rank and full rank scores for 100 data points is 0.98.
+
+## Counterfactual Evaluation
+
+We plan to add a simple demo for counterfactual evaluation on the RTE dataset soon.
+
+
+
+
\ No newline at end of file
diff --git a/examples/glue/analyze.py b/examples/glue/analyze.py
new file mode 100644
index 0000000..022dfd9
--- /dev/null
+++ b/examples/glue/analyze.py
@@ -0,0 +1,187 @@
+import argparse
+import logging
+import os
+from typing import Dict, Optional
+
+import torch
+import torch.nn.functional as F
+from torch import nn
+from transformers import default_data_collator
+
+from examples.glue.pipeline import construct_bert, get_glue_dataset
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments, ScoreArguments
+from kronfluence.task import Task
+from kronfluence.utils.dataset import DataLoaderKwargs
+
+BATCH_TYPE = Dict[str, torch.Tensor]
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Influence analysis on GLUE dataset.")
+
+ parser.add_argument(
+ "--dataset_name",
+ type=str,
+ default="sst2",
+ help="A name of GLUE dataset.",
+ )
+ parser.add_argument(
+ "--checkpoint_dir",
+ type=str,
+ default="./checkpoints",
+ help="A path that is storing the final checkpoint of the model.",
+ )
+
+ parser.add_argument(
+ "--query_gradient_rank",
+ type=int,
+ default=-1,
+ help="Rank for the low-rank query gradient approximation.",
+ )
+ parser.add_argument(
+ "--query_batch_size",
+ type=int,
+ default=100,
+ help="Batch size for computing query gradients.",
+ )
+ parser.add_argument(
+ "--train_batch_size",
+ type=int,
+ default=128,
+ help="Batch size for computing training gradients.",
+ )
+ parser.add_argument(
+ "--factor_strategy",
+ type=str,
+ default="ekfac",
+ help="Strategy to compute influence factors.",
+ )
+
+ args = parser.parse_args()
+
+ if args.checkpoint_dir is not None:
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+ args.checkpoint_dir = os.path.join(args.checkpoint_dir, args.dataset_name)
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+
+ return args
+
+
+class TextClassificationTask(Task):
+ def compute_train_loss(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ sample: bool = False,
+ ) -> torch.Tensor:
+ logits = model(
+ input_ids=batch["input_ids"],
+ attention_mask=batch["attention_mask"],
+ token_type_ids=batch["token_type_ids"],
+ ).logits
+
+ if not sample:
+ return F.cross_entropy(logits, batch["labels"], reduction="sum")
+ with torch.no_grad():
+ probs = torch.nn.functional.softmax(logits, dim=-1)
+ sampled_labels = torch.multinomial(
+ probs,
+ num_samples=1,
+ ).flatten()
+ return F.cross_entropy(logits, sampled_labels.detach(), reduction="sum")
+
+ def compute_measurement(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ ) -> torch.Tensor:
+ # Copied from: https://github.com/MadryLab/trak/blob/main/trak/modelout_functions.py.
+ logits = model(
+ input_ids=batch["input_ids"],
+ attention_mask=batch["attention_mask"],
+ token_type_ids=batch["token_type_ids"],
+ ).logits
+
+ labels = batch["labels"]
+ bindex = torch.arange(logits.shape[0]).to(device=logits.device, non_blocking=False)
+ logits_correct = logits[bindex, labels]
+
+ cloned_logits = logits.clone()
+ cloned_logits[bindex, labels] = torch.tensor(-torch.inf, device=logits.device, dtype=logits.dtype)
+
+ margins = logits_correct - cloned_logits.logsumexp(dim=-1)
+ return -margins.sum()
+
+ def get_attention_mask(self, batch: BATCH_TYPE) -> Optional[torch.Tensor]:
+ return batch["attention_mask"]
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.INFO)
+
+ # Prepare the dataset.
+ train_dataset = get_glue_dataset(
+ data_name=args.dataset_name,
+ split="eval_train",
+ )
+ eval_dataset = get_glue_dataset(
+ data_name=args.dataset_name,
+ split="valid",
+ )
+
+ # Prepare the trained model.
+ model = construct_bert()
+ checkpoint_path = os.path.join(args.checkpoint_dir, "model.pth")
+ if not os.path.isfile(checkpoint_path):
+ raise ValueError(f"No checkpoint found at {checkpoint_path}.")
+ model.load_state_dict(torch.load(checkpoint_path))
+
+ # Define task and prepare model.
+ task = TextClassificationTask()
+ model = prepare_model(model, task)
+
+ analyzer = Analyzer(
+ analysis_name=args.dataset_name,
+ model=model,
+ task=task,
+ cpu=False,
+ )
+ # Configure parameters for DataLoader.
+ dataloader_kwargs = DataLoaderKwargs(collate_fn=default_data_collator)
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+
+ # Compute influence factors.
+ factor_args = FactorArguments(strategy=args.factor_strategy)
+ analyzer.fit_all_factors(
+ factors_name=args.factor_strategy,
+ dataset=train_dataset,
+ per_device_batch_size=None,
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ initial_per_device_batch_size_attempt=512,
+ )
+ # Compute pairwise scores.
+ rank = args.query_gradient_rank if args.query_gradient_rank != -1 else None
+ score_args = ScoreArguments(query_gradient_rank=rank, query_gradient_svd_dtype=torch.float32)
+ scores_name = args.factor_strategy
+ if rank is not None:
+ scores_name += f"_qlr{rank}"
+ analyzer.compute_pairwise_scores(
+ score_args=score_args,
+ scores_name=scores_name,
+ factors_name=args.factor_strategy,
+ query_dataset=eval_dataset,
+ query_indices=list(range(min([len(eval_dataset), 2000]))),
+ train_dataset=train_dataset,
+ per_device_query_batch_size=args.query_batch_size,
+ per_device_train_batch_size=args.train_batch_size,
+ overwrite_output_dir=True,
+ )
+ scores = analyzer.load_pairwise_scores(scores_name)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/glue/figure/counterfactual.png b/examples/glue/figure/counterfactual.png
new file mode 100644
index 0000000..ab1954e
Binary files /dev/null and b/examples/glue/figure/counterfactual.png differ
diff --git a/examples/glue/figure/query_batching.png b/examples/glue/figure/query_batching.png
new file mode 100644
index 0000000..8fdb5fd
Binary files /dev/null and b/examples/glue/figure/query_batching.png differ
diff --git a/examples/glue/pipeline.py b/examples/glue/pipeline.py
index d38d44e..3db7e55 100644
--- a/examples/glue/pipeline.py
+++ b/examples/glue/pipeline.py
@@ -1,13 +1,11 @@
-import os
from typing import List
-import torch
-import torch.nn as nn
-import torchvision
from datasets import load_dataset
+from torch import nn
from torch.utils.data import Dataset
from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer
+# Copied from https://github.com/huggingface/transformers/blob/main/examples/pytorch/text-classification/run_glue.py.
GLUE_TASK_TO_KEYS = {
"cola": ("sentence", None),
"mnli": ("premise", "hypothesis"),
@@ -41,14 +39,12 @@ def get_glue_dataset(
data_name: str,
split: str,
indices: List[int] = None,
- dataset_dir: str = "data/",
) -> Dataset:
assert split in ["train", "eval_train", "valid"]
raw_datasets = load_dataset(
path="glue",
name=data_name,
- # data_dir=dataset_dir,
)
label_list = raw_datasets["train"].features["label"].names
num_labels = len(label_list)
@@ -75,7 +71,7 @@ def preprocess_function(examples):
load_from_cache_file=(not False),
)
- if split == "train" or split == "eval_train":
+ if split in ["train", "eval_train"]:
train_dataset = raw_datasets["train"]
ds = train_dataset
else:
@@ -86,3 +82,10 @@ def preprocess_function(examples):
ds = ds.select(indices)
return ds
+
+
+if __name__ == "__main__":
+ from kronfluence import Analyzer
+
+ model = construct_bert()
+ print(Analyzer.get_module_summary(model))
diff --git a/examples/glue/query_batching_analysis.py b/examples/glue/query_batching_analysis.py
new file mode 100644
index 0000000..ad00ff4
--- /dev/null
+++ b/examples/glue/query_batching_analysis.py
@@ -0,0 +1,35 @@
+import logging
+
+import matplotlib.pyplot as plt
+import numpy as np
+from scipy.stats import spearmanr
+from tueplots import markers
+
+from kronfluence.analyzer import Analyzer
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+
+ # Load the scores. You might need to modify the path.
+ full_scores = Analyzer.load_file("scores_ekfac/pairwise_scores.safetensors")["all_modules"]
+ lr_scores = Analyzer.load_file("scores_ekfac_qlr32/pairwise_scores.safetensors")["all_modules"]
+
+ # Only plot first 1000 points to avoid clutter.
+ plt.rcParams.update({"figure.dpi": 150})
+ plt.rcParams.update(markers.with_edge())
+ plt.rcParams["axes.axisbelow"] = True
+ plt.scatter(lr_scores[0][:1000], full_scores[0][:1000], edgecolor="k")
+ plt.grid()
+ plt.xlabel("Full Rank Score")
+ plt.ylabel("Low Rank (32) Score")
+ plt.show()
+
+ all_corr = []
+ for i in range(100):
+ all_corr.append(spearmanr(full_scores[i], lr_scores[i])[0])
+ logging.info(f"Averaged Spearman Correlation: {np.array(all_corr).mean()}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/glue/requirements.txt b/examples/glue/requirements.txt
new file mode 100644
index 0000000..7b0c55a
--- /dev/null
+++ b/examples/glue/requirements.txt
@@ -0,0 +1,4 @@
+transformers
+evaluate
+datasets
+scikit-learn
\ No newline at end of file
diff --git a/examples/glue/train.py b/examples/glue/train.py
index 675233f..b6dacf6 100644
--- a/examples/glue/train.py
+++ b/examples/glue/train.py
@@ -1,6 +1,7 @@
import argparse
import logging
import os
+import time
from typing import Tuple
import evaluate
@@ -9,7 +10,6 @@
from accelerate.utils import set_seed
from torch import nn
from torch.utils import data
-from tqdm import tqdm
from transformers import default_data_collator
from examples.glue.pipeline import construct_bert, get_glue_dataset
@@ -26,12 +26,6 @@ def parse_args():
default="sst2",
help="A name of GLUE dataset.",
)
- parser.add_argument(
- "--dataset_dir",
- type=str,
- default="./data",
- help="A folder to download or load GLUE dataset.",
- )
parser.add_argument(
"--train_batch_size",
@@ -94,7 +88,6 @@ def train(
num_train_epochs: int,
learning_rate: float,
weight_decay: float,
- disable_tqdm: bool = False,
) -> nn.Module:
train_dataloader = data.DataLoader(
dataset=dataset,
@@ -103,26 +96,29 @@ def train(
drop_last=True,
collate_fn=default_data_collator,
)
+
model = construct_bert().to(DEVICE)
optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=weight_decay)
+ start_time = time.time()
model.train()
for epoch in range(num_train_epochs):
total_loss = 0.0
- with tqdm(train_dataloader, unit="batch", disable=disable_tqdm) as tepoch:
- for batch in tepoch:
- tepoch.set_description(f"Epoch {epoch}")
- model.zero_grad()
- outputs = model(
- input_ids=batch["input_ids"].to(device=DEVICE),
- attention_mask=batch["attention_mask"].to(device=DEVICE),
- token_type_ids=batch["token_type_ids"].to(device=DEVICE),
- ).logits
- loss = F.cross_entropy(outputs, batch["labels"].to(device=DEVICE))
- total_loss += loss.detach().float()
- loss.backward()
- optimizer.step()
- tepoch.set_postfix(loss=total_loss.item() / len(train_dataloader))
+ for batch in train_dataloader:
+ loss = model(
+ input_ids=batch["input_ids"].to(device=DEVICE),
+ attention_mask=batch["attention_mask"].to(device=DEVICE),
+ token_type_ids=batch["token_type_ids"].to(device=DEVICE),
+ labels=batch["labels"].to(device=DEVICE),
+ ).loss
+ optimizer.zero_grad()
+ loss.backward()
+ optimizer.step()
+ total_loss += loss.detach().float()
+ logging.info(f"Epoch {epoch + 1} - Averaged Loss: {total_loss / len(dataset)}")
+ end_time = time.time()
+ elapsed_time = end_time - start_time
+ logging.info(f"Completed training in {elapsed_time:.2f} seconds.")
return model
@@ -136,14 +132,14 @@ def evaluate_model(model: nn.Module, dataset: data.Dataset, batch_size: int) ->
total_loss = 0.0
for batch in dataloader:
with torch.no_grad():
- outputs = model(
- batch["input_ids"].to(device=DEVICE),
- batch["token_type_ids"].to(device=DEVICE),
- batch["attention_mask"].to(device=DEVICE),
- )
+ logits = model(
+ input_ids=batch["input_ids"].to(device=DEVICE),
+ attention_mask=batch["attention_mask"].to(device=DEVICE),
+ token_type_ids=batch["token_type_ids"].to(device=DEVICE),
+ ).logits
labels = batch["labels"].to(device=DEVICE)
- total_loss += F.cross_entropy(outputs, labels, reduction="sum").detach().item()
- predictions = outputs.argmax(dim=-1)
+ total_loss += F.cross_entropy(logits, labels, reduction="sum").detach()
+ predictions = logits.argmax(dim=-1)
metric.add_batch(
predictions=predictions,
references=labels,
@@ -160,7 +156,7 @@ def main():
if args.seed is not None:
set_seed(args.seed)
- train_dataset = get_glue_dataset(data_name=args.dataset_name, split="train", dataset_dir=args.dataset_dir)
+ train_dataset = get_glue_dataset(data_name=args.dataset_name, split="train")
model = train(
dataset=train_dataset,
batch_size=args.train_batch_size,
@@ -169,11 +165,11 @@ def main():
weight_decay=args.weight_decay,
)
- eval_train_dataset = get_glue_dataset(data_name=args.dataset_name, split="eval_train", dataset_dir=args.dataset_dir)
+ eval_train_dataset = get_glue_dataset(data_name=args.dataset_name, split="eval_train")
train_loss, train_acc = evaluate_model(model=model, dataset=eval_train_dataset, batch_size=args.eval_batch_size)
logger.info(f"Train loss: {train_loss}, Train Accuracy: {train_acc}")
- eval_dataset = get_glue_dataset(data_name=args.dataset_name, split="valid", dataset_dir=args.dataset_dir)
+ eval_dataset = get_glue_dataset(data_name=args.dataset_name, split="valid")
eval_loss, eval_acc = evaluate_model(model=model, dataset=eval_dataset, batch_size=args.eval_batch_size)
logger.info(f"Evaluation loss: {eval_loss}, Evaluation Accuracy: {eval_acc}")
diff --git a/examples/imagenet/README.md b/examples/imagenet/README.md
index 4333276..399f60d 100644
--- a/examples/imagenet/README.md
+++ b/examples/imagenet/README.md
@@ -1,3 +1,54 @@
+# ImageNet & ResNet-50 Example
+
+This directory contains scripts for training ResNet-50 on ImageNet. Please begin by installing necessary packages.
```bash
-torchrun --standalone --nnodes=1 --nproc-per-node=4 ddp_analyze.py
-```
\ No newline at end of file
+pip install -r requirements.txt
+```
+
+## Training
+
+We will use the pre-trained model from `torchvision.models.resnet50`.
+
+## Computing Pairwise Influence Scores
+
+To obtain a pairwise influence scores on 1000 query data points using `ekfac`, run the following command:
+```bash
+python analyze.py --dataset_dir PATH_TO_IMAGENET \
+ --query_gradient_rank -1 \
+ --query_batch_size 100 \
+ --train_batch_size 512 \
+ --factor_strategy ekfac
+```
+On A100 (80GB), it takes approximately 12 hours to compute the pairwise scores (including computing EKFAC factors).
+
+We can also use query batching (low-rank approximation to the query gradient; see Section 3.2.2 from the [paper](https://arxiv.org/pdf/2308.03296.pdf)) to compute influence scores with a
+larger query batch size.
+```bash
+python analyze.py --dataset_dir PATH_TO_IMAGENET \
+ --query_gradient_rank 32 \
+ --query_batch_size 500 \
+ --train_batch_size 512 \
+ --factor_strategy ekfac
+```
+On A100 (80GB), it takes roughly 4 hours to compute the pairwise scores with query batching (including computing EKFAC factors).
+Assuming that you ran above two commands, `query_batching_analysis.py`
+contains code to compute the correlations between the full rank and low-rank scores.
+
+
+
+
+The averaged correlations between the low-rank and full rank scores for 100 data points is 0.95.
+
+## Computing Pairwise Influence Scores with DDP
+
+You can also use DistributedDataParallel (DDP) to speed up influence computations. You can run:
+```bash
+torchrun --standalone --nnodes=1 --nproc-per-node=2 ddp_analyze.py --dataset_dir PATH_TO_IMAGENET \
+ --query_gradient_rank -1 \
+ --factor_batch_size 512 \
+ --query_batch_size 100 \
+ --train_batch_size 512 \
+ --factor_strategy ekfac
+```
+On 2 A100 (80GB), it takes approximately 6 hours to compute the pairwise scores. When available, you can use more GPUs
+to speed up influence computations.
diff --git a/examples/imagenet/analyze.py b/examples/imagenet/analyze.py
index e2786ab..d831a9d 100644
--- a/examples/imagenet/analyze.py
+++ b/examples/imagenet/analyze.py
@@ -4,18 +4,19 @@
import torch
import torch.nn.functional as F
-from analyzer import Analyzer, prepare_model
-from arguments import FactorArguments
-from task import Task
from torch import nn
from examples.imagenet.pipeline import construct_resnet50, get_imagenet_dataset
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments, ScoreArguments
+from kronfluence.task import Task
+from kronfluence.utils.dataset import DataLoaderKwargs
-BATCH_DTYPE = Tuple[torch.Tensor, torch.Tensor]
+BATCH_TYPE = Tuple[torch.Tensor, torch.Tensor]
def parse_args():
- parser = argparse.ArgumentParser(description="Influence analysis on ImageNet datasets.")
+ parser = argparse.ArgumentParser(description="Influence analysis on ImageNet dataset.")
parser.add_argument(
"--dataset_dir",
@@ -25,29 +26,28 @@ def parse_args():
)
parser.add_argument(
- "--factor_strategy",
- type=str,
- default="ekfac",
- help="Strategy to compute preconditioning factors.",
+ "--query_gradient_rank",
+ type=int,
+ default=-1,
+ help="Rank for the low-rank query gradient approximation.",
)
parser.add_argument(
- "--batch_size",
+ "--query_batch_size",
type=int,
- default=512,
- help="Batch size for compute factors and scores.",
+ default=100,
+ help="Batch size for computing query gradients.",
)
parser.add_argument(
- "--analysis_name",
- type=str,
- default="imagenet",
- help="Name of the influence analysis.",
+ "--train_batch_size",
+ type=int,
+ default=128,
+ help="Batch size for computing training gradient.",
)
-
parser.add_argument(
- "--checkpoint_dir",
+ "--factor_strategy",
type=str,
- default="./checkpoints",
- help="A path to store the final checkpoint.",
+ default="ekfac",
+ help="Strategy to compute preconditioning factors.",
)
args = parser.parse_args()
@@ -55,40 +55,38 @@ def parse_args():
class ClassificationTask(Task):
- def compute_model_output(self, batch: BATCH_DTYPE, model: nn.Module) -> torch.Tensor:
- inputs, _ = batch
- return model(inputs)
-
def compute_train_loss(
self,
- batch: BATCH_DTYPE,
- outputs: torch.Tensor,
+ batch: BATCH_TYPE,
+ model: nn.Module,
sample: bool = False,
) -> torch.Tensor:
- _, labels = batch
-
+ inputs, labels = batch
+ logits = model(inputs)
if not sample:
- return F.cross_entropy(outputs, labels, reduction="sum")
+ return F.cross_entropy(logits, labels, reduction="sum")
with torch.no_grad():
- probs = torch.nn.functional.softmax(outputs, dim=-1)
+ probs = torch.nn.functional.softmax(logits, dim=-1)
sampled_labels = torch.multinomial(
probs,
num_samples=1,
).flatten()
- return F.cross_entropy(outputs, sampled_labels.detach(), reduction="sum")
+ return F.cross_entropy(logits, sampled_labels.detach(), reduction="sum")
def compute_measurement(
self,
- batch: BATCH_DTYPE,
- outputs: torch.Tensor,
+ batch: BATCH_TYPE,
+ model: nn.Module,
) -> torch.Tensor:
- _, labels = batch
+ # Copied from: https://github.com/MadryLab/trak/blob/main/trak/modelout_functions.py.
+ inputs, labels = batch
+ logits = model(inputs)
- bindex = torch.arange(outputs.shape[0]).to(device=outputs.device, non_blocking=False)
- logits_correct = outputs[bindex, labels]
+ bindex = torch.arange(logits.shape[0]).to(device=logits.device, non_blocking=False)
+ logits_correct = logits[bindex, labels]
- cloned_logits = outputs.clone()
- cloned_logits[bindex, labels] = torch.tensor(-torch.inf, device=outputs.device, dtype=outputs.dtype)
+ cloned_logits = logits.clone()
+ cloned_logits[bindex, labels] = torch.tensor(-torch.inf, device=logits.device, dtype=logits.dtype)
margins = logits_correct - cloned_logits.logsumexp(dim=-1)
return -margins.sum()
@@ -96,35 +94,59 @@ def compute_measurement(
def main():
args = parse_args()
-
logging.basicConfig(level=logging.INFO)
- train_dataset = get_imagenet_dataset(split="eval_train", data_path=args.dataset_dir)
- # eval_dataset = get_imagenet_dataset(split="valid", data_path=args.dataset_dir)
+ # Prepare the dataset.
+ train_dataset = get_imagenet_dataset(split="eval_train", dataset_dir=args.dataset_dir)
+ eval_dataset = get_imagenet_dataset(split="valid", dataset_dir=args.dataset_dir)
+ # Prepare the trained model.
model = construct_resnet50()
-
task = ClassificationTask()
+
+ # Define task and prepare model.
model = prepare_model(model, task)
analyzer = Analyzer(
- analysis_name=args.analysis_name,
+ analysis_name="imagenet",
model=model,
task=task,
)
-
- factor_args = FactorArguments(
- strategy=args.factor_strategy,
- covariance_data_partition_size=1,
- covariance_module_partition_size=1,
+ # Configure parameters for DataLoader.
+ dataloader_kwargs = DataLoaderKwargs(
+ num_workers=4,
)
- analyzer.fit_covariance_matrices(
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+
+ # Compute influence factors.
+ factor_args = FactorArguments(strategy=args.factor_strategy)
+ analyzer.fit_all_factors(
factors_name=args.factor_strategy,
dataset=train_dataset,
+ per_device_batch_size=None,
factor_args=factor_args,
- per_device_batch_size=1024,
+ overwrite_output_dir=False,
+ )
+
+ # Compute pairwise scores.
+ rank = args.query_gradient_rank if args.query_gradient_rank != -1 else None
+ score_args = ScoreArguments(query_gradient_rank=rank, query_gradient_svd_dtype=torch.float32)
+ scores_name = args.factor_strategy
+ if rank is not None:
+ scores_name += f"_qlr{rank}"
+ analyzer.compute_pairwise_scores(
+ score_args=score_args,
+ scores_name=scores_name,
+ factors_name=args.factor_strategy,
+ query_dataset=eval_dataset,
+ query_indices=list(range(1000)),
+ train_dataset=train_dataset,
+ per_device_query_batch_size=args.query_batch_size,
+ per_device_train_batch_size=args.train_batch_size,
overwrite_output_dir=True,
)
+ scores = analyzer.load_pairwise_scores(scores_name)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
if __name__ == "__main__":
diff --git a/examples/imagenet/ddp_analyze.py b/examples/imagenet/ddp_analyze.py
index 0e3d0fd..5d64551 100644
--- a/examples/imagenet/ddp_analyze.py
+++ b/examples/imagenet/ddp_analyze.py
@@ -5,14 +5,12 @@
import torch
import torch.distributed as dist
-import torch.nn.functional as F
-from torch import nn
from torch.nn.parallel.distributed import DistributedDataParallel
+from examples.imagenet.analyze import ClassificationTask
from examples.imagenet.pipeline import construct_resnet50, get_imagenet_dataset
from kronfluence.analyzer import Analyzer, prepare_model
-from kronfluence.arguments import FactorArguments
-from kronfluence.task import Task
+from kronfluence.arguments import FactorArguments, ScoreArguments
from kronfluence.utils.dataset import DataLoaderKwargs
torch.backends.cudnn.benchmark = True
@@ -33,28 +31,22 @@ def parse_args():
)
parser.add_argument(
- "--factor_strategy",
- type=str,
- default="ekfac",
- help="Strategy to compute preconditioning factors.",
- )
- parser.add_argument(
- "--covariance_batch_size",
+ "--query_gradient_rank",
type=int,
- default=512,
- help="Batch size for computing covariance matrices.",
+ default=-1,
+ help="Rank for the low-rank query gradient approximation.",
)
parser.add_argument(
- "--lambda_batch_size",
+ "--factor_batch_size",
type=int,
- default=256,
- help="Batch size for computing Lambda matrices.",
+ default=512,
+ help="Batch size for computing influence factors.",
)
parser.add_argument(
"--query_batch_size",
type=int,
- default=64,
- help="Batch size for computing query gradient.",
+ default=100,
+ help="Batch size for computing query gradients.",
)
parser.add_argument(
"--train_batch_size",
@@ -62,54 +54,22 @@ def parse_args():
default=128,
help="Batch size for computing training gradient.",
)
+ parser.add_argument(
+ "--factor_strategy",
+ type=str,
+ default="ekfac",
+ help="Strategy to compute preconditioning factors.",
+ )
args = parser.parse_args()
return args
-class ClassificationTask(Task):
- def compute_train_loss(
- self,
- batch: BATCH_DTYPE,
- model: nn.Module,
- sample: bool = False,
- ) -> torch.Tensor:
- inputs, labels = batch
- logits = model(inputs)
-
- if not sample:
- return F.cross_entropy(logits, labels, reduction="sum")
- with torch.no_grad():
- probs = torch.nn.functional.softmax(logits, dim=-1)
- sampled_labels = torch.multinomial(
- probs,
- num_samples=1,
- ).flatten()
- return F.cross_entropy(logits, sampled_labels.detach(), reduction="sum")
-
- def compute_measurement(
- self,
- batch: BATCH_DTYPE,
- model: nn.Module,
- ) -> torch.Tensor:
- # Copied from https://github.com/MadryLab/trak/blob/main/trak/modelout_functions.py.
- inputs, labels = batch
- logits = model(inputs)
-
- bindex = torch.arange(logits.shape[0]).to(device=logits.device, non_blocking=False)
- logits_correct = logits[bindex, labels]
-
- cloned_logits = logits.clone()
- cloned_logits[bindex, labels] = torch.tensor(-torch.inf, device=logits.device, dtype=logits.dtype)
-
- margins = logits_correct - cloned_logits.logsumexp(dim=-1)
- return -margins.sum()
-
-
def main():
args = parse_args()
logging.basicConfig(level=logging.INFO)
+ # Prepare the dataset.
train_dataset = get_imagenet_dataset(split="eval_train", dataset_dir=args.dataset_dir)
eval_dataset = get_imagenet_dataset(split="valid", dataset_dir=args.dataset_dir)
@@ -117,60 +77,59 @@ def main():
device = torch.device("cuda:{}".format(LOCAL_RANK))
torch.cuda.set_device(LOCAL_RANK)
+ # Prepare the trained model.
model = construct_resnet50()
task = ClassificationTask()
+
+ # Define task and prepare model.
model = prepare_model(model, task)
model = model.to(device=device)
+
+ # Apply DDP.
model = DistributedDataParallel(model, device_ids=[LOCAL_RANK], output_device=LOCAL_RANK)
analyzer = Analyzer(
- analysis_name="ddp",
+ analysis_name="imagenet_ddp",
model=model,
task=task,
- profile=True,
- disable_model_save=True,
)
+ # Configure parameters for DataLoader.
dataloader_kwargs = DataLoaderKwargs(
- num_workers=2,
- pin_memory=True,
- prefetch_factor=2,
+ num_workers=4,
)
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+ # Compute influence factors.
factor_args = FactorArguments(
strategy=args.factor_strategy,
)
- analyzer.fit_covariance_matrices(
- factors_name=args.factor_strategy,
- dataset=train_dataset,
- factor_args=factor_args,
- per_device_batch_size=args.covariance_batch_size,
- dataloader_kwargs=dataloader_kwargs,
- overwrite_output_dir=False,
- )
- analyzer.perform_eigendecomposition(
- factors_name=args.factor_strategy,
- factor_args=factor_args,
- overwrite_output_dir=False,
- )
- analyzer.fit_lambda_matrices(
+ analyzer.fit_all_factors(
factors_name=args.factor_strategy,
dataset=train_dataset,
+ per_device_batch_size=args.factor_batch_size,
factor_args=factor_args,
- per_device_batch_size=args.lambda_batch_size,
- dataloader_kwargs=dataloader_kwargs,
overwrite_output_dir=False,
)
- scores = analyzer.compute_pairwise_scores(
- scores_name="pairwise",
+
+ # Compute pairwise scores.
+ rank = args.query_gradient_rank if args.query_gradient_rank != -1 else None
+ score_args = ScoreArguments(query_gradient_rank=rank)
+ scores_name = args.factor_strategy
+ if rank is not None:
+ scores_name += f"_qlr{rank}"
+ analyzer.compute_pairwise_scores(
+ score_args=score_args,
+ scores_name=scores_name,
factors_name=args.factor_strategy,
query_dataset=eval_dataset,
+ query_indices=list(range(1000)),
train_dataset=train_dataset,
- per_device_train_batch_size=args.train_batch_size,
per_device_query_batch_size=args.query_batch_size,
- query_indices=list(range(1000)),
+ per_device_train_batch_size=args.train_batch_size,
overwrite_output_dir=False,
)
- logging.info(f"Scores: {scores}")
+ scores = analyzer.load_pairwise_scores(scores_name)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
if __name__ == "__main__":
diff --git a/examples/imagenet/figure/query_batching.png b/examples/imagenet/figure/query_batching.png
new file mode 100644
index 0000000..bc865c7
Binary files /dev/null and b/examples/imagenet/figure/query_batching.png differ
diff --git a/examples/imagenet/pipeline.py b/examples/imagenet/pipeline.py
index e3f0fe2..51aa6ae 100644
--- a/examples/imagenet/pipeline.py
+++ b/examples/imagenet/pipeline.py
@@ -2,8 +2,8 @@
from typing import List
import torch
-import torch.nn as nn
import torchvision
+from torch import nn
from torch.utils.data import Dataset
diff --git a/examples/imagenet/query_batching_analysis.py b/examples/imagenet/query_batching_analysis.py
new file mode 100644
index 0000000..c0b5480
--- /dev/null
+++ b/examples/imagenet/query_batching_analysis.py
@@ -0,0 +1,36 @@
+import logging
+
+import matplotlib.pyplot as plt
+import numpy as np
+from scipy.stats import spearmanr
+from tueplots import markers
+
+from kronfluence.analyzer import Analyzer
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+
+ # Load the scores. You might need to modify the path.
+ full_scores = Analyzer.load_file("scores_ekfac/pairwise_scores.safetensors")["all_modules"]
+ lr_scores = Analyzer.load_file("scores_ekfac_qlr32/pairwise_scores.safetensors")["all_modules"]
+
+ # Only plot first 1000 points to avoid clutter.
+ plt.rcParams.update({"figure.dpi": 150})
+ plt.rcParams.update(markers.with_edge())
+ plt.rcParams["axes.axisbelow"] = True
+ plt.scatter(lr_scores[0][:1000], full_scores[0][:1000], edgecolor="k")
+ plt.grid()
+ plt.xlabel("Full Rank Score")
+ plt.ylabel("Low Rank (32) Score")
+ plt.show()
+
+ # Compute the averaged spearman correlation.
+ all_corr = []
+ for i in range(100):
+ all_corr.append(spearmanr(full_scores[i], lr_scores[i])[0])
+ logging.info(f"Averaged Spearman Correlation: {np.array(all_corr).mean()}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/imagenet/requirements.txt b/examples/imagenet/requirements.txt
new file mode 100644
index 0000000..a667c1f
--- /dev/null
+++ b/examples/imagenet/requirements.txt
@@ -0,0 +1,3 @@
+scikit-learn
+matplotlib
+tueplots
\ No newline at end of file
diff --git a/examples/requirements.txt b/examples/requirements.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/examples/uci/README.md b/examples/uci/README.md
index ee30203..7cc0e56 100644
--- a/examples/uci/README.md
+++ b/examples/uci/README.md
@@ -1,8 +1,7 @@
# UCI Regression Example
-This directory contains scripts designed for training a regression model and conducting influence analysis with
-datasets from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/datasets). Install all necessary packages:
-
+This directory contains scripts for training a regression model and conducting influence analysis with
+datasets from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/datasets). Please begin by installing necessary packages.
```bash
pip install -r requirements.txt
```
@@ -11,7 +10,7 @@ pip install -r requirements.txt
To train a regression model on the Concrete dataset, run the following command:
```bash
-python train.py --dataset_name concrete \
+python train.py --dataset_name concrete \
--dataset_dir ./data \
--output_dir ./checkpoints \
--train_batch_size 32 \
@@ -22,16 +21,21 @@ python train.py --dataset_name concrete \
--seed 1004
```
-# Computing Pairwise Influence Scores
+## Computing Pairwise Influence Scores
-To obtain a pairwise influence scores using EKFAC, run the following command:
+To obtain a pairwise influence scores using `ekfac`, run the following command:
```bash
-python analyze.py --dataset_name concrete \
+python analyze.py --dataset_name concrete \
--dataset_dir ./data \
--checkpoint_dir ./checkpoints \
--factor_strategy ekfac
```
+You can also use `identity`, `diagonal`, and `kfac`.
+
+## Counterfactual Evaluation
-# Counterfactual Evaluation
+You can check the notebook `tutorial.ipynb` to run the counterfactual evaluation.
-You can check the notebook `tutorial.ipynb` for running the counterfactual evaluation.
\ No newline at end of file
+
+
+
diff --git a/examples/uci/analyze.py b/examples/uci/analyze.py
index a8d963f..653886e 100644
--- a/examples/uci/analyze.py
+++ b/examples/uci/analyze.py
@@ -6,14 +6,14 @@
import torch
import torch.nn.functional as F
-from arguments import FactorArguments
from torch import nn
from examples.uci.pipeline import construct_regression_mlp, get_regression_dataset
from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments
from kronfluence.task import Task
-BATCH_DTYPE = Tuple[torch.Tensor, torch.Tensor]
+BATCH_TYPE = Tuple[torch.Tensor, torch.Tensor]
def parse_args():
@@ -35,16 +35,15 @@ def parse_args():
"--checkpoint_dir",
type=str,
default="./checkpoints",
- help="A path to store the final checkpoint.",
+ help="A path that is storing the final checkpoint of the model.",
)
parser.add_argument(
"--factor_strategy",
type=str,
default="ekfac",
- help="Strategy to compute preconditioning factors.",
+ help="Strategy to compute influence factors.",
)
-
args = parser.parse_args()
if args.checkpoint_dir is not None:
@@ -58,7 +57,7 @@ def parse_args():
class RegressionTask(Task):
def compute_train_loss(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
sample: bool = False,
) -> torch.Tensor:
@@ -72,7 +71,7 @@ def compute_train_loss(
def compute_measurement(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
) -> torch.Tensor:
# The measurement function is set as a training loss.
@@ -83,17 +82,20 @@ def main():
args = parse_args()
logging.basicConfig(level=logging.INFO)
+ # Prepare the dataset.
train_dataset = get_regression_dataset(
data_name=args.dataset_name, split="eval_train", dataset_dir=args.dataset_dir
)
eval_dataset = get_regression_dataset(data_name=args.dataset_name, split="valid", dataset_dir=args.dataset_dir)
+ # Prepare the trained model.
model = construct_regression_mlp()
checkpoint_path = os.path.join(args.checkpoint_dir, "model.pth")
if not os.path.isfile(checkpoint_path):
raise ValueError(f"No checkpoint found at {checkpoint_path}.")
model.load_state_dict(torch.load(checkpoint_path))
+ # Define task and prepare model.
task = RegressionTask()
model = prepare_model(model, task)
@@ -103,25 +105,27 @@ def main():
task=task,
cpu=True,
)
-
+ # Compute influence factors.
factor_args = FactorArguments(strategy=args.factor_strategy)
analyzer.fit_all_factors(
factors_name=args.factor_strategy,
dataset=train_dataset,
per_device_batch_size=None,
factor_args=factor_args,
- overwrite_output_dir=True,
+ overwrite_output_dir=False,
)
+ # Compute pairwise scores.
analyzer.compute_pairwise_scores(
- scores_name="pairwise",
+ scores_name=args.factor_strategy,
factors_name=args.factor_strategy,
query_dataset=eval_dataset,
train_dataset=train_dataset,
+ # Use full batch for computing query gradient.
per_device_query_batch_size=len(eval_dataset),
- overwrite_output_dir=True,
+ overwrite_output_dir=False,
)
- scores = analyzer.load_pairwise_scores("pairwise")
- print(scores)
+ scores = analyzer.load_pairwise_scores(args.factor_strategy)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
if __name__ == "__main__":
diff --git a/examples/uci/data/concrete.data b/examples/uci/data/concrete.data
new file mode 100644
index 0000000..51d5ce3
--- /dev/null
+++ b/examples/uci/data/concrete.data
@@ -0,0 +1,1030 @@
+540.0 0.0 0.0 162.0 2.5 1040.0 676.0 28 79.99
+540.0 0.0 0.0 162.0 2.5 1055.0 676.0 28 61.89
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 270 40.27
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 365 41.05
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 360 44.30
+266.0 114.0 0.0 228.0 0.0 932.0 670.0 90 47.03
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 365 43.70
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 28 36.45
+266.0 114.0 0.0 228.0 0.0 932.0 670.0 28 45.85
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 28 39.29
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 90 38.07
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 28 28.02
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 270 43.01
+190.0 190.0 0.0 228.0 0.0 932.0 670.0 90 42.33
+304.0 76.0 0.0 228.0 0.0 932.0 670.0 28 47.81
+380.0 0.0 0.0 228.0 0.0 932.0 670.0 90 52.91
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 90 39.36
+342.0 38.0 0.0 228.0 0.0 932.0 670.0 365 56.14
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 90 40.56
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 180 42.62
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 180 41.84
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 28 28.24
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 3 8.06
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 180 44.21
+380.0 0.0 0.0 228.0 0.0 932.0 670.0 365 52.52
+380.0 0.0 0.0 228.0 0.0 932.0 670.0 270 53.30
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 270 41.15
+342.0 38.0 0.0 228.0 0.0 932.0 670.0 180 52.12
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 28 37.43
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 7 38.60
+304.0 76.0 0.0 228.0 0.0 932.0 670.0 365 55.26
+266.0 114.0 0.0 228.0 0.0 932.0 670.0 365 52.91
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 180 41.72
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 270 42.13
+190.0 190.0 0.0 228.0 0.0 932.0 670.0 365 53.69
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 270 38.41
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 28 30.08
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 90 37.72
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 90 42.23
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 180 36.25
+342.0 38.0 0.0 228.0 0.0 932.0 670.0 90 50.46
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 365 43.70
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 365 39.00
+380.0 0.0 0.0 228.0 0.0 932.0 670.0 180 53.10
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 90 41.54
+427.5 47.5 0.0 228.0 0.0 932.0 594.0 7 35.08
+349.0 0.0 0.0 192.0 0.0 1047.0 806.9 3 15.05
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 180 40.76
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 7 26.26
+380.0 95.0 0.0 228.0 0.0 932.0 594.0 7 32.82
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 180 39.78
+190.0 190.0 0.0 228.0 0.0 932.0 670.0 180 46.93
+237.5 237.5 0.0 228.0 0.0 932.0 594.0 90 33.12
+304.0 76.0 0.0 228.0 0.0 932.0 670.0 90 49.19
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 7 14.59
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 7 14.64
+475.0 0.0 0.0 228.0 0.0 932.0 594.0 365 41.93
+198.6 132.4 0.0 192.0 0.0 978.4 825.5 3 9.13
+304.0 76.0 0.0 228.0 0.0 932.0 670.0 180 50.95
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 28 33.02
+304.0 76.0 0.0 228.0 0.0 932.0 670.0 270 54.38
+266.0 114.0 0.0 228.0 0.0 932.0 670.0 270 51.73
+310.0 0.0 0.0 192.0 0.0 971.0 850.6 3 9.87
+190.0 190.0 0.0 228.0 0.0 932.0 670.0 270 50.66
+266.0 114.0 0.0 228.0 0.0 932.0 670.0 180 48.70
+342.0 38.0 0.0 228.0 0.0 932.0 670.0 270 55.06
+139.6 209.4 0.0 192.0 0.0 1047.0 806.9 360 44.70
+332.5 142.5 0.0 228.0 0.0 932.0 594.0 7 30.28
+190.0 190.0 0.0 228.0 0.0 932.0 670.0 28 40.86
+485.0 0.0 0.0 146.0 0.0 1120.0 800.0 28 71.99
+374.0 189.2 0.0 170.1 10.1 926.1 756.7 3 34.40
+313.3 262.2 0.0 175.5 8.6 1046.9 611.8 3 28.80
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 3 33.40
+425.0 106.3 0.0 151.4 18.6 936.0 803.7 3 36.30
+375.0 93.8 0.0 126.6 23.4 852.1 992.6 3 29.00
+475.0 118.8 0.0 181.1 8.9 852.1 781.5 3 37.80
+469.0 117.2 0.0 137.8 32.2 852.1 840.5 3 40.20
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 3 33.40
+388.6 97.1 0.0 157.9 12.1 852.1 925.7 3 28.10
+531.3 0.0 0.0 141.8 28.2 852.1 893.7 3 41.30
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 3 33.40
+318.8 212.5 0.0 155.7 14.3 852.1 880.4 3 25.20
+401.8 94.7 0.0 147.4 11.4 946.8 852.1 3 41.10
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 3 35.30
+323.7 282.8 0.0 183.8 10.3 942.7 659.9 3 28.30
+379.5 151.2 0.0 153.9 15.9 1134.3 605.0 3 28.60
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 3 35.30
+286.3 200.9 0.0 144.7 11.2 1004.6 803.7 3 24.40
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 3 35.30
+439.0 177.0 0.0 186.0 11.1 884.9 707.9 3 39.30
+389.9 189.0 0.0 145.9 22.0 944.7 755.8 3 40.60
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 3 35.30
+337.9 189.0 0.0 174.9 9.5 944.7 755.8 3 24.10
+374.0 189.2 0.0 170.1 10.1 926.1 756.7 7 46.20
+313.3 262.2 0.0 175.5 8.6 1046.9 611.8 7 42.80
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 7 49.20
+425.0 106.3 0.0 151.4 18.6 936.0 803.7 7 46.80
+375.0 93.8 0.0 126.6 23.4 852.1 992.6 7 45.70
+475.0 118.8 0.0 181.1 8.9 852.1 781.5 7 55.60
+469.0 117.2 0.0 137.8 32.2 852.1 840.5 7 54.90
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 7 49.20
+388.6 97.1 0.0 157.9 12.1 852.1 925.7 7 34.90
+531.3 0.0 0.0 141.8 28.2 852.1 893.7 7 46.90
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 7 49.20
+318.8 212.5 0.0 155.7 14.3 852.1 880.4 7 33.40
+401.8 94.7 0.0 147.4 11.4 946.8 852.1 7 54.10
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 7 55.90
+323.7 282.8 0.0 183.8 10.3 942.7 659.9 7 49.80
+379.5 151.2 0.0 153.9 15.9 1134.3 605.0 7 47.10
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 7 55.90
+286.3 200.9 0.0 144.7 11.2 1004.6 803.7 7 38.00
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 7 55.90
+439.0 177.0 0.0 186.0 11.1 884.9 707.9 7 56.10
+389.9 189.0 0.0 145.9 22.0 944.7 755.8 7 59.09
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 7 22.90
+337.9 189.0 0.0 174.9 9.5 944.7 755.8 7 35.10
+374.0 189.2 0.0 170.1 10.1 926.1 756.7 28 61.09
+313.3 262.2 0.0 175.5 8.6 1046.9 611.8 28 59.80
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 28 60.29
+425.0 106.3 0.0 151.4 18.6 936.0 803.7 28 61.80
+375.0 93.8 0.0 126.6 23.4 852.1 992.6 28 56.70
+475.0 118.8 0.0 181.1 8.9 852.1 781.5 28 68.30
+469.0 117.2 0.0 137.8 32.2 852.1 840.5 28 66.90
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 28 60.29
+388.6 97.1 0.0 157.9 12.1 852.1 925.7 28 50.70
+531.3 0.0 0.0 141.8 28.2 852.1 893.7 28 56.40
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 28 60.29
+318.8 212.5 0.0 155.7 14.3 852.1 880.4 28 55.50
+401.8 94.7 0.0 147.4 11.4 946.8 852.1 28 68.50
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 28 71.30
+323.7 282.8 0.0 183.8 10.3 942.7 659.9 28 74.70
+379.5 151.2 0.0 153.9 15.9 1134.3 605.0 28 52.20
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 28 71.30
+286.3 200.9 0.0 144.7 11.2 1004.6 803.7 28 67.70
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 28 71.30
+439.0 177.0 0.0 186.0 11.1 884.9 707.9 28 66.00
+389.9 189.0 0.0 145.9 22.0 944.7 755.8 28 74.50
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 28 71.30
+337.9 189.0 0.0 174.9 9.5 944.7 755.8 28 49.90
+374.0 189.2 0.0 170.1 10.1 926.1 756.7 56 63.40
+313.3 262.2 0.0 175.5 8.6 1046.9 611.8 56 64.90
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 56 64.30
+425.0 106.3 0.0 151.4 18.6 936.0 803.7 56 64.90
+375.0 93.8 0.0 126.6 23.4 852.1 992.6 56 60.20
+475.0 118.8 0.0 181.1 8.9 852.1 781.5 56 72.30
+469.0 117.2 0.0 137.8 32.2 852.1 840.5 56 69.30
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 56 64.30
+388.6 97.1 0.0 157.9 12.1 852.1 925.7 56 55.20
+531.3 0.0 0.0 141.8 28.2 852.1 893.7 56 58.80
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 56 64.30
+318.8 212.5 0.0 155.7 14.3 852.1 880.4 56 66.10
+401.8 94.7 0.0 147.4 11.4 946.8 852.1 56 73.70
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 56 77.30
+323.7 282.8 0.0 183.8 10.3 942.7 659.9 56 80.20
+379.5 151.2 0.0 153.9 15.9 1134.3 605.0 56 54.90
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 56 77.30
+286.3 200.9 0.0 144.7 11.2 1004.6 803.7 56 72.99
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 56 77.30
+439.0 177.0 0.0 186.0 11.1 884.9 707.9 56 71.70
+389.9 189.0 0.0 145.9 22.0 944.7 755.8 56 79.40
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 56 77.30
+337.9 189.0 0.0 174.9 9.5 944.7 755.8 56 59.89
+374.0 189.2 0.0 170.1 10.1 926.1 756.7 91 64.90
+313.3 262.2 0.0 175.5 8.6 1046.9 611.8 91 66.60
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 91 65.20
+425.0 106.3 0.0 151.4 18.6 936.0 803.7 91 66.70
+375.0 93.8 0.0 126.6 23.4 852.1 992.6 91 62.50
+475.0 118.8 0.0 181.1 8.9 852.1 781.5 91 74.19
+469.0 117.2 0.0 137.8 32.2 852.1 840.5 91 70.70
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 91 65.20
+388.6 97.1 0.0 157.9 12.1 852.1 925.7 91 57.60
+531.3 0.0 0.0 141.8 28.2 852.1 893.7 91 59.20
+425.0 106.3 0.0 153.5 16.5 852.1 887.1 91 65.20
+318.8 212.5 0.0 155.7 14.3 852.1 880.4 91 68.10
+401.8 94.7 0.0 147.4 11.4 946.8 852.1 91 75.50
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 91 79.30
+379.5 151.2 0.0 153.9 15.9 1134.3 605.0 91 56.50
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 91 79.30
+286.3 200.9 0.0 144.7 11.2 1004.6 803.7 91 76.80
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 91 79.30
+439.0 177.0 0.0 186.0 11.1 884.9 707.9 91 73.30
+389.9 189.0 0.0 145.9 22.0 944.7 755.8 91 82.60
+362.6 189.0 0.0 164.9 11.6 944.7 755.8 91 79.30
+337.9 189.0 0.0 174.9 9.5 944.7 755.8 91 67.80
+222.4 0.0 96.7 189.3 4.5 967.1 870.3 3 11.58
+222.4 0.0 96.7 189.3 4.5 967.1 870.3 14 24.45
+222.4 0.0 96.7 189.3 4.5 967.1 870.3 28 24.89
+222.4 0.0 96.7 189.3 4.5 967.1 870.3 56 29.45
+222.4 0.0 96.7 189.3 4.5 967.1 870.3 100 40.71
+233.8 0.0 94.6 197.9 4.6 947.0 852.2 3 10.38
+233.8 0.0 94.6 197.9 4.6 947.0 852.2 14 22.14
+233.8 0.0 94.6 197.9 4.6 947.0 852.2 28 22.84
+233.8 0.0 94.6 197.9 4.6 947.0 852.2 56 27.66
+233.8 0.0 94.6 197.9 4.6 947.0 852.2 100 34.56
+194.7 0.0 100.5 165.6 7.5 1006.4 905.9 3 12.45
+194.7 0.0 100.5 165.6 7.5 1006.4 905.9 14 24.99
+194.7 0.0 100.5 165.6 7.5 1006.4 905.9 28 25.72
+194.7 0.0 100.5 165.6 7.5 1006.4 905.9 56 33.96
+194.7 0.0 100.5 165.6 7.5 1006.4 905.9 100 37.34
+190.7 0.0 125.4 162.1 7.8 1090.0 804.0 3 15.04
+190.7 0.0 125.4 162.1 7.8 1090.0 804.0 14 21.06
+190.7 0.0 125.4 162.1 7.8 1090.0 804.0 28 26.40
+190.7 0.0 125.4 162.1 7.8 1090.0 804.0 56 35.34
+190.7 0.0 125.4 162.1 7.8 1090.0 804.0 100 40.57
+212.1 0.0 121.6 180.3 5.7 1057.6 779.3 3 12.47
+212.1 0.0 121.6 180.3 5.7 1057.6 779.3 14 20.92
+212.1 0.0 121.6 180.3 5.7 1057.6 779.3 28 24.90
+212.1 0.0 121.6 180.3 5.7 1057.6 779.3 56 34.20
+212.1 0.0 121.6 180.3 5.7 1057.6 779.3 100 39.61
+230.0 0.0 118.3 195.5 4.6 1029.4 758.6 3 10.03
+230.0 0.0 118.3 195.5 4.6 1029.4 758.6 14 20.08
+230.0 0.0 118.3 195.5 4.6 1029.4 758.6 28 24.48
+230.0 0.0 118.3 195.5 4.6 1029.4 758.6 56 31.54
+230.0 0.0 118.3 195.5 4.6 1029.4 758.6 100 35.34
+190.3 0.0 125.2 161.9 9.9 1088.1 802.6 3 9.45
+190.3 0.0 125.2 161.9 9.9 1088.1 802.6 14 22.72
+190.3 0.0 125.2 161.9 9.9 1088.1 802.6 28 28.47
+190.3 0.0 125.2 161.9 9.9 1088.1 802.6 56 38.56
+190.3 0.0 125.2 161.9 9.9 1088.1 802.6 100 40.39
+166.1 0.0 163.3 176.5 4.5 1058.6 780.1 3 10.76
+166.1 0.0 163.3 176.5 4.5 1058.6 780.1 14 25.48
+166.1 0.0 163.3 176.5 4.5 1058.6 780.1 28 21.54
+166.1 0.0 163.3 176.5 4.5 1058.6 780.1 56 28.63
+166.1 0.0 163.3 176.5 4.5 1058.6 780.1 100 33.54
+168.0 42.1 163.8 121.8 5.7 1058.7 780.1 3 7.75
+168.0 42.1 163.8 121.8 5.7 1058.7 780.1 14 17.82
+168.0 42.1 163.8 121.8 5.7 1058.7 780.1 28 24.24
+168.0 42.1 163.8 121.8 5.7 1058.7 780.1 56 32.85
+168.0 42.1 163.8 121.8 5.7 1058.7 780.1 100 39.23
+213.7 98.1 24.5 181.7 6.9 1065.8 785.4 3 18.00
+213.7 98.1 24.5 181.7 6.9 1065.8 785.4 14 30.39
+213.7 98.1 24.5 181.7 6.9 1065.8 785.4 28 45.71
+213.7 98.1 24.5 181.7 6.9 1065.8 785.4 56 50.77
+213.7 98.1 24.5 181.7 6.9 1065.8 785.4 100 53.90
+213.8 98.1 24.5 181.7 6.7 1066.0 785.5 3 13.18
+213.8 98.1 24.5 181.7 6.7 1066.0 785.5 14 17.84
+213.8 98.1 24.5 181.7 6.7 1066.0 785.5 28 40.23
+213.8 98.1 24.5 181.7 6.7 1066.0 785.5 56 47.13
+213.8 98.1 24.5 181.7 6.7 1066.0 785.5 100 49.97
+229.7 0.0 118.2 195.2 6.1 1028.1 757.6 3 13.36
+229.7 0.0 118.2 195.2 6.1 1028.1 757.6 14 22.32
+229.7 0.0 118.2 195.2 6.1 1028.1 757.6 28 24.54
+229.7 0.0 118.2 195.2 6.1 1028.1 757.6 56 31.35
+229.7 0.0 118.2 195.2 6.1 1028.1 757.6 100 40.86
+238.1 0.0 94.1 186.7 7.0 949.9 847.0 3 19.93
+238.1 0.0 94.1 186.7 7.0 949.9 847.0 14 25.69
+238.1 0.0 94.1 186.7 7.0 949.9 847.0 28 30.23
+238.1 0.0 94.1 186.7 7.0 949.9 847.0 56 39.59
+238.1 0.0 94.1 186.7 7.0 949.9 847.0 100 44.30
+250.0 0.0 95.7 187.4 5.5 956.9 861.2 3 13.82
+250.0 0.0 95.7 187.4 5.5 956.9 861.2 14 24.92
+250.0 0.0 95.7 187.4 5.5 956.9 861.2 28 29.22
+250.0 0.0 95.7 187.4 5.5 956.9 861.2 56 38.33
+250.0 0.0 95.7 187.4 5.5 956.9 861.2 100 42.35
+212.5 0.0 100.4 159.3 8.7 1007.8 903.6 3 13.54
+212.5 0.0 100.4 159.3 8.7 1007.8 903.6 14 26.31
+212.5 0.0 100.4 159.3 8.7 1007.8 903.6 28 31.64
+212.5 0.0 100.4 159.3 8.7 1007.8 903.6 56 42.55
+212.5 0.0 100.4 159.3 8.7 1007.8 903.6 100 42.92
+212.6 0.0 100.4 159.4 10.4 1003.8 903.8 3 13.33
+212.6 0.0 100.4 159.4 10.4 1003.8 903.8 14 25.37
+212.6 0.0 100.4 159.4 10.4 1003.8 903.8 28 37.40
+212.6 0.0 100.4 159.4 10.4 1003.8 903.8 56 44.40
+212.6 0.0 100.4 159.4 10.4 1003.8 903.8 100 47.74
+212.0 0.0 124.8 159.0 7.8 1085.4 799.5 3 19.52
+212.0 0.0 124.8 159.0 7.8 1085.4 799.5 14 31.35
+212.0 0.0 124.8 159.0 7.8 1085.4 799.5 28 38.50
+212.0 0.0 124.8 159.0 7.8 1085.4 799.5 56 45.08
+212.0 0.0 124.8 159.0 7.8 1085.4 799.5 100 47.82
+231.8 0.0 121.6 174.0 6.7 1056.4 778.5 3 15.44
+231.8 0.0 121.6 174.0 6.7 1056.4 778.5 14 26.77
+231.8 0.0 121.6 174.0 6.7 1056.4 778.5 28 33.73
+231.8 0.0 121.6 174.0 6.7 1056.4 778.5 56 42.70
+231.8 0.0 121.6 174.0 6.7 1056.4 778.5 100 45.84
+251.4 0.0 118.3 188.5 5.8 1028.4 757.7 3 17.22
+251.4 0.0 118.3 188.5 5.8 1028.4 757.7 14 29.93
+251.4 0.0 118.3 188.5 5.8 1028.4 757.7 28 29.65
+251.4 0.0 118.3 188.5 5.8 1028.4 757.7 56 36.97
+251.4 0.0 118.3 188.5 5.8 1028.4 757.7 100 43.58
+251.4 0.0 118.3 188.5 6.4 1028.4 757.7 3 13.12
+251.4 0.0 118.3 188.5 6.4 1028.4 757.7 14 24.43
+251.4 0.0 118.3 188.5 6.4 1028.4 757.7 28 32.66
+251.4 0.0 118.3 188.5 6.4 1028.4 757.7 56 36.64
+251.4 0.0 118.3 188.5 6.4 1028.4 757.7 100 44.21
+181.4 0.0 167.0 169.6 7.6 1055.6 777.8 3 13.62
+181.4 0.0 167.0 169.6 7.6 1055.6 777.8 14 21.60
+181.4 0.0 167.0 169.6 7.6 1055.6 777.8 28 27.77
+181.4 0.0 167.0 169.6 7.6 1055.6 777.8 56 35.57
+181.4 0.0 167.0 169.6 7.6 1055.6 777.8 100 45.37
+182.0 45.2 122.0 170.2 8.2 1059.4 780.7 3 7.32
+182.0 45.2 122.0 170.2 8.2 1059.4 780.7 14 21.50
+182.0 45.2 122.0 170.2 8.2 1059.4 780.7 28 31.27
+182.0 45.2 122.0 170.2 8.2 1059.4 780.7 56 43.50
+182.0 45.2 122.0 170.2 8.2 1059.4 780.7 100 48.67
+168.9 42.2 124.3 158.3 10.8 1080.8 796.2 3 7.40
+168.9 42.2 124.3 158.3 10.8 1080.8 796.2 14 23.51
+168.9 42.2 124.3 158.3 10.8 1080.8 796.2 28 31.12
+168.9 42.2 124.3 158.3 10.8 1080.8 796.2 56 39.15
+168.9 42.2 124.3 158.3 10.8 1080.8 796.2 100 48.15
+290.4 0.0 96.2 168.1 9.4 961.2 865.0 3 22.50
+290.4 0.0 96.2 168.1 9.4 961.2 865.0 14 34.67
+290.4 0.0 96.2 168.1 9.4 961.2 865.0 28 34.74
+290.4 0.0 96.2 168.1 9.4 961.2 865.0 56 45.08
+290.4 0.0 96.2 168.1 9.4 961.2 865.0 100 48.97
+277.1 0.0 97.4 160.6 11.8 973.9 875.6 3 23.14
+277.1 0.0 97.4 160.6 11.8 973.9 875.6 14 41.89
+277.1 0.0 97.4 160.6 11.8 973.9 875.6 28 48.28
+277.1 0.0 97.4 160.6 11.8 973.9 875.6 56 51.04
+277.1 0.0 97.4 160.6 11.8 973.9 875.6 100 55.64
+295.7 0.0 95.6 171.5 8.9 955.1 859.2 3 22.95
+295.7 0.0 95.6 171.5 8.9 955.1 859.2 14 35.23
+295.7 0.0 95.6 171.5 8.9 955.1 859.2 28 39.94
+295.7 0.0 95.6 171.5 8.9 955.1 859.2 56 48.72
+295.7 0.0 95.6 171.5 8.9 955.1 859.2 100 52.04
+251.8 0.0 99.9 146.1 12.4 1006.0 899.8 3 21.02
+251.8 0.0 99.9 146.1 12.4 1006.0 899.8 14 33.36
+251.8 0.0 99.9 146.1 12.4 1006.0 899.8 28 33.94
+251.8 0.0 99.9 146.1 12.4 1006.0 899.8 56 44.14
+251.8 0.0 99.9 146.1 12.4 1006.0 899.8 100 45.37
+249.1 0.0 98.8 158.1 12.8 987.8 889.0 3 15.36
+249.1 0.0 98.8 158.1 12.8 987.8 889.0 14 28.68
+249.1 0.0 98.8 158.1 12.8 987.8 889.0 28 30.85
+249.1 0.0 98.8 158.1 12.8 987.8 889.0 56 42.03
+249.1 0.0 98.8 158.1 12.8 987.8 889.0 100 51.06
+252.3 0.0 98.8 146.3 14.2 987.8 889.0 3 21.78
+252.3 0.0 98.8 146.3 14.2 987.8 889.0 14 42.29
+252.3 0.0 98.8 146.3 14.2 987.8 889.0 28 50.60
+252.3 0.0 98.8 146.3 14.2 987.8 889.0 56 55.83
+252.3 0.0 98.8 146.3 14.2 987.8 889.0 100 60.95
+246.8 0.0 125.1 143.3 12.0 1086.8 800.9 3 23.52
+246.8 0.0 125.1 143.3 12.0 1086.8 800.9 14 42.22
+246.8 0.0 125.1 143.3 12.0 1086.8 800.9 28 52.50
+246.8 0.0 125.1 143.3 12.0 1086.8 800.9 56 60.32
+246.8 0.0 125.1 143.3 12.0 1086.8 800.9 100 66.42
+275.1 0.0 121.4 159.5 9.9 1053.6 777.5 3 23.80
+275.1 0.0 121.4 159.5 9.9 1053.6 777.5 14 38.77
+275.1 0.0 121.4 159.5 9.9 1053.6 777.5 28 51.33
+275.1 0.0 121.4 159.5 9.9 1053.6 777.5 56 56.85
+275.1 0.0 121.4 159.5 9.9 1053.6 777.5 100 58.61
+297.2 0.0 117.5 174.8 9.5 1022.8 753.5 3 21.91
+297.2 0.0 117.5 174.8 9.5 1022.8 753.5 14 36.99
+297.2 0.0 117.5 174.8 9.5 1022.8 753.5 28 47.40
+297.2 0.0 117.5 174.8 9.5 1022.8 753.5 56 51.96
+297.2 0.0 117.5 174.8 9.5 1022.8 753.5 100 56.74
+213.7 0.0 174.7 154.8 10.2 1053.5 776.4 3 17.57
+213.7 0.0 174.7 154.8 10.2 1053.5 776.4 14 33.73
+213.7 0.0 174.7 154.8 10.2 1053.5 776.4 28 40.15
+213.7 0.0 174.7 154.8 10.2 1053.5 776.4 56 46.64
+213.7 0.0 174.7 154.8 10.2 1053.5 776.4 100 50.08
+213.5 0.0 174.2 154.6 11.7 1052.3 775.5 3 17.37
+213.5 0.0 174.2 154.6 11.7 1052.3 775.5 14 33.70
+213.5 0.0 174.2 154.6 11.7 1052.3 775.5 28 45.94
+213.5 0.0 174.2 154.6 11.7 1052.3 775.5 56 51.43
+213.5 0.0 174.2 154.6 11.7 1052.3 775.5 100 59.30
+277.2 97.8 24.5 160.7 11.2 1061.7 782.5 3 30.45
+277.2 97.8 24.5 160.7 11.2 1061.7 782.5 14 47.71
+277.2 97.8 24.5 160.7 11.2 1061.7 782.5 28 63.14
+277.2 97.8 24.5 160.7 11.2 1061.7 782.5 56 66.82
+277.2 97.8 24.5 160.7 11.2 1061.7 782.5 100 66.95
+218.2 54.6 123.8 140.8 11.9 1075.7 792.7 3 27.42
+218.2 54.6 123.8 140.8 11.9 1075.7 792.7 14 35.96
+218.2 54.6 123.8 140.8 11.9 1075.7 792.7 28 55.51
+218.2 54.6 123.8 140.8 11.9 1075.7 792.7 56 61.99
+218.2 54.6 123.8 140.8 11.9 1075.7 792.7 100 63.53
+214.9 53.8 121.9 155.6 9.6 1014.3 780.6 3 18.02
+214.9 53.8 121.9 155.6 9.6 1014.3 780.6 14 38.60
+214.9 53.8 121.9 155.6 9.6 1014.3 780.6 28 52.20
+214.9 53.8 121.9 155.6 9.6 1014.3 780.6 56 53.96
+214.9 53.8 121.9 155.6 9.6 1014.3 780.6 100 56.63
+218.9 0.0 124.1 158.5 11.3 1078.7 794.9 3 15.34
+218.9 0.0 124.1 158.5 11.3 1078.7 794.9 14 26.05
+218.9 0.0 124.1 158.5 11.3 1078.7 794.9 28 30.22
+218.9 0.0 124.1 158.5 11.3 1078.7 794.9 56 37.27
+218.9 0.0 124.1 158.5 11.3 1078.7 794.9 100 46.23
+376.0 0.0 0.0 214.6 0.0 1003.5 762.4 3 16.28
+376.0 0.0 0.0 214.6 0.0 1003.5 762.4 14 25.62
+376.0 0.0 0.0 214.6 0.0 1003.5 762.4 28 31.97
+376.0 0.0 0.0 214.6 0.0 1003.5 762.4 56 36.30
+376.0 0.0 0.0 214.6 0.0 1003.5 762.4 100 43.06
+500.0 0.0 0.0 140.0 4.0 966.0 853.0 28 67.57
+475.0 0.0 59.0 142.0 1.9 1098.0 641.0 28 57.23
+315.0 137.0 0.0 145.0 5.9 1130.0 745.0 28 81.75
+505.0 0.0 60.0 195.0 0.0 1030.0 630.0 28 64.02
+451.0 0.0 0.0 165.0 11.3 1030.0 745.0 28 78.80
+516.0 0.0 0.0 162.0 8.2 801.0 802.0 28 41.37
+520.0 0.0 0.0 170.0 5.2 855.0 855.0 28 60.28
+528.0 0.0 0.0 185.0 6.9 920.0 720.0 28 56.83
+520.0 0.0 0.0 175.0 5.2 870.0 805.0 28 51.02
+385.0 0.0 136.0 158.0 20.0 903.0 768.0 28 55.55
+500.1 0.0 0.0 200.0 3.0 1124.4 613.2 28 44.13
+450.1 50.0 0.0 200.0 3.0 1124.4 613.2 28 39.38
+397.0 17.2 158.0 167.0 20.8 967.0 633.0 28 55.65
+333.0 17.5 163.0 167.0 17.9 996.0 652.0 28 47.28
+334.0 17.6 158.0 189.0 15.3 967.0 633.0 28 44.33
+405.0 0.0 0.0 175.0 0.0 1120.0 695.0 28 52.30
+200.0 200.0 0.0 190.0 0.0 1145.0 660.0 28 49.25
+516.0 0.0 0.0 162.0 8.3 801.0 802.0 28 41.37
+145.0 116.0 119.0 184.0 5.7 833.0 880.0 28 29.16
+160.0 128.0 122.0 182.0 6.4 824.0 879.0 28 39.40
+234.0 156.0 0.0 189.0 5.9 981.0 760.0 28 39.30
+250.0 180.0 95.0 159.0 9.5 860.0 800.0 28 67.87
+475.0 0.0 0.0 162.0 9.5 1044.0 662.0 28 58.52
+285.0 190.0 0.0 163.0 7.6 1031.0 685.0 28 53.58
+356.0 119.0 0.0 160.0 9.0 1061.0 657.0 28 59.00
+275.0 180.0 120.0 162.0 10.4 830.0 765.0 28 76.24
+500.0 0.0 0.0 151.0 9.0 1033.0 655.0 28 69.84
+165.0 0.0 143.6 163.8 0.0 1005.6 900.9 3 14.40
+165.0 128.5 132.1 175.1 8.1 1005.8 746.6 3 19.42
+178.0 129.8 118.6 179.9 3.6 1007.3 746.8 3 20.73
+167.4 129.9 128.6 175.5 7.8 1006.3 746.6 3 14.94
+172.4 13.6 172.4 156.8 4.1 1006.3 856.4 3 21.29
+173.5 50.1 173.5 164.8 6.5 1006.2 793.5 3 23.08
+167.0 75.4 167.0 164.0 7.9 1007.3 770.1 3 15.52
+173.8 93.4 159.9 172.3 9.7 1007.2 746.6 3 15.82
+190.3 0.0 125.2 166.6 9.9 1079.0 798.9 3 12.55
+250.0 0.0 95.7 191.8 5.3 948.9 857.2 3 8.49
+213.5 0.0 174.2 159.2 11.7 1043.6 771.9 3 15.61
+194.7 0.0 100.5 170.2 7.5 998.0 901.8 3 12.18
+251.4 0.0 118.3 192.9 5.8 1043.6 754.3 3 11.98
+165.0 0.0 143.6 163.8 0.0 1005.6 900.9 14 16.88
+165.0 128.5 132.1 175.1 8.1 1005.8 746.6 14 33.09
+178.0 129.8 118.6 179.9 3.6 1007.3 746.8 14 34.24
+167.4 129.9 128.6 175.5 7.8 1006.3 746.6 14 31.81
+172.4 13.6 172.4 156.8 4.1 1006.3 856.4 14 29.75
+173.5 50.1 173.5 164.8 6.5 1006.2 793.5 14 33.01
+167.0 75.4 167.0 164.0 7.9 1007.3 770.1 14 32.90
+173.8 93.4 159.9 172.3 9.7 1007.2 746.6 14 29.55
+190.3 0.0 125.2 166.6 9.9 1079.0 798.9 14 19.42
+250.0 0.0 95.7 191.8 5.3 948.9 857.2 14 24.66
+213.5 0.0 174.2 159.2 11.7 1043.6 771.9 14 29.59
+194.7 0.0 100.5 170.2 7.5 998.0 901.8 14 24.28
+251.4 0.0 118.3 192.9 5.8 1043.6 754.3 14 20.73
+165.0 0.0 143.6 163.8 0.0 1005.6 900.9 28 26.20
+165.0 128.5 132.1 175.1 8.1 1005.8 746.6 28 46.39
+178.0 129.8 118.6 179.9 3.6 1007.3 746.8 28 39.16
+167.4 129.9 128.6 175.5 7.8 1006.3 746.6 28 41.20
+172.4 13.6 172.4 156.8 4.1 1006.3 856.4 28 33.69
+173.5 50.1 173.5 164.8 6.5 1006.2 793.5 28 38.20
+167.0 75.4 167.0 164.0 7.9 1007.3 770.1 28 41.41
+173.8 93.4 159.9 172.3 9.7 1007.2 746.6 28 37.81
+190.3 0.0 125.2 166.6 9.9 1079.0 798.9 28 24.85
+250.0 0.0 95.7 191.8 5.3 948.9 857.2 28 27.22
+213.5 0.0 174.2 159.2 11.7 1043.6 771.9 28 44.64
+194.7 0.0 100.5 170.2 7.5 998.0 901.8 28 37.27
+251.4 0.0 118.3 192.9 5.8 1043.6 754.3 28 33.27
+165.0 0.0 143.6 163.8 0.0 1005.6 900.9 56 36.56
+165.0 128.5 132.1 175.1 8.1 1005.8 746.6 56 53.72
+178.0 129.8 118.6 179.9 3.6 1007.3 746.8 56 48.59
+167.4 129.9 128.6 175.5 7.8 1006.3 746.6 56 51.72
+172.4 13.6 172.4 156.8 4.1 1006.3 856.4 56 35.85
+173.5 50.1 173.5 164.8 6.5 1006.2 793.5 56 53.77
+167.0 75.4 167.0 164.0 7.9 1007.3 770.1 56 53.46
+173.8 93.4 159.9 172.3 9.7 1007.2 746.6 56 48.99
+190.3 0.0 125.2 166.6 9.9 1079.0 798.9 56 31.72
+250.0 0.0 95.7 191.8 5.3 948.9 857.2 56 39.64
+213.5 0.0 174.2 159.2 11.7 1043.6 771.9 56 51.26
+194.7 0.0 100.5 170.2 7.5 998.0 901.8 56 43.39
+251.4 0.0 118.3 192.9 5.8 1043.6 754.3 56 39.27
+165.0 0.0 143.6 163.8 0.0 1005.6 900.9 100 37.96
+165.0 128.5 132.1 175.1 8.1 1005.8 746.6 100 55.02
+178.0 129.8 118.6 179.9 3.6 1007.3 746.8 100 49.99
+167.4 129.9 128.6 175.5 7.8 1006.3 746.6 100 53.66
+172.4 13.6 172.4 156.8 4.1 1006.3 856.4 100 37.68
+173.5 50.1 173.5 164.8 6.5 1006.2 793.5 100 56.06
+167.0 75.4 167.0 164.0 7.9 1007.3 770.1 100 56.81
+173.8 93.4 159.9 172.3 9.7 1007.2 746.6 100 50.94
+190.3 0.0 125.2 166.6 9.9 1079.0 798.9 100 33.56
+250.0 0.0 95.7 191.8 5.3 948.9 857.2 100 41.16
+213.5 0.0 174.2 159.2 11.7 1043.6 771.9 100 52.96
+194.7 0.0 100.5 170.2 7.5 998.0 901.8 100 44.28
+251.4 0.0 118.3 192.9 5.8 1043.6 754.3 100 40.15
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 28 57.03
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 28 44.42
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 28 51.02
+446.0 24.0 79.0 162.0 10.3 967.0 712.0 28 53.39
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 3 35.36
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 3 25.02
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 3 23.35
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 7 52.01
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 7 38.02
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 7 39.30
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 56 61.07
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 56 56.14
+446.0 24.0 79.0 162.0 11.6 967.0 712.0 56 55.25
+446.0 24.0 79.0 162.0 10.3 967.0 712.0 56 54.77
+387.0 20.0 94.0 157.0 14.3 938.0 845.0 28 50.24
+387.0 20.0 94.0 157.0 13.9 938.0 845.0 28 46.68
+387.0 20.0 94.0 157.0 11.6 938.0 845.0 28 46.68
+387.0 20.0 94.0 157.0 14.3 938.0 845.0 3 22.75
+387.0 20.0 94.0 157.0 13.9 938.0 845.0 3 25.51
+387.0 20.0 94.0 157.0 11.6 938.0 845.0 3 34.77
+387.0 20.0 94.0 157.0 14.3 938.0 845.0 7 36.84
+387.0 20.0 94.0 157.0 13.9 938.0 845.0 7 45.90
+387.0 20.0 94.0 157.0 11.6 938.0 845.0 7 41.67
+387.0 20.0 94.0 157.0 14.3 938.0 845.0 56 56.34
+387.0 20.0 94.0 157.0 13.9 938.0 845.0 56 47.97
+387.0 20.0 94.0 157.0 11.6 938.0 845.0 56 61.46
+355.0 19.0 97.0 145.0 13.1 967.0 871.0 28 44.03
+355.0 19.0 97.0 145.0 12.3 967.0 871.0 28 55.45
+491.0 26.0 123.0 210.0 3.9 882.0 699.0 28 55.55
+491.0 26.0 123.0 201.0 3.9 822.0 699.0 28 57.92
+491.0 26.0 123.0 210.0 3.9 882.0 699.0 3 25.61
+491.0 26.0 123.0 210.0 3.9 882.0 699.0 7 33.49
+491.0 26.0 123.0 210.0 3.9 882.0 699.0 56 59.59
+491.0 26.0 123.0 201.0 3.9 822.0 699.0 3 29.55
+491.0 26.0 123.0 201.0 3.9 822.0 699.0 7 37.92
+491.0 26.0 123.0 201.0 3.9 822.0 699.0 56 61.86
+424.0 22.0 132.0 178.0 8.5 822.0 750.0 28 62.05
+424.0 22.0 132.0 178.0 8.5 882.0 750.0 3 32.01
+424.0 22.0 132.0 168.0 8.9 822.0 750.0 28 72.10
+424.0 22.0 132.0 178.0 8.5 822.0 750.0 7 39.00
+424.0 22.0 132.0 178.0 8.5 822.0 750.0 56 65.70
+424.0 22.0 132.0 168.0 8.9 822.0 750.0 3 32.11
+424.0 22.0 132.0 168.0 8.9 822.0 750.0 7 40.29
+424.0 22.0 132.0 168.0 8.9 822.0 750.0 56 74.36
+202.0 11.0 141.0 206.0 1.7 942.0 801.0 28 21.97
+202.0 11.0 141.0 206.0 1.7 942.0 801.0 3 9.85
+202.0 11.0 141.0 206.0 1.7 942.0 801.0 7 15.07
+202.0 11.0 141.0 206.0 1.7 942.0 801.0 56 23.25
+284.0 15.0 141.0 179.0 5.5 842.0 801.0 28 43.73
+284.0 15.0 141.0 179.0 5.5 842.0 801.0 3 13.40
+284.0 15.0 141.0 179.0 5.5 842.0 801.0 7 24.13
+284.0 15.0 141.0 179.0 5.5 842.0 801.0 56 44.52
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 28 62.94
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 28 59.49
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 3 25.12
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 3 23.64
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 7 35.75
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 7 38.61
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 56 68.75
+359.0 19.0 141.0 154.0 10.9 942.0 801.0 56 66.78
+436.0 0.0 0.0 218.0 0.0 838.4 719.7 28 23.85
+289.0 0.0 0.0 192.0 0.0 913.2 895.3 90 32.07
+289.0 0.0 0.0 192.0 0.0 913.2 895.3 3 11.65
+393.0 0.0 0.0 192.0 0.0 940.6 785.6 3 19.20
+393.0 0.0 0.0 192.0 0.0 940.6 785.6 90 48.85
+393.0 0.0 0.0 192.0 0.0 940.6 785.6 28 39.60
+480.0 0.0 0.0 192.0 0.0 936.2 712.2 28 43.94
+480.0 0.0 0.0 192.0 0.0 936.2 712.2 7 34.57
+480.0 0.0 0.0 192.0 0.0 936.2 712.2 90 54.32
+480.0 0.0 0.0 192.0 0.0 936.2 712.2 3 24.40
+333.0 0.0 0.0 192.0 0.0 931.2 842.6 3 15.62
+255.0 0.0 0.0 192.0 0.0 889.8 945.0 90 21.86
+255.0 0.0 0.0 192.0 0.0 889.8 945.0 7 10.22
+289.0 0.0 0.0 192.0 0.0 913.2 895.3 7 14.60
+255.0 0.0 0.0 192.0 0.0 889.8 945.0 28 18.75
+333.0 0.0 0.0 192.0 0.0 931.2 842.6 28 31.97
+333.0 0.0 0.0 192.0 0.0 931.2 842.6 7 23.40
+289.0 0.0 0.0 192.0 0.0 913.2 895.3 28 25.57
+333.0 0.0 0.0 192.0 0.0 931.2 842.6 90 41.68
+393.0 0.0 0.0 192.0 0.0 940.6 785.6 7 27.74
+255.0 0.0 0.0 192.0 0.0 889.8 945.0 3 8.20
+158.8 238.2 0.0 185.7 0.0 1040.6 734.3 7 9.62
+239.6 359.4 0.0 185.7 0.0 941.6 664.3 7 25.42
+238.2 158.8 0.0 185.7 0.0 1040.6 734.3 7 15.69
+181.9 272.8 0.0 185.7 0.0 1012.4 714.3 28 27.94
+193.5 290.2 0.0 185.7 0.0 998.2 704.3 28 32.63
+255.5 170.3 0.0 185.7 0.0 1026.6 724.3 7 17.24
+272.8 181.9 0.0 185.7 0.0 1012.4 714.3 7 19.77
+239.6 359.4 0.0 185.7 0.0 941.6 664.3 28 39.44
+220.8 147.2 0.0 185.7 0.0 1055.0 744.3 28 25.75
+397.0 0.0 0.0 185.7 0.0 1040.6 734.3 28 33.08
+382.5 0.0 0.0 185.7 0.0 1047.8 739.3 7 24.07
+210.7 316.1 0.0 185.7 0.0 977.0 689.3 7 21.82
+158.8 238.2 0.0 185.7 0.0 1040.6 734.3 28 21.07
+295.8 0.0 0.0 185.7 0.0 1091.4 769.3 7 14.84
+255.5 170.3 0.0 185.7 0.0 1026.6 724.3 28 32.05
+203.5 135.7 0.0 185.7 0.0 1076.2 759.3 7 11.96
+397.0 0.0 0.0 185.7 0.0 1040.6 734.3 7 25.45
+381.4 0.0 0.0 185.7 0.0 1104.6 784.3 28 22.49
+295.8 0.0 0.0 185.7 0.0 1091.4 769.3 28 25.22
+228.0 342.1 0.0 185.7 0.0 955.8 674.3 28 39.70
+220.8 147.2 0.0 185.7 0.0 1055.0 744.3 7 13.09
+316.1 210.7 0.0 185.7 0.0 977.0 689.3 28 38.70
+135.7 203.5 0.0 185.7 0.0 1076.2 759.3 7 7.51
+238.1 0.0 0.0 185.7 0.0 1118.8 789.3 28 17.58
+339.2 0.0 0.0 185.7 0.0 1069.2 754.3 7 21.18
+135.7 203.5 0.0 185.7 0.0 1076.2 759.3 28 18.20
+193.5 290.2 0.0 185.7 0.0 998.2 704.3 7 17.20
+203.5 135.7 0.0 185.7 0.0 1076.2 759.3 28 22.63
+290.2 193.5 0.0 185.7 0.0 998.2 704.3 7 21.86
+181.9 272.8 0.0 185.7 0.0 1012.4 714.3 7 12.37
+170.3 155.5 0.0 185.7 0.0 1026.6 724.3 28 25.73
+210.7 316.1 0.0 185.7 0.0 977.0 689.3 28 37.81
+228.0 342.1 0.0 185.7 0.0 955.8 674.3 7 21.92
+290.2 193.5 0.0 185.7 0.0 998.2 704.3 28 33.04
+381.4 0.0 0.0 185.7 0.0 1104.6 784.3 7 14.54
+238.2 158.8 0.0 185.7 0.0 1040.6 734.3 28 26.91
+186.2 124.1 0.0 185.7 0.0 1083.4 764.3 7 8.00
+339.2 0.0 0.0 185.7 0.0 1069.2 754.3 28 31.90
+238.1 0.0 0.0 185.7 0.0 1118.8 789.3 7 10.34
+252.5 0.0 0.0 185.7 0.0 1111.6 784.3 28 19.77
+382.5 0.0 0.0 185.7 0.0 1047.8 739.3 28 37.44
+252.5 0.0 0.0 185.7 0.0 1111.6 784.3 7 11.48
+316.1 210.7 0.0 185.7 0.0 977.0 689.3 7 24.44
+186.2 124.1 0.0 185.7 0.0 1083.4 764.3 28 17.60
+170.3 155.5 0.0 185.7 0.0 1026.6 724.3 7 10.73
+272.8 181.9 0.0 185.7 0.0 1012.4 714.3 28 31.38
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 3 13.22
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 7 20.97
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 14 27.04
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 28 32.04
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 90 35.17
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 180 36.45
+339.0 0.0 0.0 197.0 0.0 968.0 781.0 365 38.89
+236.0 0.0 0.0 194.0 0.0 968.0 885.0 3 6.47
+236.0 0.0 0.0 194.0 0.0 968.0 885.0 14 12.84
+236.0 0.0 0.0 194.0 0.0 968.0 885.0 28 18.42
+236.0 0.0 0.0 194.0 0.0 968.0 885.0 90 21.95
+236.0 0.0 0.0 193.0 0.0 968.0 885.0 180 24.10
+236.0 0.0 0.0 193.0 0.0 968.0 885.0 365 25.08
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 14 21.26
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 28 25.97
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 3 11.36
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 90 31.25
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 180 32.33
+277.0 0.0 0.0 191.0 0.0 968.0 856.0 360 33.70
+254.0 0.0 0.0 198.0 0.0 968.0 863.0 3 9.31
+254.0 0.0 0.0 198.0 0.0 968.0 863.0 90 26.94
+254.0 0.0 0.0 198.0 0.0 968.0 863.0 180 27.63
+254.0 0.0 0.0 198.0 0.0 968.0 863.0 365 29.79
+307.0 0.0 0.0 193.0 0.0 968.0 812.0 180 34.49
+307.0 0.0 0.0 193.0 0.0 968.0 812.0 365 36.15
+307.0 0.0 0.0 193.0 0.0 968.0 812.0 3 12.54
+307.0 0.0 0.0 193.0 0.0 968.0 812.0 28 27.53
+307.0 0.0 0.0 193.0 0.0 968.0 812.0 90 32.92
+236.0 0.0 0.0 193.0 0.0 968.0 885.0 7 9.99
+200.0 0.0 0.0 180.0 0.0 1125.0 845.0 7 7.84
+200.0 0.0 0.0 180.0 0.0 1125.0 845.0 28 12.25
+225.0 0.0 0.0 181.0 0.0 1113.0 833.0 7 11.17
+225.0 0.0 0.0 181.0 0.0 1113.0 833.0 28 17.34
+325.0 0.0 0.0 184.0 0.0 1063.0 783.0 7 17.54
+325.0 0.0 0.0 184.0 0.0 1063.0 783.0 28 30.57
+275.0 0.0 0.0 183.0 0.0 1088.0 808.0 7 14.20
+275.0 0.0 0.0 183.0 0.0 1088.0 808.0 28 24.50
+300.0 0.0 0.0 184.0 0.0 1075.0 795.0 7 15.58
+300.0 0.0 0.0 184.0 0.0 1075.0 795.0 28 26.85
+375.0 0.0 0.0 186.0 0.0 1038.0 758.0 7 26.06
+375.0 0.0 0.0 186.0 0.0 1038.0 758.0 28 38.21
+400.0 0.0 0.0 187.0 0.0 1025.0 745.0 28 43.70
+400.0 0.0 0.0 187.0 0.0 1025.0 745.0 7 30.14
+250.0 0.0 0.0 182.0 0.0 1100.0 820.0 7 12.73
+250.0 0.0 0.0 182.0 0.0 1100.0 820.0 28 20.87
+350.0 0.0 0.0 186.0 0.0 1050.0 770.0 7 20.28
+350.0 0.0 0.0 186.0 0.0 1050.0 770.0 28 34.29
+203.5 305.3 0.0 203.5 0.0 963.4 630.0 7 19.54
+250.2 166.8 0.0 203.5 0.0 977.6 694.1 90 47.71
+157.0 236.0 0.0 192.0 0.0 935.4 781.2 90 43.38
+141.3 212.0 0.0 203.5 0.0 971.8 748.5 28 29.89
+166.8 250.2 0.0 203.5 0.0 975.6 692.6 3 6.90
+122.6 183.9 0.0 203.5 0.0 958.2 800.1 90 33.19
+183.9 122.6 0.0 203.5 0.0 959.2 800.0 3 4.90
+102.0 153.0 0.0 192.0 0.0 887.0 942.0 3 4.57
+102.0 153.0 0.0 192.0 0.0 887.0 942.0 90 25.46
+122.6 183.9 0.0 203.5 0.0 958.2 800.1 28 24.29
+166.8 250.2 0.0 203.5 0.0 975.6 692.6 28 33.95
+200.0 133.0 0.0 192.0 0.0 965.4 806.2 3 11.41
+108.3 162.4 0.0 203.5 0.0 938.2 849.0 28 20.59
+305.3 203.5 0.0 203.5 0.0 965.4 631.0 7 25.89
+108.3 162.4 0.0 203.5 0.0 938.2 849.0 90 29.23
+116.0 173.0 0.0 192.0 0.0 909.8 891.9 90 31.02
+141.3 212.0 0.0 203.5 0.0 971.8 748.5 7 10.39
+157.0 236.0 0.0 192.0 0.0 935.4 781.2 28 33.66
+133.0 200.0 0.0 192.0 0.0 927.4 839.2 28 27.87
+250.2 166.8 0.0 203.5 0.0 977.6 694.1 7 19.35
+173.0 116.0 0.0 192.0 0.0 946.8 856.8 7 11.39
+192.0 288.0 0.0 192.0 0.0 929.8 716.1 3 12.79
+192.0 288.0 0.0 192.0 0.0 929.8 716.1 28 39.32
+153.0 102.0 0.0 192.0 0.0 888.0 943.1 3 4.78
+288.0 192.0 0.0 192.0 0.0 932.0 717.8 3 16.11
+305.3 203.5 0.0 203.5 0.0 965.4 631.0 28 43.38
+236.0 157.0 0.0 192.0 0.0 972.6 749.1 7 20.42
+173.0 116.0 0.0 192.0 0.0 946.8 856.8 3 6.94
+212.0 141.3 0.0 203.5 0.0 973.4 750.0 7 15.03
+236.0 157.0 0.0 192.0 0.0 972.6 749.1 3 13.57
+183.9 122.6 0.0 203.5 0.0 959.2 800.0 90 32.53
+166.8 250.2 0.0 203.5 0.0 975.6 692.6 7 15.75
+102.0 153.0 0.0 192.0 0.0 887.0 942.0 7 7.68
+288.0 192.0 0.0 192.0 0.0 932.0 717.8 28 38.80
+212.0 141.3 0.0 203.5 0.0 973.4 750.0 28 33.00
+102.0 153.0 0.0 192.0 0.0 887.0 942.0 28 17.28
+173.0 116.0 0.0 192.0 0.0 946.8 856.8 28 24.28
+183.9 122.6 0.0 203.5 0.0 959.2 800.0 28 24.05
+133.0 200.0 0.0 192.0 0.0 927.4 839.2 90 36.59
+192.0 288.0 0.0 192.0 0.0 929.8 716.1 90 50.73
+133.0 200.0 0.0 192.0 0.0 927.4 839.2 7 13.66
+305.3 203.5 0.0 203.5 0.0 965.4 631.0 3 14.14
+236.0 157.0 0.0 192.0 0.0 972.6 749.1 90 47.78
+108.3 162.4 0.0 203.5 0.0 938.2 849.0 3 2.33
+157.0 236.0 0.0 192.0 0.0 935.4 781.2 7 16.89
+288.0 192.0 0.0 192.0 0.0 932.0 717.8 7 23.52
+212.0 141.3 0.0 203.5 0.0 973.4 750.0 3 6.81
+212.0 141.3 0.0 203.5 0.0 973.4 750.0 90 39.70
+153.0 102.0 0.0 192.0 0.0 888.0 943.1 28 17.96
+236.0 157.0 0.0 192.0 0.0 972.6 749.1 28 32.88
+116.0 173.0 0.0 192.0 0.0 909.8 891.9 28 22.35
+183.9 122.6 0.0 203.5 0.0 959.2 800.0 7 10.79
+108.3 162.4 0.0 203.5 0.0 938.2 849.0 7 7.72
+203.5 305.3 0.0 203.5 0.0 963.4 630.0 28 41.68
+203.5 305.3 0.0 203.5 0.0 963.4 630.0 3 9.56
+133.0 200.0 0.0 192.0 0.0 927.4 839.2 3 6.88
+288.0 192.0 0.0 192.0 0.0 932.0 717.8 90 50.53
+200.0 133.0 0.0 192.0 0.0 965.4 806.2 7 17.17
+200.0 133.0 0.0 192.0 0.0 965.4 806.2 28 30.44
+250.2 166.8 0.0 203.5 0.0 977.6 694.1 3 9.73
+122.6 183.9 0.0 203.5 0.0 958.2 800.1 3 3.32
+153.0 102.0 0.0 192.0 0.0 888.0 943.1 90 26.32
+200.0 133.0 0.0 192.0 0.0 965.4 806.2 90 43.25
+116.0 173.0 0.0 192.0 0.0 909.8 891.9 3 6.28
+173.0 116.0 0.0 192.0 0.0 946.8 856.8 90 32.10
+250.2 166.8 0.0 203.5 0.0 977.6 694.1 28 36.96
+305.3 203.5 0.0 203.5 0.0 965.4 631.0 90 54.60
+192.0 288.0 0.0 192.0 0.0 929.8 716.1 7 21.48
+157.0 236.0 0.0 192.0 0.0 935.4 781.2 3 9.69
+153.0 102.0 0.0 192.0 0.0 888.0 943.1 7 8.37
+141.3 212.0 0.0 203.5 0.0 971.8 748.5 90 39.66
+116.0 173.0 0.0 192.0 0.0 909.8 891.9 7 10.09
+141.3 212.0 0.0 203.5 0.0 971.8 748.5 3 4.83
+122.6 183.9 0.0 203.5 0.0 958.2 800.1 7 10.35
+166.8 250.2 0.0 203.5 0.0 975.6 692.6 90 43.57
+203.5 305.3 0.0 203.5 0.0 963.4 630.0 90 51.86
+310.0 0.0 0.0 192.0 0.0 1012.0 830.0 3 11.85
+310.0 0.0 0.0 192.0 0.0 1012.0 830.0 7 17.24
+310.0 0.0 0.0 192.0 0.0 1012.0 830.0 28 27.83
+310.0 0.0 0.0 192.0 0.0 1012.0 830.0 90 35.76
+310.0 0.0 0.0 192.0 0.0 1012.0 830.0 120 38.70
+331.0 0.0 0.0 192.0 0.0 1025.0 821.0 3 14.31
+331.0 0.0 0.0 192.0 0.0 1025.0 821.0 7 17.44
+331.0 0.0 0.0 192.0 0.0 1025.0 821.0 28 31.74
+331.0 0.0 0.0 192.0 0.0 1025.0 821.0 90 37.91
+331.0 0.0 0.0 192.0 0.0 1025.0 821.0 120 39.38
+349.0 0.0 0.0 192.0 0.0 1056.0 809.0 3 15.87
+349.0 0.0 0.0 192.0 0.0 1056.0 809.0 7 9.01
+349.0 0.0 0.0 192.0 0.0 1056.0 809.0 28 33.61
+349.0 0.0 0.0 192.0 0.0 1056.0 809.0 90 40.66
+349.0 0.0 0.0 192.0 0.0 1056.0 809.0 120 40.86
+238.0 0.0 0.0 186.0 0.0 1119.0 789.0 7 12.05
+238.0 0.0 0.0 186.0 0.0 1119.0 789.0 28 17.54
+296.0 0.0 0.0 186.0 0.0 1090.0 769.0 7 18.91
+296.0 0.0 0.0 186.0 0.0 1090.0 769.0 28 25.18
+297.0 0.0 0.0 186.0 0.0 1040.0 734.0 7 30.96
+480.0 0.0 0.0 192.0 0.0 936.0 721.0 28 43.89
+480.0 0.0 0.0 192.0 0.0 936.0 721.0 90 54.28
+397.0 0.0 0.0 186.0 0.0 1040.0 734.0 28 36.94
+281.0 0.0 0.0 186.0 0.0 1104.0 774.0 7 14.50
+281.0 0.0 0.0 185.0 0.0 1104.0 774.0 28 22.44
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 1 12.64
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 3 26.06
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 7 33.21
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 14 36.94
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 28 44.09
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 7 52.61
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 14 59.76
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 28 67.31
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 90 69.66
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 180 71.62
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 270 74.17
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 7 18.13
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 14 22.53
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 28 27.34
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 56 29.98
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 90 31.35
+350.0 0.0 0.0 203.0 0.0 974.0 775.0 180 32.72
+385.0 0.0 0.0 186.0 0.0 966.0 763.0 1 6.27
+385.0 0.0 0.0 186.0 0.0 966.0 763.0 3 14.70
+385.0 0.0 0.0 186.0 0.0 966.0 763.0 7 23.22
+385.0 0.0 0.0 186.0 0.0 966.0 763.0 14 27.92
+385.0 0.0 0.0 186.0 0.0 966.0 763.0 28 31.35
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 180 39.00
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 360 41.24
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 3 14.99
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 3 13.52
+382.0 0.0 0.0 186.0 0.0 1047.0 739.0 7 24.00
+382.0 0.0 0.0 186.0 0.0 1047.0 739.0 28 37.42
+382.0 0.0 0.0 186.0 0.0 1111.0 784.0 7 11.47
+281.0 0.0 0.0 186.0 0.0 1104.0 774.0 28 22.44
+339.0 0.0 0.0 185.0 0.0 1069.0 754.0 7 21.16
+339.0 0.0 0.0 185.0 0.0 1069.0 754.0 28 31.84
+295.0 0.0 0.0 185.0 0.0 1069.0 769.0 7 14.80
+295.0 0.0 0.0 185.0 0.0 1069.0 769.0 28 25.18
+238.0 0.0 0.0 185.0 0.0 1118.0 789.0 28 17.54
+296.0 0.0 0.0 192.0 0.0 1085.0 765.0 7 14.20
+296.0 0.0 0.0 192.0 0.0 1085.0 765.0 28 21.65
+296.0 0.0 0.0 192.0 0.0 1085.0 765.0 90 29.39
+331.0 0.0 0.0 192.0 0.0 879.0 825.0 3 13.52
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 7 16.26
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 28 31.45
+331.0 0.0 0.0 192.0 0.0 978.0 825.0 90 37.23
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 7 18.13
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 28 32.72
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 90 39.49
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 180 41.05
+349.0 0.0 0.0 192.0 0.0 1047.0 806.0 360 42.13
+302.0 0.0 0.0 203.0 0.0 974.0 817.0 14 18.13
+302.0 0.0 0.0 203.0 0.0 974.0 817.0 180 26.74
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 180 61.92
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 90 47.22
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 180 51.04
+500.0 0.0 0.0 200.0 0.0 1125.0 613.0 270 55.16
+540.0 0.0 0.0 173.0 0.0 1125.0 613.0 3 41.64
+252.0 0.0 0.0 185.0 0.0 1111.0 784.0 7 13.71
+252.0 0.0 0.0 185.0 0.0 1111.0 784.0 28 19.69
+339.0 0.0 0.0 185.0 0.0 1060.0 754.0 28 31.65
+393.0 0.0 0.0 192.0 0.0 940.0 758.0 3 19.11
+393.0 0.0 0.0 192.0 0.0 940.0 758.0 28 39.58
+393.0 0.0 0.0 192.0 0.0 940.0 758.0 90 48.79
+382.0 0.0 0.0 185.0 0.0 1047.0 739.0 7 24.00
+382.0 0.0 0.0 185.0 0.0 1047.0 739.0 28 37.42
+252.0 0.0 0.0 186.0 0.0 1111.0 784.0 7 11.47
+252.0 0.0 0.0 185.0 0.0 1111.0 784.0 28 19.69
+310.0 0.0 0.0 192.0 0.0 970.0 850.0 7 14.99
+310.0 0.0 0.0 192.0 0.0 970.0 850.0 28 27.92
+310.0 0.0 0.0 192.0 0.0 970.0 850.0 90 34.68
+310.0 0.0 0.0 192.0 0.0 970.0 850.0 180 37.33
+310.0 0.0 0.0 192.0 0.0 970.0 850.0 360 38.11
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 3 33.80
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 7 42.42
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 14 48.40
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 28 55.94
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 90 58.78
+525.0 0.0 0.0 189.0 0.0 1125.0 613.0 270 67.11
+322.0 0.0 0.0 203.0 0.0 974.0 800.0 14 20.77
+322.0 0.0 0.0 203.0 0.0 974.0 800.0 28 25.18
+322.0 0.0 0.0 203.0 0.0 974.0 800.0 180 29.59
+302.0 0.0 0.0 203.0 0.0 974.0 817.0 28 21.75
+397.0 0.0 0.0 185.0 0.0 1040.0 734.0 28 39.09
+480.0 0.0 0.0 192.0 0.0 936.0 721.0 3 24.39
+522.0 0.0 0.0 146.0 0.0 896.0 896.0 7 50.51
+522.0 0.0 0.0 146.0 0.0 896.0 896.0 28 74.99
+273.0 105.0 82.0 210.0 9.0 904.0 680.0 28 37.17
+162.0 190.0 148.0 179.0 19.0 838.0 741.0 28 33.76
+154.0 144.0 112.0 220.0 10.0 923.0 658.0 28 16.50
+147.0 115.0 89.0 202.0 9.0 860.0 829.0 28 19.99
+152.0 178.0 139.0 168.0 18.0 944.0 695.0 28 36.35
+310.0 143.0 111.0 168.0 22.0 914.0 651.0 28 33.69
+144.0 0.0 175.0 158.0 18.0 943.0 844.0 28 15.42
+304.0 140.0 0.0 214.0 6.0 895.0 722.0 28 33.42
+374.0 0.0 0.0 190.0 7.0 1013.0 730.0 28 39.05
+159.0 149.0 116.0 175.0 15.0 953.0 720.0 28 27.68
+153.0 239.0 0.0 200.0 6.0 1002.0 684.0 28 26.86
+310.0 143.0 0.0 168.0 10.0 914.0 804.0 28 45.30
+305.0 0.0 100.0 196.0 10.0 959.0 705.0 28 30.12
+151.0 0.0 184.0 167.0 12.0 991.0 772.0 28 15.57
+142.0 167.0 130.0 174.0 11.0 883.0 785.0 28 44.61
+298.0 137.0 107.0 201.0 6.0 878.0 655.0 28 53.52
+321.0 164.0 0.0 190.0 5.0 870.0 774.0 28 57.21
+366.0 187.0 0.0 191.0 7.0 824.0 757.0 28 65.91
+280.0 129.0 100.0 172.0 9.0 825.0 805.0 28 52.82
+252.0 97.0 76.0 194.0 8.0 835.0 821.0 28 33.40
+165.0 0.0 150.0 182.0 12.0 1023.0 729.0 28 18.03
+156.0 243.0 0.0 180.0 11.0 1022.0 698.0 28 37.36
+160.0 188.0 146.0 203.0 11.0 829.0 710.0 28 32.84
+298.0 0.0 107.0 186.0 6.0 879.0 815.0 28 42.64
+318.0 0.0 126.0 210.0 6.0 861.0 737.0 28 40.06
+287.0 121.0 94.0 188.0 9.0 904.0 696.0 28 41.94
+326.0 166.0 0.0 174.0 9.0 882.0 790.0 28 61.23
+356.0 0.0 142.0 193.0 11.0 801.0 778.0 28 40.87
+132.0 207.0 161.0 179.0 5.0 867.0 736.0 28 33.30
+322.0 149.0 0.0 186.0 8.0 951.0 709.0 28 52.42
+164.0 0.0 200.0 181.0 13.0 849.0 846.0 28 15.09
+314.0 0.0 113.0 170.0 10.0 925.0 783.0 28 38.46
+321.0 0.0 128.0 182.0 11.0 870.0 780.0 28 37.26
+140.0 164.0 128.0 237.0 6.0 869.0 656.0 28 35.23
+288.0 121.0 0.0 177.0 7.0 908.0 829.0 28 42.13
+298.0 0.0 107.0 210.0 11.0 880.0 744.0 28 31.87
+265.0 111.0 86.0 195.0 6.0 833.0 790.0 28 41.54
+160.0 250.0 0.0 168.0 12.0 1049.0 688.0 28 39.45
+166.0 260.0 0.0 183.0 13.0 859.0 827.0 28 37.91
+276.0 116.0 90.0 180.0 9.0 870.0 768.0 28 44.28
+322.0 0.0 116.0 196.0 10.0 818.0 813.0 28 31.18
+149.0 139.0 109.0 193.0 6.0 892.0 780.0 28 23.69
+159.0 187.0 0.0 176.0 11.0 990.0 789.0 28 32.76
+261.0 100.0 78.0 201.0 9.0 864.0 761.0 28 32.40
+237.0 92.0 71.0 247.0 6.0 853.0 695.0 28 28.63
+313.0 0.0 113.0 178.0 8.0 1002.0 689.0 28 36.80
+155.0 183.0 0.0 193.0 9.0 1047.0 697.0 28 18.28
+146.0 230.0 0.0 202.0 3.0 827.0 872.0 28 33.06
+296.0 0.0 107.0 221.0 11.0 819.0 778.0 28 31.42
+133.0 210.0 0.0 196.0 3.0 949.0 795.0 28 31.03
+313.0 145.0 0.0 178.0 8.0 867.0 824.0 28 44.39
+152.0 0.0 112.0 184.0 8.0 992.0 816.0 28 12.18
+153.0 145.0 113.0 178.0 8.0 1002.0 689.0 28 25.56
+140.0 133.0 103.0 200.0 7.0 916.0 753.0 28 36.44
+149.0 236.0 0.0 176.0 13.0 847.0 893.0 28 32.96
+300.0 0.0 120.0 212.0 10.0 878.0 728.0 28 23.84
+153.0 145.0 113.0 178.0 8.0 867.0 824.0 28 26.23
+148.0 0.0 137.0 158.0 16.0 1002.0 830.0 28 17.95
+326.0 0.0 138.0 199.0 11.0 801.0 792.0 28 40.68
+153.0 145.0 0.0 178.0 8.0 1000.0 822.0 28 19.01
+262.0 111.0 86.0 195.0 5.0 895.0 733.0 28 33.72
+158.0 0.0 195.0 220.0 11.0 898.0 713.0 28 8.54
+151.0 0.0 185.0 167.0 16.0 1074.0 678.0 28 13.46
+273.0 0.0 90.0 199.0 11.0 931.0 762.0 28 32.24
+149.0 118.0 92.0 183.0 7.0 953.0 780.0 28 23.52
+143.0 169.0 143.0 191.0 8.0 967.0 643.0 28 29.72
+260.0 101.0 78.0 171.0 10.0 936.0 763.0 28 49.77
+313.0 161.0 0.0 178.0 10.0 917.0 759.0 28 52.44
+284.0 120.0 0.0 168.0 7.0 970.0 794.0 28 40.93
+336.0 0.0 0.0 182.0 3.0 986.0 817.0 28 44.86
+145.0 0.0 134.0 181.0 11.0 979.0 812.0 28 13.20
+150.0 237.0 0.0 174.0 12.0 1069.0 675.0 28 37.43
+144.0 170.0 133.0 192.0 8.0 814.0 805.0 28 29.87
+331.0 170.0 0.0 195.0 8.0 811.0 802.0 28 56.61
+155.0 0.0 143.0 193.0 9.0 1047.0 697.0 28 12.46
+155.0 183.0 0.0 193.0 9.0 877.0 868.0 28 23.79
+135.0 0.0 166.0 180.0 10.0 961.0 805.0 28 13.29
+266.0 112.0 87.0 178.0 10.0 910.0 745.0 28 39.42
+314.0 145.0 113.0 179.0 8.0 869.0 690.0 28 46.23
+313.0 145.0 0.0 127.0 8.0 1000.0 822.0 28 44.52
+146.0 173.0 0.0 182.0 3.0 986.0 817.0 28 23.74
+144.0 136.0 106.0 178.0 7.0 941.0 774.0 28 26.14
+148.0 0.0 182.0 181.0 15.0 839.0 884.0 28 15.52
+277.0 117.0 91.0 191.0 7.0 946.0 666.0 28 43.57
+298.0 0.0 107.0 164.0 13.0 953.0 784.0 28 35.86
+313.0 145.0 0.0 178.0 8.0 1002.0 689.0 28 41.05
+155.0 184.0 143.0 194.0 9.0 880.0 699.0 28 28.99
+289.0 134.0 0.0 195.0 6.0 924.0 760.0 28 46.24
+148.0 175.0 0.0 171.0 2.0 1000.0 828.0 28 26.92
+145.0 0.0 179.0 202.0 8.0 824.0 869.0 28 10.54
+313.0 0.0 0.0 178.0 8.0 1000.0 822.0 28 25.10
+136.0 162.0 126.0 172.0 10.0 923.0 764.0 28 29.07
+155.0 0.0 143.0 193.0 9.0 877.0 868.0 28 9.74
+255.0 99.0 77.0 189.0 6.0 919.0 749.0 28 33.80
+162.0 207.0 172.0 216.0 10.0 822.0 638.0 28 39.84
+136.0 196.0 98.0 199.0 6.0 847.0 783.0 28 26.97
+164.0 163.0 128.0 197.0 8.0 961.0 641.0 28 27.23
+162.0 214.0 164.0 202.0 10.0 820.0 680.0 28 30.65
+157.0 214.0 152.0 200.0 9.0 819.0 704.0 28 33.05
+149.0 153.0 194.0 192.0 8.0 935.0 623.0 28 24.58
+135.0 105.0 193.0 196.0 6.0 965.0 643.0 28 21.91
+159.0 209.0 161.0 201.0 7.0 848.0 669.0 28 30.88
+144.0 15.0 195.0 176.0 6.0 1021.0 709.0 28 15.34
+154.0 174.0 185.0 228.0 7.0 845.0 612.0 28 24.34
+167.0 187.0 195.0 185.0 7.0 898.0 636.0 28 23.89
+184.0 86.0 190.0 213.0 6.0 923.0 623.0 28 22.93
+156.0 178.0 187.0 221.0 7.0 854.0 614.0 28 29.41
+236.9 91.7 71.5 246.9 6.0 852.9 695.4 28 28.63
+313.3 0.0 113.0 178.5 8.0 1001.9 688.7 28 36.80
+154.8 183.4 0.0 193.3 9.1 1047.4 696.7 28 18.29
+145.9 230.5 0.0 202.5 3.4 827.0 871.8 28 32.72
+296.0 0.0 106.7 221.4 10.5 819.2 778.4 28 31.42
+133.1 210.2 0.0 195.7 3.1 949.4 795.3 28 28.94
+313.3 145.0 0.0 178.5 8.0 867.2 824.0 28 40.93
+151.6 0.0 111.9 184.4 7.9 992.0 815.9 28 12.18
+153.1 145.0 113.0 178.5 8.0 1001.9 688.7 28 25.56
+139.9 132.6 103.3 200.3 7.4 916.0 753.4 28 36.44
+149.5 236.0 0.0 175.8 12.6 846.8 892.7 28 32.96
+299.8 0.0 119.8 211.5 9.9 878.2 727.6 28 23.84
+153.1 145.0 113.0 178.5 8.0 867.2 824.0 28 26.23
+148.1 0.0 136.6 158.1 16.1 1001.8 830.1 28 17.96
+326.5 0.0 137.9 199.0 10.8 801.1 792.5 28 38.63
+152.7 144.7 0.0 178.1 8.0 999.7 822.2 28 19.01
+261.9 110.5 86.1 195.4 5.0 895.2 732.6 28 33.72
+158.4 0.0 194.9 219.7 11.0 897.7 712.9 28 8.54
+150.7 0.0 185.3 166.7 15.6 1074.5 678.0 28 13.46
+272.6 0.0 89.6 198.7 10.6 931.3 762.2 28 32.25
+149.0 117.6 91.7 182.9 7.1 953.4 780.3 28 23.52
+143.0 169.4 142.7 190.7 8.4 967.4 643.5 28 29.73
+259.9 100.6 78.4 170.6 10.4 935.7 762.9 28 49.77
+312.9 160.5 0.0 177.6 9.6 916.6 759.5 28 52.45
+284.0 119.7 0.0 168.3 7.2 970.4 794.2 28 40.93
+336.5 0.0 0.0 181.9 3.4 985.8 816.8 28 44.87
+144.8 0.0 133.6 180.8 11.1 979.5 811.5 28 13.20
+150.0 236.8 0.0 173.8 11.9 1069.3 674.8 28 37.43
+143.7 170.2 132.6 191.6 8.5 814.1 805.3 28 29.87
+330.5 169.6 0.0 194.9 8.1 811.0 802.3 28 56.62
+154.8 0.0 142.8 193.3 9.1 1047.4 696.7 28 12.46
+154.8 183.4 0.0 193.3 9.1 877.2 867.7 28 23.79
+134.7 0.0 165.7 180.2 10.0 961.0 804.9 28 13.29
+266.2 112.3 87.5 177.9 10.4 909.7 744.5 28 39.42
+314.0 145.3 113.2 178.9 8.0 869.1 690.2 28 46.23
+312.7 144.7 0.0 127.3 8.0 999.7 822.2 28 44.52
+145.7 172.6 0.0 181.9 3.4 985.8 816.8 28 23.74
+143.8 136.3 106.2 178.1 7.5 941.5 774.3 28 26.15
+148.1 0.0 182.1 181.4 15.0 838.9 884.3 28 15.53
+277.0 116.8 91.0 190.6 7.0 946.5 665.6 28 43.58
+298.1 0.0 107.5 163.6 12.8 953.2 784.0 28 35.87
+313.3 145.0 0.0 178.5 8.0 1001.9 688.7 28 41.05
+155.2 183.9 143.2 193.8 9.2 879.6 698.5 28 28.99
+289.0 133.7 0.0 194.9 5.5 924.1 760.1 28 46.25
+147.8 175.1 0.0 171.2 2.2 1000.0 828.5 28 26.92
+145.4 0.0 178.9 201.7 7.8 824.0 868.7 28 10.54
+312.7 0.0 0.0 178.1 8.0 999.7 822.2 28 25.10
+136.4 161.6 125.8 171.6 10.4 922.6 764.4 28 29.07
+154.8 0.0 142.8 193.3 9.1 877.2 867.7 28 9.74
+255.3 98.8 77.0 188.6 6.5 919.0 749.3 28 33.80
+272.8 105.1 81.8 209.7 9.0 904.0 679.7 28 37.17
+162.0 190.1 148.1 178.8 18.8 838.1 741.4 28 33.76
+153.6 144.2 112.3 220.1 10.1 923.2 657.9 28 16.50
+146.5 114.6 89.3 201.9 8.8 860.0 829.5 28 19.99
+151.8 178.1 138.7 167.5 18.3 944.0 694.6 28 36.35
+309.9 142.8 111.2 167.8 22.1 913.9 651.2 28 38.22
+143.6 0.0 174.9 158.4 17.9 942.7 844.5 28 15.42
+303.6 139.9 0.0 213.5 6.2 895.5 722.5 28 33.42
+374.3 0.0 0.0 190.2 6.7 1013.2 730.4 28 39.06
+158.6 148.9 116.0 175.1 15.0 953.3 719.7 28 27.68
+152.6 238.7 0.0 200.0 6.3 1001.8 683.9 28 26.86
+310.0 142.8 0.0 167.9 10.0 914.3 804.0 28 45.30
+304.8 0.0 99.6 196.0 9.8 959.4 705.2 28 30.12
+150.9 0.0 183.9 166.6 11.6 991.2 772.2 28 15.57
+141.9 166.6 129.7 173.5 10.9 882.6 785.3 28 44.61
+297.8 137.2 106.9 201.3 6.0 878.4 655.3 28 53.52
+321.3 164.2 0.0 190.5 4.6 870.0 774.0 28 57.22
+366.0 187.0 0.0 191.3 6.6 824.3 756.9 28 65.91
+279.8 128.9 100.4 172.4 9.5 825.1 804.9 28 52.83
+252.1 97.1 75.6 193.8 8.3 835.5 821.4 28 33.40
+164.6 0.0 150.4 181.6 11.7 1023.3 728.9 28 18.03
+155.6 243.5 0.0 180.3 10.7 1022.0 697.7 28 37.36
+160.2 188.0 146.4 203.2 11.3 828.7 709.7 28 35.31
+298.1 0.0 107.0 186.4 6.1 879.0 815.2 28 42.64
+317.9 0.0 126.5 209.7 5.7 860.5 736.6 28 40.06
+287.3 120.5 93.9 187.6 9.2 904.4 695.9 28 43.80
+325.6 166.4 0.0 174.0 8.9 881.6 790.0 28 61.24
+355.9 0.0 141.6 193.3 11.0 801.4 778.4 28 40.87
+132.0 206.5 160.9 178.9 5.5 866.9 735.6 28 33.31
+322.5 148.6 0.0 185.8 8.5 951.0 709.5 28 52.43
+164.2 0.0 200.1 181.2 12.6 849.3 846.0 28 15.09
+313.8 0.0 112.6 169.9 10.1 925.3 782.9 28 38.46
+321.4 0.0 127.9 182.5 11.5 870.1 779.7 28 37.27
+139.7 163.9 127.7 236.7 5.8 868.6 655.6 28 35.23
+288.4 121.0 0.0 177.4 7.0 907.9 829.5 28 42.14
+298.2 0.0 107.0 209.7 11.1 879.6 744.2 28 31.88
+264.5 111.0 86.5 195.5 5.9 832.6 790.4 28 41.54
+159.8 250.0 0.0 168.4 12.2 1049.3 688.2 28 39.46
+166.0 259.7 0.0 183.2 12.7 858.8 826.8 28 37.92
+276.4 116.0 90.3 179.6 8.9 870.1 768.3 28 44.28
+322.2 0.0 115.6 196.0 10.4 817.9 813.4 28 31.18
+148.5 139.4 108.6 192.7 6.1 892.4 780.0 28 23.70
+159.1 186.7 0.0 175.6 11.3 989.6 788.9 28 32.77
+260.9 100.5 78.3 200.6 8.6 864.5 761.5 28 32.40
\ No newline at end of file
diff --git a/examples/uci/figure/counterfactual.png b/examples/uci/figure/counterfactual.png
new file mode 100644
index 0000000..bac49e7
Binary files /dev/null and b/examples/uci/figure/counterfactual.png differ
diff --git a/examples/uci/requirements.txt b/examples/uci/requirements.txt
index 4a67121..5a65422 100644
--- a/examples/uci/requirements.txt
+++ b/examples/uci/requirements.txt
@@ -1,2 +1,4 @@
scikit-learn
-jupyter
\ No newline at end of file
+jupyter
+matplotlib
+tueplots
\ No newline at end of file
diff --git a/examples/uci/tutorial.ipynb b/examples/uci/tutorial.ipynb
index 912c9b9..789fd6d 100644
--- a/examples/uci/tutorial.ipynb
+++ b/examples/uci/tutorial.ipynb
@@ -1,11 +1,20 @@
{
"cells": [
+ {
+ "cell_type": "markdown",
+ "id": "60a4df59-3c1e-47aa-bc08-12b883bc6579",
+ "metadata": {},
+ "source": [
+ "# Kronfluence Tutorial\n",
+ "\n",
+ "Kronfluence is a repository designed to compute influence functions using Kronecker-factored Approximate Curvature (KFAC) or Eigenvalue-corrected KFAC (EKFAC). In this short tutorial, we will introduce some functionalities of Kronfluence on the UCI regression pipeline (it is quick to run and does not require GPUs)."
+ ]
+ },
{
"cell_type": "code",
"execution_count": 1,
"id": "initial_id",
"metadata": {
- "collapsed": true,
"ExecuteTime": {
"end_time": "2024-03-12T10:46:20.005159Z",
"start_time": "2024-03-12T10:46:19.995640Z"
@@ -13,67 +22,57 @@
},
"outputs": [],
"source": [
- "import kronfluence"
+ "import math\n",
+ "import random\n",
+ "from typing import List, Optional, Tuple\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import torch\n",
+ "import torch.nn.functional as F\n",
+ "from random import shuffle\n",
+ "from torch import nn\n",
+ "from torch.utils import data\n",
+ "from tueplots import cycler, markers\n",
+ "from tueplots.constants import markers as marker_constants\n",
+ "from tueplots.constants.color import palettes\n",
+ "from tqdm import tqdm\n",
+ "\n",
+ "from examples.uci.pipeline import construct_regression_mlp, get_regression_dataset\n",
+ "\n",
+ "plt.rcParams.update({\"figure.dpi\": 150})\n",
+ "plt.rcParams.update(markers.with_edge())"
]
},
{
- "cell_type": "code",
- "execution_count": 2,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "7d13fb5e-1ffb-463d-bcd4-dbf09559abb1",
+ "metadata": {},
"source": [
- "from examples.uci.train import train, evaluate"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T10:47:03.741170Z",
- "start_time": "2024-03-12T10:47:02.235222Z"
- }
- },
- "id": "4e56f0f1d6e34e62"
+ "## Setting up the Model and Dataset"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 43,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "8c4246ae-3f8f-460f-a987-ad89c1bdc5cd",
+ "metadata": {},
"source": [
- "from kronfluence.analyzer import Analyzer, prepare_model\n",
- "from kronfluence.arguments import ScoreArguments\n",
- "from kronfluence.task import Task\n",
- "from typing import Tuple\n",
- "import torch\n",
- "from torch import nn\n",
- "import math\n",
- "import torch.nn.functional as F"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:02:46.505618Z",
- "start_time": "2024-03-12T21:02:46.503015Z"
- }
- },
- "id": "6dc3ab20b6cb4050"
+ "Before computing influence scores, we need to prepare the trained model and datasets. Let's define the hyperparameters that we will use to train the model."
+ ]
},
{
"cell_type": "code",
- "execution_count": 4,
- "outputs": [],
- "source": [
- "from examples.uci.pipeline import construct_regression_mlp, get_regression_dataset"
- ],
+ "execution_count": 2,
+ "id": "4e56f0f1d6e34e62",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T11:40:46.724609Z",
- "start_time": "2024-03-12T11:40:46.722860Z"
+ "end_time": "2024-03-12T10:47:03.741170Z",
+ "start_time": "2024-03-12T10:47:02.235222Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "f3ed29a0d098c6dd"
- },
- {
- "cell_type": "code",
- "execution_count": 12,
"outputs": [],
"source": [
"dataset_name = \"concrete\"\n",
@@ -83,70 +82,163 @@
"num_train_epochs = 40\n",
"learning_rate = 0.03\n",
"weight_decay = 1e-05"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aafc7037-a40d-47d0-877b-91e2bc71ec7a",
+ "metadata": {},
+ "source": [
+ "After loading training and query (validation) datasets, we will train the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "3ec0486b-4abe-461e-a258-8d24d9c1b10b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "((927, 8), (927, 1))"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T20:55:43.240827Z",
- "start_time": "2024-03-12T20:55:43.238178Z"
+ "source": [
+ "train_dataset = get_regression_dataset(data_name=dataset_name, split=\"train\", dataset_dir=dataset_dir)\n",
+ "query_dataset = get_regression_dataset(data_name=dataset_name, split=\"valid\", dataset_dir=dataset_dir)\n",
+ "train_dataset.data_x.shape, train_dataset.data_y.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "54b2c746-0432-4917-aeb7-17e91e72553b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Sequential(\n",
+ " (0): Linear(in_features=8, out_features=128, bias=True)\n",
+ " (1): ReLU()\n",
+ " (2): Linear(in_features=128, out_features=128, bias=True)\n",
+ " (3): ReLU()\n",
+ " (4): Linear(in_features=128, out_features=128, bias=True)\n",
+ " (5): ReLU()\n",
+ " (6): Linear(in_features=128, out_features=1, bias=True)\n",
+ ")"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
}
- },
- "id": "cd2af4deeea3afd7"
+ ],
+ "source": [
+ "construct_regression_mlp()"
+ ]
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 5,
+ "id": "d8f275b5-7767-4d26-84ff-8a39aa74df08",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def train(\n",
+ " dataset: data.Dataset,\n",
+ " batch_size: int,\n",
+ " num_train_epochs: int,\n",
+ " learning_rate: float,\n",
+ " weight_decay: float,\n",
+ " disable_tqdm: bool = False,\n",
+ ") -> nn.Module:\n",
+ " train_dataloader = data.DataLoader(\n",
+ " dataset=dataset,\n",
+ " batch_size=batch_size,\n",
+ " shuffle=True,\n",
+ " drop_last=True,\n",
+ " )\n",
+ " model = construct_regression_mlp()\n",
+ " optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=weight_decay)\n",
+ "\n",
+ " model.train()\n",
+ " for epoch in range(num_train_epochs):\n",
+ " total_loss = 0.0\n",
+ " with tqdm(train_dataloader, unit=\"batch\", disable=disable_tqdm) as tepoch:\n",
+ " for batch in tepoch:\n",
+ " tepoch.set_description(f\"Epoch {epoch}\")\n",
+ " model.zero_grad()\n",
+ " inputs, targets = batch\n",
+ " outputs = model(inputs)\n",
+ " loss = F.mse_loss(outputs, targets)\n",
+ " total_loss += loss.detach().float()\n",
+ " loss.backward()\n",
+ " optimizer.step()\n",
+ " tepoch.set_postfix(loss=total_loss.item() / len(train_dataloader))\n",
+ " return model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "6a1337cb-6fe5-4edc-9821-de27bbef9074",
+ "metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 545.57batch/s, loss=0.889]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 582.99batch/s, loss=0.56]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 576.00batch/s, loss=0.436]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 574.70batch/s, loss=0.365]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 554.65batch/s, loss=0.309]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 539.66batch/s, loss=0.251]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 531.06batch/s, loss=0.224]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 547.77batch/s, loss=0.217]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 574.51batch/s, loss=0.186]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 546.78batch/s, loss=0.21]\n",
- "Epoch 10: 100%|██████████| 28/28 [00:00<00:00, 540.93batch/s, loss=0.189]\n",
- "Epoch 11: 100%|██████████| 28/28 [00:00<00:00, 534.31batch/s, loss=0.181]\n",
- "Epoch 12: 100%|██████████| 28/28 [00:00<00:00, 551.12batch/s, loss=0.171]\n",
- "Epoch 13: 100%|██████████| 28/28 [00:00<00:00, 548.24batch/s, loss=0.147]\n",
- "Epoch 14: 100%|██████████| 28/28 [00:00<00:00, 561.72batch/s, loss=0.15]\n",
- "Epoch 15: 100%|██████████| 28/28 [00:00<00:00, 563.34batch/s, loss=0.143]\n",
- "Epoch 16: 100%|██████████| 28/28 [00:00<00:00, 575.86batch/s, loss=0.143]\n",
- "Epoch 17: 100%|██████████| 28/28 [00:00<00:00, 560.37batch/s, loss=0.15]\n",
- "Epoch 18: 100%|██████████| 28/28 [00:00<00:00, 511.37batch/s, loss=0.142]\n",
- "Epoch 19: 100%|██████████| 28/28 [00:00<00:00, 506.99batch/s, loss=0.119]\n",
- "Epoch 20: 100%|██████████| 28/28 [00:00<00:00, 521.90batch/s, loss=0.118]\n",
- "Epoch 21: 100%|██████████| 28/28 [00:00<00:00, 531.20batch/s, loss=0.112]\n",
- "Epoch 22: 100%|██████████| 28/28 [00:00<00:00, 489.00batch/s, loss=0.122]\n",
- "Epoch 23: 100%|██████████| 28/28 [00:00<00:00, 557.58batch/s, loss=0.12]\n",
- "Epoch 24: 100%|██████████| 28/28 [00:00<00:00, 555.09batch/s, loss=0.104]\n",
- "Epoch 25: 100%|██████████| 28/28 [00:00<00:00, 564.86batch/s, loss=0.0998]\n",
- "Epoch 26: 100%|██████████| 28/28 [00:00<00:00, 565.11batch/s, loss=0.126]\n",
- "Epoch 27: 100%|██████████| 28/28 [00:00<00:00, 540.83batch/s, loss=0.105]\n",
- "Epoch 28: 100%|██████████| 28/28 [00:00<00:00, 561.48batch/s, loss=0.0981]\n",
- "Epoch 29: 100%|██████████| 28/28 [00:00<00:00, 524.37batch/s, loss=0.0991]\n",
- "Epoch 30: 100%|██████████| 28/28 [00:00<00:00, 513.95batch/s, loss=0.104]\n",
- "Epoch 31: 100%|██████████| 28/28 [00:00<00:00, 517.93batch/s, loss=0.0894]\n",
- "Epoch 32: 100%|██████████| 28/28 [00:00<00:00, 522.07batch/s, loss=0.115]\n",
- "Epoch 33: 100%|██████████| 28/28 [00:00<00:00, 521.34batch/s, loss=0.0845]\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 520.06batch/s, loss=0.0926]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 534.94batch/s, loss=0.0833]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 517.63batch/s, loss=0.091]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 520.73batch/s, loss=0.0929]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 544.11batch/s, loss=0.0883]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 400.69batch/s, loss=0.0901]\n"
+ "Epoch 0: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 433.68batch/s, loss=0.942]\n",
+ "Epoch 1: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 578.97batch/s, loss=0.663]\n",
+ "Epoch 2: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 507.52batch/s, loss=0.436]\n",
+ "Epoch 3: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 590.30batch/s, loss=0.351]\n",
+ "Epoch 4: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 509.56batch/s, loss=0.293]\n",
+ "Epoch 5: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 474.25batch/s, loss=0.25]\n",
+ "Epoch 6: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 537.15batch/s, loss=0.222]\n",
+ "Epoch 7: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 644.86batch/s, loss=0.206]\n",
+ "Epoch 8: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 741.23batch/s, loss=0.185]\n",
+ "Epoch 9: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 669.30batch/s, loss=0.194]\n",
+ "Epoch 10: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 483.44batch/s, loss=0.17]\n",
+ "Epoch 11: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 644.04batch/s, loss=0.177]\n",
+ "Epoch 12: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 578.84batch/s, loss=0.158]\n",
+ "Epoch 13: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 506.81batch/s, loss=0.173]\n",
+ "Epoch 14: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 546.14batch/s, loss=0.145]\n",
+ "Epoch 15: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 130.30batch/s, loss=0.136]\n",
+ "Epoch 16: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 208.50batch/s, loss=0.14]\n",
+ "Epoch 17: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 584.80batch/s, loss=0.141]\n",
+ "Epoch 18: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 620.74batch/s, loss=0.133]\n",
+ "Epoch 19: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 740.27batch/s, loss=0.142]\n",
+ "Epoch 20: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 676.98batch/s, loss=0.115]\n",
+ "Epoch 21: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 502.51batch/s, loss=0.117]\n",
+ "Epoch 22: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 545.23batch/s, loss=0.117]\n",
+ "Epoch 23: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 638.29batch/s, loss=0.109]\n",
+ "Epoch 24: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 626.93batch/s, loss=0.112]\n",
+ "Epoch 25: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 611.66batch/s, loss=0.106]\n",
+ "Epoch 26: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 621.82batch/s, loss=0.103]\n",
+ "Epoch 27: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 633.66batch/s, loss=0.105]\n",
+ "Epoch 28: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 493.41batch/s, loss=0.0992]\n",
+ "Epoch 29: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 634.15batch/s, loss=0.101]\n",
+ "Epoch 30: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 749.29batch/s, loss=0.101]\n",
+ "Epoch 31: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 575.25batch/s, loss=0.0898]\n",
+ "Epoch 32: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 502.94batch/s, loss=0.0888]\n",
+ "Epoch 33: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 605.97batch/s, loss=0.0852]\n",
+ "Epoch 34: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 131.50batch/s, loss=0.0891]\n",
+ "Epoch 35: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 688.25batch/s, loss=0.0881]\n",
+ "Epoch 36: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 676.97batch/s, loss=0.0883]\n",
+ "Epoch 37: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 713.74batch/s, loss=0.0779]\n",
+ "Epoch 38: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 528.26batch/s, loss=0.0904]\n",
+ "Epoch 39: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:00<00:00, 605.93batch/s, loss=0.0747]\n"
]
}
],
"source": [
- "train_dataset = get_regression_dataset(data_name=dataset_name, split=\"train\", dataset_dir=dataset_dir)\n",
- "\n",
"model = train(\n",
" dataset=train_dataset,\n",
" batch_size=train_batch_size,\n",
@@ -154,54 +246,142 @@
" learning_rate=learning_rate,\n",
" weight_decay=weight_decay,\n",
")"
- ],
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "23d2dc0b-bcfa-4c4b-ab5c-4d96d1d22e03",
+ "metadata": {},
+ "source": [
+ "We can compute the loss on the query dataset after training the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "6dc3ab20b6cb4050",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T20:55:46.006660Z",
- "start_time": "2024-03-12T20:55:43.876876Z"
+ "end_time": "2024-03-12T21:02:46.505618Z",
+ "start_time": "2024-03-12T21:02:46.503015Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "c75658f17d06a7ab"
- },
- {
- "cell_type": "code",
- "execution_count": 14,
"outputs": [
{
"data": {
- "text/plain": "0.16043664876697133"
+ "text/plain": [
+ "0.14518585019898647"
+ ]
},
- "execution_count": 14,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "query_dataset = get_regression_dataset(data_name=dataset_name, split=\"valid\", dataset_dir=dataset_dir)\n",
+ "def evaluate(model: nn.Module, dataset: data.Dataset, batch_size: int) -> float:\n",
+ " dataloader = data.DataLoader(\n",
+ " dataset=dataset,\n",
+ " batch_size=batch_size,\n",
+ " shuffle=False,\n",
+ " drop_last=False,\n",
+ " )\n",
+ "\n",
+ " model.eval()\n",
+ " total_loss = 0.0\n",
+ " for batch in dataloader:\n",
+ " with torch.no_grad():\n",
+ " inputs, targets = batch\n",
+ " outputs = model(inputs)\n",
+ " loss = F.mse_loss(outputs, targets, reduction=\"sum\")\n",
+ " total_loss += loss.detach().float()\n",
+ "\n",
+ " return total_loss.item() / len(dataloader.dataset)\n",
"\n",
"evaluate(model=model, dataset=query_dataset, batch_size=eval_batch_size)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "368fb7a4-8615-4452-8772-4c4d4fcb2944",
+ "metadata": {},
+ "source": [
+ "## Defining a Task"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6f86702a-6e8f-425a-b47b-de3252b88599",
+ "metadata": {},
+ "source": [
+ "Before computing influence scores, we need to define a `Task` class. This class encapsulates information about the trained model and how influence scores will be computed: (1) how to compute the training loss; (2) how to compute the measurement; (3) which modules to use for influence function computations; and (4) whether the model used attention mask."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "03dad2b0-dd52-47ec-92d1-503914f78951",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from kronfluence.analyzer import Analyzer, prepare_model\n",
+ "from kronfluence.task import Task"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a158910-7f1d-4d47-b59f-8df708d2f358",
+ "metadata": {},
+ "source": [
+ "We can optionally use `Analyzer.get_module_summary` to easily get the name of available modules."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "97fdf9f1-5296-4e08-916a-1f593990e620",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "==Model Summary==\n",
+ "Module Name: `0`, Module: Linear(in_features=8, out_features=128, bias=True)\n",
+ "Module Name: `2`, Module: Linear(in_features=128, out_features=128, bias=True)\n",
+ "Module Name: `4`, Module: Linear(in_features=128, out_features=128, bias=True)\n",
+ "Module Name: `6`, Module: Linear(in_features=128, out_features=1, bias=True)\n"
+ ]
+ }
],
+ "source": [
+ "print(Analyzer.get_module_summary(model))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "41238e1b9bcec5cc",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T20:55:47.948299Z",
- "start_time": "2024-03-12T20:55:47.939642Z"
+ "end_time": "2024-03-12T20:58:22.611435Z",
+ "start_time": "2024-03-12T20:58:22.608172Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "eed8dcc003228fc4"
- },
- {
- "cell_type": "code",
- "execution_count": 23,
"outputs": [],
"source": [
- "BATCH_DTYPE = Tuple[torch.Tensor, torch.Tensor]\n",
- "\n",
"class RegressionTask(Task):\n",
" def compute_train_loss(\n",
" self,\n",
- " batch: BATCH_DTYPE,\n",
+ " batch: Tuple[torch.Tensor, torch.Tensor],\n",
" model: nn.Module,\n",
" sample: bool = False,\n",
" ) -> torch.Tensor:\n",
@@ -209,1283 +389,987 @@
" outputs = model(inputs)\n",
" if not sample:\n",
" return F.mse_loss(outputs, targets, reduction=\"sum\")\n",
+ " # Sample the outputs from the model's prediction for true Fisher.\n",
" with torch.no_grad():\n",
" sampled_targets = torch.normal(outputs, std=math.sqrt(0.5))\n",
" return F.mse_loss(outputs, sampled_targets.detach(), reduction=\"sum\")\n",
"\n",
" def compute_measurement(\n",
" self,\n",
- " batch: BATCH_DTYPE,\n",
+ " batch: Tuple[torch.Tensor, torch.Tensor],\n",
" model: nn.Module,\n",
" ) -> torch.Tensor:\n",
" # The measurement function is set as a training loss.\n",
- " return self.compute_train_loss(batch, model, sample=False)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T20:58:22.611435Z",
- "start_time": "2024-03-12T20:58:22.608172Z"
- }
- },
- "id": "41238e1b9bcec5cc"
+ " return self.compute_train_loss(batch, model, sample=False)\n",
+ "\n",
+ " def tracked_modules(self) -> Optional[List[str]]:\n",
+ " # These are the module names we will use to compute influence functions.\n",
+ " return [\"0\", \"2\", \"4\", \"6\"]"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 24,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "03d4f582-74b8-41a3-8e09-ebfbe72be849",
+ "metadata": {},
"source": [
- "task = RegressionTask()\n",
- "model = prepare_model(model, task)\n",
- "analyzer = Analyzer(\n",
- " analysis_name=\"tutorial\",\n",
- " model=model,\n",
- " task=task,\n",
- " cpu=True,\n",
- ")"
- ],
+ "Kronfluence wraps all supported modules within the model with `TrackedModule`. This wrapper will be used for computing the factors and influence scores. Once your model is ready and the task is defined, prepare your model with:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "1192b28fd4535410",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-12T20:58:24.595047Z",
"start_time": "2024-03-12T20:58:24.588848Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "1192b28fd4535410"
+ "outputs": [],
+ "source": [
+ "task = RegressionTask()\n",
+ "model = prepare_model(model, task)"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 27,
- "outputs": [
- {
- "data": {
- "text/plain": "[('',\n Sequential(\n (0): TrackedLinear(\n (original_module): Linear(in_features=8, out_features=128, bias=True)\n )\n (1): ReLU()\n (2): TrackedLinear(\n (original_module): Linear(in_features=128, out_features=128, bias=True)\n )\n (3): ReLU()\n (4): TrackedLinear(\n (original_module): Linear(in_features=128, out_features=128, bias=True)\n )\n (5): ReLU()\n (6): TrackedLinear(\n (original_module): Linear(in_features=128, out_features=1, bias=True)\n )\n )),\n ('0',\n TrackedLinear(\n (original_module): Linear(in_features=8, out_features=128, bias=True)\n )),\n ('0.original_module', Linear(in_features=8, out_features=128, bias=True)),\n ('1', ReLU()),\n ('2',\n TrackedLinear(\n (original_module): Linear(in_features=128, out_features=128, bias=True)\n )),\n ('2.original_module', Linear(in_features=128, out_features=128, bias=True)),\n ('3', ReLU()),\n ('4',\n TrackedLinear(\n (original_module): Linear(in_features=128, out_features=128, bias=True)\n )),\n ('4.original_module', Linear(in_features=128, out_features=128, bias=True)),\n ('5', ReLU()),\n ('6',\n TrackedLinear(\n (original_module): Linear(in_features=128, out_features=1, bias=True)\n )),\n ('6.original_module', Linear(in_features=128, out_features=1, bias=True))]"
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "fe331fda-fd5f-4555-b952-2cf62aca05ab",
+ "metadata": {},
"source": [
- "list(model.named_modules())"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T20:59:23.401098Z",
- "start_time": "2024-03-12T20:59:23.396531Z"
- }
- },
- "id": "4a38704b80ff26b2"
+ "You can see that the `TrackedModule` are now installed."
+ ]
},
{
"cell_type": "code",
- "execution_count": 25,
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Fitting covariance matrices [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Fitting covariance matrices [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
- ]
- }
- ],
- "source": [
- "covariance_matrices = analyzer.fit_covariance_matrices(\n",
- " factors_name=\"ekfac\",\n",
- " dataset=train_dataset,\n",
- " per_device_batch_size=None,\n",
- " overwrite_output_dir=True,\n",
- ")"
- ],
+ "execution_count": 12,
+ "id": "4a38704b80ff26b2",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T20:59:08.113601Z",
- "start_time": "2024-03-12T20:59:08.079505Z"
+ "end_time": "2024-03-12T20:59:23.401098Z",
+ "start_time": "2024-03-12T20:59:23.396531Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "87964b32dd38d4ff"
- },
- {
- "cell_type": "code",
- "execution_count": 33,
"outputs": [
{
"data": {
- "text/plain": "torch.Size([129, 129])"
+ "text/plain": [
+ "Sequential(\n",
+ " (0): TrackedLinear(\n",
+ " (original_module): Linear(in_features=8, out_features=128, bias=True)\n",
+ " )\n",
+ " (1): ReLU()\n",
+ " (2): TrackedLinear(\n",
+ " (original_module): Linear(in_features=128, out_features=128, bias=True)\n",
+ " )\n",
+ " (3): ReLU()\n",
+ " (4): TrackedLinear(\n",
+ " (original_module): Linear(in_features=128, out_features=128, bias=True)\n",
+ " )\n",
+ " (5): ReLU()\n",
+ " (6): TrackedLinear(\n",
+ " (original_module): Linear(in_features=128, out_features=1, bias=True)\n",
+ " )\n",
+ ")"
+ ]
},
- "execution_count": 33,
+ "execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "covariance_matrices[\"activation_covariance\"][\"2\"].shape"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T20:59:59.570656Z",
- "start_time": "2024-03-12T20:59:59.567837Z"
- }
- },
- "id": "481af2c88737df72"
+ "model"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "190902fc-fe59-42c7-a94f-07c577dedbf7",
+ "metadata": {},
+ "source": [
+ "We can now create the `Analyzer` instance to compute influence scores. The `analysis_name` is used to organize the results."
+ ]
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 13,
+ "id": "19d3800e-a518-4bfe-a0b1-02ebf16b8f3e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "analyzer = Analyzer(\n",
+ " analysis_name=\"tutorial\",\n",
+ " model=model,\n",
+ " task=task,\n",
+ " cpu=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d5c4fb98-4dd2-4d49-b856-8a989d5a530e",
+ "metadata": {},
+ "source": [
+ "## Computing Influence Factors"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b05772c8-28f7-4471-acfe-762e55344790",
+ "metadata": {},
+ "source": [
+ "We can compute the activation and pseudo-activation covariance matrices with `fit_covariance_matrices`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "87964b32dd38d4ff",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2024-03-12T20:59:08.113601Z",
+ "start_time": "2024-03-12T20:59:08.079505Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ }
+ },
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Performing Eigendecomposition [4/4] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "eigen_factors = analyzer.perform_eigendecomposition(\n",
- " factors_name=\"ekfac\",\n",
+ "analyzer.fit_covariance_matrices(\n",
+ " factors_name=\"tutorial_factor\",\n",
+ " dataset=train_dataset,\n",
+ " per_device_batch_size=None,\n",
" overwrite_output_dir=True,\n",
")"
- ],
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "319928b0-3e4a-4a60-8b5e-dd70f5230f82",
+ "metadata": {},
+ "source": [
+ "You can load the computed covariance matrix with `load_covariance_matrices`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "481af2c88737df72",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:00:31.570596Z",
- "start_time": "2024-03-12T21:00:31.553063Z"
+ "end_time": "2024-03-12T20:59:59.570656Z",
+ "start_time": "2024-03-12T20:59:59.567837Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "31da64ca7f237819"
- },
- {
- "cell_type": "code",
- "execution_count": 36,
"outputs": [
{
"data": {
- "text/plain": "torch.Size([129, 129])"
+ "text/plain": [
+ ""
+ ]
},
- "execution_count": 36,
+ "execution_count": 15,
"metadata": {},
"output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAJYCAYAAADyoFdhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAABcSAAAXEgFnn9JSAAEAAElEQVR4nOz9eXQd1Zn1j++qupplWbIleZJHecA22GBodxgcOwQSwkwCdKb1BSchoZPulyEkv7U6pNNJOuvtjhlCh3RDuhOSXiQkL5AQhtANJIQQZjMYPOBZ8mxLtmRrlm7V+f0h6579PFcS873Yej5rea0rnbpVp06dKpXr2bV34JxzMAzDMAzDMEYMYb47YBiGYRiGYeQWuwE0DMMwDMMYYdgNoGEYhmEYxgjDbgANwzAMwzBGGHYDaBiGYRiGMcKwG0DDMAzDMIwRht0AGoZhGIZhjDDsBtAwDMMwDGOEYTeAhmEYhmEYIwy7ATQMwzAMwxhh2A2gYRiGYRjGCMNuAA3DMAzDMEYYdgNoGIZhGIYxwkjluwOGYRiGYYwszj//fGzevDmn26yvr8f999+f022+n7EbQMMwDMMwcsrmzZuxadM6zJxWkJPtbWroy8l2jiTsBtAwDMMwjJwzc1oBXntiak62ddzSxpxs50jCbgANwzAMw8gDDgmSnG3LkNhLIIZhGIZhGCMMewJoGIZhGEbOcQBil5sngA5AkJMtHTnYE0DDMAzDMIwRht0AGoZhGIZhjDCsBGwYhmEYRl5I7OWMvGFPAA3DMAzDMEYY9gTQMAzDMIyc44Cc2cDYSyDZ2BNAwzAMwzCMEYY9ATQMwzAMIw84xC5XGkDTGmrsCaBhGIZhGMYIw54AGoZhGIaRF+wt4PxhTwANwzAMwzBGGPYE0DAMwzCMnOMAxDl6AmjPGbOxJ4CGYRiGYRgjDHsCaBiGYRhGXjANYP6wJ4CGYRiGYRgjDLsBNAzDMAzDGGFYCdgwDMMwjJzjgJwZQVuhORt7Aqjo6urCP/7jP2L27NkoLi7GxIkT8bnPfQ47d+7Md9feMzo7O3Hffffh85//PObMmYPi4mKUlZVh4cKF+M53voP29vYhv/uzn/0MixcvRnl5OcaMGYOzzz4bTz/9dA57nxv279+P2tpaBEGAmTNnDrvsSBiTpqYmXHfddZgzZw5KSkowZswYLFq0CF/72tcGXf6BBx7A0qVLUVFRgYqKCixbtgwPPfRQjnv93vHCCy/g0ksvxcSJE1FQUIDKykosWbIEd9xxB9wgf+DiOMbNN9+M4447DiUlJaipqcGll16KdevW5aH3b58XX3wR//Iv/4KPf/zjqKurQxAECII3Tlx9O+fIU089hbPPPhtjxoxBeXk5Fi9ejP/+7/9+t3blXeOtjEmSJHjyySfx9a9/HSeeeCJGjRqFoqIi1NfX48orr8TWrVuH3daRMibG+xRnZOjq6nIf+MAHHAA3YcIEd+mll7rFixc7AK6mpsZt3rw53118T/jP//xPh/7/ILm5c+e6Sy65xH30ox91o0aNcgDcMccc4/bu3Zv1vauuusoBcCUlJe6CCy5wH/3oR10qlXJRFLnf/va3ud+R95DLLrvMBUHgALj6+vohlxsJY7Jy5Uo3duxYB8DNnz/f/c3f/I372Mc+5qZOneqiKMpa/uabb3YAXCqVcmeddZa74IILXElJiQPgfvjDH+ZhD95d7rnnHhdFkQPgFi1a5C699FL3oQ99yKVSKQfAffrTnxbLx3HsLrroIgfAVVZWuk984hNu6dKlLggCV1pa6p577rk87clb54ILLshcO/jfcLydc2RgjIMgcEuXLnWf+MQnXGVlpQPgvvrVr74He/b2eStjsnHjxkz7+PHj3fnnn+8uuugiN2nSJAfAjRo1yj355JODfvdIGpPBmDdvnps9O+V27piQk3+zZ6fcvHnz8r3b7yvsBpD4xje+4QC4k08+2bW1tWV+f+ONNzoAbunSpfnr3HvIz372M/fFL37RrV27Vvx+165d7oQTTnAA3Kc+9SnR9uijjzoAbuzYsW7Dhg2Z3z/99NOusLDQVVZWupaWllx0/z3nsccecwDcF7/4xWFvAEfCmOzbt89VV1e70tJS97vf/S6rXd+8vP766y6KIldUVOSefvrpzO/Xr1/vxo4d61KplNu4ceN73u/3ir6+PldbW+sAuF/84heibe3atW7MmDEOgPvjH/+Y+f3Af7hmzZrl9uzZk/n9Pffc4wC4mTNnur6+vpztwzvhX/7lX9w3v/lNd//997vdu3e7oqKiYW8A3845sn//fldRUeEAuHvvvTfz+z179riZM2c6AO7xxx9/t3ftbfNWxmTTpk3uzDPPdH/4wx9ckiSZ33d3d7vLL7/cAXBTpkxxvb294ntH2pgMht0A5h+7ATxMT0+PGz16tAPgXnrppaz2BQsWOABu5cqVeehd/nj66acdAFdUVOR6enoyv//Yxz7mALibb7456zv/5//8HwfA3XDDDTns6XtDZ2enq6+vd/PmzXMbNmwY9gZwJIzJ3/7t3zoA7kc/+tFbWv6qq67KarvpppscAPd3f/d373Ivc8drr73mALg5c+YM2j5w3P/1X/8187u5c+c6AIM+7Tr//PMdAHfPPfe8V11+T3mjG8C3c47867/+qwPgLrjggqzv/OY3v3EA3LnnnvtOu/6e8UZjMhSdnZ2Zv0l/+tOfRNuRPibO9d8Azpqdctt2jM/Jv1l2A5iFaQAP89RTT+HgwYOor6/HCSeckNV+8cUXA+jXMo0kFi5cCADo6enB/v37AfTrJP/4xz8C8OPCHE1j9e1vfxtbtmzBbbfdhoKCgiGXGwlj0tXVhTvvvBNlZWVYvnz5m/rOgM7vaB2ToqKiN7Xc2LFjAQBbt27FunXrUFJSgnPOOSdruaNhTIbi7Z4jw82hc845B8XFxXjsscfQ3d39bnc5r5SUlGD27NkAgF27dom2kTomxruL3QAeZtWqVQCARYsWDdo+8PtXX301Z316P7BlyxYAQEFBAcaMGQMAWL9+PXp6elBTU4O6urqs7xwtY/Xqq6/ixhtvxPLly7FkyZJhlx0JY7Jy5Uq0tbXhhBNOQElJCR5++GFce+21+PKXv4wf/OAHWX+kWltbsW3bNgAY9D9VkydPRnV1NRobG3Ho0KGc7MO7zYwZM1BfX4/169fjl7/8pWhbt24d7rzzTlRVVeGiiy4C4K8zxx577KD/oTga5slQvN1zZLhrc2FhIY499lh0d3djw4YN70Gv80eSJGhsbAQAjB8/XrQdTWMSu9z8M7KxG8DDDPyhGuzCxL8fOCFHCrfccgsA4Kyzzso87XijsSorK0NlZSVaWlrQ1taWm46+yyRJgi984QuorKzE97///TdcfiSMydq1awEAtbW1uPDCC3H22Wfj5ptvxn/8x3/gmmuuwcyZM3HXXXdllh8Yk6qqKpSVlQ26ziP9vIqiCD//+c9RWVmJz3zmMzjxxBPxyU9+EqeffjoWLFiAuro6/OEPf8j852kkX2fezjly6NAhHDx4cNjvHa1jdtddd2Hfvn2oqanBKaeckvn9SB4T493FbgAPM2B1UlpaOmj7wB+wI/WP99vh97//PX7yk5+goKAA3/3udzO/f6OxAo788frhD3+IF154AStWrMiU74ZjJIxJS0sLAOD+++/H//zP/+BHP/oR9u3bh4aGBlx33XXo6urCZZddhldeeQXAyBgTADj11FPxxBNPYMaMGXjppZfw61//Go8//jjCMMSZZ56JGTNmZJYdydeZtzMf2IJqJI3Z9u3bcfXVVwMAvvOd7wipwdE2JkmO/hnZ2A2gMSivv/46PvvZz8I5hxUrVmS0gCOBbdu24frrr8fSpUtx+eWX57s77xuSpP8ymk6n8Z3vfAdf/vKXUVNTg6lTp2LFihW45JJL0NfXhxUrVuS5p7nlrrvuwuLFizF58mQ899xzaG9vx4YNG3D55ZfjxhtvxOmnn46enp58d9M4Qujo6MDHP/5xNDc348ILL8SVV16Z7y4ZRyl2A3iY8vJyAP2myIPR0dEBABg1alTO+pQvdu7cibPOOgstLS249tprcdVVV4n2Nxor4Mger6985Svo7e3Fbbfd9qa/c7SPCeD3EcCgL4EM/O6JJ54Qyx/NY7Jx40ZcdtllqK6uxoMPPojFixejrKwMs2bNwu23345zzz0XL730En76058CGNnXmbczH3jOjYQx6+vrwyWXXIKVK1fitNNOy9KVAiNvTIz3DrsBPMyUKVMAADt27Bi0feD3U6dOzVmf8sGBAwfwkY98BI2NjVi+fDluuOGGrGXeaKw6OjrQ2tqKqqqqI/IC9OCDD6K0tBRXXnklli1blvn3yU9+EkD/DfLA7/bs2QPg6B8TwM/90tJS1NTUZLVPmzYNALBv3z4AfkxaWloyf5A0R/p59atf/Qp9fX0466yzxB/mAS699FIAwJ///GcAI/s683bOkYqKCowePXrY7x0tY5YkCS677DI8/PDDOP744/HAAw+gpKQka7mjaUwcgBhBTv7ZeyDZ2A3gYQZKnC+99NKg7QO/X7BgQc76lGva29vxsY99DGvXrsXHP/5x/Od//uegEUZz5sxBUVERmpqaBo3IOxrGqrW1FU888YT499xzzwEAuru7M78bsFkYCWMy8CZvV1fXoCXNAwcOAPBPKCorKzN/9F9++eWs5bdv347m5mZMnToVFRUV71W331MG/tAO/EHWDPx+QD85cJ1ZvXo1+vr6spY/GubJULzdc2S4a3NfXx9Wr16N4uLijGXKkcrf//3f46677sLs2bPxv//7v6isrBxy2ZEyJsZ7i90AHubUU0/F6NGjsXnz5oyInbnnnnsAAOedd16Oe5Ybenp6cMEFF+D555/HRz/6Udx1112IomjQZUtKSnD66acDAO6+++6s9iN9rFy/QXrWv4Fczvr6+szvBp56He1jAvQ/wVm4cCGcc5kyLzPwO7Z8GfC6G9h/5mgYkwF7jpUrVw7a/sILLwDwT0enT5+OuXPnoqura9As5KNhTIbi7Z4jw82hBx98EN3d3TjjjDNQXFz8bnc5Z1x//fX493//d0yZMgWPPvooamtrh13+qBkTByQ5+mePAAchXw7U70cGouBOOeUU197envn90R4Fl06nM9mkS5YscR0dHW/4neEinYqKio6K2DPN1q1b33YU3NEyJr/4xS8cAHfccce5Xbt2ZX7/8ssvZ2LP/t//+3+Z33MU3DPPPJP5/YYNG46KKLgXX3xx4E+L+/d//3fR9swzz7iysjIHwD366KOZ33MUHGds33vvvUdcFJzmnUTBDXWODBV7tnfv3iMi9uyNxmQgEWf8+PFiTIbjSB8T5/qTQGbOSrnXt03Iyb+ZsywJRBM45+y++DDd3d1YtmwZnnvuOUyYMAFLlixBY2MjnnvuOdTU1ODZZ58Vlg5HC7fcckvGcuCiiy4ashx3ww03oLq6OvPz1VdfjVtuuQWlpaU488wz0dvbi0cffRTOOdxzzz248MILc9D73NHQ0IDp06ejvr4emzZtGnSZkTAml19+ecb77pRTTkFXVxeefvpp9PT04IorrsCPf/xjsfzNN9+Ma6+9FqlUCmeeeSYKCwvxyCOPoKurC//2b/+Gv//7v8/Tnrw7fO1rX8toZefPn4958+Zh165deOaZZ5AkCb74xS/i9ttvzyyfJAkuvvhi/Pa3v0VVVRU+/OEPo7m5GU888QSKi4vx+OOP46//+q/ztTtviYceekhYRD3//PNwzon+f/Ob3xSpJ2/nHLn33ntx6aWXwjmHZcuWYezYsXjsscfQ2tqKa6+9FjfeeON7up9vhbcyJq+88goWLVoE5xxOPvnkIUu2X/jCF3DaaaeJ3x1JYzIY8+fPR0/fBtz/h+Gfdr5bnP/hfSgqmI01a9bkZHtHBPm683y/0tnZ6b75zW+6+vp6V1hY6MaPH+8uv/xyt3379nx37T3jW9/6VuYpxnD/tm7dmvXdO+64w5144omutLTUVVZWurPOOss99dRTud+JHPBGTwAHONrHJEkS9+Mf/zizj2VlZe7kk092P/vZz4b8zv333++WLFniysvLXXl5uVuyZIl74IEHctjr95bf/OY37iMf+UjmqWZVVZX70Ic+5H75y18Ounw6nXY33nijmz9/visuLnZjx451F198sVuzZk2Oe/7OuOOOO97wunHHHXcM+r23eo785S9/cWeddZarrKx0paWl7qSTThp2zuWLtzImjz/++Ju69g42hs4dOWMyGPPmzXP1s1JuzbaJOflXb08As7AngIZhGIZh5JSBJ4C//cO4nGzvog/vtSeACnsJxDAMwzAMY4SRyncHDMMwDMMYeTgAicu2GnuvtmVI7AmgYRiGYRjGCMOeABqGYRiGkRdi5OYJoJGNPQE0DMMwDMMYYdgNoGEYhmEYxgjDSsCGYRiGYeQchwBxjp5DOSs1Z2FPAA3DMAzDMEYY9gTQMAzDMIy8kCsbGCMbewJoGIZhGIYxwrAngIZhGIZh5ByH3NnAmBF0NvYEcAjmz5+P+fPn57sb7ytsTLKxMRkcG5dsbEyysTHJxsbEyBVH5A1gV1cX/vEf/xGzZ89GcXExJk6ciM997nPYuXNnvrtmGIZhGMabJHZhTv4Z2Rxxo9Ld3Y3TTz8d3/3ud9He3o4LLrgAkydPxh133IETTjgBW7ZsyXcXDcMwDMMw3tcccTeA//zP/4xnn30WJ598MjZs2IBf//rXeO6553DjjTeiqakJn/vc5/LdRcMwDMMw3pAACcKc/IP5AGZxRN0A9vb24tZbbwUA/OhHP0J5eXmm7dprr8WCBQvwxBNP4MUXX8xXFw3DMAzDMN73HFE3gE899RQOHjyI+vp6nHDCCVntF198MQDggQceyHXXDMMwDMN4Cwy8BZyLf/YWcDZHlA3MqlWrAACLFi0atH3g96+++urb3sb48ePR0dGBvr4+ALC3sYjNmzcDsDFhbEwGx8YlGxuTbGxMssnXmGzbtg1lZWXYs2dPTrdr5I8j6gZw27ZtAIC6urpB2wd+39jY+La30dHRgY6uLhSOru5f19YmuUBvX+ZjEEZDrse5RP4iTrhRtoX+QWwQDb3OQbbiP/H3qI9Z2wuUDoJ/juQD4YC+5oIAKYwCADRu2gf00Tikhp5GSYHcn7Av7dcZqzEqLPDrpLakSK2jh9aRjkWbKy/26+iVbaBt63HgH+PSQgxFkMhjl0qXAgAa1+/OPq680kIaI7UO3lenjgF6ev1nPTcSGj8aOwByX3Ubf4+XU7iyIt/H9m7ZGNK+Fcj1B3GMAhweF33+8L7rbdMYBbEcIxf7ZYNIzrek0I9L2CvXKeaHOB5qTHh/EjUv+ZxXx8Dx/qRUW4E/lmF3GgUoAwBs27AHLqZ+qXkT0Hi6SJ2vdK1Adw99SZ27tD8uVHOK91U/FtFzWKyUvqevMURC8wYAoi6/rKPrQdAXizFJioa+jgR9NF76HOny45BUlMhtd9K203q+0RzQ6+ym806Pn7im0TirYxWkaR7p6w0df318UsHh6+yWfbIfUNe3tJynAc31rEsRHfOkUI5zurS/ra+rC8bI4oi6AWxvbwcAlJaWDtpeVtZ/MWlra3vDdQ31v6u+vj4Ujq7GrP/v/wcAGP9cu2iP1m/PfA4qK+SX6axzXfIPZnKg1bf1yZM6GuXXE1SPGbrT+qymEz6uHe3XsWGb/Fqv315QKG9ugiL6uWq0bOMLivqDmTT4cYgmTRiynz1Tx4qmIrohcAcPya9Nm5T5HB7qzHzunF0jlitds9v3Y/8B0db5oWMzn8s2tch+7d7nPxeocaA/AAdPm4ahSHXKi27pCw3+B3Vc+YYtPXuyX8dBeaENWvw4uCo5p+LXN/vVqeMj5tjMKXKd22iM6uV/mMJDfvtJww7ZZ/pD0bNkQeZz4f+8IBcrLfM/TJ8s25r9uKenjRNt0SHq8w75pMFNp+PfJsco2evnTVgj51TX7NrM55J1cp3xPvpeif/jmUyXYxJX+PmQalU3u5v8+RSq89N10rI1VaKtc6o/XmWvbBdtCc19Pj8BIJri+5aMkjc0cbm/uYpe2Zj5HNC+9f/sv+fK5TrSlf76yTdnABD00M/qpiUpov+gbZLXmICWbTtjrmireM7ve99Ufy4XbN0rlus6zu93kJbXuqLtNKdqRsltP7s687njoyeJttFP+YcBcVOzaAunT/VtY8pEW/Di63650XJ7bpKfby7lrxvpCnnjW7ivI/M5KZZ/aqNmOv7l8u8Zr9Ot2Sjauj/opU8lu+TfpnCvvxa6PnVc6W9mz8xa0bbrtP65s/U//hVT1LmVC8yiJX8cUTeAuSLVlWTd+A2QtPuTWv9BTvb5C0xYoS5S+okDt5XSxVrdFPETk6BcXqT4D0dc7v+AFarl4gPqxoS3zf1s7xRt/PTEdcs/ivzHNKvP9MegcJ38Qy6efOgnYZ30P3n6n25JY6tcBz350H88yzbTsuoJI39PP30KRvkXisq2yXGIWv3PrkQ9Hayu9J/37ZfrpItuwd6Dfh0F6glWi+9zqP6QpyaO98vpG2Yay3BXk2rz+x62yWMX0HEO9JMPevpUeMB/LyxWNxi0b0Gn+s9Oh19/aqe8QeenZEksn9AGW72PpwvlzYfroWOnnvry00JH5ycAgJ+00JhEe+SxCnfRXKkoF22O/+OlnwZV+vMn6JBzvWQ7/SHXT1foHHFqHFyJv5Hg/wgBQNjqr0sJ90X95zA54G+YglJ57MJuepq6W94U8X8QXafadq2/OUjUecdbr3hZ3YQ3+7Eu4Lmv+ly0j84zVTlwZX4fCna3yvXTf7T0uSu2MUx1hf9jDwAJP0FV/5kPD9ADBlp/eFBdG1r9+ZrMkv/hiLgve+S5y1UGp57sluz28zs8KOc6X6OTmfI/ZdHe1sznwr3yb1vpnv75Fg5dDDCOUo6oG8CBt3471YVpgI6O/hNi1KhRg7Yza9asGfT38+fPzy5bGYZhGIbxruIAJBYFlzeOqGevU6b0l7l27NgxaPvA76dOnTpou2EYhmEYhnGEPQFcuHAhAOCll14atH3g9wsWLBi03TAMwzCM9wsB4pw9hzIjaM0RdQN46qmnYvTo0di8eTNeeeUVHH/88aL9nnvuAQCcd95572xDvX0ZTUiiNEVhmdfrpRukbiRVW535LPRmAJIO0m6ol1hcp9cHaU2b0K20SU0b9y21kgTHSlMUFpE4Welgkj3+xQitRRLrUNq0hHUx+nu0jbBSvbhAb7XqMQrpZYiA3qLm8QHkGDmlI8QuEpartqR7aE1beo//XtQjj0FAmjDHL5IASEjbpd+GjukFlWisf3lAzykev3jnbtEUkp5Tjxcfr+Rg25Bt4U5l60DHJ1Fvcwb0pmS00T9p128qJof8sQp79FwniYbWt9HPWW+88xxTuiuxjkNyXwufJ21kkdRh8fwISBjPuksAcs6WyfOTzyfXJvVTrG/jYwwAAWtVleY0GULGAgDxmvW+L/qFN9IO8jUlC1ouapXa0WA77UOZ0gvT9QDayYDmrZ7roi9KoymuHTQmPHYAELKGTetdSQunNbTcz0i9AJduPYghoXMm0POmhTSU2jlBvOxH16Z2pRunuVfQIF94SWgOO3X+8Nhqja5bsynzOetqTbrFcOsu0RQf8n0LmuQ6x7X1z8WN7UO/2W0cnRxRJeDCwkL83d/9HQDgK1/5SkbzBwA33XQTXn31VSxduhQnnnhivrpoGIZhGMabwKH/LeBc/DMNYDZH1BNAALj++uvx2GOP4emnn8asWbOwZMkSNDY24rnnnkNNTQ1++tOf5ruLhmEYhmEY72uOuBvA4uJiPP744/i///f/4pe//CXuu+8+jBkzBpdffjm++93vDmkS/VYIwijj8aetXkTZ96R5oi1+aZ1fR5H0hOKfdTmILUjCUdKCIr2bSpN10+X3pnj/PbaLcGXS98tto3KAKjGzf5gu67C9izZtZrsIXSKJhykVsZVNrMvdXHIa58vpSMkH1QGXYF5bL9u4tKvK1hGVjmKyyQCAVJ33oNPjh4ND+0pG1d4aQ3tvpcZ7v62YyrC6nB5zOVWbatPPukQfjSb/SGX9k7Dn2Sz1UlQHlcK1tySZIHPpO9kly43R5Im0A6pfvH+6vFVAx195OPJR1lIINvENxlTKdXJ5Wpfv2QCX+qLLtQmXClVZPJrgvQxZMgEAqcn+ehOrNlGS03ORjl2sypSpqd7CIx4jfSGjFiod8phoo+Fiuv6oYxDSvNTl1JDOQT2neGzTu6WsQI8nI653BbT++bNkn+kalipR1zC25tFl0e0km1A+dinKi9c+gGz3k96swgPI5F8bSLPFjpinStLA1/L0ZOllGr3u9zWsln3m8nCiZB8RjwNJjgBpx5SMlfMmpPcmA2Xcvn9p/xxO3z+0Vdl7SXJkFSKPKo64G0AAKCkpwXe+8x185zvfyXdXDMMwDMMwjjjs1tswDMMwDGOEYTeAhmEYhmHkHOcCxDn659y7YwPzwgsv4NJLL8XEiRNRUFCAyspKLFmyBHfccYdMDTpMHMe4+eabcdxxx6GkpAQ1NTW49NJLsW7dukHW7nnggQewdOlSVFRUoKKiAsuWLcNDDz30ruzDAEdkCTgnHD6QHO8GSKsX1vwBQHDs7MxnHeEUb/MiDG2Nwnq6ROmBItK06KipZDNZC9SQHkRp1jhqTus/WLemc3W5Xzraju0wEq0x4sxVpUUJKK9S6wNFFjHpsMKDcv3pXV5/lGUlwigtF2vOQpUWk97hY8hS42V+bfd8r/MqXiNNyPl4ac1UusFbUqQod9QpWw62+sgak1F+nZGyRolbW/06tE6J9j3V1CrahJWJ0i3yBYzzn3UeatLkLTx0zGHClhM6ao76xTo4AHBTfOxduEPaZggLHG2HQ2MU6Kg2mh8RHXM9zqzl7J4zXrQVPkPaXpV7nF7ns1pTM6bJfhWTtcj+VtEW8/hp+yCyAgo7VDwj26GwHRIUdE6G8+fINooe03OW9YhOazRJxxwp3ZqwdKmfJNpSpCsV14P1W2W/SGsZN8ttO86CLpb6atatolVe+9JNQ6c6caxjuECOUfLKWt82WmY8x3P8HIiayUpG2d+wXUyk8r9ZnxwrS6Kwwo9RpLSjjuZD0CTHiC2pQnVO8vzQmsbRG/r1vVGvsv0xsrj33nvxN3/zN4jjGIsWLcKSJUvQ1NSEJ598En/5y1/w2GOP4Re/+EVm+SRJcMkll+C3v/0tKisrcc4556C5uRn33HMPHnroITz++ONYvHhx1nZ+8IMf4JprrkEqlcIZZ5yBoqIiPPLIIzj33HPxwx/+MOOG8k6xG0DDMAzDMPJC7oyg3xnpdBpf/vKXEccxfvGLX+DTn/50pm3dunU47bTT8Mtf/hJf+MIX8KEPfQgA8NOf/hS//e1vMWvWLDz55JMYN67/Pzn33nsvLr74YnzmM5/BunXrkKL/BK5fvx7XXXcdioqK8Pjjj+Pkk08GAGzYsAGnnHIKrrnmGpx11lmYOXPmO96nI2PkDcMwDMMw8sTrr7+Offv2Yc6cOeLmDwDmzp2Lz372swD6S8QD3HTTTQCA73//+5mbPwD4xCc+gfPPPx+bNm3C7373O7GuW265BXEc48orr8zc/AHA7Nmz8Y1vfAPpdBq33HLLu7JP9gRwEJxL4A6X27JKn1R+0lYvXPbdc8YE0VbzU0pVGC8tAbrH+zJMwWOyxBhNpvUckOVhTjloXTIt83nUZlkGiZqp5KjsItoW+/Jm6W+UjQWVz9I7pbN8RGWlSPULXH5oke74ffV+fwq2yySAruneSuLgdL+OcfdtFsuJ8oZOqKAS1sELjhdtox9o9V8bK8s6XMaMJ0l7haLt/nudC2UJsHQDlXJ2KWuMcd5uo298ZeZzz3xZYi597FXf/1ly/V0T/NxQphwA2cfoUi5LB3RpnyUIgbId4vKw41LhhFqxXEjWHumt0kIjENY1qs9kJ8R2JAAQHKB5q6QKXL5PnzRbtO073kscJv1C2gJx2TKZ4a1roj3SBoitN1IdKh2F0jKaTpZzo7bLXw8OfECWjov3+zEqXLtBtPF56NIqsea04/1iK19XffFygZCsUvS1iMvDvePkzCkiWyhta8PnvFZMhVWV9IOyZqLth5t3ijZODQpGk7WQKkW2LPbXhopqKQ9I7fLXiiypCksJKtX3UnQN2yvLwWEblWW1dovtpGqUZVCBX2ffNN9W1KwSi8i+Ki6T87l7vj8/y+5/Ua6frmHhNGVrxufhHrk/nHS0/4Py70/1b/yY9Z1QL9o6a/tL4cm6/DwPStyR8RyqSJ1jQzF2bP+x3bp1K9atW4eSkhKcc845WctdfPHFuP/++/HAAw/gE5/4ROb3Azq/iy++eNDvXHvttXjggQfwwx/+8O3shuDIGHnDMAzDMIw8MWPGDNTX12P9+vX45S9/KdrWrVuHO++8E1VVVbjooosAAKtWrQIAHHvssSgoyPZYXLRoEQDg1Vf9A4DW1lZs29avHT/hhBOyvjN58mRUV1ejsbERhw4dymp/q9gNoGEYhmEYOcchQIwwJ/9c1jPtt0YURfj5z3+OyspKfOYzn8GJJ56IT37ykzj99NOxYMEC1NXV4Q9/+APGjOl/KjxwIzdUOMXA7xsbfQVl4DtVVVUoK8uq+Qz5vbeLlYANwzAMwzjq2bx5M+bPnz9o25o1a97w+6eeeiqeeOIJXHTRRXjppZfw0ksvAQAKCwtx5plnYsaMGZll29v75TSl5PLADNzgtbW1venvDPW9t4vdAA5GnCA50ApgEIuLDoo5U5oAtnphzR8gdVHJ2o2irXAjaaZ0rBpph4KCQtHG0Wmj/+CXYxsOAEinvaZJ26aUUUSZ3raOrBP9WrfJ/5AooVcw9P+0ArK4SDtpO1BAbTUUUZWoqDFtYyDWT8ek4t6Voo01RwlZtGiyrDdozIq2yP91JazDUmPLVh/h4fkEACVqv7lfwatybpRtJEudTtkvsQ5leYO9XtuVZXmzhyxWQmWjQ31jm5Zk6/Yhl9Pz0vVRPJaaC6xbE7GKap1Zmiwieuo18fOk1dTPg7IsIubKS97aI2sGsWXHJqlhY4uT6l/JSDyOM6z4lfwezwc3zDhrUqT703Pd0bnt6LzW1jh8Tha9uEk08Tq1hRPIZkaf1xyf6PT3xKaHPl+DjQ2+QZ0vox/0xzUrfo2WHXauq+Mfd0vrJNEv0n3qaEgx/zZuEU2pnf6Pc0R90fvN41egbHMitttR+8p/K2IdUUdk2eEQ1fetlb+gWMLoaXmjU3lYDx11qmjOHBG/S/58ueCuu+7C8uXL8YEPfAB33XUX5s+fj127duGGG27AjTfeiMcffxxPP/30m9YL5hu7ATQMwzAM46invr7+TT3pG4yNGzfisssuQ21tLR588EGUH86ZnjVrFm6//Xbs2rULDz74IH7605/ib//2bzPtnUP8x73j8MOkUfQf9Df6zlDfe7uYBtAwDMMwjJzjACQIc/Jv6JrCm+NXv/oV+vr6cNZZZ2Vu1JhLL70UAPDnP/8ZADBlyhQAwI4dO7KW5d9PnepDAga+09LSkrnRezPfe7vYE8DBcE6WsQhObdAlUrbX0FYvXPZNTZR2Ea7Ml8Xi9bJcw9vT5TTuIzv6R8rd37UPPpEAICCbG23nAQxTpqJElPReaSUhEkSUk31AJ06iHfBp/OLxZNOyWo4JuNQSyP/DsP0Fp28AQHpLg9+W0lgkXEJTpSkeW13m5fKNUyUgtqsR61DJD1ySDQpkm5vuUxWCTbJsLUproZoboPJjr5zLIVlcBFSSBWSZOaZyWmqctGzhBJlY2XKIsrIqI/L6I5WIw+OeqDnLJcdIJbUk1WRro8qDAfVT7Ks6VjG/UVcl+8VlPkyS23ab/DmTmiqtN1yntwWJ1TkyHAH9z961yNIkzzFRYh5OFqHGOW70pfcgpZOBhi4D8jzSsoKEEyp0mg2do+GYSt+PJmkDFU72Nj3YsVu08bVWz/Wwgq67uhTO10wlK+DrVKT2JyZ9VVRZKdoCtpqh7bGVEACEbLGkroMRlQjTu9S+0rHMSlwhKYm+Tol1TJNpLG6dt9IKy+Q5j4GkqMCeBw3HwI3X6NGjB20f+H3L4XN24cKFAIDVq1ejr68v603gAf3gggULMr+rrKzElClTsG3bNrz88ss47bTTxHe2b9+O5uZmTJ06FRUV0vLo7WBH3DAMwzAMYxjGj+9/cLNy5cpB2wcMoKdNmwYAmD59OubOnYuurq5BM3zvueceAMB5550nfj/gGTjQ/ma+83axG0DDMAzDMPJC7MKc/HunXHDBBQD6S7z/8R//IdqeffZZ3HzzzQCkgfO1114LAPj617+Offt8FeA3v/kN7r//fsycOTOz3gGuuuoqRFGE2267Dc8++2zm9xs3bsT3vvc9pFIpXHXVVe94fwC7ATQMwzAMwxiWRYsW4brrrgMAfPnLX8axxx6LSy+9FKeddhpOPfVUdHR04Itf/CLOOOOMzHc+97nP4aKLLsLGjRtxzDHH4JJLLsGHPvQhXHzxxSgpKcGdd94pcoABYM6cOVixYgV6enqwZMkSnH322bjwwguxcOFC7N+/HzfddNO7kgMMmAZwcMIQ0aj++npQKvUSrOvRMVqsKeF4N0BZvSgNxqHjKBZog4o9G+e1hHGl3F64oSHzuXeyX0e6TB7Wki1Ko0X01XodQaA1gKwJ0W/qk6YlNVFqnzjKCBOVXosjpJQGsHeGX7a7xo/lqM4pctv7KBZKa8U4AmuyjHtLURSU1vJFNTS2idQKxdO9ZjO1V8beiWHR+iPW/VAclhsjNSQhaYe0tVDHZK9NKmsc+nTVWr4w8uMcKMEy6/f0/I6KlNXQwHcqlOiZ16+sN1ib5HqVjnQ4nVG1j9UK9TGg45qMkXqtg3P8HK7ao7SdFG0nIgrHyEg3ng3dU+W8KSENYG+tHIfCbj/30zVSkxO1UKwaa7cUws4FQHq2128VNGqLHb8sx/bp48/nQaxi1aIu0id3SZuUmC2jlD5QaMfUcWS9a6g1zmyxQnM/pTTNfC3SbSFF7iXasoXPGaXLjsb6OSWuS5CRjyIuE0DAb2FGcl/5Ohy1+Hka1ii9Xo3f1ySlxquPtJz7muW2+dxSNwcc8RgUaIsy3+emE+U1pnYHaa8ny+PTOq//fEo35/52wCFA8g4Nmt/Ktt4pK1aswCmnnILbbrsNL774ItavX49Ro0Zh6dKluOKKK/CpT31KLB+GIe6++27ccsst+OlPf4oHH3wQZWVl+MQnPoFvf/vbmDdv3qDbueaaazBz5kysWLECTz75JADgpJNOwte//nWce+6573g/BrAbQMMwDMMwjDfBRRddlIl7ezNEUYRrr702Uw5+s5x33nnvmtZvKOwG0DAMwzCMvPBu6POMt4fdAA5CEEUIDpejnE4WEFYIshzEJYaCx6T3D6dsaKsXLvvqcmq83acLRGn56B5jfKkqemGd37YqI2p7EiYgl/tIW31QuTssk6U17leWHQFtj0s3AOCafTnaKcuOgtd8XwqoxBSMVoaXNO6uRZZ1UnW+fOZeluV0HodYlb5Csl7QpZzUntbM52SPtPNwMSViqNQY3lduS6gUDUhbC23ZUvzQC77PysYiYhsAZTMR7/PbSFVVyu1RiSmtElG4NM7zIVbSBN52VDdRtLmDZIehLIl4bujyfUjlLp00wf0Ktu8VbRXrKKlhnLRf4vVwik+kjr+jsS15fY9sozSJ8M+viLZY9EsmgYCshkJlxeLIZsQpB5fgKb8NN2uGbBNz2J+f2uJE2Byt2yrXQedPMkUeu4jsV4JiOad4HGJ1XeRUClekgu/puAZtVFpVZd7U2gbfLz03eCzHy+sUJzDpucjnq74OpvZQsolO/+G0FFU65mvFcPZRnP4TkbwBkJZbUbWUIzgqP4vUHgAh58MqK6sUzf2au1aJNk4pCdbJc3lU+dz+fvS9U6c840jDbgANwzAMw8g5DkCco3dR7fY2G3v2ahiGYRiGMcKwJ4CGYRiGYeQeByQuN28B2yPAbOwG8I1QdhSs80jvlvoMfkU/mqy0fGs3ZD7rGDJh9aJ1RMfNyXx07V2iKWnw2pdw1jTfsFtqzIRWMVR2BBzp1jh4ZmF/x6R+hu0JgslSd4ND3p7CpVSsGumKtN6t79jpmc8FTWTf0aH2m+xjdNQca9/CepWVuMXr3aLR0hpD9EWNkSP9XnzCHNFW0ODnQKzsKVhrF5IGSGsFQVqhQM0N7hdrMgEVX6Y0U6yFjHdJTRvHS2k7HKFjYmuPYYLHk/1yvxOO0VJxRRwFx7ZJgLTACbTmlLRcQbHUuAYUz+a27RJtrPuKakgfqCLq+BzRc9Y1e9uhYJG0bQgb/dgm05QdUuyvHQFZNgEquk1ZqrBezO1RelGKUmNSE6Q+mGPJgklKO8za2y1SA+oSr2nVsWqsvYtUn+PWVmpTsYQ9g0dWptW8TE2t89tSOlw0+zmWbtgumoSGVmk7OVYPSnPs2ukaUyt1eCCNo7ZmCkhTy3uajJZ61+AgnZPanmbebP+9TQ2iLaTthUqHGZBmM35dasmFbc+xs0Qb1vpl3dx60eSi/r2w+6ORh5WADcMwDMMwRhj2BNAwDMMwjDwQ5OwlkOw0A8NuAIfisK1CoG0s2nyJJKqbLpoCLlUeUIkRBVTuUiUS4SyvrF647Nu0RKZqjK2kvh30pbW+Y6eJ5aIuWfoQbWSFEKl9Taicoq0XhJVJgZxGbJ3TdaIsw5a9RiXNZlkCTpf7EkbU7UsffXXSQiNI/DgUPL9etumSJrdROShpkWXLiEtoqvTVNcfve+lqVWKkhIywXJYtg25Kr2BLGFXCZJL9MrUlmObLYknTftEWsbVIgUrw4BLjsTI2qK/QH69IW1xU+DHqG1+Z+ZxqVzYZE33JLEjLtI9oH1n9dMrvsXQgUePsar2tUbhLlT7ZIkYl6YTUt2RGnWgLVnvpBdt5hFMnieW4RNcxV1rJlJb77UUtstQOKlVHe1tlG1mzJPWTRVPU5JeNm4dO6un569ni56ImKqHv8ucLl24BIOBzUiVZ9E304+ymKsujF/z5pM953h8t34jo3Do0TyapsAggXU5l/rFSVuC20LmlZBJBFSWIKHlAwpY02j6I+hWqdfYe70uhhU3quDo/nomew7Qet933OVDjnFT4fqYrZSm3sMGnf0TKpontdthmCgDCVpJXaPuYcf5Ytk+XFmWjttPPnXKM9p7RP7bxq3aDNNKwG0DDMAzDMHKOA5DkyAjaNI7ZmAbQMAzDMAxjhGFPAA3DMAzDyAuxafPyht0ADooD0v02EVrrwhFFwRRl+7DZW4I4bR9DmhLXJ9cZskXEGKmfYasXofnTkF1EgdIDoZU0MioyKqb90VoU1tO4NqmR4Ri3YG+zaEuorXSj1K0JawllJVG6iuwd2GamT2qF4lKvd9ORYWxXErSoGD8+BjoejzVzSivE/WILGgAIOkiPptbpyKJG2J+oPmfNFSKk46+tS8QYqT4Lq5xKOX5Bj1+PHr/koO9LwXayPFLaxBTr8LRtDtlyBFofyst2qzi+zTTOeozoPEwpWyC239EK0DSPbULn3T45LxNaf/lKZRdC+8qxYwAQkp1QouLRmEjPjT6/DZdW2yMbnYJD6lpxiGLCaJ06spJtdNxWaZuS6vPXrWS00q2yvk0dO76OcKweIK2FKta1yu81+eOTOuCPfzJOxqMJaxyt5SugfpVKPR3YpqdCrhM8zkpPV7TZWwslTfIaJq6TSrOdkHUOX8uD7VIfzNZCBWmp12NbIx47QGqv9d8KtvdhvS4AoWOteFla7MRt3vImVONQubl/+6HclDECsBtAwzAMwzByjkOQQw2gPWnUmAbQMAzDMAxjhGFPAAfBRRHi2sOvxpdLe43USl/64HIMAKDGP+ZvXTJNNI3+g7ej0NYyvZMpQeSFdaJNJHwcVNujsu+2vz0283ny/0iLk7CLyilFcn/aP+Qd40f971r5PUqliJtliSSa6S1wAuWwH42lMrZKiXB13sIlpUo5HfO9FUv7RD81xz2qEkq2tPr1KdsXtoto+StpqTP6d6/4bddpGxC/DwdPkskmFat9ianl9GmirbTJl12KV8lUhaCUSodLT8h87hkjy7VlD/l+9XxogWhLUv5/rWUbZNky3rgl83m4dBl0qXIafXaV0mIHVB7qm+Lnc6pYzhsu5QaU/AJIK5tonLQS4RIjp6MAgKMSY1QrrVjSO3xCTu9MKb3YddqMzOep/yltgYT1xzGU4rJDpviwfVDPMfL4F768OfO5+fK/Em1jV/vrQUedtKcJqNJW/vtVok2XzZnuZcdlPpes3CLaHJ1bwrapVpYRHcky2s5dKNrKG6h8+9pG2ecJ/vyMVUpI/IH5mc8qy0Ye85T8s8LygWiutyQKdslryoELaP0dUhZR1OLPz8JVW2WfKVGm8zh5Xpds9defgMqnABCPq8x8DpXUJ6SSczhWynJ66/y8TYr8vIm6VNrHHm87tP94uY7wWP9zxW9ekm10XIMaWTruOsZf00pel2XeZHND5vPurywWbZMe8WPUMVP2pfm4/n2I/4y8YBrA/GFPAA3DMAzDMEYY9gTQMAzDMIy8kCsNoJGNjbxhGIZhGMYIw54ADkZvH4IN/fqXQh2PxtYLKpIKB73GZNRmqTdJSCelI9fSZf4wFBSpmLDdXuenI97Y7oV1f20zK8RyFR3eViDokzqVURu97kpb3rgub7fBOhtA6f6UBjDZudsvN0/GkLGlgoiTA1Bc7fsdF3kLhbha7g/459WbRFO6wVtelE2sFG0h6d3ifXLb0USvran4s9RdodZrfsY8JDWaQbnvpzZzYbuKAorYKqqReq2Y5lTR46+KtvTJXhfltu0Ubaz705YQInpuoowQZAJlccExeKm1DX65UcqKh/RTwe59oi2s8hqj9K7doo2tf3Q0F0ePJXvkOtmWI2qX83Tci16HFaiYMNdDy5LNDOqkPjTZ1Jj5nGpX87nex8vVPqki6uh8Gr1P2Q6RNUuW0Q+Pu7JmKjzgz9dksuxntNvr5hKyTXHagoQsiEa/JPWOwtJpqozOS29qyHxOTZTbDl7x55q2UQrH+nPEjZLXt4j3j49HjdSiVa324xXuV5Y6KdL6jlb2J2nfl5KnVTQknReJuvaJCMO0bONrXyKlt+AroVNRikw808f/VWyV1kWpZtLNqv2JD7RmPkdOWrYUP+81m2681MmyJVHJfmUFttPPgTJlA1N2WKcbDp0Yahyl2A2gYRiGYRg5xwGILQoub1gJ2DAMwzAMY4RhTwAHw7lMOTQ+oOwBqETrtsmyC9t+RM2yhJEmt3/XLl30S7b4cl1WaYXc5KMu9YyebDPY6oVLvgBEsoVTZbdgj69v6EQK7kuoSsCixFgsy9YBJ1R0KgsSSnGIVSkiiP32yzf60kqwU1l2sL0KFFQyKdgjyzMxWdIEkfy/T7zdl1e5lKL77JTFhSgxatf+9d4+hMu1jko8mkDZ2hTu9VKCRI0Xlw7jZpnUwVYSUKV21HpriWS3HFu2JwmojMg2OQAQNfmx1XMqobKY3h8xx7QVCo2ltkpimUHUIuUVxdu9HYarlMcu6fDWSSGVhxNlcSI7Kc+DaB/ta7mUfSS7/LbDCbLUzukVKFHfo2QYnTSBld6OKaqVNiCO+sbrCIulpVJCc1bb7XCijLZwCijFJSv1hq8BOh2DrF5CdQxAxzygOexUghCvMdbJJnzdVeVaPccYRykxOnElbCeJS4Gcw7yNQM19se+cZhTKMYl20zlZK8vd4jp4UM5n0Q9Vthb7vqVRtPE5X7FV/g3gZJ1QJSSNWdv/NybqUdeXnBAgyZkNjNnNaOwJoGEYhmEYxgjDngAahmEYhpFzTAOYX+wGcDCCIOut1wxcblBvzYoygiqRDFemGJZhEgNEqYoSPvSbvlyiS4pkqSPifoZDPyIPdOmTSxGqbM1jFKiypUtnFW19G/UlTIYuR7jOriHbgpTfv0Bti0tAQYEsyXG5Wx97N8zY8tuJTgW1uITe9Cug8dPrILLGmeeNPj5cTlVvC4JL3IE6zWlsnSp3BtTGb1DqN705MSRrvIR0QEkOxA9qf7j8rEpy4vzRpXBRhnt7f0xYEtCn0n/C7f48dwXleNPQPugzK6CSHIYpkzstkyga/Lqkj0FCMhOnJBpCHqDOEZ5/Th1zfoten4NCupJS1zoqOTsxL4cpyemEHzp/XI+UlfB6tBzF0VvtYp5AjkvQLa/lwyEkD7w/+jjS+CUl8hzk625WaZqdINR85rf2s98s98s6da3gdWr5S1LY32833PEwjkrsBtAwDMMwjNzjgMTl6MbTHgFmYRpAwzAMwzCMEYY9ATQMwzAMI+c4AHGOnkPZA8Bs7AZwMIIgo7UJdMICJRQImwwAjuwC2hZLh/2ynd4uQq+zr9bbJgQbZQpFSDYQ0Z4W0RaTzqf9Q7MynzndA5BWL5HSebSfNDXzufghlehAupH4kFxnNGuGX3+btLUJSkinckhaHLgJPu0hUlqhXtJetc73YzTm0Va5juE0gKQVaj9WJhmU7vO2Ezo5IyC7nURZNoTN3gakd4a0+iggR3/XJCMDUpMm+HWO9uvvGS8tTgqfeM2vY/ok0dZb7a1LilulJUh6h7euCQqUNoz1TlozRe44bDPUv1JKl2jz+6YTNlibFO9RVjJElsaQdZ6kKQMA163si7iNLHbi8fL47D/O70P13atlN1nnRekfQZO0zWFrpsImOZ95TNrrZZ9HpadkPndMlW2FB8nW5ulVok1o7XQKxSkL/efXVCoNLRuW0TwqkJdy1l7Go5RNE+17oiyJAraM0rpP1qMpHRlrNF3DDtHG64n4PFPncfeSeZnPRQf0nPUC26BbWUvx3BxTKbtM23YqXSZs9+vUc0+k7IyR8y0pomM3zZ/jYZuav8PomDsWTMx8LiIrIQBIqM+pqkrR5sb4ORbskvsTt/i/D4emHyPaxr7mz7v0lFrR1lXTf8xdyjSAIw0rARuGYRiGYYww7AmgYRiGYRh5IMjdSyBmBJ1F4HSNZoQzf/58NG7ai9OmfR4AELRLb4+YnOV1CYvd8HVZZ7jwdyYaJx/Px1RWjFQ6AidicOKBU/Y0wi5E2QPwslH9NPk9ShrRNiBJF5U7nLaqGNrGYLiyiLD6YKsFnVZAJZ+0SrmIZk7zP6gyH1tjaCsEYUEyTZbvHaVGBCrRQYTG637S/oQU+J5QaRWQthairAeVGKETKioocUEd1/iQ30ZUJecpSxDSW2WaAM/TqNqXnOMmOc7hKL+OsGas7DPN2XCsLJ+ByneJkgck1BZVyNJ0TOkiUbXaHrWFY2XqRazK8kPB0oEsyyYaEzHv1bKBKsMGdCxdp7yO8PUhy9aE0NcDPheSNj9+WQlC5TR+6pzjlJUsu6vh7Jeoz1mlYzqfApWkI44PX8O0HRKXkbtkeTig+YbRam7Q+RnOmyXaQG2JKh3z9VQfV5Yc6JQVca3gUr46Blz6DmdMEW3J5gbfpseLUlD035Gopsa3qbI1WwTpawxbdWmrqWRB/5g98+qtmDq9BmvWrEEumD9/PvZ278DnfvORnGzvpx9/BOOK63K2f0cC9gTQMAzDMIy8kJgSLW/kbeQ7Oztx33334fOf/zzmzJmD4uJilJWVYeHChfjOd76D9vb2Ib/7s5/9DIsXL0Z5eTnGjBmDs88+G08//XQOe28YhmEYhnHkkrcbwF/+8pe46KKL8NOf/hRRFOH888/HkiVLsHXrVnzrW9/CX/3VX2Hfvn1Z37v66quxfPlyrF69GmeccQYWL16MRx99FB/84Adx33335X5HDMMwDMN4y/RHwQU5+Wdat2zyVgIuKCjAF7/4RVx99dWYO3du5ve7d+/GOeecg5dffhlXX301fvnLX2baHnvsMdxyyy0YO3YsnnnmGcyadVi78MwzWLZsGZYvX45ly5ahsrLyHfUtcD5GbNjosoPKboX1NDoWSOhdho6yGs7iROtU2N6DbQu0fkZrUxgRO9Qq90f0S9t5kOYn6VVxUrSs1tqJtSi9EW+D16H1bYkad7FtOl5ZmhzWweh+cXxZm8p0Y42O0vnpqC7ZSHFppLsRYw4g4X7q6CeKttNaS54PYZnUJor4Ld3nZtJG6vgnto9h/ZFajueYPg9E1Fy7slQZZrxC0na67qHjvlyP1Liy7i/rnBwigjFUFk7DwXZLoY4aIw2t1lYFZHOUaKsXrdPl7/H8UOd8MlSE3DDr1/NNHJNS9WeR15+lF1a2MNzG0YCJvlZQP+k4xmpuRKzfVFGArHfTx4DPi1Brtnmc3dDXGz0fYo5n07F0evsDv9dzjbWCB6XeVcwVNV4y2lCvk2LvtJaPdX96nSJSUl5jogH7Gv0d46gnb08AL7vsMtx+++3i5g8AJkyYgB/96EcAgN/85jfopRP4pptuAgBcf/31mZs/ADj55JNx5ZVXorW1FT/5yU9y0HvDMAzDMN4piQty8s/I5n2pvly4sN8ItaenB/v397/F19XVhT/+8Y8AgIsvvjjrOwO/e+CBB3LUS8MwDMMwjCOT9+VbwFu29LvfFxQUYMyY/rLA+vXr0dPTg5qaGtTV1WV9Z9GiRQCAV1999R1v3wUB3GEbkiyHeCoV6PIfp0ukd+568xuk/5yEOnGBS5PjpSWEowSOuNmnXGhrh5B+1mUDTviI1PdESXaiTMCI12/y6y+Vfebyk5szXbRhrf+etr/gElDcQrYfc2eK5YK9fl+hS4VUptIlpoDKJ4natkgyaJPlmr6FPvUkenataHNUKoq0BQlZZbBNT6LWz5YqiX75aRjLIGFPkZUEQokbyqbF0dhqhJVJLX2PUgayvlM69JzNLpn7tkRJFaK5/qm+a9wp2oaTOIASeEKVnBA3+bnClhp6Pos+lsv9Cbdu931Wdi5iW7qkSVZG0USZSpPs9ukpWUkgPDenymtdRPY+6b2kkdalfCrnafkGj1EyVlqQuNd98og+r4eziOHyat882efCbWSPRdKLKJDPHxK6FjllEcPnLpQdFp8jTpVahQxEy1jGUbKOtquivuhjzukcPL/CCjmWIlVF/R1J6Gdt78X2Ytp+SaTzqBSfqNhbLqVVOo84lmoc4lGHryNhPp6SBUhcrp5D2VNAzfvyCeAtt9wCADjrrLNQdFi/sm1bv5/TYDd/AFBWVobKykq0tLSgTf2BNQzDMAzDMDzvuyeAv//97/GTn/wEBQUF+O53v5v5/YAtTKn+XylRVlaG1tZWtLW1YdSoUUMuB/SbUA7G5s2bkcLw3zUMwzAM453hAMQ5ejJnr7hk8756Avj666/js5/9LJxzWLFiRUYLaBiGYRiGYbx7vG+eAO7cuRNnnXUWWlpacO211+Kqq64S7eWHo406h9HgdHT0a3De6OkfgCHjYObPn4/GdTuRNPTrfrQ9AFtvaK0d6zOi+XNEW7zOa99StdWiDbSNeLvUPrFmL1GxZ2zLEM30WrtAx7Y1Dx1RF83y+rakYYfcNul1WPMHAKm6SZnP6V17RFtI2pdg83bRFpCOUVuEBKRpc3892X9evUUsh2FsbRKK6otmSf2hiF/ST5JZF6P0dAVrfJwUlO6GLUk48gqQcWa8bzoeLd3g1x9Vqei0CRT9tH23aGJdYdih7FZ4OTVvWO8UqRgqtl/h8dL6RmHnsVsefxHppbVc1BZpu6Ydfj3D6eJS02SsVt8EGrNVG+X26BzlyC13SGot49ZWv/6JE2S/6ByMZtfLtj1+bINqNUY0N4aL3NOaLD63kp1ybGO2/iF7l0RpzFj7FqnISj5ewQGl7WSNprbwYVsjbS1Dxyv13Dq1SrJpGVPp16/Ol3DWNP/DbjVnqV/aIkjsn7J34uOfZb1DtldOW2yR/UpEfe5fKcUl1tL5qS2I2NZIzY0UzcV4l9TrcQydvh6I80KdI2mOKT1O/v1x67f6Nq057Dm8HkuFHXG8L24ADxw4gI985CNobGzE8uXLccMNN2QtM2VK/0V/x44dWW1A/81fa2srqqqq3tQNoGEYhmEY+cUsWvJH3kvA7e3t+NjHPoa1a9fi4x//OP7zP/8TgX6jDcCcOXNQVFSEpqYm7Ny5M6v9pZdeAgAsWLDgPe+zYRiGYRjGkUxenwD29PTgggsuwPPPP4+PfvSjuOuuuxAN4dxfUlKC008/HQ8//DDuvvtuXH311aL9nnvuAQCcd95577hfQSqFaFJ/GSgr5YDTJNSNKluLRAeU1QYlMwj7BqiSk3adnzzR/1CgkgbIDkWUfVUJWDjXq/JpQFYyWUkTlPChS6Zc9tU2LeBS5fga0eT2+zJFrMpPwaJ5mc8FO/b770yWJbmgg2xAmvaLNpGAoMqPbK+QVX6mkoy2ykERlZFKZOmLj0GWPQmthxNegiJZYo5qaIz0MdhMpcO34NSfGu9tTnQpj+2KYjUXuWQW0Tp0mV+Ut4cpBw4noYiVtUw0zssDQnUecFoKSy0AIMV2G5Cw1Qz/b1fbxaRG+zHRViIifaFDHeNSlcDC0PkalsmyG4/RcKkgfKwAIKRSYrzTn2d8vAHAkTWOU7KZqM5fU4azTQlV6ZjPi+HmTTB1kmjj0j5fM3WiRtBCJdnxSibTRDIWnY5CP2tJQ1Tj1xMraxS+BoRK4iDmKdk5AUBUPkQiir7WsW0Op+8AAM0/neLj+vx8zjpHyCop2bJNtPE1OuhREgo+f+rkXOmp6f+e25j750HOIWc2MFbhziZvTwDjOManPvUp/PGPf8SSJUvwm9/8BoVKU6e59tprAQD//M//jI0bvdbnmWeewe23347Kykp8/vOff0/7bRiGYRiGcaSTtyeAt956K377298CAKqrq/HlL3950OVuuOEGVFf3/y/ujDPOwFVXXYVbbrkFxx9/PM4880z09vbi0UcfhXMOd9xxxzvOATYMwzAMIzckZtCcN/J2A9hCj7YHbgQH45/+6Z8yN4AA8IMf/ADHH388br31Vjz66KMoLCzEGWecgW9+85s45ZRT3tM+G4ZhGIZhHA3k7Qbwn/7pn/BP//RPb+u7l19+OS6//PJ3tT9ZDAgG9AsppE3S0U9C70S6JL0ebR8j7BC0xQnZVWg9YsI2MGQtkuyUdiFC06Y1hiXUL6XlCjhiSemU2OoFyp6EbW2csrEQthzl0lIlPEDaLrJzcErrEtN+B2p/QrZN0JFHpOWJqqS+KdnvNTrh7BmiTdiTzJBJNAFZXGjrErG9GWRdkpbHmI9/NElGhoWsFVPRgxxZp48P6/7YLgaQ88Gp+cY6xqDba5MCpT9NSAsXqLnOli1aRxaSBU2gLDt4HPT3RD+1RpPn6TAWQQHp9bSGTVhjKK1lTOMcKQsnnt9BlbLUobmZbFMvrrHWU81Td8hvLytejq1sqJ+J0kXyOrW+jTWUw8USZtma0HqCEqlb4/VEe5plG8Ubsv5Vb5uj2YJ2qbUUmkl1nomxrJa2KQlZrGTNDYqiY42uhvWuAAC+TrIWVttvkd45VNpEPj6J0pXyeaGvyegbWjvKlkupdmWXRvsaHpRzquhwX4L0MFF/7xkB4py9BWxPGjV5fwvYMAzDMAzDyC3vCx9AwzAMwzBGFg45fAs4J1s5srAbwEFICiL0TB0LAChcJx/Pc2lK24UkY+kxf4sqyfA6lDUGJvrX8sMu6XLvUr6M1HXiVNFWupEsUKjcEMyTtixBp19noMuIVG7ihAhAliLcHJmqIRI+tP0BlcX2fVb6Mo573Jfe3FaZEtI7xZeYUvv9uB+88HixXMUmKimt2yra2FqCxw6Qjv665MOl40BZ+Oz4/LGZz3W/kX2OyWIjNXWyaGObiaCbyjU6jYXKvskeVZokuwjX0irbqFwX1MnSsbCIWKxyrw/6fY+U7QyXV9OzfLk7Umkswp5E2dqEsT+OibLQ4BQHfUFuP/+EzOeKJ2TyDKeGBOr86avxfUmlZEoIdlIJkI5H95kniMUKD/nyXXeN3J/ytf48CzqVBQkdy0DZDqGQEkSOkQkinOqiky04QaL35NmirXgPzanX/dzTZdGwgkrFxcpdodyXb7v/Wvar6H9e8n3WSTrbd/ltq2tfVD0283n338gUipqXfJ87q3xfSjdVyn6xJKBblTdZ9qGvRVupvN6qLXxonarUniz2tlNdVXKMih983n9NXTPjem9LVbDdz430BFl+7pnnr+tlr6sUJ7ruigQUAAH9DUh2S+savn5H8+Tc4O+5IinLCCkpJimXll47z+g/X9M7BrdgM45erARsGIZhGIYxwrAngIZhGIZh5AWLgssf9gTQMAzDMAxjhGFPAAch7EujaGu/ZiPLJqPHa1OCchnvFOz1ViJ99Sq+jKxZAmV/kpBOxanIoKDY653KXlO6GNZTcbyPsq7h+CqnLEjcBB+/BaXJE4qZtVKTFYz33+N4N0BavbDmDwCS0V5/EpImDwCCFt/Pzulew1T1jLLQoPFK9PGhMembIbWJBc2kk9QRXqSFS0jPBACTHiIdmda7kU1DvEvqdUKOF2MdVqGcN8kGr6+L1LaTcWS90SdtJoTG8JCKtiMLknCzsukZTfOvQO4Px4ZFL6/361C2LGxzlKiYONawaYTFxSgZczb6eX+csyx1yCImqJdRY32jfF8KtkjrEp7DbIdStlqOSUKxhOV16twl/Vk8QVqqhGSxk1QpW6MOPxfjdRtFG9tycEwkAGGjVLpG9pOvP3yeD2uNorS9rL0tU5rjhDS0Wu8o7HfCoZ/aTHxoh9we2c6k+JxX+tDeBdMyn4valHURn6+dss+gaySUFU9wgMahXfa5oMFfmwq2SJ1fOqTzR1m4BC2kvRzl53pql7x2hz3+e/FYFenHkZLN8voZD2OHxDYwWXrUvV5nmF4k9YEpOuaBumaObuj/ORw6kfA9xYyg84c9ATQMwzAMwxhh2BNAwzAMwzByTr8NTG6eAJoNTDZ2AzgILk68C75KBeASY6yc2Nkage0BACDNJUZl5wH62Sk3eXZ7d83qGT2VkVKlvgzCpQAAiOOhHd4jskrJWiqhlIseZU9D5cf4gCxhcMKHtnoRZV81tsEu3+8ycqVPb5MlpSDlS366RB9ROa2wUR2D1la/nCrrxJS4klKlfbZmYVsWAEj4+PTJ4xNTukiKy6La6meYtI9gt09VEOU/yCQYt0+mL7g0zSNlMxLRsUw6ZamNx5PLyMkhZa9BPzudZEEJEllJBsKWQ9lr0Djr5BEm2iPnW+kBPx9ifW7RHAtpnXGLtPrhvkS7pWwh7vKlNm2UwUkdUbMsPwvbETVGcEMnlnBJPau0OwR6ueQgJXMUSEsQTtJx2maE5BtJk5xT4tgpmQlfD9Aqx5YTSyL6HNP5CABFjf6czLpGch/1vvLxKZUWQfFBNW/5e/sPDNnG80GfdyApBlsSuXZl/UX7ENVIaQdonbG2SqLriFNJMKASfdIk2/hvReEmKR2I2a5opzzmFYctd6LuNzfXjKMHuwE0DMMwDCMPBDkzgrYouGxMA2gYhmEYhjHCsCeAhmEYhmHkHpdDH0ATAWZhN4CDUVgAN63faiJQlgNhC+l8dIxWlX9lv2u6tIsoIBsY/Wp/7wxv4VLwmozc6jvWxx6ly6WWp3SV19d1zPdRYMXVyrYg9jPfKe1Ob7nX/BSsUnow0i1FY+X+sD1NsGieaAsPeC0Mx7sB0uqFNX8AsO8Cb11Q1Oa3XVE4V66jh/Rte5ROiWg/VsajlZEdRVAqrUpSpFtMj68UbfG06sznvnJ5ypTu8PsXbVd2KKSniumYxKXSeqWQdHdJtYyTikf7cU5tkHY4AWn7OAIPAMJxZJXSJrVC8VSKHlyjIt5I/+gm+P0OW6W+yZGNRdguY/VYWxWOUpZHdAwQSUVdMGeG/6xi1cJGrwNN10k9Vdc4P0bSbEPq6QLSfaYq5JKObG26p1aKtpINXhN4aJG0iBlF3zu4oFq0pbr89aG0S1p2cBRh0qEsTyZP9J+hIB2jo7i/aJLsl6N1ds+TtjkFE/34hQfltrG/1W9b6WSTMX7Mwv1S78jHvPdUGT1YvN4fg95p3pqpYI3cdN94f10MxyhLnUM0x5Rmjq2YXJm0dwqn+n13O6QuLqj30ZqJOieDl9f5zypSsm+Gv66EvTH9XtpOsaaue5S8drOGsmSl1H2DdeCF8nt9833UYeq5daKNbY72njNDtNXe6+df9+JZoq3p+P597/svux0YadgRNwzDMAwj5zjkzgfQHgBmYxpAwzAMwzCMEYY9ARyEIE4QHuovjSTl0lYg4LLvOFny4Uf3B6fLR/c1bEExXpb5umuoDBvIe/KCJl8yi7plX9iZv30irb9Ilk/KN5KzfCLL1q3zfVlnzDrZ54BKwNo2w/31ZN/HHdJuBZT2kNovy4Oc8MFWL4As++79K/+/wtEvyXU4LncqS4iQSnut9XJ6lz1LyQlFal/JfqW7Wo5z2Va/73GRKjKyvYdOJSn3ZWYu+3ZXy3JT9AyN3+Ra0dYy25e0aner5JluX9YJdfpGO5X2VHnY0fEJq2WJnu0psNOX6JNJsryVHu3XWbBPHn9ObXAqvYTL4hgjpRAhJdZAJdbEtK8H6+W+dkz0+1O+Vp4/nNYTU1kx2tsqlmM7FDetUm67yh/zzmq5/vJSPw69ZbKNS8BxkxojtrlRSSB9E/24FOyWpVZO9eHjytY7gJRo9JXLEmbx695GxynblICTbiI1ll00N1RZlFNdijdLaYfrItkH2cBo2cKBuf64jn1NSg6SUb6fYaTmLMkFesfJa19Bkypx8zrpnNQWPgnb4dRUirZ0GZXhqbRbtFduKy7zbW1T5PWmoN2PQ4m65rM1UzhhmmiL2nupbZxoS8gKqmOSeqpGfyuCtHwW1juq/2enPY6Mox67ATQMwzAMIy/k7CUQIwsrARuGYRiGYYww7AngICRFETpn95e8ShpbRRu/vYeUvH8OD/q3Msfdt1muk8uDqzeJtlGd/s2uYLQqMVLJp69OlsyCPr/suEf9W5KxfgtYOb8zYx5t9T+oFBIOfI/mzhRNbrV/e9RNVm8g0tuJBy88XrRVPePfZNUJH/y2L5d9d39Urr/2Be/uH/TqdBTf57r75VuzoLcF4waVUDLLv21d/uI20bbnPN82/hG5TkdJA4FOCaFyWsHaxsznQvUGMur8W5/JGjlvajZSyoV6k1SkNtRKWQE2+X3oOU2+pV2ynsqdKlCej3nvsb7MHz2xSixWyOUn9baoSJDRqRBUrkvWbRRt6Q+f6Nf/jHzDMarw2xjzmHxzuXiRf5szaJdluITOV/eSX2fb+SeK5YqbvJwj1anSZVr8Ma69S84NfqO/+vey9InRVI6k+QUA2O/LsIlKxAm7/Bi1z5VvPJdu8290B/Q2bKDKtZwoM+q5RtHWN92/xeoi+fQl2ubndzhjimgDlfpjVXKOqn0/m5fIt47HvqgkIodJT5aygtpn/ZvESYksmXKJNq6tFG3BWj8fitTx5+tBrOQi/OCpb4JcZ7idzvO18npd3O3nG6jsOuAckfm5wB+TcQ9ulW0kcXAT5DEOad7EG+T1IJrr3+DVfU6RrGD6vVpy4MezoE1eM6Pew9fFPL0lYU8A84c9ATQMwzAMwxhh2BNAwzAMwzByjkOQsyeAzqLgsrAngIZhGIZhGCMMewI4CGFPGqVr+l3jXbdMAnGkOWObFABIU+pAqBzcHetPlF0Ia2ugkxNaWv32Evnav0iU2OKXg9YAsi1Hp7JUoZ85BQIAEtL5BHtV4gbtg7CmABCTlrBik7RzQOj/zxGklBULJXyw1Qtr/gCge5zfn1KVJuEO0bLjpcYoYG2a0l2xlQRbJgDA+N973RcfD43bKzVg7MyfJhudUGkteU45nYDBy/XIuRix5vCgTPtISPtUvPWAaOub6PsVrlRpAjQHCl/xuiU1Y4XFTaDOEdkROc5O6bCYolUN/mvqHGFrjJSyril9ar3/YUyl3B6PJ1k4lT/TIJej84AtVABpgeN2yrQXPnZQx8ftIH3oqKHtg1yf1GSF63zfikqk9jY6QFo4Gnct34pqyf5mnzx3C0gP1jtVWlkFNPfj0TJVI9pNujV9DaPvVa1VljRt/tgV0LUiGSWvN9jlE1cCPU84uUXZR/E1BSrpSCRpqGtFapvfnk5j4fkXqO8llErD8yvcLHXFhXT9cRXyuo7dtK8qbSomDTXU3xg0ee1owUGVzlNB46nsvtJ7vO43Um0VW/u/Fyo5da4wDWD+sCeAhmEYhmEYIwx7AmgYhmEYRl7IVRSckU3gnH7GPLKZP38+GtftxKmlFwBQJR6o0qGTj9K5VCASDyBLWAiViz4HvOsSYIlK/+C+cMkpeuc27nrbb5ZQJ03QegJVCufScaJKoRHZiXCpUB8DHuesPtMxCUpkCYsTCaDc98X31LET5ZQCuT+idKQSHfg4a0mA2PQwZVHup0v3Db2YPv7DfC8kGxoxL9X3ArKE0SVzcQx0OXCYfom+qGMgzh9la5Jw6knxMOeEtvqgn4PU0P/f5Ta2UMlarkCuI6EybKTKfLyepF1JIYa77IY8DkOf1292LNnaB4CUoOjjQ+daqM+fIcrp/T/6/dGpNCIJhMY5USXzkGya9DFww5RkeRyyzl36XtZ5RuViva98XmTNG56nXHIe9ljJbQ93DRvuPH+z567+u5F0eIlIWKYShQ5fv//ScjemzpmANWvWDLn9d5P58+djW+cenPbzz+Zke3+57E5MKR2fs/07ErAngIZhGIZh5ByH3GkA7UlXNqYBNAzDMAzDGGHYDaBhGIZhGMYIw0rAg+DKi9H5oWMBAGWbW2XjLv86vbaLYBIVgRWwvkXrCunnVJ2ME4r3eWsRrX0JyVoiqPKRVGkVcyb0bdp6hTRN4dQ62UZxRTomLjng7Qj0/oRVPpYs0PpA1kxpzRyvg20flLUDW73obXedtSjzuXyljMBKk14vqlCaH4pZ614io9OK91D8VrfS09F8QJ8aIx6zOT4KLNglbTlcix/LaLyy+iFrmVBHyJGOLBxfK5p4DkT100Rb0O3HLFHxcmK5Y7wFiVuzXjaGft5EM1TMWbO3nXETZL9C1r7tkbY5QcEwOslmsttQkXtsSRN2KUuNJj/WQmNYKo+/2Laas/GO3X45peUMWL9VIPVnbrrf90hZhLB+S2soWS/KVkL92yAN3R6yMdF6uhKv8wqUNQ5IX+dK1TWM9K46Vg8UbZg0qXg31rhNl9ewcDudI7U+9iwiKxQASOoperCpVa6f5k08XsUevrQ287H7jAWiqeQPr/lVqHFOTfXbQ1rZDpFukeP+AAB0rRW2Vj3quk5/A5L5M0RbQFY/0Ri1P0SsrKWCOh+LmaU4pPHU53U0zs/FIJTPfQ6e2h9tl/yv0k/mApdDGxirAWdhTwANwzAMwzBGGPYE0DAMwzCMvGBG0PnDbgAHIeiNUbbpcFlOW0KwHYa2aKGS38ELjhdNFfeuzHxOTZ8qvzbZlwDcy5tFW1gvlxX9bPGO+y1/NT7zuWxipViuYI8vRQSq1NF+LH3vqY2ijUsmcbtMmohm+bJfmGXFQikHKVmo6Jvh3fELG2UZifvSWu+nZt39O+X6yWE/UGUkLvs2nSXLLtUPUXmrTKUcsAVNJC9IIaVsdMyTJdpStkrZKst8qckTM5/jQr8/XSdNE8sV/5HSHcZVirbeY/yYlKzfK9oSKm+KBBQAqUm+VORaZTJDPNWvM1JlK1HK2+uPT2raFLnt0WQl0aCOD50jQZNMIeG0jGB0hWqjvhQMnaTTsWiyaOuo9WNb++g20SZsQaZSaVL1y5E8wI2TZdcw5aURrYtkSbtytS/fH5xXKdqKWnyfC16Rx0dIMZw8f5IFs/y2d6nx4/IdlbSjWpV6Q9YlvZPHirbCrZRCocu8bHmk7E+4XByqxCJHxy5oUQkVbMVCJWxtqdM2y8s+ykpkW3SIpCP75ViCypvJIXUtmjnN93lTg2xjaYmy5WFLGlTKeZqQfITTmKJ2dS5V+f3pmiCvN5g4N/Ox/MlNcv10rY3GyeOarvJyh2irSqWhc6T58hNFW82vVmc+9yyeLdraJvfPo2RoBYZxlGI3gIZhGIZh5ByHIIc2MPakUWMaQMMwDMMwjBGGPQE0DMMwDCMvONMA5g2LglPMnz8fja/vwmmjPwFA2pYAMpIqUhYN8X6v19GWHVmxPYSI5hkuVotsX/o7R3YOpBvRtgXxfrJs0bFgFIGUFUnE8Us6TorXobd3oDXzORrGgiJubRVNwg6B9DlsoQMAIF1hvHO3aOJIKn18eLy4j1nLKksNEeOkLWloWR33xOuMW7wOMysqi61s1PEfNmaNdGRZ0U+stVP2QQEtmxyU+kARIcfbVpY9UYXXRem5LS2P5HxzfUonNeT31HJ0meJt9//C71+itKpDxWpFSn/I/dT7w8dRj5eIG0xUfBmtU/dDRIHpecPnk5r7rtPbk3AMYZZFFGlcY2VJxVF6Oi4xpv1LTVCWRM1eE+rUOSL6rGLpRAQjoS2ihL5aXW9EvKSe6we9JlDrCnlOxXqusz2Wjpcb5rwTekGOe1T7E9B13bUp3eIwsaHiuqj+PPM4Z0UWJkPHWcZsNaWvi9X9P/9ly39h6szanEbBNXTsxV/95PKcbO+Fz/8M08rGWRQcYU8ADcMwDMPIC4lp8/KGaQANwzAMwzBGGPYEcDCCwLv6q7Iol09iSsMAZDJHOFa6uycN3p5Cl4e5/BBrB3cqVSUtcntcpuAEEU4P6V8/udUXyJIPJ25kpZfQ97KSBmgfnLaIIad8LlkBMoFBl+ECXmeRL2/GKtmEy7y6dMMJH9rqJb3N25Xo0jSX71NTZJKB20dpEirZApQSoUt5PD+EjYqaU+ld3s4hqpGWHVwSdmpuJB0dtJgsWXEpLKukSfYePJb9v/ClSi4jBZEsb4n5oEp+3K9IyQOSLv+//eFkEjodgY+PTvEQyR1aakF942OuJQBcvtMlZi7fRzOUHU6jn1OhaguoJBdv3CLa9FwR66Tj7FTZMtRyiIHltHSApCupCeNFG89LXZrkcUj2Swsa3rbTJUbqZ9ZxpVI4n/Oxup7xOeLUtYjPg6RN2sxwKTfU84askrSMIaDklrBs6FJ4VlIH2+OMosQVZanD1z6dXsPriPdIKyues2GJKitTyT7eI22huFycqlByIZauKHufgQSTwNRgIw67ATQMwzAMI+c45M4I2m5vs7ESsGEYhmEYxgjDngAahmEYhpEXzAYmf9gN4CAEgde/BSryKE26C9bdAUB6h9cDBYVD5+okylomqvHbCJU2iO0wIqXlEbFdfaSzmag0P9t9v7RWSOxfqOwb2AZGae1Yb6IjvVg7FFYp/QxbsRySWp5Uue9LQBYHIcXOARAaukTpA1k/pTWGwpZF6ZtS03y8mNZdiWO5v1W1kU5O23lM8RFi8bYd/vfVUucX0vr1toXFyTB2K1p3xdYbodreUNsGICPYSMOWpSOsrvbb6pAaULak0TYwrOXSGjChr21RGjDC9al1jhraRonti1j3l1IRWxwFl7WvrGndIW2HovFeE+r2yWhDPncDrbuin9laCgAiivHLspahfQjDoQs4PGeFDg7qnFS6OBFDVlMt22huJko7GPE6lYULnxfielajjgGdu4HSjgYcE6iuRbx/rl1eU1i/FzfLc15onDuUVpl12Xousn0MX+vKy8RifG3V5whYf5hl2+XXqeciaxyz7FzYdqhcXg9YVxiomMWBqEC3V13jjaMeuwE0DMMwDCP3uNxpAE0EmI1pAA3DMAzDMEYY9gRwEOLSQhw8bRoAoGybKgdRKcIp64DUeO+cH0+S5ZOQSky6hMEO+KG2AeEyjyodg8o8B0+amPlc8WdpORFSKVQ7xCe1vqQQjK2U32vzfc5ysqcShi5vhbNn+LYDsnySUDkypUom6fF++93VvhxY/uI2sRzbGOj96V4yz/c5kv+zLP3Ler8KbfVC5a2dnz1GtNXd25j53HLqZNFW+RqVlTY2iLakyZcE+z640P++R5bdwuf8cvHJx4m2wm2+vBWmZanIkR1GUCGlCgGPbST/n8fjHLz4ulxnL6VLnODHIdooS+0ixaFWlaK2+zJpsmCmaAq7SKrQKst1PF7RMfWiLV63MfO5b95U0ZYu9eeTMohB0kCl93oqydPvASAki5hwnDx3QSXA3lPmi6biLd5yqfd4KVXoK/fztPQPq1XHqLSr0mVEGVuV0ONj/L4HqzZkPg9nVZLMmyaagnZ/HQnbZfnZ1fvzwh2Qx6d3zuzM56JVDfJ7dF3UVkkBJ5ZMpfOuSUoADi3x41eyR8lk6JwJelSqCiWU7P2beaJt3J/IEkvbdlGJWyfPsCVWqk4moiRUXu2r8Z9T7SplaZuXC7WcPVe0jWrwJeeCrdLOheUJOkWl6xgv7ylZL7/HySDpGmkDU9Du19kzS+7P7g/0X2v71uZDixfkUANoWkONPQE0DMMwDMMYYdgTQMMwDMMwco75AOYXewJoGIZhGIYxwrAngG9A1KqsN1hrdVDq4rrne41R0fZW0eZI9xco7Vs83es6UnvU90jn1zVHamtKV3ldVsVqsqBQmqyALA5ckdTMhc1e66Kjn0Dawb6FM0RTwRrS5al1YoePNtvx+WNF06SHvG4lURFI8TSvySnb6vu15zyprRr/e9q2ssko3uPtFsKD0nohYTuKfdIag20zWPMHAGv/0esr594ovwe2/jh2llzndj8ORXtJr3dI9svN8Lqu8DUVGTaR9DrKZoQtb4LpStO4xmvmus5aJNrKXmjw36tVejfSn7XM8jqiym0ykoqjxlBaLNoCiqGK1jaINnBEndK07r3M6yTH37NJtLG+Fluk9qltmY8QK9khLS7YmsPt8t9r/Rs5JsUtfr/3z5XrmHKnP15Fe+Q5z3O4UFvqTCL7mPlS0xi83uD7qO2XSGPWOVVaGRUd8GPGViVJS6vcNq3TzZB2K3GZP5Zdk6RWrPjRl/0PysKp6AWaf3pf6Tzc+kmpMat7wu9D+yS/7apX5CpY91fQpOLedtO1YvIE0eTI1mT876VWNb2TbHuU5c2BJf56nS6ST6HG/OxZv351nT/4AX89qHzVXzO7J8qxTJ88zS+3Rmqhw73+e26U/HuQVPqfwy07RVtxo9cx9tTLvwdFW73eMeqUesSkptKvs1uOQ9+o/mdjLk+PgyyBLn+8b54A7t+/H7W1tQiCADNnzhx22Z/97GdYvHgxysvLMWbMGJx99tl4+umnc9RTwzAMwzCMI5v3zQ3gV7/6VTQ3N7/hcldffTWWL1+O1atX44wzzsDixYvx6KOP4oMf/CDuu+++976jhmEYhmGMaJqamnDddddhzpw5KCkpwZgxY7Bo0SJ87WtfG3T5Bx54AEuXLkVFRQUqKiqwbNkyPPTQQ8NuY82aNbjkkktQU1ODkpISHHfccfjBD36ARFW+3i7vixLwH/7wB/z85z/HF7/4Rfz4xz8ecrnHHnsMt9xyC8aOHYtnnnkGs2b1l9yeeeYZLFu2DMuXL8eyZctQWVn5jvoTJA6pzv4BdiWyvOl27xvsKwCA4jXeWqJzobQLKdriy4o6VSO1l8qwuix6wpzM59LVu0Qbl31aTp+W+TzmoXWyz2yb0ifTKnpn+HJNQae0HGALiujZtbKNXe5LVHlwhi+t1P1GlmS4BB1WVYo2ts2Ii3w5Zfwjsgwiyl3K1T7o9n3umCdLUSVkM6KtKjjhQ1u9cNl394fl98Y/Rdt/bb1oA6VzdFOpLZkmy3qlz27OfO76a1lGLt1ANhYVssTkyP4i2CjL1iGVlUsfXyP7RfseqyQVTgyo2ESlw77eIZeDsvpJ03/komPk03wufwcl0rRl/N3e1gTKiiVe78coOHa2aHOcPLFdJnXElGwRzvNjO+YhdaxqvT1R6XpZIotpnA8tlXKESjqfDi5UfaayYuXd8hhwyo5O5wlTfmxL/qSO3expg34vnFonl6OypVPJHCmy4ileKa8VnF7jVAJG7yJ/LItel+dkTHKE6Xc3ibZk49bM5yqyiIpf3yyW677wpMznnmp53S1P+Wum2yavg2yV0vFBaeFUStempFFa/1T9nvZdSSEcpexoyU7Fej+2nVPJmkm9yzDqVX8t75tQKdo6J9P5+YQ6Bu1kv5XI+mjbcf6cLP/9KtEWk8Sld5a8ThWv8rKZzg9KOU/Zzv6Oh/JPQ85IjkB7lhdffBEf/ehHsX//fsyfPx8XXHABDh06hLVr1+Lmm2/GihUrxPI/+MEPcM011yCVSuGMM85AUVERHnnkEZx77rn44Q9/iL/7u7/L2sYzzzyDD3/4w+jq6sLixYsxbdo0/PnPf8Y111yDp59+Gr/+9a8RaAupt0jenwB2dXXhS1/6EubNm4frrrtu2GVvuukmAMD111+fufkDgJNPPhlXXnklWltb8ZOf/OQ97a9hGIZhGCOTpqYmnHXWWejq6sLvfvc7rF69Gr/61a/w+9//Hg0NDVlytPXr1+O6665DUVER/vznP+Phhx/Gfffdh1deeQVjx47FNddcg02bpOa5r68Pn/nMZ9DV1YWbbroJzz33HH79619j48aNOPnkk3H33Xfj5z//+Tvel7zfAH7729/Gli1bcNttt6FAPc1hurq68Mc//hEAcPHFF2e1D/zugQceeG86ahiGYRjGu4pzQU7+vVt861vfQnNzM1asWIHzzz8/q33x4sXi51tuuQVxHOPKK6/EySefnPn97Nmz8Y1vfAPpdBq33HKL+M5vf/tbbN26FQsXLsQ111yT+X15eTluvfVWAMCNN974jvclrzeAr776Km688UYsX74cS5YsGXbZ9evXo6enBzU1Nairq8tqX7RoUWadhmEYhmEY7yZdXV248847UVZWhuXLl7+p7wzo/N7Kg6vhvrNo0SLMmDEDq1evRkNDw1vpfhZ50wAmSYIvfOELqKysxPe///03XH7btn4Nw2A3fwBQVlaGyspKtLS0oK2tDaNGjRp0uTdD0NWH0gGrjOpK2W/Sm0TVMraN44NKN0hrjIT0Ti4txRb8fxOO8wGAggZvXeF03FeHX2dpk19nUC6X45gmpKT+sKDZ2y3o2CHui0tLWwER/bRXWarQ9+JOaaMTkrYmUfFLpTvIvoa8AbQNA5N0qPWT1Uep0j4lPWQ7skNqxThSTsS7AcJ+RWj+0B8bOEBK2WYwrMEJykpFW5q0ViWbldULxw02St0VR4gl6tilyPonGCXnA0hjJLR8kHY46CNtWoHUZAVs/aM0bMLXYaeKq6Lj7zqUHQ7Nh1B5Q7DeLWqW2rQqjrDKilmkCDHqS0zRfwAQkFYwmCM1Ujw3KjYrexI6BqNfHlof7FRkIdumuC4ZxxYeIg1YkdTXBk2tmc8x6cOCLmmpkya9a6pV2sAMhzvkz7W4tVW0FbT4OZUcUuckW6zskdcDoXGk+LdorLSrqnjJn5ParsoVkX2QOucDOs/L1qpjQFZDWXop0v1pfSDHc8ZKlx3RsSvd4dsC1eeEtKPJFLmvpQ1+/iUqZpPPA93nipe9tZR+DYDnaVwizwPuW8VadX0L+vuWDw3gkWYEvXLlSrS1teG0005DSUkJHn74YTz66KPo7u7G7Nmzcemll2LiRG8T1Nramrl3OeGEE7LWN3nyZFRXV6OxsRGHDh1CRUW/PnzVqn5958CDLc2iRYuwZcsWvPrqq5g2bdrb3p+83QD+8Ic/xAsvvIA77rgDY8eOfcPl29v7L7ylpaVDLlNWVobW1tY3dQM4f/78QX+/efNmpDD0NgzDMAzDGHmsXdv/MmRtbS0uvPBC/O53vxPt//AP/4Cf/OQn+NSnPgXAP7iqqqpCWZl8mWiAuro6NDc3o7GxEccdd5z43lAPvAZ+39jYOGj7myUvN4Dbtm3D9ddfj6VLl+Lyyy/PRxcMwzAMw8gnLodG0K7/Ac9QD3/WrFkz6O+Zlpb+J9j3338/oijCj370I1xyySXo7OzErbfeihtuuAGXXXYZ5s6di+OPP/5NP7gCgDZ6EvxG3xvsO2+HvNwAfuUrX0Fvby9uu+22N/2d8sNlzU5VUmQ6DpeU3kz5d6iDPX/+fDS+vsvbXqj0hYAsVVyfLIuyXUC8a49so9KUtn0QZQrlsB8f8CWTsFxNBloPlxizziey8HBq+ByVipJeuT+MLtdwuTurdEwl7tRUaakSU4nWKWuRiJIzeN8CZRfj9pLNhHL3Bx0Tt1VZ0HASiC7D888bG+Q6OeFDWb1w2Tcok7YmCY2to/Izjzkg50a8ZZtoS030KTHpjqHnfqhKhendfpyj+qmizW33NhpBpGTAdDUOemm8umWZUtjCpORlhM+RWF2gQipvJWqdqTqfZhLvkaVjLm9xaQ0AIj6uen+ohBa3UPmxRpZFef/iCjmWXEwL1sv/cTsqBya6lFvs1xOOltY/CZWgAyVVcK3UpmQfjuYAyzJ0mZLPi2hfi2xjGchYKVtIq4QcwSY/N3WKi6BWVnTE+PH1TZU3E9628jljyyBto8XX03i7lEkIGxWn1lnh1xlWjhZt8d6hy/liOUpPCktUIg7N2aJGOWf570Ogzh8+l9nGCACSBn8MojFKckKWRGWvq+PItkM75N+m0qr+vyth37vjLXc0M+C/l06n8b3vfQ9f/vKXM20rVqxAY2Mj7r77bqxYsQK/+MUv8tXNN01ebgAffPBBVFZW4sorrxS/7z58Ed65cyeWLVsGAPjVr36F8ePHY8qU/rinHTuUVuMwHR0daG1tRVVV1TvS/xmGYRiGkRvezTd034j6+vo39aRvKMpJXz/YSyDLly/H3XffjSeeeEIs/1YfXJWXl6OlpWXI772Vh13DkTcNYGtra2aQNN3d3Zm2gZvCOXPmoKioCE1NTdi5cycmTZLZpy+99BIAYMGCBe9hrw3DMAzDGIlMndpfTSktLUVNTfbLVQMvZOzb1/8EeeDBVUtLCzo6OgbVAQ481BpY98D3WlpasGPHjkHvaQb7ztshLzYwzrlB/23d2u8YX19fn/ndwICWlJTg9NNPBwDcfffdWeu85557AADnnXdebnbCMAzDMIwRw8CbvF1dXejpyZZBHDjQLwkYePJXWVmZuQl8+eWXs5bfvn07mpubMXXq1MwbwACwcOFCAP7BlubdeuD1voiCe7Nce+21ePjhh/HP//zPOOecc0QU3O23347Kykp8/vOff+cbCoKMnUSgRJis+UiNl3E7adZnjJNtMem+QqXzA2lHXLN8RZ81WkG31Mw5+l5QSjYzpcqChmK0XCJtLFKTJvg2rSMizUx8oFU0RaxNUhoWXtYpDUs42j+y5rEEpGbGkd4xUfYKIekRtRaJdYypyRNFG1t9sLYSkBFYidbosTZxGDFv1vem0TrXeaf31Dj5P0fuSxCqUzI9tDcDa6F0rFrAWr5OqU1zZLiu9UcCsvPQOs+QLJBijubTfRlGH6pJaByylqOfQ2W3E9f58XQvyVgtob1l2xSlp3VUaole2yLXweentiCp8+dPpPTCbOcRNymrJJ7ral+TaX7eRq3yfGXLmJDtnpSuOCgg2xR1nrHeLWmT62c9YjhajrPjc01pbyP644W9KgqOLYnY6kfp7jgaUl/DAo6l1HYr2pJG9IuuN2qehlu9FjbRtkBke6Q120PqA0NlqUTbdmqcxb6rG4n4EC2rdIsp/ruizt2ku9V/rVxdD3b6a1io9Ny9Jf3r0ZGBueHdNWl+o229U6ZMmYKFCxdi1apVeOKJJ/CRj3xEtA9ULtny5ZxzzsF//Md/4J577sFpp50mlh/qwdU555yD//7v/8Y999yD66+/XrS9/PLL2LJlC4499th3ZAEDvA+SQN4KZ5xxBq666irs378fxx9/PC688EKcffbZ+OAHP4h0Oo077rjjHecAG4ZhGIZhDMbXv/51AMB1112H3bu9d+Urr7ySSefg9xuuuuoqRFGE2267Dc8++2zm9xs3bsT3vvc9pFIpXHXVVWIbF110EaZPn45Vq1bh5ptvzvy+o6MDX/nKVwAAX/3qV9/xvhxRTwCB/lDl448/HrfeeiseffRRFBYW4owzzsA3v/lNnHLKKfnunmEYhmEYb5JcGUG/W3z605/GI488gp///OeYN28eTjnlFHR1deHpp59GT08PrrjiClxyySWZ5efMmYMVK1bg2muvxZIlS3DmmWeisLAQjzzyCLq6uvBv//ZvmDlzpthGQUEB7rzzTpxxxhm49tpr8etf/xpTp07Fk08+id27d+Piiy/GZZdd9o735X11Azht2jS4N2EKdPnll7+3/oGFKaRn99uXFOyVqQNshxLvlK/Tp6Z7QWbf+ErRFlJZlO1iAABU1tE2MGE1lTtVeTihslW81D9yLnhBWpWEXLYsUGWD0b6MFKpyHZcHs9z3i6ks1im/F82Y4pfTZetiSs5QiRhxtS8jccJGwVppvcHJGVnl9DnT/ToK5b6y/Ulq2hTRFm/zb5f3fXChaCva60sy3ZPkW1fCfkeVcrjs23smucC3yOVCKj+5udNFm2vzcyOlSj7pnX5/smxtqPSpS2QhjXu8X1mEUMmJy+KhTlWhklZYoSxO2G5lsnxZiy2PoGwzQOkyIaU0AEC8w+8rJsgSevc4SsSpkmXFhMr+0XTfF9cs91uUHyvk+Zls8CXhvqVybhQ++7rv/snHiLZ0uT8GpQ+vkusc5q3AcJcvoerSJJcOuaSZlXJBZf74+FmiKdjsn1oE6noQUtky0fKNGl/21+Xb9C6/zqh+mtxeH5VMp3tbqPTq18Vy6Q+fmPlctEvut+OyqCrJcok2fbL0eCt43m/DqeQhpPw+hKrPyeaGzGe+ngFAusbP977RZPWyX1kl7Wv1XZ4pz4OAUnaCDdL6KeI5rOU1JHcI1ffYhijqUZZenMBUJa2F0gOpIXoOGUNyxx134NRTT8Xtt9+OP/3pTwiCAIsWLcKXvvSlQW/MrrnmGsycORMrVqzAk08+CQA46aST8PWvfx3nnnvuoNs45ZRT8MILL+Bb3/oW/vSnP2HVqlWor6/H1772NVx11VXZ5/zb4H11A2gYhmEYxsjAIXdG0O/mZoIgwBVXXIErrrjiTX/nvPPOe8svqc6fPz+jE3wvOKI0gIZhGIZhGMY7x54ADkbikDrYX9Z0umRKZRHt/M4O/j3zx4m2Eiqt6Tcv3Rh6K0+9Qccl4aBYBcNTybFnjF+uqEY68Tt+g7dPlgp7xvtyV+HGraKNHel1YHlICQI6BB1pKtHotzkLqbymAuy57Ntd7T8XqjdvQ04s0Wksu/zbll0nTRNtJVxyVuMQ0VutSY96o/KQP+bJNFnuDGidOuFDvO1LZd+eGjlvSvhNVZVk4Yrp+KvxEv911m+BjvJlHv0Goov9XMyaw7welWwh1k/fSw4dGnI5p9/QpHHXBQxRoutVaQ+c9lEg29om+fOpWJUtRZmE3tIMlPyA5ykfb0C+sRsXqzc9J/mklrhE9ivV6cdZywNEuU09AknPpLeAX5F9YYmMSH9RSTCc1BL2qrlB45A+JOdGxCkbKo3DcYLIQXlceYzQImUzvO8RvRHstKShlNY/UZ5nRXxN0W/b03pSbUpeQVICpyQ7oOtIoMaB9ydQ14pUK5Xvh3lzlt9kDrvkdap7gj8/i19X40xyGy0XSpfTdVElovCb2V1TZIm+hNI/+sbIud9X3j8fXJ4eB+XSCNqQ2BNAwzAMwzCMEYY9ATQMwzAMI/e4HD4BzJHW8EjCngAahmEYhmGMMAL3ZnxXRhDz58/Htg17cFrtpwEAiXKPF1okpW8TditKP5N0D62n4u9pq4JwdIVePENMWhth56D0YMMS+P8DuD65bdbW6KQJ1gRGKhMxafX9ikgjBUg7Dz1+qfFeNxk3e51PVCcTPeLde+mHYfZVa2QIp3Q9bCeTdVxnUN6isk0Rx0Bvj/RBok0txxrKRGmrxDEJh9b8cHJB/xeH1pxyWopOGghSfhyE5UiT1KaK76hts45Qj4meY0xqAunplOWRWEda6qk4HSG9r1ktLPcv851JE9UvSIepjkFMtjZZ40xoPSV4Tik9JVt26D5ywoe2euDLtUhnydKDUeqJ0pXyuZxlXUT2NGGx1oeSpnGY8y41bbL4mRNyeK7rdKGQNM6cbKSXHXZOqXNEJMGoucf7x8k2AJDesZNWIo9BNIoSPjjZRCVs8N+A9G6pPxRjqxJEeHtJh9SAcsKUTnjha3kWNMd0Pwf0vH/Z8XNMmTUOa9asGXo97yLz58/HpkNNmHbL3+Vkew1X3YqZFTU5278jAXsCaBiGYRiGMcKwG0DDMAzDMIwRhr0EMgguCuGq+kuvuqwT7/SO96EqrYnkjFmyDBK8utF/VtYyAVk46BJwQOXhrEf+RM+HFmQ+Fz3+qlwHlUGyLGgoHSHYJJ3luTSRtCu7iCoKilclLC77JntkcDrbrXBJCQCSalrnZCp1rNks+8xWIsqGIeIy8rhK0YZVPiEl0lY5lLgQn3ycaAtf80kQXX8tUxVKNvvyVrxFjl8Q+rHmhA9t9RK87PvlTpRpEqntVNJUsgJRVtJlRDo+2qaFkwZibdlB5dWg3M+9sFOl11ApUs+pmLYXqUQPcczVseOyb0Q2QwCQ3uvnESfuAEDXTL+Nwida5fZornBpkpNfACXf0KVcKsmlTztWNBVtIHuNqUoKUejPu+jPMglEdlKqcNhiKd24XbRxuTumVBWdzCGsf2ZPE23Bfprrra1y/VyGb5Ll9HD2DP/Drr2iLSbZR6JsWlgukiojeyw1ZzmxRFvXpMgORV9TXExl35PmyT43+n5mXT8pLcWp6xtfk/XYsoVQMobslpTVC7bT34oF8rxOyN4JK9fKPtP8i3TKDl0X0arOXS5Hq+0F2/w8TSbKedo7tn97yb6hJTPvJWYDkz/sCaBhGIZhGMYIw54AGoZhGIaRH+w11LxhTwANwzAMwzBGGPYEcDB6ehG/3q87S02UNiYhR/Mo7RNG+bauCVIzVbbR6zpYdwcAHZO9rUDxQy+INtZ1BNPqZF8avI4pSZFO6eT5YrnCvV6D45SFQm+117OkXu0UbWwJkpXYPcHrSJLNjbJfZKMSVlWKtmSctyAIdkuNUTzaj1HLbG8DUbOxQCzH/2vRdi4xRen1HiOPXQFbV2gbCxqXwm2yX26i1y2VbpB2KEmZ76eeKxwv5tq87QfHuwFAQvYUQvMHYO/ZXu827oEtok3bU4g+s03PmKohl0tNkJGFjixiXCfFds2bIZYLemnf1ssIQbbiSO+RWjHW2mk7ioii8zgOq/8Xfv71jZearO4qfx6WjK8VbQlbjXCMmorYYg1bx5lzRdvolV4P1lklj10RHQNXIP8/XXDA74PTkWFsv5TIucgRYpEao4S0fWzvkihLFdZy9qhrUekOf0zY0gQA0hxFqfqF3b4tUBYxCKlfKhoyTEi/RzrfSNkt9dH+hI27RBvoPNPaYY5cdI1yvjmKBnSJitw7yWsOi16X23MUDSdi7gD0TPHHpKDFnyPB/la5jnFem3romErRVraDvqfGma14tN41WOfPNY57BKRVzq5l8pyvu4esuQ5Ka5nuOf1zwEX50eKZBjB/2BNAwzAMwzCMEYY9ATQMwzAMI+c4ZBeX3sttGRK7ARyMKMpYZSQHpYWGI+sF7YYfkbu/Ms0Qj/W13UpZoz8MsTobuAyn7RW4RFO2wbe5bTvVYkNbbxS3+jJFWp+JQ6QoAIAjiwOo0opIDFBJKkEflRh7pOVNaoPvd+1uP4KxSlEQ6QWqDMolxpL1shzEBaesZAZOQEjLEiP20bhXyJIZGn2f07psSaQ4VaVLpS9weoGyeuGyr+tTNhPDXDk5zSQrVYOPq0oP4NKhSKRYK8vPolScHrpfWbZDdM44fW5xSTAZeu6lNkgLl9GdZP2j7ElEKgknrqjjz7YfFX+RJe30Pl/6HFWqbKHIKqVQ2TsJ+xhV7hwWmm+xsi4JKcWDE12yUmjouJatlSkUMZWRs2ynSPaRVZqmZXWCCF+LuOwKAAktG+30x0db0BTs82VLnV6SUMKLvu7yMYhUoodIvVH7U7DSW3O54eQUap4WbaLzjo65Lk1jr+9X5ZPq2kDnRVpfw9gWTJ27AVnE8N8GAGL/6u5pkE0kcQjVNaxyZf8xCbvfwhw1jgrsBtAwDMMwjDwQ5FADaFpDjWkADcMwDMMwRhh2A2gYhmEYhjHCsBLwYCRJRiOm9Sb8czRaxvQITYuK3xLrGEYPpKN/RKyWiiRiHUm80Wu0RKwVILVi2gphh9ewZcUOkU4qVLYPyTB6N7YgCZXNBOuDhD4HQED6yqDbb1vbMERkLcMRYf0b8PuXqCgr1jclHVKnJOL42mQsFI+Da1Y6zGG0Q6zLSu8km4lhtHsi3k2vX0eGlWmlqYf3Tx9X0L7GTdLWhrcn9K59UivG2w7JogNQ+kBtt0PENE/6t03/Hx1Of6r1m6/4KC19jsQc8cfHLlSaOdJPJSpii61S4nUbRZuwvNkq7ZB4LHl+9W/EH0s9ttxPrWkTui/W3Sl9G28vrWPvqI2jEwEgPtDi26qklUjClip6PtD1QZ+vwraJ9YDq2pBsbvDLqWskrz8aUym/R8crSxfHmmd9rpKmNtaaRjrXsuYp/zzMuRwU+HEI1fGP6TzX57G4NnXLuc7zLSyW6+S5H+9TVlZ0vFjvDACpKf32YkGu3sZgHIBclYDtLZAs7AmgYRiGYRjGCMOeABqGYRiGkRfy8eDR6MduAAejsACYOQUAEO5SyQ8H/eP/QKUJcAIGlGWHsGxQViwBWTugRDnss6VCgSytBIW+pCkSFtRr/sIGRJXWuEyhLWJEaU9tO1QlVEakl9TJdIzgEJWRVJkioJJGWOb3J6lVSRbkZK/tL0JKgnCHZOkmoGMQq9Ikj19QIR32A0puCTbKMl/S5UtOuszDx1WUtLSsgNNMhil9DkdQN0H+YsNm/5kSCQAAlHKQVaKnsm/IJSVVKhbjrqxkOP3F6XlCpc9YpbikJk/0bdrOhaxmAnWOpGr9/uljLmxT6FhFM6fJfnGShrZUYdmEKh2LcVA2MMLOQ5U0XTKMDITLvmPl3A9TbDtCJWBVwgzZLkSVPrlE66qkPCCg8QtGy7kR0Pi5tFonXwvVfAuafVlZlIeV1U9YS/utUzVo/JLJ6ppC18hAlYcDto/REgqa34GycImb/feyzmu6NvH5oq9Foi/d8viwPVJYI8v8PEaxsqBh2ZGbopKHtvmycqDmIv+t0OdP15x+GUDSZLcDIw074oZhGIZh5Ad7Apg3TANoGIZhGIYxwrAngIZhGIZh5IXcGUEbGrsBHIy+NIJt/VFnOt6HdTfaZoR1fpHSdYDsShyUbo1ij+J9UmuVqvP6MygdUUIxa+G4Gv97FR8Usj5HRSyxfkvHTonopGHsTlLKSoLtIpItMvaOdTI6QiwcR/vaTlYFKjov4b4o/Vm6Ybvv1ySpi+MILK2RcaRv0tpOt8Zbf4Qzpoq2VIf/Xnq31K2xrQLvdzBKagwdjXuorDfYUkfryIRdBGv+IOdNerPULfLcTNql5c1QViyB0oAKPVWXtN6IW7zmS1tcCK2a0juyXUk0Ro4D25NAn5McbabsiRKy0eC+xGq8hM2R0nLxuKemTJJtdPw5ag6Q0X2ONYaAiuNT5xZdR/T5E5EmkMcyNUHqwfjaoOdzUOD1YOnX1TiQPizeKS2JItKZuh27RRtfO0IV8chzTOgi1XEMSXvLOjsAwg6FbX8AWUEMlIUT66Gd0pwKW6Bg6OtiovSVQ53XWr+d7PHX/FDZE0V1Xu+abtwu2sQ6tWa71Gta41XrZBvbzsyYIvtCFjthrdRoFu/sv8YE6benPzaOXOwG0DAMwzCM/GAawLxhGkDDMAzDMIwRhj0BHIzCAiT1/e7oYZt0Yg+5LDJLlQObWjOfE1VOZbsNtkkBgKDclz5SZKEBAPEu2t6xM+U6K8mmoYvsCCbKkiz2Ulk5UIecnfmrZJmCEx20VUFC6+SSL6BSQhbPl33eTKUjZY2ANloPWcL0nDZPLFa81Y9tsmmraIvqp/n+t0oLBS6taDf8kK03VJm866xFmc+lj6+R66RyblQv50PQSWUrstfQSSNsCZGoBBkuhcaqtC8SPpT1Bpd9ez+ySLSVrvapJFFlpWhji5q+ub6MlHpBlptEaa1ClhhTrX5f9dyIanw/03tkyTyaN9t/b4M8rsKKgywtACCZ6OUPYbssRwfbfNINl8zDY4+R6yerkq5j60RbyTo/ZxNtXUQlufQuVTKl8ykiixsAcC0+vSJRSRMBlXnjKWNUP/28DajMK0rkAAJOIVHl1KSSJAhTa0VbsLbBf66U33Mky9AJLyFdw3r/arZoK97oj3NSRdsukscRrTRX2uX5yWXsSM11t9WXUANlgcVyGN3nvtOPz3wu2SSlN6Isq22O6FiKUrgeE7KkStfKa2uwakPms5bQ8PyOd8pSu0ipWXycaIv2USKKuoaF0yb7HzrkObLr3H5ZQ3qXsj/KEaYBzB/2BNAwDMMwDGOEYTeAhmEYhmEYIwwrARuGYRiGkXsccvcSiL1skoXdAA5GkiA81K+TCJQWRVhEdEh9IGu79Gv/rHcSlhOQdhGB0m5wLFRfoYr36fGak2FVFPzav4pfAklKgnKl+WH9DGmWAACh76eOnmNNGw5KvQlGk2ZO2SvEU70WhjUsJeulVqxvotdFRbtkn4Nur6+Mp0prjLDB62mi1NBTPz2+Uvxc9kKD/2GC1EyxVslt3yWaHNltcLSdtr9gCw2tw5QrVMeOdXGHpK6QrV5Y8wcAXcf4cSn80yrRxjFUhZtI+1Yg9VqO50oir6wu7edlqKK5HGkCOX4PAED62kjpWNkiJhwv9ahhA+3fRHV8SJclYu82NYjFEprPxQ1Sa+lozobaPojO+UhZbwQ0DjqijvultWnxdq9bLChV0ZBkZcK2JqHS+QnrJ3V8wjaKdCtQ8WWkaU10TBzZu4Td8trHUWOF++U1U0RDdtE6Dg4TJ6mj01j3mZbjxdfkpEKNAx8Dtc6S1/18c8rKSKxDW9KQVjmgORWklIaOtp0eJS2CikkLq8NwRQyijrokTXCwQVoEgfTjcbmKr3tpi19lndSjFh3s336ghtU4+rEbQMMwDMMw8oS9BJIvTANoGIZhGIYxwrAngIPRl0bS0F9y0iVZTvsI1aN7cClXpT0gpCSIkhLRJKwkGoZOzohaZRmWkwAclZwDlSyQUEKFU30OqZ/prTIxYrj0j2i0Lw/FlHICyJJWpMuW5FafZcWyxpcpwmpf5nWdyopnpbckSVSaSNLll410IsFBb7HidFmMSkzBi6+LtoBK6HGDdO1niwg9V7gUHu+ndAyVGMCl3ViV2lMTqBSq7CjiJm9dIcqbkOkL2uqFy77hWGkzwjYTbDsTKOsVR2WqLBsTTntokvYaPKcCVd7i8jOXfPtXROkLjarUzgkVG6V9DJfQuMwXjZOlYk5xSSnZh7A1UsdYlBV71Vyk0qdTcgdxbqlzMprs00bcdmUDQvNb2BqpYyCOv5obMZXhg53yT0Ca+6mSbUQyUKhKk300PzbK60hCpeqgk0qt6voSsPxBl8UpVSPQ8g0q33NqDwDwWnSSjqPrg06QEctp2y6aA3z8E7V+lu8UUQlWL6tL0yKBJ5Kl4zTZwohrA+T1O+VUEgidW079HRn7TP94Rl2y/znDtHl5w54AGoZhGIZhjDDsCaBhGIZhGPnBngDmDXsCaBiGYRiGMcKwJ4BDER7Wpyj7i4B1HspShfV1Ou6LdR1a+xYVeX2G1kWxhknbrSQH6b9ObC2iNSWkkQm0DQzvj9b8sb5N21/QNli7BShLBaXXcZ3DxUmRdQXr98JgyOXigzI6TaA0OUJD56Rei4+z61V6IO6n0uEJbZzWhDJ0/PV+BynattI0chyfbuPjlaUj4n7q7dHxSpQeSOiraN6wvhWQ85Q1f/0rpXEYRkeqx0HY3AT6/6Y0fn3yuIb7WzOftZOFXjbze2VjElL0oNbJ8nmedexYW6XbWO+orZ9YA6a1aWwZo7SX6JL9zhAOHeOVpfvVtia8LGkAQ637TNN8y7L+IUsaZYEF0v0J/Zw6Nk5FHTLiGqPGmef+cMdHf0/MN3WdB82PrH4W0nyg/c66Durrz1Co65vrHdq6hudpQlGAgDoP1Xkn9kFrbzPneZ7exrUouLxhTwANwzAMwzBGGPYE0DAMwzCMvDBc4cR4b7EbwEFwZUXoWbIAAFB4QJZcoo3eniKokFYvjkombo+0vxC2KcOULbU9BZeA+lRCRcF2/yi/b4q3KkmtbRDLBWQ7EqgyskgyqK4WbaKEWivTF5LNfhvReGlHEHSTrc2sOtEWvbzeL6dKEW4CbX+nH7/eYyeL5Qpf8VYfgSqfBMfM9D/s3S/XTyUgXa7hMl9wwjGiqWWWH7OKTTXye320zl5V8tnTnPkYTaFxUGU8Ts7ISmOh8llYruYblYeyym5U3uqbKy0hOOEj1mU3KvseuOjYzOcx/+9luRwfu+NmiaZgLaUOqEQPPkcGrJYybdO8/UmqqVW2sX2IshZKT/XnTKpYlqPTjXS+soyhWtrfoNj3q326PEdKH/a2OdGkCaKNrV8CVfJLT/H9CrtlCT3c6W1NtAWJSOOoVMd8hk9xCOhcSk2W6Q6cJpHMny7aumv89aBsgzz+qXa/78l+NTcWzvH9VykUbEPTtmSmaKt43lsnpSf560jUopJAWEJTrqyy+Nyikj8AJGRDFS6cK79HlkGJKlt3Hz8t87mwVSWPvCKtoEQ3Z/vzKdrj7Z3iiSqhZpe//vROl9f1ws2cQqIKcZQoE6+X9jHBdH8tDJQ9FiePJKPLRFNQUe+3F8rt7Tiz/9qR/q+hZQTG0YmVgA3DMAzDMEYY9gTQMAzDMIz8YCXgvGFPAA3DMAzDMEYY9gRwEIL2bhT+zwsAgFDbN5B+ItklNSzhaK+fCSZIzUey1etgUkrn50hLGG/YLNdJMU46oipNGp1UMVnJqOgnYeGh4qoCsoRIN+qYM9LXtbSIpogixNK79og21lpFq6WGhbVqySEZXxW2ej1iMslr7aInVonltNUH49aQLmqa1L6BYsmCSGrF2Jon2ijHoXIbLdsnY6E42k5bi7AdThgObXUQ03EMO6V2x82b4fu8Vo6lo77EKnItoH6lXlgn2hKyvNARbzxXWPcX1kh9KMdjuZfk+h1FhiWNylKH7Eqicrmv2OL1ejpWi49Pqm6SaIv2+3nj1JxijWhY6ud6rCPjqM9lTmpA2V4jKVcxfhv83A9VNFdqm9empfc1izahY9Qq+CavHXM71bnFqyBboPR2GY/H+xMdkNepEtIOKlOo7Mg63vbqTf4HraElyh9ZLX6O6ZoT0XHVFkQRzbFERy6ydZGOkCyjebReHlfetoiyA1Cy2R8Tt19e32LqZ1RRIdoC1i6yrlifn9Tn1CGl1yMNbazGAfRzpKIa43X+GGj9s7AWqlsoN/eq/16oLL0m/67/mDe2xYCcwu89LsidDYzZzWRhTwANwzAMwzBGGPYE0DAMwzCMvBCYBjBv2A3gYIQBwtL+skJQKm05kkPewiVS1gsJlW5CnUDASRAqVQHkjq/LDWIVE2UZLlXmrRK4NB2Pq5Srb6ISQ6yKPvS9UJWORaKHhsrDkbLDSTqo9KlsZ0SygSrXuRJfakuP9p8LVWnNkVVKskXaUSD0U1pbIfDYJqrUxRY4gbISEW78OgmEUlx0eTis9rYQCdntsC1PFqocyPYXTpXvufSVZalD69HHgMfPkV1I1nroM5d8AQDVVX4xnWTB6SVZqTSUJqHWmWXNMwSuQpWO2YpFna84ROVh2l6ojgGXFYO0OkfG0dzoVHYhVZX+B50YQWk2OlWDxzbpkCXagErjOrXDtfllE5JlBCpxBwX+e4GeNyTD0HMxoVI129EAEOVO1y77zOdWoPtMNjfcz2i8srziPqrjGFT5Poc9aj5zapAa5xRfF5XlkeNUEp0Swik7an4HZOOkZR9iuVJ/fe6rkONceNCPn77usqVOVhIIW3oNc750jZZtEV0PghJpsdN2TH+ZOdlpNjAjjfdFCbipqQnXXXcd5syZg5KSEowZMwaLFi3C1772tUGXf+CBB7B06VJUVFSgoqICy5Ytw0MPPZTjXhuGYRiG8Y5wOfpnZJH3G8AXX3wRc+fOxY033oiCggJccMEF+MAHPoADBw7g5ptvzlr+Bz/4Ac4//3w8/fTTOPXUU3H66afj+eefx7nnnotbb701D3tgGIZhGIZxZJHXEnBTUxPOOussdHV14Xe/+x3OP/980f7888+Ln9evX4/rrrsORUVFePzxx3HyyScDADZs2IBTTjkF11xzDc466yzMnCmd6N8yBQXAYcd17bYecukwK3jclx/SWxtlG72VGSuH/YCSQaI6VVamt9OySlNU3gio1BXs3icW4/QFXTaI9/gSoEirAOCoX7q0Fu/2byeKEHKoN0uL5PYSemM4K6S+3ZeOC/ZRisdo9RbeMOHv0QxKPWjYKbfNbw+qUq7jMlytSokopfLNAfXGHm9fleFiCmsPufx8SCbB8NzQpTxHbzXyW58AEJIEQO8PqHyfVTKlRAQuNwHqWFLCh37Tl8u+cb16K/d1P/dDlQTC2473qTeXadt6ToWU1IK98o1akaQxRfaF54fr9OOnU1Wiykq/XEqV+SnRQZfhHb8pr+fzGF8mx9hK0QYqR+pjzuMSHSOvZYGj8j1dR7IkAFxeT8tzhBN3ss5BWlaUVgGgks5DVQJOON1mlkzuCRtJEkDnUtAt18/XG31eB5zioSQaMZWto7lyvETajEqQ4WtTlnSArgdZ8gfuM0lqAvVWO7/lHMQyQSjeQ+klatsRlej1G8JRDa1Hl6apTF76ipTGODqfdPKMi/L8dqy9nZs38voE8Fvf+haam5uxYsWKrJs/AFi8eLH4+ZZbbkEcx7jyyiszN38AMHv2bHzjG99AOp3GLbfc8p732zAMwzAM40gmbzeAXV1duPPOO1FWVobly5e/qe8M6PwuvvjirLaB3z3wwAPvXicNwzAMwzCOQvJWAl65ciXa2tpw2mmnoaSkBA8//DAeffRRdHd3Y/bs2bj00ksxcaIvh7a2tmLbtv7H2ieccELW+iZPnozq6mo0Njbi0KFDqBjmbVrDMAzDMN4H2AsaeSNvN4Br164FANTW1uLCCy/E7373O9H+D//wD/jJT36CT33qUwCQufmrqqpCWZnSNB2mrq4Ozc3NaGxsxHHHHfe2+xbEMcLmfu1dovQS/HOkLRRYh6e1XGwREqrX7dlu46DUZLFGK9qnbAzIUiPhNImqKrEca1Gy7A54ObKx6f8FaWb097jP2gaEdJJhLPV0bBHBmh9A7gNbKIh+vBFs9ZDIK4tIdFDWG8IWZPtu+T2yUUk360QHsldQx5ztFhKVpCJWwbo4pQ8Uc0XptViPFrIdCYCYtpdqVXY7pPPSWjseM042cCpFgbfNmj8AAK2TtU56/VrTyBotrZNlIqVjFbYWe6SukO1XErLsCLVei+fiVqkdZa2YTq/gY+7UfHOkr9XaW0eWMfr8YU1Y0CVtQIQmmM9/PZ/pGqmTesJmf54HdRNEm9AEq/SXNFsuqfnAurVgnxwjoTNsoWsRFHxNUTZNSRPZ0yidJycPQSWniHQMNc68rNO2XcOQkLY3YQsibdkypjLzObWuQbTFpCsM9LnLqSSB1McJG7JaqSt0PLbKwkv0UyWBlG/pvz6EfW/hOmscFeTtBrDl8B+o+++/H1EU4Uc/+hEuueQSdHZ24tZbb8UNN9yAyy67DHPnzsXxxx+P9vb+m6tSLdYlBm4M25SwfTDmz58/6O83b96MAgy9DcMwDMMw3iXsCWDeyJsGMDn8VCedTuM73/kOvvzlL6OmpgZTp07FihUrcMkll6Cvrw8rVqzIVxcNwzAMwzCOSvL2BLCcbBgGewlk+fLluPvuu/HEE0+I5TtVEDjTcbgMMko5qw/GmjVrBv39/Pnz0bi1Celp/fYVqZ2qFMWlUFWmCISzvFoxP8rPKqfRo/fyodMrnNp3fpQfjfOu+uldqoRJpRWdSCASI8bK0rFw+9f2F1Qy0akKnDSQHGjFUGRZfVDyAKelOB2WzmVKbX8xwY9D0KRK5tQXLlkBsqSZLJBWEtHaBv9Z2XJgpy+ZxfrJM5Vhosm+bOVUAgpLB6JaVXbjMqKWFbDFyTAlwERZdnBpyjXJkqlIeCELl6RRWUdQuUtbvQiLi5nT5OqpHK3LqfxzapK0QxJlTJ2qwaU9NR848YXnW9wkS/ksm9Bjyf3SqQ18PQh1csZov6zbIc9JYUmiynx8bnHJF5CpLjHNr6zkDL42FMu5znYlXDYE5DyFKmlGM6b476n94fSfqGzo8jqPs7ZD4pJzVCrTKsR1V1lzcbk4PmGOXCedu7FOaqH9y0rVoGOSZXNFcyw1liQu6jjyHAtValTEUgiVDMVJRK5NpQtN8xY7yfZdss/R0EkeYj5QQhEA9JUd3vcwD3YsuTRptieNWeTtCeDUqVMB9Jd0a2pqstqnTZsGANi3r/+PyZQp/ReflpaWzI2eZseOHWLdhmEYhmEYRjZ5uwEceJO3q6sLPepJGgAcOND/9GbgyV9lZWXmJvDll1/OWn779u1obm7G1KlT7Q1gwzAMwzgScEFu/hlZ5O0GcMqUKVi4cCGcc5kyLzPwO7Z8OeeccwAA99xzT9byA78777zz3ovuGoZhGIZhHDXkNQru61//Oj7zmc/guuuuw//+7/9iwoR+S4JXXnkFN954IwDgyiuvzCx/1VVX4cc//jFuu+02fPKTn8QHPvABAMDGjRvxve99D6lUClddddU771jiEB06rDNJKY0ZaVGCAmVHwzq5WL5SH7IliNYxcoyXslvhZbM0YBwFx7ooHXPGmjm5ZQSsW1GaH96HrGgm0puIGCgAIfXLdQ+tk+QoOwBI2shGhzQ52qJBWjuoeDS2nFBPltmKJ+lSI8Fari5lT0L6meCQlB9wxFKoIqOE7QSPg94f6pfT84a0XcNZ+GjLG9ZFaTsPoe0Mhv6fMUcIZlkXsV5IbVtoNJUFjdDvuaFFOVonKTRzOgKLzq3hYruEBY3qs7DXULYcaYoaCyN1brEOU2stC/y+Zu2pOEeHjpQMtD5QW5kM0g8AcB1+Oa0rFdcmfexYC6tsmkK6/iRqnvJ56LqVRo+3QfrnUFsQ0b7qGDpxfRtiDAAg7JZtySDVpcyydJzjA0PbNGVZYJHmWdjVaDssmouuTOqkxTrVnGUNoD7vArYJU1pL1q4GKi6P4yZdp7SIyTeBafPyRl5vAD/96U/jkUcewc9//nPMmzcPp5xyCrq6uvD000+jp6cHV1xxBS655JLM8nPmzMGKFStw7bXXYsmSJTjzzDNRWFiIRx55BF1dXfi3f/u3d54DbBiGYRiGcZST1xtAALjjjjtw6qmn4vbbb8ef/vQnBEGARYsW4Utf+hIuu+yyrOWvueYazJw5EytWrMCTTz4JADjppJPw9a9/Heeee26uu28YhmEYxtvFngDmjbzfAAZBgCuuuAJXXHHFm/7Oeeed995q/frSwI5+24lkmNKnTiuIRvuXT8LxtaIt3bDdL6csSBht2cGl0ESXaDnZoNrbEWirF1FqVSUlYdlCDvdZ/VLO8lFlZeZzrFIuhB2OWk/ANhpOOc+zjcEY6te6jUP2K6s0SUkQwWj1MhDbeSjbDN6HqLVdtPG4i9QJyLJLokpfAiobZRVd2Q5DWTGEZDOhk1PYdkZbXPDYspUMoJImtI0OzfekYUfmc6Tsibi8Fe+TVjJcDtRWL1z2ZUsTvazT5WFOXNGlrxKyzVBjJCyQaK7Hyv6GrZj0tjlxA+OkY0GycWvmc1Qv3Qd4PVmyj2EQlkR96npA6xGl1bS6NvB5oZIf0tt80ok+/gEd16zrDacNKeun+BB975A8f+QG/Fjq1JsUXcOcsukZ7h6By5vhfrnONJ8Xyn6Lr7VZSS2c1KGuI0KeUkzfa1aWPXyedchrQ0BzMb1bnp8sXYnUtrm8rv9WsDwgNUampcR7/XzXx65gW/9YB28hDcU4OsjbSyCGYRiGYRhGfrAbQMMwDMMwjBGG3QAahmEYhmGMMPKuAXxfUpiCm96voQi27pRtpJ/Qd89uyvjM5+DAMDYWOrKH9XvK6oVjiFytjGoLN3tdoWuluCWlPwRbKijrFaEpUZqfsMxrWKK5s+Q6d/hoLo6hA6SWq/38E0Tb6Of9eHJkGAAEc2b4bVO0VPrDJ4rlilY1+G0dlOMckPUGtJUEjaXWZIXF/rgmTftF297LFmY+j797g2hjrVCqTupuEraWoL5oq5LUBD9v4malKyXNWZYFCFmJpFTUVHob6ffmzZbf2+mPXVYEFs1TN432Z8sOsRh/T0dl8TqyNICEbus8c0Hmc+mf1ok21s06Ze0RT/Y2J6keFVlImkDWa8YfWiSWK2jx50FHnYx0K3uWrJ86lIUG7WvQrWyAyr1eNDVjmuzzTopSU1YsIqpvgrRwCVtI97nLa8eytLak+3NKA5iaSPNtvLymJCtXZz5rrXJMYxmpSDw+fw5ecLxoG73ef69vlJ8rBRuU/pS0lkGZ0ujSuTTceZYoXXaWzpi/N3ea71elnMMFj6z0q1C2Ken6CX65bV6r6CYq3XeVP/6Fm2R0Hl93UxNklCJfo/U5EhSR3nGGSrzi2EBlVxRSLGGg9LyHFvXvT/yI0o7nCLOByR/2BNAwDMMwDGOEYU8ADcMwDMPIDxbTljfsBnAQgtghbOt/7O+ULQco9UKX8sId9Dp/gXqczpYQOjGAEwpUeYtLIeEuaV3BLvdRrS8VJrq0So/8A90vIqqQpS9O8XCNshTO5chQlbTZbqPiiU1Dfi9QpSlhQ5D2ZbfCZ2Q5kK15gmiYh9hqX/l4RWNk6Stu8aWW6Jh60Tb+HtqHcaokR8c1VnYrYow4jaFXjheXfaOxsl+ug0rViSpnUXmLy4GA3L9kw1bZNtGXnLhUDECWlZta/TqGSV/QJWC2R0pNkqVpTvjQditc9g3UOCdko8TWOAAQbfJzU1eT2CqHLTVST74q94FKmuVN0uonJplBpKxrhCVIkTq3yPIk2SvPXU6C0CkeooypS+h0XDlBJlQlWV5/0Ns3dNv6RtEUVo/161cJP6kpdb7tkLZK8stWPSuvFbzvhZS+kVZSixTJX/Rx5JJzoixiEtq/aMYU0RbSeaGtrMJ1DZnPJaosOpwhSkEjHUtOCVLygILtVPatlnOWE17iZjkOnPikZR8hzeH0xi2yjc7DQNlcsVQmUlZWZVv7j2XYN3S53Dg6sRtAwzAMwzByj0PujKBNa5iFaQANwzAMwzBGGPYE0DAMwzCM/GBP5vKG3QAOgovTGd2K1uSJ5ZQ+gzVzOiZOLKdtLDh2SOnp2ColUBYxrGlL7yDdjY7RIo1MVvRXn9QxCkinoqPTeB90XB5rmjgyDgDiYWxBwkavR4tJUxRVyDgktnDR1w7X7I9Jlm0K92OY4xOr6LnUeK+Zi9dvlttjPZW2VKHtxzt2DdkvjrJK75X6zaxjOQQcvwZI24xQafSE7i9r/WQDQ/YXw0WZhVqbyNvatUf+gm051LbZdoQ1fwCENjFWY6TPC7k90mgOEwUojomy/eBzJL1VaubE+jc3iKaQtVYqglHr/obqi7aF4uPKJB3q+FDsmduj4ix5naofrJnM2kbXMFGHhNMRcrwOpX9m0jv9OZIV8cgxbmoshzsGw54/NG+H7bMeE/oej4mOWOPj6IaZN1n7yovpvxWsMw6UpVdM8Y/blW0TXWPi3fKcDAf2T2tFjaMeKwEbhmEYhmGMMOwJoGEYhmEYecGMoPOH3QAOQhClENYctkNIq/Im2VgE5NgPAKAyQvokmb4QPfWa/zxeOr8nY8ilfbu08wiKKQmkTL6+nyLbgd6Z3p0+apdl3YjSAxDLch0nAYRbd4k2x+kVykIhNc3bLbg2aQkBKjEFqiwS1HsX/2iPLGel67wFxcF6X6Ib85i0O0iRpUKiSowh2Ux0LJos2kqfXO/7USrH0vX58kffPOWwv8Ufk+BYdVybfVkxUXYOYRVZukygRI8CWfJJXn098zk1XW67b7wvi6Y2yLIO23TocRbHuVDak4Tj/TgHjeqYsxUPlWt1+oKrINuMvdKWI+JSuNo2l8WDMmm9weUubfXCZd94mUzxcJEvCRZvkuXhhCx2Muc0gGS/nHuiBDhX7ms0tjLzuXeytOkpet2PH5+DABDQeehWvS7bUn5ctAwjNdnbrQxXwozJDkVLO3h+J5PHy7Zt3p4kGCWtnwKeU7q0nvLbcLrkzMdVf4/nwwSflhGpY9CzYFrmc/EWZZvDZV81Jo6ug8k0ua/RvtbMZ22VxNZMrl3uD+9DNEGuk+d+mPJFtPCgLG9zAkvn7LGiraiJJC4b5XnNJWedssTHVfeZ00U6zz5etJU9tsavY6qc3/tP7O9b/LsHYYws7AbQMAzDMIz8YE8A84ZpAA3DMAzDMEYY9gTQMAzDMIz8YE8A84bdAA5CUhiha3a/9iKI5ewsfP5Q5nMQqtfwR3ltyL7jpcZs0mpvZZJUjxZtB+f4top1Uu8WTPJ6wVBpPtgSYtdpMzKfx70o9UDF20knp6wD9h/nNUBjX5YWLUKH1SctAvomeC1USuu8SKPTVyMjqvpG+WVLD8jvdY3zOraOib6fxYukLq70qfUYClfutYMdtXJ6l7JOqlhao4COXbpUjl/bMtI7qmjAqrX+50jZu8R1XvfXPc7Ph7ZJsl/j93qdT9dMGYHWXeWXHd2ptKOvrM18TtXK77EuM5lYI9rCBrKkqZO6tXB/a+ZzeirrtZTOkywjtB4sYPsTbXlDba5ERchN9vvA8W6AiseK5DHo+Kqft4V/0yraOAYxrvbnWedCqesq2+zP684p0nao7Flv/XPgDPm9mg4/tgfrld418T9XvaatS4a2ztnxCT/fJj2kbHRICxdRbJu2c2H9btsseQ6O7iZt4k6piwOdI4mywwlIvxf0SN0iW5DEtVInGXZ4bVzPJH/tKz4o7VV2nebnQ+lMqVOrfsXPv+iAnItBEdkolctrStRM1zs15r11/voWdctjHpIuMxktdZLts/w+OFp91CPH2dFpHihHqoOz/Lwc06j6TJpDVyrnVNsxvs+FB+VKoyde9uufJq8xZTP9nGo+vlK0NS/uH5f4URgjDLsBNAzDMAwjL9hbwPnDNICGYRiGYRgjDHsCOAhhbxol6/pLL04711O5AaoMwiXhSb+QZcrkIJWOleN61R5KJRgny3Vumy/XJTPqRBsXKqf+J1mclKmUg0oqb6iydfXdq/33lPWGoz6zvQoAYJVPy8hK46ByVCo1RbQVbPHrjFtaRRsXUMrX+n4GqvQNst9Jdkgbk7DL23nUPrpNtMV8LHWyBfVZFu+Bkh1Uotm+WzZSycxFShLw0rrM59IqKn2pOZUm65XCJ1rltsf7spu2seDkDLYnAmRZNmyXpTxM9Ot0G7eKJi4kptiCSK0/4CSNKbJchz1k4aGTZyi9hucXAKR6qKyModFWL1z2dcdMk9t72R8DUBJI2VqdNOHLg4WVx4gmPp8mPCATHdK7/TGp3lIp10n7Hig7j4T64hK5t+N/8LT/YdYM0RbQXBkuOSMkWUblC2rO0jriOVJeEW7yliSBlnZQyVaXh/m4QpXo2e6naDcdc76WAph++ybfr33SBiYa7a9hQmIAeW0tapB/0hI6Pjp9Jer0fY52SQunNB2fQCWgjOqe6H8gyYQuw4OsmXrnyWt32Z/9vjpta8NjqxKLSrf4a1pYoSx8Jvl+TXpUWjM5um5Vb5XyitLmOQCApjYHyOr9e48D4II3XOxd25YhsCeAhmEYhmEYIwx7AmgYhmEYRn6wJ3N5w54AGoZhGIZhjDDsCeAguHTsNSjaXoH0OoGyBGHNT1gkLS4cRyUpS5WELDs4DguQupVg9QbRlqa+sObHKW1iomObiJB0XnGT1MFwvBTHTgFAQPFOiYqJEyibCfGfPaV94lg3tu/I0huRhslp6xWOxyqUGiOXpnFXdjh8LJMGGc0UspWI1oQmND8CpX1iSw36XqCWc2RPIaLYACQHWn2bmosxazS1LopioYJtUvMj5rTW6LHGrJH0YHquH6I5q/rFczFR85nR8WWsCYzbpOaQrYU43g2Qc0Vo/qDsY/gcVNF5fHxSqzaLtpj0bbrPbC3i1DxlXWGsx2GYiLeQ9JVuu9S4ivWw7i+RxyDhS8BueQ7yMQmVDjcmy5agQJ0/HFmnNIc8LsFaaWWV0DiAtKSxui5FpJPV48xzPVLXDZ5/sYqGFNpENebBOq9/HdqUZ5DzlaMP6VruVMxmSOdMwXMyCjDRekFeP8+3lNRhinNNXSvSB/xcCQ9KfWDS7s9Xvc7S5xv6f98l/y4ZRz92A2gYhmEYRs4JkDsbmBy9anJEYSVgwzAMwzCMEYY9ARyMIEB4uESkH+tz+VaXt6JR3sgkmTFRtOEln9qgbQzAJbMOWWKMarwtDFtH9P+CyhvHzPGfN28Xi4XKFoYJ6ijZYP2WIZfTpdaQbBn0/yKCUkp7UCVTThcJC+T0C2id8RhfwmA7lf5f+GPCJT5AlY6mKnuSNd4qJyIrGQCIqdQa1UvLBkf2K+G8WXJ7VOKOW1pEG8sFounUF2XFgw2+5JiaNlm2UdkqULYZcbMv2esyfEjWG3pOhTRP3TDl+4COD5clAWXn0qkkDVx+VlIILvuHZGMDAI76ybYfABDT3A9rxso2SviAOkd43kaTfOpJepss84sSZqk8P3mMkhPmiLZwjS8jutnS8ijooXLdalkCHA4uT8fKBoSPQ9JNpdxiWdLm61YwWV6LWBKQKIsTsX41NyK2idJyBH1tEn3xy0Z8LWpT8hpKGom0fIPKxVqGwccumqjSckgukGjrJ16Huo5wiTtQczFgeyRKHgpblRUTSQLC8dIGiFNw4jUq2Yi2zfITQM7NtCrti2vFZJnwE2xsyHzWY+QGriuteXoeZC+B5A17AmgYhmEYhjHCsCeAhmEYhmHkBYuCyx92AzgYhQVIpveXAaM98s3YhN6ai1RyBpcRoj2yHCgKqPoNsDHV/nuqJMNv94W6pLmP+raDygF1MrA+2SITMUSfmw4M2RZSKSrQZQN6C1SnhMR7fVJD95kniLay1d6RPm6RZaNUhS9NRntbM5/bzj9RLFf+TEPmc6JKZKJ8p/aNy4pc8gWAFCWwxOot4Na/WZT5POYhWa4RbyfWyBSXgMpDrtnPB53UkiIH/3jb0G8g63Idl4qimdNkv6isHB4rky2wqcF/TyVUOCrfotrP71glhvDcCMvlG4firWn19jiXxeMmmfYQf8iPc+rJV+U6uTS5X55bnQv9fNcJH1xO5bJvxycWi+XKNw/zVjMl97hX5Jv4KPDyjbBBJm5wWkpWEshwb3fX+/M8mCJLeeFufsvdbzum8xGQxwdqrkdjfNwDlzABIN7oZSB6bnA6h35LN6r2ZfmuE6eLttKNvs/JKH9+pnSZl0qYTqVc8Bvi0Sy5fpZoxHtkSozagPgxqPNjm4xWMpkXvWRHJ9aggkrqO/1bx06lOPXM8esveGq1aGOHgtSMaXL9dJ7H6o33iMYlOHGeaAvX+5SaoEX2mVNDXLGUZRxc0H/skt12OzDSsCNuGIZhGEZ+sCeAecM0gIZhGIZhGCMMewJoGIZhGEbuccjdE0B70piF3QAORhggrujXaIS7lEc8pzso6wPWwSSHhk4yiA9JfUYkFpOzNBxFWhidEjFEQkGyqRFDEUTyoS/btAQFb346xK2tmc+p0aNEG2vACg8pi5ADpN9ycmwdp5mQxUFxU7VcjuwVsmxgSJPlVNIAW4KESgfDy4bKIqa4hTRatdKCJKDxE/o5AI5sJ4ROUlnqgPqi7VbYXiPbUoX6pXRebAsSNkvNXEI2NNpKQoxLMSUG6KQJ2reoslK2cUJJVZVso7nveuXxL2gh+5hRck7xsXPd0n6pbDOdT4lcp0hgoXOENX8AEJd7TVbB7lbZRnNd6x05CSJQlh3JaL+sPgaMTlkJG/0xCdQ8Zc0h65G11ZNIr9BJFmVehxe0y3NEzDGVuMEaWq1HTQ76610Qq7+0XWwLNHj/ASCkecl97F+YjqvSgCaUGqN1uI7asv7+k07OjZHHTiS86IQPvg6TpVdcLo9V0R6/bZ38IY6PSm7ivzEifQVAMtr3M9wk9cL8t0NcZyGvk/pvQPGB/v3JOm7GUY+VgA3DMAzDMN4i+/fvR21tLYIgwMyZM4dd9mc/+xkWL16M8vJyjBkzBmeffTaefvrpYb/z1FNP4eyzz8aYMWNQXl6OxYsX47//+7/ftf7bDaBhGIZhGHkhcLn5917w1a9+Fc3NzW+43NVXX43ly5dj9erVOOOMM7B48WI8+uij+OAHP4j77rtv0O/ce++9WLp0Kf7nf/4HCxYswFlnnYWNGzfisssuw3XXXfeu9N9KwIORJEi1Hi5bKDsCUWrpleXN7jnejiLVIduiTd59HxR6DgDdU32ZrOR1FWae8uWAjrmyvFG+0m+j5xhvTZBqV6HeVBroK5fWC4VN5Kq/VSaIiFUou4jURG9x4A6qcjeVjrpr5PbKyXoh2i0tG7qnVvp1TvOfU52qfELlzUSVA7mc6sZJm57kFW/tEFVId38uaYbjZMl5/1xftipdr/oyZ0bmc1whS0DRa95Sw1X40k1wSCYZiPErkYkOHWfOzXyu+Iu0YhESBGXLwT93HSuTTYobvLVESpUAuYzUPt2XYcuctJIJ0lQiS6n/R271c93pZBsqhWu5Q0edP9fKm1QJkMr+mCvtkDqn+GNZWCn7mVrl7XBEQo0qyXHZd9PnpI3SrB/7ZTuPkXZIJc96W5h4vJQHJCX+8uoK5JwKSS6gS9psEdI3Uc7hqIvO7d3yWsHEVPpsv1hZ3mynZJMJlaIt9aIviyYq2SYa7/c9UqXw9M5dfnuT5Dlf1OSvb+0z/LEapRJx0mX+e9GWXaItrPHjp9NrIpIZBKp0LPZBlcJ3X+pTfSo3yVJrIc3NUElc9p/qr7VVq1r96tNKflDq96flU38l2sauJGucHfI4BnT9SU1WqUQNNC6T5FwM2/y53Hy6TKWpWuOPa9Al/z7sOq3/upVeZWm5b4U//OEP+PnPf44vfvGL+PGPfzzkco899hhuueUWjB07Fs888wxmzeqfd8888wyWLVuG5cuXY9myZagkKc2BAwfwuc99DnEc495778XHP/5xAMDevXtx2mmn4cYbb8S5556LZcuWvaN9sCeAhmEYhmEYb5Kuri586Utfwrx5897wadxNN90EALj++uszN38AcPLJJ+PKK69Ea2srfvKTn4jv/Nd//RcOHTqECy64IHPzBwDjxo3D97//fQDAjTfe+I73w24ADcMwDMMw3iTf/va3sWXLFtx2220ooBezNF1dXfjjH/8IALj44ouz2gd+98ADD4jfP/TQQ0N+55xzzkFxcTEee+wxdKsXD98qdgNoGIZhGEZ+cDn69y7x6quv4sYbb8Ty5cuxZMmSYZddv349enp6UFNTg7q6uqz2RYsWZdbJrFq1SrQzhYWFOPbYY9Hd3Y0NGzZktb8VTAM4GL19wKb++DStU+LX+aMJUoNR+My6zOegTNoKxM0+ti1S2sESjprSViL0vdJyqW9hq4TCl73WKamXEy3a57Vi4XZlOcCWJEojE5OFRqj1gWy/omwsWH9UvlZG6QW0r7GykijZ4DWBcRXFwrVIjWEyibSQyoon3uHjuMKUGgeK7tMxdBHrMlXblDv9OPBxBKReS6nwRAxZssHrAQMVgcX6Q30MRq/0usL0PhmdFrFVirLsYNuUknUyosyRPUmirHLYbqP04VW+W9qChnRKwS45Jijy+6etktL7KMpMzZuyZ/25FStdKdthRGMr1fdI56fsUGKySmLtWKjOQbZ6Yc0fACSkfy15YbNoY4uQsEHq1kDHVUenORrnRP8vnsYspc55NPt+JnTMXbu0tWHLltGPvi63TTYm0TR5jrC1VDRJxtAle/3809YoHC9X82c5Do50phXNNB8K5ZOTiKxyEnX8Q5rPWRZBbMWk7ZAq/Xmt4x8n/s7bZWlLGt473Zcxv/dxkOLc1bY5FJ85tlNdd0n/HBTJ60G8ucG3qWsFx4iGNBcAwNH5NOZVed4lr1KEpdK1T3iqfzx3dJoNzBuRJAm+8IUvoLKyMlOKHY5t2/rvIwa7+QOAsrIyVFZWoqWlBW1tbRg1ahQOHTqEgwcPDvu9uro6rFy5Eo2NjViwYMHb3Bu7ATQMwzAMI0+8V2/oDsbmzZsxf/78QdvWrFnzht//4Q9/iBdeeAF33HEHxo4d+4bLtx/+j1mp8ndlysrK0NramrkBbKf/zA31vbLDD5ja2toGbX+zWAnYMAzDMAxjGLZt24brr78eS5cuxeWXX57v7rwr2BPAQQiiCGH14XKhsipwbf7uPNkjbUyC6ZMzn5tOlrYP1b8iOwz1+n5vLSUG/PkVuc5F8zKfoxZpqRFv807wzZd7m4HaJ2Wp0FEZyRXIx//t9b5EUvq7laKNUyFEqQNANLve97FD2TLUUnmwU5a34gm+DKtLpocW+ZJTZ7Uf99q7tonl3E5vm6DTSwIqK7UuqhVtFff69UQzpE2Co9Jx7ynyf4js6H9o6XS5TkqUCNbLBBZOF+lbujDzOS5WTvyP+FJr+rRjRVtnld+fUaXSIiZet9H/EMrRTE3xVinJPulTFfKY6WQYljhQCTApl9sOOr11iVPlVC77hqpcF/L2xklbI55HUYX8XnqrH9veyTJd5MAZ3rZlwgPyGIiEnBPm+D6/IrUznPCRZfVCZd8dl0ubmcn3eGnEvtNluaaw3RcSR/32RdHmuFyoyv7BZBp3kg4AQDTB7yvvWzROWtckJFU4eOHxoq3qGW/Tk2yW48XHK71NJk2E8/34Req8Tm9pyHxOlSipClkBJXV0/ry2XizXdtGJmc+jGlRCyX5/DqYbpBxFJJTMlud1tHNoyYGwZiqREodgmx+jcKo8rp31/hrmUn6dRfulnU/Y4vfh0FyViHOcX8eoXz8rv0dPfYI6VYYf5c9Dt0bKEZIev/2mi+pF24S9/lzrnidtlNrr+svMSUGebGBy+ASwvr7+TT3pG4yvfOUr6O3txW233famv1N++LrSqf5+Mh2Hz49Rh8+9cr4WdXaiQlmWDfadt4vdABqGYRiGYQzDgw8+iMrKSlx55ZXi9wNv4u7cuTPjy/erX/0K48ePx5Qp/f8h2bFD/mdqgI6ODrS2tqKqqipzM1dRUYHRo0fj4MGD2LFjB+bNm5f1vYH1TZ069R3tk90AGoZhGIaRH46gd09aW1vxxBNPDNrW3d2daRu4KZwzZw6KiorQ1NSEnTt3YtIk+fT1pZdeAoCsFzkW/v/be/MoO8rz3Petqr17ngeNLak1gxokIYxiRstc2eEgEyaBb058rzDm5GKHLLPkLHL+sM/xMrBOjmNsk0NyFuvY4HglOAkCjBHGMfIkh9FCloTmsVtSt6Qe1PO4d1XdP7bU3/O+u7sBI3rb9PNbi8Xu/nZNX31fdanep55nxQrZunWrbN++PesGMJVKye7du6WgoECWLFnyvo6HGkBCCCGEkAmI43jM/44dyyQ0LVy4cPR39fX1IiJSWFgo119/vYiIPP3001nr3LRpk4iI3HTTTer369atU+3I5s2bZWhoSNauXSsFBQVZ7e8FPgEcgziKJT6vcanQNXa0AbExPWnQZE0b1HoQZUdxWOtu8oacziM0dhF+E8QEGYsLH7Qv1budzsYDmwcRkahl/Mio0rTTzETWqmJkxH7dcRp0hkVG8wMavSit98UHXRzazIiIlIJ+r6TIaXLQysHuV9hmbFng2Ct26yirGLRJUVOzagtmOL1gwVGtoUStZ4XpW9RvobWHiNbv5L3urDi82UavBZ/zD+pzlQ/rD9tM5iTo/rJsRkBP59nzAzrWiWLIVNSh2S8PI92shg0tgkzkGmoMo0M62k5i1xNZ9hdgx5S/X9uM1PY7fVP61Jlx1+nvge1Z89aUO1aMd8vss1sHav5ERKIKp9eZtkW34TjVI2NifW2cdOfSr9ZRcGhlo/SvZp6hdrniF1pHGJc67VtslvPQZsRo+Xywc0k36WP1ku582XEagzbNP+DOgWfmdcU2uG6UaxutGDR6volLxP5DzZ+Itsryus2YanXXjrDjrGrywfYoPNyo2gqaXDkPx7pXovdZ4LjLh7VOFo8nShpbKJyTh4wGdJHTUMZmDHswRyoP6Ws36pHzW3pUW1hQISIifvoP6FHcHxAbN26Ul156SR566CFZt26dioJ7/PHHpaKiQj73uc+pZe655x55+OGH5fnnn5dnn312NA2ktbVVHnjgARHJ5BC/X/gEkBBCCCGTT5yxgZmM/3JVal67dq188YtflI6ODlm5cqXccsstcuONN8p1110n6XRannzySZUDLCJSVVUlTzzxhPi+L+vXr5frr79e7rjjDlm6dKkcPnxYNm7c+L5zgEX4BJAQQggh5APj29/+tqxcuVIee+wxefnllyUvL0/Wrl0rX/nKV+Sqq64ac5nbb79dtm7dKg899JC8/vrrMjIyIsuWLZP77rtPNmzYcEH2izeAY5EIRGozr+1nWZxgmoSxgUksqB/9fPajusxX9i+u5JiYp1/tT9e6Uq53Qpcmo3r33eBMl27rdo/y++tcqaO8VT/i901iCdI/z5VhChuNpQqUN2y51qvRpSnVVgnHY8vRla5kFrTr/exe7uxjRordw+maH+uSLJZWAuNqL1BO6V5WoZrKGl3pxrc2MFAOGlmprV7yoDTdvULb+5T/1o2ByCSbBLDO4SudfUhYqMu1xVBOT83T1ihx0vVDnrG8QWsUsXY4kC6QNhIAZYFjLFywROtBeTBrDOF5NWk5aHHil+rzg6kNwUL9Bps3BDKJfF3ewnSEkUV6/nQvdCXBmqMVensDbv7GYBHiN+p0FCzfhTO0wSsmfFirFyz7nvnjOaotv8f1Q8nTxpppUF9X1L4MuXNik1QwcSOOIAHDJHNgCs3QCj3WC3e5fc5KeIFxlGWbAvMgMVf3Q9js+jOYOUu1RSjTWOzOebhjr/re4DXOuqSwRfdPosNdK+yDHCzXpufo+ZNocaXdyEhafLAaCi5apPf5KFhGLV2g2lLVbqyMVLh5lter51LQ47aXrtD9PAz2TiWNppQbujnvG6uk4dkVo58TjfrN0jjttj9UrdeZB3N5ZJa2FRkuz1yP4uDDbwPzQVBfX5+VGDYWd91113v2D7z66qvlpZde+h337J3JeQn4N7/5jdx5550ya9YsSSaTUlFRIddee608+eSTY3ZqGIbyrW99Sy699FIpLCyU2tpaufPOO2Xfvn1jrJ0QQgghhFhy+gTwmWeekU9/+tMShqGsWrVKrr32Wmlra5Nf//rX8h//8R+yZcsW+ed//ufR70dRJHfccYc899xzUlFRIevWrZP29nbZtGmTvPjii/KLX/xCVq9encMjIoQQQsi7ZTKj4IgmZ08A0+m0fOELX5AwDOWf//mf5a233pJ//dd/lZ///Oeya9cuqaqqkqeeekp+8YtfjC7zxBNPyHPPPSeLFy+W/fv3y6ZNm+SXv/ylPP300zIwMCB/9md/Jmn7NhwhhBBCCFHk7Ang/v37pbW1VZYuXSr/+T//Z9V28cUXy2c+8xn5u7/7O/nNb34jH//4x0VE5Jvf/KaIiHz961+X6dOdJun222+XP/mTP5Ef/ehH8vzzz8vtt9/+vvYtTvoycE4bV3hC3yN7+Iq+1cgUOD1IQYexVwCbDtQliYgEnaAJM+HPUQj/PJpAZ+CBBCju1to6D+0CjHVAXrfTqXjF2sbAS0DUVJ6xzRgGPY3Rn8VoSZKn2/x+6D9zPInBaMzPUm50ZCchANscTzzf2bnkd+pzgJFlnrFsQcuOVImZFrOdTjLMH18ng9Yedp3pEtcniQFjCgJ9G+VpfWDyLFiEGLsV/Nk3Wq4YbE2CSm234aXBisXoojxYZ3qu68vEca13jeH8+1U65io+DVYs5SYKDs6XlXhgZKE9VrQk8frMPkdgC2LscATOszcM+kY7z2CMRYXm/IPNCMa7iehzjJo/EZGREncMgYlsUppae1pBX2ktT9DCRcw8V4AOMzLarhg1ulY7CGM4NrrfuMCdO89qR2F7qZl6PCS6Icat2F0jPTueofvsPMDIQnvu4l63/pEq3V/BMdCVRub6CcearjAWW/jdtLYyCovc+MD4tFSxHjeJjvF1nnnd7hxbyyNl2zSsx3pY4Polr1jb9ESDbl+KTplYOtA7xqbbR0ozv4hz9TiITwBzRs6eAOZb8fE4VFdnBNnHjh2Tffv2SWFh4ahJIrJ+/XoREXnhhRcu3E4SQgghhHwIydkN4IIFC2ThwoVy4MABeeqpp1Tbvn375J/+6Z+ksrJSbr31VhER2blzp4iIXHLJJZK0Jq4ismrVKhER2bVr1we854QQQgi5IMST9B/JImcl4CAI5B//8R/lU5/6lPzZn/2ZPPLII7J48WJpbW2VX//617Js2TL53ve+J1VVGbuR48czr+XX1dWNub7zv29qahqz/b3gD6WleEfGKsHaNcQTlGeko2v0Y95ekyYAqQ3hGV1O88665WzqhXewcfRztFDbTARg2VHy451uW2LA8plp8l6F5UwJGFM8glna1gYtSHy73HFnZRNctFC1hZCWYkvARWCjohI+FmtbFg/KaWG7dv4PjjiLi+SOXtWGWwuNwz5a3hT9bLdersEdQ8XTe3QblG8wmUVEJyIUvQT9PKzLM9jvwdadug1kBlbfihYeNtEhhjEVzNG2HHGP6xe7Lx5EC/lgR5Ju1f3soySgukKvA/okPqntVvAc2AQMtFGKzhjrH0xc2blfNVW+7dq86dNUW4jHt3v/uN/z211qTJzUVj8o3yh97i3VhgVUa/Wiyr5ztHVNgGk5xmoK51awWFuQeD0uxSWEa5NvJA0RHHfRm0dUm6CFU5W+3oSNYBFjyunecXcuQ7PPKsXFzGssaSabIXFjlu6TwuffdD/4etsRXGvtfkVD7rpR8Mu3VVuIperYlO+L3DqTLToJJJ2CtCFzrSiAc5CE65SVWmAKTn67/luRhr8BsSlp436GxgYo/xdd7msJ/ec7AKsmf6c+53hG8v9DX8NqejLJFMGQzashH3Zy+hbw1VdfLb/61a/k1ltvle3bt48GI+fl5cknPvEJWbDAXfz6+jKTrshOlnMUn/sj2tvbO2a7paGhYczfHzlyRJJSPGYbIYQQQi4MnkzeW8A5cjn8vSanPoA/+MEPZPXq1TJnzhx54403pK+vTw4ePCh33XWXPPLII3L99dfLsHlCQQghhBBC3h85ewJ46NAh2bBhg0ybNk02b94sJSWZt/AWL14sjz/+uLS0tMjmzZvliSeekM9//vOj7QOmbHSe/v7MG2ul5m278dizZ8+Yv29oaJDjJvieEEIIIeTDRM5uAP/lX/5FUqmU3HDDDaM3d8idd94pmzdvlq1bt8rnP/95mTs3E2d08uTJrO/i7+fNmzdm+3shDkMXs2asClC3FGRpvkC3lmVx8O70FbEpYaO2K2jr0m1g9SE+PMydYJ89q/kCHUmWjgwsLqJTZ1Sb0mRZ70U41viE1oCJB/sZa3sFtMfx0Fqmo1P0F8e3xlHHmjAvC+F+WT0d6mmMnsrb3wi7rPcZvxtZ+x3Qwim9mz0/JkJOr2SCh/RgVRFHE5yDTq0jQm2S3RfsF78ZtKp2/KIOq13rp2IVE2eWm+B4ME5MTD+riLoJzquNThvPOikCjaTFH9LnI4ZzbK1E0PrH6oXR6gU1fyLakggjvESMxs3s53hjJSs1Cfo5MnYuPurrUtpmZMKxAec1tsvBOoND+hqN/YDH5lkNNWzP6vzw+pZ1vcFrkbW1getIbGIppcVd07I0jRMQdcB4j8BSydrywDnwzbhXtmDmeCa8HsD5sSM7Brsda4ekxoCxL0u0Z5bz0jnQAE7mCxp8ESSLnJWAz9+wlZeXj9l+/vednZk//itWrBARkd27d0sqlcr6/nn94PLlyy/4vhJCCCGEfJjI2Q3gjBmZt0q3bds2ZvtvfvMbEckELYuIzJ8/Xy6++GIZHByUF198Mev7mzZtEhGRm2666QPYW0IIIYRccGgDkzNyVgK++eab5Wtf+5ps3bpV/vf//t/y+c9/frTt9ddfl29961si4gyeRUQ2btwo/+W//Bd54IEH5KqrrpJp0zJWDs8++6z86Ec/kkWLFsnNN9/8/ncujkfLn1klP8C+oq/Lqe9+xGEJKLZJdlA6CG2pLZ39JDTTYMtB8MjflAZU+WGCGL3sMi+UH02ahGobMi/xROP3Z9Q/MOb3IlN2yyo/YRuer6zOHB+0kshKocDyky1NQrnGs8kw4/VnVlkyGrctnqC/JuoHPIbIygpUH5ntwT7HeD5sqb0fynrGjkIdt5VCyPjHo0raE8y7Cc+/TXsY73tm/Xju7JidaGxYKxu9UvieKTGOO3dF919oSsBqjL3LOSih2eceV6rMKovCeMsav8aaZdzl+nWfqG1Av0f22oDHY86x6q8JEpEmnBOGCUutvwNZYy92+xza8jDO6/fQz+qcmDEcTiC9UCXnEbPcOenFuNcr8qElZ08AV61aJX/1V38lIiJf+MIX5JJLLpE777xTrrnmGrn66qulv79f/vzP/1zWrl07uszdd98tt956qxw6dEguuugiueOOO+TjH/+4rF+/XgoLC+Wf/umfJJHIqbMNIYQQQt4lXjw5/5FscmoD87d/+7fy7LPPyic/+Uk5ffq0PPfcc7J371752Mc+Jk899ZQ8/vjj6vu+78vTTz8tjzzyiMyaNUs2b94sb7/9ttx+++2ybds2+aM/+qMcHQkhhBBCyB8OOX9cduutt47Gvb0bgiCQjRs3ysaNGz/AvSKEEELIBw6fzuWMnN8A/j7iJZMSzM1Ey8WF+aot3HNg9HNino5mQxuL6JqVqi2xDWKojFdhesls1/bKDtUWYGyTAS1jhtZcOvo576zRtmzb65axerqrVrhtv6pjyFTUmLGPSdTNlvHAqDGv2CS3gPVD1KKtMTyILEvNcm+H+4Nam+Lva3TrMHojjCiLli9WbcHB467N6H+C2RBLZXV+Je4Y/IR+aO73uO3HXVrnE9W74/FbXExYepGOZgt2udgmv7pSbxviqqS1Q7WF7RBDVVOt2gRsRjyzzvAERPXN0edRnbtSsGdq09v2SlxaTtiqI9B8SOuxGjMPzg9aoYiI+FUVo5+V1YZofVJijo6DPHn73NHPM7796rj7grYj4UJ93H6TswRB+x4REQGtr2ci3eIk2JoMGTsXOHaMdxOZ2Aak+88+Ovq5+lcnVFs8DBq3aALLFhjffq0ZG2CVkj7ZrJpwzou5VgQwjtImztIHKy+rCcWx6Fe6dXiBnksDK915jI0MrugY6K3NPEANnWdiKdE+Jjyt9xmj02KjtYzzsvPmR1eJ8wL73djaRCUQq9jZp9rCae76hjZTdp+tJZUscn0kodHlQtThyA1XqLait915HpmvYxB7FmSi+sIfbhEyteANICGEEEJyAvV5uSOnGkBCCCGEEDL58AngGMSBJ1Fp5rE4lvhEdEkprNJJID6UIz0o+YoYe41OnWyRbHIlp3jxAr3caVdeG/6jJXq5HlcOKtx2dPRzNGeG+l4wrcatzzjlx2+75bzpujQgWCadp8tuESQb+GW6pI3O/yNX6n0u2uPK5FlpHPA5ecqVU/su1iWs/MJFo5+DV3Wkn1/tSuZ+iykjYkk7y5YB+sWUJgfmufNc+Eu9PVynV6YTbYIuV/bBlIBgh05mwHJgukmX/AI4ntCURVXZ15R5o6Ou3B3O1TKCJJSVs5JasIRe4Y4nNkkWPpT2g4sWqTZv0MkFIpPi4qE9TUr3QzzTjVMxFks+lhWNDcjsF2Hf7Pw50TL6GfvPm6tLuR4keqRm6f5KlBS6fT54VLXheLMpJD6UBAOzX5jwYa1esOzbv0LLBYoOu/6Mm1zihp3XPozFuFeXH+PZbp6nlq5Sbfmv7hv97C3Ucz4+BaV+m2xR5Pqo/4p61VZ8yPV7XOiudWGB/vNTtNMdd5w2Nj0wZsN6c+4OuPK6Z0qmSmZgrFHSMypGPwdJvS/R4WOwASP7qHTLhWdcnwRmDgrsc1Surw3eHif78OYaOQ2ODTvnIZ0nnlWr2xqWjn4uPKGvbzFYGeUd06XwoY/UZ74zgcsP+XDCG0BCCCGE5AaWgHMGS8CEEEIIIVMMPgEkhBBCyOQzmTFtfNKYBW8Ax8L3JSzJaIL8Lq2fwdf+g04TsQVaEWt/Eve49WTFiaXAssNGVIE1Rn6b0SOiBQnoT4JT7Xr9oJny8o3FBerwjPYtAuuXoMfYGKDNhLGqCcqdZq7gtNF5DU8Q1QQ6HA+is4qO63UEZ52+JSswDLU8vn7Ajbo/P1/b+6ANRHjRPNWWfxYscJbUqzavzS2XFYGFfVThbB9iG7824I41YXSYEei3/MJC1YbL+cZ6A/VIfruJKwN7kqw4LPg5XuD0ZzbQLe6FKLhYj3XU/Vl9KOo+PROj5uN8qjLWNWe1llABc9IztjMhjGHU7/pmjkjSaR+DQRPT1t7l2mZqfW086M5BYPY5LnWWJJ6ZP9FEEYIwR1DzJyISVkJfH3DrSMyYrr6H6/AqtFY5hv4qaDIaTThfcUeXapOZTnNmzx3OrfxOM8chwtKDa0Wi21wbKmCs2Fi1AXesQbM+dyGcg2iB1i36reOPm6ATNNs2Eg+v5SY+U8C+Bq2L4nI91v1OuE7N0GMjAB1hbHWyYLEkRh8qcC79DqPzw2u5OecC14eoplw1JXszfe0Zxxny4Yc3gIQQQgjJCfYfl2TyoAaQEEIIIWSKwSeAYzE0LMGOQyIiEpkyYtTvyhbWxiQecaWPrHJdGsq8pqSANg1YzrB4LdqdPg3l4gDKBpHZr8iUaxAfnPNt2oegPYl1/ocSKiagiOi0EW+/2bY3/r/3YrAuEbDl8EwZJBxy+4n9KiISodu/6eescifgw3n2dh7Uu4ypDaZEH8Kx2n3BdISws8v93paf4ZzjsWW27fYrMiV6TILIkhXAufRg2yI6nSOrvIXb/q1LvcnqZ7Ayio1VBZY0JxrPNpUmbHFpHHFqfKlA2KZLgGiHk25u0V/23fFF0LeeSXqIsI9OacubCMez6S8PJAdxpEuaAmXRifrB2tqo8wpWLyKiyr5+gbMZSZ8+o78Hx+31mf1Smza2KRMca4xpMJERX0CJ0d+2TzWFON5gX2xKDF7DLOqaZvcL9/nAMdUWov2WmSNolWQtYtTPsb5m4ThVGBsglYjSrtNLIrgOZklCcD7Z6yWkoET2eOA67w/o8YbXGM9YYE0/kykJH+qbQJ7zQUJtXs7gE0BCCCGEkCkGnwASQgghJCcwCi538AZwLDzfBcfb8gx+zQawY5sp84kqW5oEDCwXm+0l4K3D2Lrc46P8aa4MhukHIrpUlBV0DyWsrFIx7qc51mho/DcQ8c3VrDI5lmRMWzDbOfzjsdnQeNVDxqVfvbk8TTvle1BCteUgtR/mbU4sD/omEQVTL2zYvMA21FixYwPfVK3Qb+hFUP7OKslhqdCU73Hc2DdoMcUj6tVvsmPpMDHHvQWcNmMKy1t2v1AmgW/eiph+T+t9xvPql+o3KiNM2bFla1ynb9qgj3AehOatXN+8ta/2q899N5iu3wIWVWIc/zVK385dmOcoHRERNdfsOnGuYdk3MW+O+h6WKX3zdiq+6Zs+2qj3EyQh9nqQmO/ejk836sQanMtZ8hc1NmHcmPQNAemAZ+agByXNrHI3fq/AJG7ku7dhI/tGLb59HZlkExhGWdfrJFxDYR34Zq+ISKjehjf7BX2UPtmsdwvGKV5nRfS5C81yak5Or1FtguNhhnEaOJdYEp9lFMhUgzeAhBBCCMkNfAKYM6gBJIQQQgiZYvAGkBBCCCFkisES8Bh4vjeq0YhsAgGmDhSMr+XK0vVY2wRA2ccYzVTU4zRaVjODaSPxGWeN4RcWqO9FkKoRGUsIH+ww0LbE7pd15kctFyaZZH7hvuuXGUd6sFeIuk2SCuq8QAdjdVDBNKdTClu1JYhfCOkLJh3DL3a6m9jaraAtSMJqk+DfSWaf0xNYY6jzBUkTYi1O0EqmV2vTlP2K0TuizjTrnINu0WpVfbQM6tPbQ5TdhR2/SRh7ZqyjjsyO2bgf9FT++JYqYjWasH2vyGrMYP5YexfYNRxHtr+wj0Kji8Rkm8jYeeDY8Mw68bxG1mIJz6W1AcEEGaMdU0k60H/WmgR1f5G1J4FrQFCtU3xwXiTqZus2SPSwtikBznNzDvwU9AvOA6OLRG1s3GOuDXDcVnMcwjnxrP4Qxqa1MlL7aHS50TDYdlnNLmp78+CaYlKOlPbSaqHh+NDGSCT7fI23bfu3AvsT/x6ITGwRI0Vm3E42LAHnDD4BJIQQQgiZYvAJICGEEEJyAm1gcgdvAMcg9n2JSzKP9j3zeDzoAusVU9bxG5aOfh6Zrl3t8986PPrZM1YfYQ2UT/ZpJ3tvNthOWDuUY86KofdTK0Y/l2835SAIYI9N2TosdT8Huw6rNiyLWLf6AI4hNnYRfjVuz9jOQMksSOpS0dAyV3JKlbjyVukbTXqfsezr6/KmB+HsI3N0acX/9W9HP6NNiohOl4iW1au2eIGzk4nN9hJdri0wwfMROPqHKxe7/RgxpeLd0O9L9LaHZ7pxVLxXJ1Skj7uUiNiUeTFQ3rMWJ1CaDIzdCp7nqGG++95ZLR1ASx1J6+NJt7j9DAr0WA+mgT2FLQ/Dz55JPYlPu21Ec/S5613sjqHiNzqVRk65ueCBrY1YSxDov771q1VT+cv7Rz9337JStVX84ujo56EVc1VbFLh1Fr15RLehFCM0JfpasHQykgCvwl0rsJRrrV6wjNh38+WqrWwvlHLbu/T6oYxt7UmCixaNfk706u3hd/0VF+t1NjkLofAiZyUT7G1U3xtucFY2+Sf1fvkwxiJjt4Rl33CWnvPeQUj7sJZRV13q9uWsvoZ5B915DWq1pUr/pW4cJftcaTcY0CXgoNOdn67Lddm66BRYP736tl4OrmFZJe1CSEgy0psYxkP3jQ2qrWK767OwXF8P2lZlzmV4kjYwUw3eABJCCCFk8oll8jSAfNKYBTWAhBBCCCFTDD4BJIQQQsik48nkaQC9d/7KlIM3gGPhe5KuyOgk/CETA3TCaXJspI6cbhv9mH9cR2dhnFDYpGOUgkGnI/NKte2DgBYqNUvHIyVSLjqtpNHpP+JerddScVglWpvotYEeyLShpsS3MUenQOdVN0u1Kd1SidGwgG4xNDqvJOh3CvY7PV1qvtZ8JUE7iPuR+YWzQsg7prVCEUaB2Xi0Ste3Xp/WdobFTneTGBzfSkISWkODsW7eEadN83yj5QSdj9fRo9qKTjoNW2j0YKjRtBF/HvRRVKHHlN/rbCBCawsEesGhWtdfhb89oL+HGtCZWiPloy2HGVN4ftLHtcYsMQvOs7GBUTFXx7XOr3wItFcpPV/RfsWD7dm4vxgsgkpOaJuMGNZZ+Zre57jUHV/hLhOPVgna3hptt+KDhUvUo8859lE8W19jrNbzPBgRJqL1gUrzJyL9C92xlwwZSyKYk0FFhWqKYB54x/SxoiVNulTrjJOgvVNaUhNXVrDXaVqjGnN+Ctx4tjZAIWhtAzN3Vb+YMeX3uWPHSEdLullfy4sxqg8tg2br6xRavZQ06fOTOOWuP7GNiYN5nT5xUrUFoDO39kH496j02PiaXW/EzJFE5nhYIZ168AaQEEIIIbmBd545gxpAQgghhJApBp8AjkUsEpwr9XmntKO6QMpBbJM5MGHBWBWoUlRC258IOP9Hc3U5VY46G4N4nnGMx9f53z7kPs+r0/s1gWVHBHYYgS1pF4ElSLVO9PCghBqbdIwIyiJDf7RQtRVDqSU+Zexqup0VQwz2O3Ggy14j81zpKGhtU224nNdnrB2g1BqbtAdVJu8bUk2Ds135pmDbPhmXal22iqBkiykX6R5TygVrnrCrS7WhTYtN3AggEUGVG0UkvR9sR+aZMmLSleu85vEvAcUHXWnNZDYouxBrEeTVOWlC3GlSDcCCxgt0yTycAWX4A9r6R6UvGJlE3Axl8qXzVJsPiSgRzLO4RFth4FiJZlaotqDezafoiN4vlHbYxAgPE2yqtB0OpsHEpmyNliqppatUW0ETzDtI40gfbdT7jAkfxuoFy76dq2eqtoqX9rr1m2tR1jkZZ3sD03Q/BINuPTj2sAQrIiIwL6K9h1QTprGkl+lzHOyCUq6VAEAZNho0CRgFICsY1hKKic4rWlvFZ+F7Jn1DprnrtWeSlEL4++Av0PZBmLhi04ziRlcS9ubppJYIpCWJZp1Yo9JFjAVScEVm3tGPb+rBG0BCCCGE5ATeeOYOloAJIYQQQqYYfAJICCGEkNzAJ4A5gzeAYxHH4g2f0wAaew2l3Yi1MipEnYXRN2EMUZzS2pcwDdYLJ7XFRRy5bSR+o604vDywRpjp9GDpw41m005DZzUluA6JjNILdIvx/qO6DTRZsbVXAN1a/k+2q7aoYHzrEunocm35ri0wdiF4DJHRxaljMMcTdju7Dd9E4mE0V7xQa2sKXnYRcsFcra9Eq4d0q9YAYb/7YEcRWO0b2FjYiLr0GadxtNpRtLLxerSm0QeNnmcit1BDlzZxhjH8nOgrHfP3IiIRHKtvdKXhaafJC+bovhRlR6HPXbRtt1tnjda7hqDZ9Aa1RhPnmn9Y22aE/WBlVOR0f+EhPZ5R55V4S9uy4BjzTXSeh2PfaoJR29lobFNwuchY3sC+5L+qNadoaxKDrswvNhZOQ6A5LtRxlngOUPMnIuKhjtVci9C2JWoydjidbiyWvKzXGfU5bd9EmlYPznlimraIEZjziYN62yGsP87SgLprstWcem87nWxoxxTY2tjl4haIF4QxZc9juM/pGINlS/T6QS8en9A2M3jdstfWAOyEItCHZ/YZ/sbkGZ056HS9Aj0eqt/O9F8wbJW+5MMObwAJIYQQkhv4BDBnUANICCGEEDLF4BPA8Tjn9h4PaCsRgbKvTTmIoZSX5ddvygNqU1Das4/nsZRjk0fQhiaEcoBKVBCRCKwwYpO+gT9jukPmF1DCLNK2GVgytcvFUGoNFs9Xbd4AWN60mZIpWD1I4P5tYm0SwnJn5+LvOqzXgdYvptydgDJ51KHTEYJaV3KKz2qbFoGUEGtrYm1bEL/cLYf9ZUvTPiaUmD7BcRObMRRgekm5Lk2GzS4hxasw5w4tY6wVD5SObB8hWEaOh409DfSlDJnSMYyNyLQFmC5iS3K4bXNeowFn7+GZ0peXdFICtAEJphvLIyinRp06JSaY7axS0sd1idnHFBdfz3pM0rFlRME0ibS2LlFWOQuN5ABlErDOyFynEnWu9I62MiI64cNavWDZN31xvV5utyubx2l9HUnMAuufMn1dDM5CGRaO2yvW41KNIyM5wDJ/VG/saSBJJejQUogYxkpsrFhU6olJ41ByHoO+hrp+t5KWxLw57gc4byIiIZwvv36OaouONMLGzD7j2Cg31lwojTH7j+MjMDZKqYqM5CD2s/5qffDEk/gWMJ80ZsEngIQQQgghUww+ASSEEEJIbuCTuZzBJ4CEEEIIIVMMPgEcC8+TKD+jJfKnaTsKQS2X0T75YN/gV1aoNrTssPYHfjFElA1p7ZPS/Vk9SJfTvoQfbXC7v8Po4kCbkq3zA+sAs19K62ItYlALaa1lIBYqshYH+F1f//sjqnI6Nm8Q9qVVxxoFp5wWLjLRTwL2MRgLJ6JjvHwT74TatJGl2rIh/zdu+yOrFqm2ZCfESx3WtgxKv1nrxlGc0HowtNTwlyxQbXLK2cDY84O6Qs/EXAUYx2Yj8XDcGl1hnAYd0IqlbpndekwpG5MKE0MHetTA6Dd9PP9GY4g2PQljt4MxbmL6z5sJc8TEEqLlEsaVhSZCEKPGMGJPRCQCKx6/Yalq86FvrfVGXADa3uPG3gnHra+PJwArlviU3k+ZWeva2ty4TMzX9icYJxZcpMdsVAxWTDbeDaxeUPMnIpJe6daTeEtbUqVBS5qIanUb9HUwDdrM9ROj07DvREQkBMubI9pSJ4R5kTIxfskWWK5XrxOvhZGxUULtaJZmF/S2qNm215uwyelFwysu1vt1FrZt4gV90JaHJjYSIznjfUdUG17T4mX6OhIcc9fhaJY+P0OVmTlpIzcnC8/+XSOTBp8AEkIIIYRMMXgDSAghhBAyxWAJeCxGUuKdK+fZpAksd6ZPnVZtAaYXmPImJinYNAFMCcEymIhI4I1foo0g5QCLG9Y9XllODOhSIdqtRKZ8NhGYVhCeadVtaI1hysNoLYP7JSLid8CxQ5nP9gken7XXiKAs5hu7AzwHsbFsiCBpIn9no95nKO3l79eWGlg6srYmWF5VpXdbpsTz1aJtWVSJyaZ2QHlTlW5FJAY7j6ykFpQZmPKjSpc4CCVt019ocaJkESLausakSUShK6f5JqFCpUSY0pfadv/4Je3Ijm88vonGDZSYgxIzbmCfgwEt0Ug3uXKkLVt7IKEI+/V+2TQgtU6cT56+jnho9wL9nLZJIyDRSPSa9JJj5rsAyhGyrF6g7GvtdgT2KyvhA8cOjK/Q2u2gZYu1YYHjiYydC57LYJ+WYaTRpsmUGr0Bt19eUaFqi9rhOlJo7FbQqguvYWe71PewJBsc09dIlNdkXddhnNo5IodcudguF4KsINGiZTNoa+MbK7DKtsz4CAb07ycNVoBzBp8AEkIIIYRMMfgEkBBCCCE5YdKMoEkWfAJICCGEEDLF4BPAcTgfWWT/cYK6O7SVEBEJQTfiGZsRvQ6tYcL4Lb9AL4dRY4HRDqLmEGO7fLNf2Gb1YKifsXo91D6hBkdEx1fZCCTU0yldpCE22jHcTw+ONWsdqMNs0TpMgf3KiigDHV6W1hLj3qw9BdhAhDaibIKIv6DMaYfSLU4LZ/sLyYqg8kELZ7aFEXI2ljDE8WA0bajf8lPGugT6D8+jBY8tMn2C/RxZ7RvoysIeY4cExxMNjR8FJyY6Dcdplv4Mxjf2rR1TqH9NN2vroqDKjY300Ua9frALCZuN1Qtq1cz8UdpEe17hfFltGsYs4jywcXJq7JkoONy2vYbFoMvDeDcRbfUiJnpO9afZFzwHMV4brCUVXlMCo6GOndYuMVPbmGCkZJbFFuiRbVxeiDZKE8Sg2eXiceaF1ZX6cE3BOE4RrRee6O+IPa84R4KaGtUWw98mG+OI68nSiBdkxnBOouBEqAHMIXwCSAghhBAyxeATQEIIIYRMPvEkagD5pDEL3gCOQVScL71rM87tZb+1JcbxS36ycPboR/+IsQtBCwpTavVnzRj9HOfrklwANgM9yypVW9m+Lvc9LAeV6nKgj0kNJkUhbnRu9baM6EEJK7VMW1wk3tjnvjdvtmoLTruSzKlP6+SEWS+67Ykpd45c7dJMCo649ID2a/X6K/e6MphvSrky333X69RWIlhy9ouK9HJQ/lDJEiJy7P92yRDznzbJDHCsYlNjIEEiWFjvft+pj9uDFAq0sRER8TDZxJTMVSl5ui4H+VDGHrlCJ5vkdUBJ65BJIYCyXO+1Lvmh5Ke79baLof8Wz9FtrVBqLdZjCpNuImP10n3zytHPla/r+YOpKnb+hNNgXpg0A2+vTrM4z+Dl8/X3IGmib7Yu0ddudSXhRKEuyYZQfgxmzlJtqZluv2zaQXDIzYMsWxs4vv4r6lVbfqc7r/42Nwd9s19oXeSv0CkU6VInMxmYpiUnJS/vdftVps8dJnzYUiuWbxvva1BNs3/lZABDta5vSw906XXAmPWHzbiBsY+JQSIiAufAzt34FFrq6LEx8slV7nOpLoaVPP2GW8xINlJXuv4sOOzWP1Kv52Aq4daZ125K5sfh74q5bgQwl6PDjarNm+/mWmxKzl4MpWRj9ZIYcn0b1ujS+7FbMj+n/hdvB6YaPOOEEEIIyQ18MpczqAEkhBBCCJli8AaQEEIIIWSKwRLwGASDKSl7IxOXhK/ki+honjilX9FPgF2ItcZQr/ObeKf4LEQiWSsW0MXoQCIRaXPLpeG1/8DojTB+yVpOqEgio8lDW4O849pWIESLmJNaJxn1OW1X7XatW4t7XVtsIp0KDrj1xINON1T9ltHF9To9TTiobUb8E86qwtodoG4pMhoZDy0ojCar7leg0Tt0TK8TtqEVOdoCxUs5rZCNdMPIMGu94kdOCxWZ5XAUee06VgvPQcEhHS+n+sGMYYEotbI3XWRYaPoLdWt+k2mD8RfZGL9o/HpP+QH33ehM27jfs7F0PthfeEZzGMGcxHNVdKhdfU9gvua3aa1t3AcxZ/1mPMM5sfrNBFjLWDsXtCCx1xHUbxUf0vNO2t3PGP1lx5SfAougJm1rk4TrTzCodYs4boKz+nqQbnXnxOri8FqBmj8RkWSr64fkGTj/JjothnMQGusVvGYmOrR+N4TxFp/Qx6r61lwXCw+7MVBo9HR45bDnB3V/eM6T5rohqL3u6FJNEeqRO4wVE8YZmmtYdNRF3fnWRgcx4wHtq7yz+lox78UFIiLS0heJaIedDxxPJu8lkByZ3Pxec0GeAL711lvyN3/zN3LbbbdJXV2deJ436qM3Ed/73vdk9erVUlJSIlVVVXLjjTfKq6++OuEyr7zyitx4441SVVUlJSUlsnr1avn+979/IQ6DEEIIIWRKcEGeAD744IPy/PPPv6dl7r//fnn00UelsLBQPvnJT8rQ0JC8/PLL8tOf/lQ2bdokt9xyS9YyzzzzjHz605+WKIrkuuuuk5qaGvnZz34mGzZskF27dsk3vvGNC3E4hBBCCJkM+BJIzrggN4BXXnmlLF++XK644gq54oorpL6+XobNI2hky5Yt8uijj0p1dbW89tprsnjxYhERee2112TNmjXy2c9+VtasWSMVFRWjy5w9e1buvvtuCcNQnnnmGbnttttEROTMmTNyzTXXyCOPPCKf+tSnZM2aNe/7eOJkIKl5mWfhyaTpIrCjkKR294+q3SN/r9ykLxxqHP3sV1XodVa5R/lY3hTR1izpEm3ZkDgLpZyLnWWHmCQLD5MSjMN+UOr2E8uzmQXdU1y7HB6DfdqL1iUDlbpUlIDlAlMOHKl39QdvglJhEkurpmSOlgqxPXdgqRCU64I6lkWtrU3fbNfvlUsW6HVCGR4TNkREPLTKAPuGwKZjQL8niqertqjGlSODZlPKhTlmS3I+JNFElWYsDsKxDuh9wQSG9GzXl4FNd0DboaIC1YY2N5iGkNkZKGmZcZMCe5K8ygq9GFrgGKuP4dlu/uSfMrZAPZA8AdY1UakuyXpgv9S3QI+NsnZ3PFGdto/xD4AkYPE81ZYuduck2axLuSo1wpT5sM/iQlNqrXFWH56yBTJjPemOJ7xI71dwFsrPSV36xLQhO6+DaVAfNPMT0zHQ6kVEl32H5laMfi40NkDRxa5vE6dMkgWM9bjA9AmMfW+OTi9Bm6vIyEVSM8YvofoH3bHb6/XwAtcPSbDcivKNCMR3cymcqdeRdxKOz8pRytw5iM31zauEfbZSHyjzps05TzSCNKZSj+/W1ZntpQ/xlYCpxgU543/9138tX/va1+Smm26SGTNmvOP3v/nNb4qIyJe//OXRmz+RzI3kvffeK11dXfLd735XLfOd73xHenp65Oabbx69+RMRmT59unz9618XEZFHHnnkQhwOIYQQQiYBL56c/0g2k37LPzg4KD//+c9FRGT9+vVZ7ed/98ILL6jfv/jii+Mus27dOikoKJAtW7bI0EQZooQQQgghZPJvAA8cOCDDw8NSW1srdXV1We2rVmXc2Xft2qV+v3PnTtWO5OXlySWXXCJDQ0Ny8ODBD2CvCSGEEHLBiePJ+Y9kMek2MMePZ15jH+vmT0SkuLhYKioqpLOzU3p7e6W0tFR6enqku7t7wuXq6upk27Zt0tTUJMuXL39f++ilQkkeO6eZMAMHbWG8hsWqTUAPFBnNlIDmJ7R2Eai1MbqbdIuzRvGqdQRSNB30QC1ga1FrbCzOQJtZfzQwvp4OrSoCY10TgWWMV6C1iWhlUnS4QrWh9UPY1aWakntgN2Gd6TnamyBC3c3xk6otgOgnz2oAYZ1hp7ZCCGphG226rXKH+xzuP6KXq4b4JdO3aNOQ3r1/9LPV9ShrlFjrSlF7Z/sL9VoS6eVitOkx8YJ+N2jHzD6j5UXQCfFbxiIomOF0eN6Q1pzijIl6tCYPtYmhaUsedHMkbeaI2naHPj8FYLci+VofFqI1R6/T2iWMZjLq7Br9XOqbfxejtvPtA6rJg3Mc7tir27BvZ2ltmgd2UtGQsQUCHWZYoMdKonts+5issQ7jIdjbqNsgaszvM+cOtbDFJi4RtMVZ8wf6ISviDeY86v5S87VcKHHQ2Q5ZmyYfNbsmjjNOwXdPafsgD8abZ+LrEr3Q74ePq7YIrvvhmVbVloRrJl7rsiI+QcvpT6tSbeHJU67N2rmA3jE0tlAe/OzPn6vbYEwFnVpLrq4HrXpuFZ3J7Jtv/mSRDz+TfgPYd85nqshmsQLFxcXS1dU1egPYB95U4y1XfM7/q9dMmPFoaGgY8/dHjhyRpBSP2UYIIYSQC8Rk6vP4EDALvvZDCCGEEDLFmPQngCUlGUuKAev0DvSfc9svPVfiOr/M+eXKyrIyMbKWeSf27Nkz5u8bGhqksaldBi/NlJrzW/V++vCSiddjjmGms/DoXK1LPuWb33brmKPd91PT3PEkTLkmMc+VvOOjxuUeyoNnb3ZPNCt369LaRJbcQ9cuG/1c+Ob45c2sUt7ierf+TrM9KDGJsY8ZWe6Wy2/S5xFtGc5e7J70TnvdpCG0uJIMlhRFRKKFzm6ld7EeC+U/cSW6RL0un2AKQc+12uqj8LQryQzd8hHVVrbdlXKiVp0u4YOVSfr/utx9LtJ2EUU/2z36OVypZQUp6L9kqy7tR0ca3bbA/kZExC8D65cunV6BKFsJEYkhaQLlD0FtjYxHbNI+UO6QtRyURRM1uiwW+9BmymnpZjf2h2EMiYi0XOPGwPzHD+tdgeOLwT4mNtIOH8q+aN8iIhJAykrvrZertoptTqIxeM1C1YZPHAqff1O3YXnY7MvASjc2i3aeUG1xhRvTAVhEiW9mOcyL4YY5qqlgL8gmjBWLVwM2SsZOCi2WAmu/hJIXsxzOLWX1clAfW/P/e9Ho58oDugRcdARKzuaa4kF5uO+j9aqtdLsbN3ac+iOwz8ZayG9xtilevZYdjUxzcytd7MZ6fodJ34DPw9X6OuXVOZlS4Q5dfvbAmitRref8SB3MmSFds43fcte3wZv0OC3d4fatv0GX3rsWZY4h1MN+8uCTuZwx6U8A587NXNxOnjw5Znt/f790dXVJZWXl6M1cWVmZlJeXT7jc+d/PmzdvzHZCCCGEEJJh0m8Aly5dKvn5+dLW1ibNzc1Z7du3bxcRyXqRY8WKFaodSaVSsnv3bikoKJAlS5Z8AHtNCCGEEPLhYdJLwIWFhXL99dfLSy+9JE8//bTcf//9qn3Tpk0iInLTTTep369bt062bt0qmzZtks985jOqbfPmzTI0NCSf+tSnpKDApBL8jnjpzHNp65SP4faJQhPwDuWzshqTNIElEngDTES/BawSD0TEr4XSnkmawLfFkv3uObrfoUsdIZY+TOh5/llw2DdO+ZgmkBVYD2/bxTN0mc/rg/WYN0TzIekE37wUEfGrXOmj+m1XmooKTcIG9KV6u01Egja3zuJCM7yhTBabt1rxbU4s+YqIJNvcvgzX6DpJjG+d2jdxISEjvwXOwSw9NrwiN478EZMK0eRKWJ4pfakxZcLm1RucfeaNQHzr1KRQqO+VuP2KGnW5zoeXsWKzDkxtCIoKTZsbD3GbLpnjPmdVhXw3bguO6jc9ixa55Jaw1bwFiuVoePM3xhK5iMTFbj8DI7WI4C3j0kbdl1G5K8MWtuj5E+XBXPP1vMP9ilOmZApfjc0brzaBY3R9VebNf0hAyT/ZpVcB6TLR3kOqLTEN5rJJc4oL4Hpg5w+MTX9Yv0QXgtwHEz7sm75Y9h2q1P1VCNtWjgei31AvPGVSdgrhLWD7pjS+DWtL2nh+TujrdX6nO748KMmnK/QLiol2dw6KW/U1OYXJIDY1C/4ehCf1saaWuVJ1XqMe63iFLmg35Xvsa6MWKDibGVP++JeCDxQveufvkA+GnLwEsnHjRhEReeihh+TQIXcBeu211+Txxx+XiooK+dznPqeWueeee6SsrEyef/55efbZZ0d/39raKg888ICIiHzpS1+ahL0nhBBCCPnD5oLcAL744ovy0Y9+dPS/kXN+S/i780keIiJr166VL37xi9LR0SErV66UW265RW688Ua57rrrJJ1Oy5NPPqlygEVEqqqq5IknnhDf92X9+vVy/fXXyx133CFLly6Vw4cPy8aNGy9IDjAhhBBCJol4kv4jWVyQEnBbW5u88cYbWb/H37W16cfV3/72t2XlypXy2GOPycsvvyx5eXmydu1a+cpXviJXXXXVmNu5/fbbZevWrfLQQw/J66+/LiMjI7Js2TK57777ZMOGDRfiUAghhBBCPvRckBvAu+66S+66665JWe7qq6+Wl1566T1v673gpULJP5GxHYiLtaYwhkSMLB3RGXeTm2jRbuuR0vxoPZ0/6DQgvjW6BgsKa9nhgUYvvxM0HgmjN8qfQAfTDZomY6ETo+WNtZlA3VebtmlBbVpsdD6e0YQhfg847JeCq327sRkpA91Nv7HiQeuSHqNhwn43ujUPtGnBsBHDQLpIienbON/1p2c0oR4cewx2G/lG1xVCUkKixJiQgzYty2YG9K6xTZ7Bc2fW6YGWNDzdatqcTs5DmwyTnIFj0TO6tAi1fbafYdv2H+XhWTfWA2vnFMF6THpJzQ7Xt0G51lei/jWGsZJlXQP6Td9Y1/jQt16HNppHjVmiw9rhuGtFVGi0yWA7E6eN5ckxSNkpMssNgKUK7teA0b7BePZtcgbo6Wx/KS2c0QtLOH5iTRyDvtbomAWvmaB388220eoFNX8iInGe2y/faGFR22s1tB6mpZjj8fA60qTdJbKuk7gvQ9DW6vo52aXHBuq5Uyu0RRDqiu3fg3gI9JWmn4uOdsH39PUtgL9Hw/n6WJNwXcR1iIgM1Jwb7zl6SjZpRtAkCxpBE0IIIYRMMSb9LWBCCCGEkIw+b5IeAfJJYxa8ARyLwJd0baY8kDzVpZpiLA2YUoRf4MpBUYcui6LlgS2nRlD68mdoR/o02G8kTDg72ozk7TzmGspNKRdLssZywIMyglen00vweMSUEbH8gE7/dnveUp2qIQOwPVu2hFKoHzjH+3Bahf5e2pVFPFMWDWc4i4sgq1zn+ivq1QkIWO7yhnVJTua4fomPG4sQKCvaElOAFjGqZK7lAbhcZEqyaHNj7VaCqgq33Bzt7h/tcKkAwXRd0hQoCdoAe7WfYC0TmeQefxjGWIFJOZjrbFmwZJnZ9viJ84k6t1xkLGImSs4IzrpzacvwAZSnQyjJBYvNuOxwc9DaIXlQjk5bOxwYU/bviwdyDjs2VMne/gEEe5KwXs/JoBn6BdaZPn1GfS8xw6US2TGFMoz0Mm2cnzjovFmjep1Y5B9xxx6Zsn9iZq1rq9LXn0QH2PsUwJywFjdwPbVWL1j27b9cp/gUboXSvpEHxF2uLB+ZkqkPPwdGXqPkCLZMjtd9vLbacTPD9UmyQ5fFo6Mu/cNbpsvD3jE4B1ZCAzZa6fl6zida3N+c/G3a3kfJBVJ6nUEqYzXGUuzUgzeAhBBCCMkJvPHMHdQAEkIIIYRMMXgDSAghhBAyxWAJeCwGh8V7fbeIiITWCgFey7cRQWgl4VndyBmnw/HLtN5EwKYlPG7sCEAvGFnrinanFUL7DqutUfojo5HB+K0QdCkioi0IrO4KotMiowHE5VDPIiIiYF1il/OhHwTtG/Ye1esAC43IWGjIdqd9k+laT4mRXtZeIQTNmdeuNXoxRuJZnQ/GyxmNXgRxXNhmdXcYBRaHerwlpjsdUdg2fgSWZ6w38GzFx7RuTdl7+CZeDnRREY7ZYqMBBZuR0Ogw0ULDak7197S1DGphrfYJx1/cb84BaC3tHFH9jlZMLVozF/W6cxVUmlg11A6aeY3aSDV+RSSGdUZDZo6YeahAvdaBJtUUwviLx4mFExEJ8dpgIytBnxzs0pFhYR/oKXtMpOSI+67VNCrNphmnIZw7vE7FRouG18zIRM2h1Qtq/rLYe1jvF/ZRZOxwQL8b2XGK481oB708aFOWV7ovfTXPjAUN6GbjvUf0PsP1wDfRpulmp0EOerTGOQ3jNDFH6zfDE24530RWVr2SuUYHA2bOTRYsAecMPgEkhBBCCJli8AkgIYQQQiYdTybvJZAJnrlPWXgDOAZRWaH0//FHRESk+LguNwQHoUxaW60XRCf4Cl0q8jGRwJQUsNwZ1OlH98pixVq4lDmrlIFLnYVG4asHZDw8Y9khYCXiz9QlU78PkxN0uQGtELJsEmqghGbc8aXSfTcwKQcxpF6MTHeu9vl9puQD5TNbdhlau3z0c9SjLUcSUDLxq2yZz5W+znx6mWqb8WNXQu2/7iLVVrzXlUnDE6bcDaSvbHD70WvO/2/3u88f0duOm1ypMqjR4y2G9AcPzqOIiAc2N5h4ICISlYEtxx5tF4ElU3/Fxa7hwDH1PYFEj+DiRbqt+fTox/CyparJH3LnxDfJGWidFCzQVh/hkUb3vXptf5EugUScRn1JC1vcvgSznDWKTUAJal2p3SvWJdMY7ImiJXq/0JYlPadWtY1UufFd8Mu39TrR3ielx7AH5XbPlOuiBXWuDc6JV6BTibDsG87S4yboAysmm0Kx1NnCWBul1MwK17ZPy0VwHnrmOhJD+dEDSyU5peNB+z5aP/q58JQu82PCh7V6wbJv+/+zSjVNf9lJakJT9seSs2+kHdjr/nR9XvE6la5ycylrXp902+u5boFqKj3kStxBW5eMR2SkHdEfuTmZOK6txgKUo5hrq5KSzNa2UCevyfRD6h91+gr58MMbQEIIIYTkhskygiZZUANICCGEEDLF4BNAQgghhOQEGkHnDt4AjkEwkJLyV87ZL5jH02mwJ0iUaN1Nus1pWhIJ/dp/iDYQRsMSVDstX1ZsE8RQ4WcREQEbhcJjzkLDar5isNew+kMf7DZi0G6JaNsHa3GCdg5BrdaURKi1MTYj3lmnrgmNrtCf53SMyTbQ/VnND+jPxOxX4c9Aa7WoXm8b7XaMVUUAmsDpv9TapHSzs/spKjQaSozEM7YcAZyH5JtO5+dP0/2FVkN+k9YpoQVJljUKaH5sJJ4P247atVbIB5sgE8alzqvX5LRbodl2Aq14GrV1EVpjBHsbVRvabaSN/gyteXyj18J5GLR2qaagHfbllOk/GMO2H9T30LKls1O1+WB5pKLYROvBMIpLRCQ4BlY5NtIrOcGlF/o2Nsv5rW7fQrSLydc6XKXJO6j1enh9iIyViN/prm+xsStKtrhzkO7q0suB5jA+ZeIM4TzHMFY8Y5tTut2Nt9jMM9QqYrybiLZ6Qc2fiEgMmmfPRHeGrW6ex2Ysos1N2KztvnCeJyAK0DNxmXhtKn9T64MxEs+eA7ROik10Yt4JsEoyY11da/O1ni884441KNX7WbMr00dHh3knNtXgDSAhhBBCJp9YJs8HkPe3WVADSAghhBAyxeATwDGI02lXIrRJIIAtIyLpM23jttmyMrre21KrQAnIz9OP9dFKwoMyQmStHTAtwzPJD1BytmWQiZJAsMQUnjZlNzwG+4ZX3/huTPHJU2P+PjRlEDwntkSibEwON+r1YDnNpAKEWB48q0uA+N2oySS1YHnapot0drkmLKebUjvagKAVSmaV4ycZKDsce36wZGbGFMoAbP9h2WqiFAXVX+a4cZ2hHVOIPR5sMrYcattZ5WGwVLHzB/oFUzuyxjP+YCQHIdjAYPKLiIjXDaU8Y0mkzp3town6RVnUmOXUOvBcwT6KTDzn1Tm2yTY4t4ykwe+F64+9hg1MINnAcwDb82x/gVWWLZHjfkXWRgvGUZbVC5R9J7pWZI2HCa59atP9TqLhGZsudS0y+4zz1VpZTbQ9LEdnpexA2khwVF+ncBxFJhko/5x8xBs0+zFJUAOYO/gEkBBCCCHkHRgYGJAf/vCH8rnPfU6WLl0qBQUFUlxcLCtWrJCvfe1r0gd+spbvfe97snr1aikpKZGqqiq58cYb5dVXX51we6+88orceOONUlVVJSUlJbJ69Wr5/ve/f8GOhzeAhBBCCCHvwFNPPSW33nqrPPHEExIEgfzJn/yJXHvttXLs2DH57//9v8sVV1whra2tWcvdf//98tnPflZ2794ta9euldWrV8vLL78s1113nfzwhz8cc1vPPPOMfOxjH5Of/OQnsnz5crnhhhvk0KFDsmHDBvmrv/qrC3I8vAEkhBBCSA6IRaJJ+u8CvAWSTCblz//8z2Xv3r2yd+9e+bd/+zf5yU9+IgcOHJDLLrtM9u/fL/fff79aZsuWLfLoo49KdXW17Ny5U374wx/KT37yE9m6dasEQSCf/exnpcu8VX/27Fm5++67JQxD2bRpk/zyl7+UTZs2yf79+2XRokXyyCOPyC9/+cv3fTzUAI5FXlL8+fPGbkPrkjJtAxMXOj2Q36u1NTFo9NBqQ0RH8yROa/0ZRpSNrFyo2vKPQAzZ9Aq3/rTWDfl9bl9iEwWn4t6sjgi0KN50bV0iYMUQm7gi1BxFq3W0WbLR7bPVu3kLXZ9HRa6PYiMpShx360if0f/aSsybAyvUC0aNzg7DS+pzgFoh39janL3WxW9V/nif3hmwdPHKdISYf8zZWkjCWYmIsfaIB+HfYUmt80x/ZLFr2qZj29AGCK1KRETC9g73tetXqrbC/U6DGA9b/ZEbO0Mr690yR4z9CVpq5Ou+xCi4LNuhyorRz1kxVxe77fn7GvU6IRLN2uiM1DkbpWDAxKrtMxF2539fN1P/otON51N3LlZNs55vGv0clxmrj1bXz76xXxKYazaaS0CrFmHco4gEM11kXXpGhW7rdPM1Ogr2Lv742troqkvVz34f9FGB0dq9fcT9YC1oYIx5A+YaBudy5JM6jq3wsBs7qRluHTY6zR8BjR70q4i2rsnS0/W7PvFMLKWyejH60M4NHx39XPMbfS0K9x502ysqUm2p1S4OMm8f2NoYyyu0COq9VMfjlb3WOPo56tdRlziO4iE9NnDOBA06ZtHrdn8r+i6brdqKjrnx7XdqG52Td9aLiEj6HzcLmZgNGzbIhg0bsn4/c+ZM+fu//3u56qqr5Nlnn5WRkRHJO/d3vnzx9AAAMytJREFU/pvf/KaIiHz5y1+WxYvdteXKK6+Ue++9V/7u7/5Ovvvd78qXvvSl0bbvfOc70tPTIzfffLPcdttto7+fPn26fP3rX5fbbrtNHnnkEVmzZs37Oh4+ASSEEEJIbogn6b8PmBUrVoiIyPDwsHR0ZP4BMzg4KD//+c9FRGT9+vVZy5z/3QsvvKB+/+KLL467zLp166SgoEC2bNkiQ+YfCO8V3gASQgghhLwPjh49KiKZMnFVVaYqceDAARkeHpba2lqpq6vLWmbVqszT8l27dqnf79y5U7UjeXl5cskll8jQ0JAcPHgwq/29wBLwWAS+hFWZUk9wQL8y70G5K32kSbX5y+GRvHmVPwRrkcAkegTtUE415QAsMea1mZIZ2ND4aCVg7A48KCt6Q8Z6Af4FYUtRPrjc20SPGL7rQ5KJiEg84ErOg5W6VJQ8Or6tBZZ9sU9SMyv096CPMIFARETS41s7oJWEX6yXi/qhTG5sGdL5UF4z5Ue0hbFl2AhsLfyF9W4/evSbYl6xKzHF5i2y/P2QjmDtScAGwgtNv0IZvvCwtiSKwYoja7zBWMnrAruYDiNNgHKaZ0pkaHGSJXeAeWDbUhWuZFpoUhWUdU2f3udgyJX9ghZdOsRe8SDZIio3+1zltldxWJ//COx8PJNQEYKMIbhokWpLV7htJE1KSNg/vs0NSjECa4eC9jFoVRLp+elDykZwVveXNwjjZticH5jXgZG4YGKFV6TnD9rjjJTqfSkcz0rrsE4okZlQJjUpJGmYZ0GlmWcwD3xja6Psdsz1AMu+A/N06Th/D8hfTGKJkthUuX1Jl5trEdjolL2p/44oeY3pS4EUKZsEg/KAuNVYRoGdVMmOFt0GpeN4WrVqKz+a6SM/Ny4wHxobmEcffVRERG644QbJPzdmjh/PjPGxbv5ERIqLi6WiokI6Ozult7dXSktLpaenR7q7uydcrq6uTrZt2yZNTU2yfPny33mfeQNICCGEkA89R44ckYaGhjHb9uzZ8zuv98c//rF897vflWQyKQ8++ODo78/bwhSZfyQjxcXF0tXVNXoDiFYy4y1XXJz5B2tvb++Y7e8W3gASQgghZPKJZULj6wu+rQ+A/fv3y2c+8xmJ41j+9m//dlQL+IcAbwAJIYQQ8qFn4cKF7+tJn6W5uVluuOEG6ezslI0bN8oXv/hF1V5SkpFRDAwMjLW4iIj0n0uTKT0nDTu/zPnlysrK3nGZ3xXeAI7F0Ih4b+0XEZHI2CvEnaCF8rW2Jdqx1/1QYGwf4F85oXls68HgyIrmAh1ZViwUrNMH7VZsdTB2nQBaHKCGREQkxDipHm0dgMdutYNIweY31c9p7DNzPN5vncVKBPow/0Sz+l40QYQTRk35RruDurWwWx+PipqCaD4Rkarvve7WYdaJOp/QWNKg1Ux0pNH93mjfMEbL6o1ioxfUjbDtdhNLCBrAdJPWH00IaEK9Hfvd+u0YQj1iv7EBGu97Bqu1TP502+jnCQLklJZPRMSHcZs2505/EcbeW3t1G4zFPDumcNvH9VjEMaZsWUTEh7GRTr17gVUMkY/RYWNjg7FusM+ekdlFw27uegePjr8te16hj0LTl2o8t2utJVLy9BvqZzRf8Q+68RCZfvYxxs3oBjEaLrRRjRg1Z/ZFRdvZqEawekHNX2ZnsB+6dNMr7ucI1m9HOkbphTZCEPWo7+VNTrB+iow+ECPxrFXORDrJ4nP97vebaLlJ4g9VA3j27Fn55Cc/KU1NTfLZz35WvvGNb2R9Z+7cuSIicvLkyaw2kcyNXFdXl1RWVo7ezJWVlUl5ebl0d3fLyZMnZdmyZVnLnV/fvHnj2NW9S/gWMCGEEELIu6Svr0/+03/6T7J371657bbb5P/8n/+jc+HPsXTpUsnPz5e2tjZpbm7Oat++fbuISNaLHOfLyOfbkVQqJbt375aCggJZsmTJ+zoO3gASQgghJDf8gfkADg8Py8033yxvvvmm/PEf/7H84Ac/kGCcN90LCwvl+uuvFxGRp59+Oqt906ZNIiJy0003qd+vW7dOtSObN2+WoaEhWbt2rRTYSuN7hCXgsfB98cszj2NjU97Eu3xbPvHLK90PtdoaRQ65MkxQUaHbIFXBlh+xJBhZHQHsi1/tth2Z6oyXMqUC3Ocq2OfIFFCwLGq2HVRVjH4OTYII2kfExp7EB6d+m0Lhgf1BVOvWL3sP6++NZyshxoqlwmgnoAwb4HGLSNjp+j1RN121xZD+4hl7kvB0du7j6HJQcg4WzHXrSOlxEx2HsrWxksFycWzK1iglsOVuLPmosqGI+Gg7Y8qwcWrs4mtgdCg49u06EFvSFrSPMakNaB9kieBYg5kzdFu5G2/eBPMVt2f7Esfp+bk/un44//48bcsQHm50+7V0gd5psCQKD41fhp0Qc+7U2I/HvxZhvwcm2Sbd3DLm97LWb8E0lkJ97pSMwUgccEz5eN2wkol617fxiVPj7kZgxw2UO/3ptaotbIb12JIzyF9sP2DZNzF7lt4B/BtQAhYu7V0yHp5NgsHroimnY2nXHiv+rfDNfMFz4Ndoq5f4tCuv22vY6HVyaIJzT0REJAxD+dM//VP5+c9/Ltdee608++yzo4kf47Fx40Z56aWX5KGHHpJ169aNpoG89tpr8vjjj0tFRYV87nOfU8vcc8898vDDD8vzzz8vzz777GgaSGtrqzzwwAMiIio55HeFN4CEEEIIIe/AY489Js8995yIiNTU1MgXvvCFMb/3jW98Q2pqMv/wWrt2rXzxi1+URx99VFauXCmf+MQnZGRkRF5++WWJ41iefPJJqTAPhaqqquSJJ56QO++8U9avXy9r1qyR6upq2bJli3R1dcnGjRvfdwycCG8ACSGEEJIjvMmygbkAdMJLoOdvBMfiq1/96ugNoIjIt7/9bVm5cqU89thj8vLLL0teXp6sXbtWvvKVr8hVV1015jpuv/122bp1qzz00EPy+uuvy8jIiCxbtkzuu+++MfOIfxd4A0gIIYQQ8g589atfla9+9au/07J33XWX3HXXXe9pmauvvlpeeuml32l77wbeAI5FMpB4diaWyD9rnLbRcsDYEYRL57i2pNZTJJpBb2K0aWGF0zD5VstTWeE+gz2EiLadGKlzmsMsRQJqVuw68mEImOPxCpwuJgH7YdcZlBiNIehpwoUz9WKdoCU02sTUAqftShe7/SoY0q+6Y/xaFhATFZWZiCX8l6axEkFLjahEu693f9RpgMoO6PEQWN0kgBqndK0754kuo6cELyeMhRMRGZ7rzmv+YfMvZdDF2eXwX9X+HKNh6nW2LV6gNWZxnjueeAnoFju11YvV2iEqOs1qyiBe0GrF0jBWkk06vg71Z3GZ1jD1LXbnvHRIH2t8xtnj4HiWMv09H3RqHVfrtqofHxj9PLBQa3sLYCymqo0+tAjGsLHziSBCzuKXwvXAzjs4XyHYpqBFS6bR6Q/7L9XHU4zXgwKj14N12hgy1EZ6Rnwew1hMXXmxais47ObB8AKn0UsaDdvINHfc+Z02ChDmqxmzXp4b67GJeEQrFktq9UVuHWmjVQarF2tl1POR2aOfC9qc/jAo0n2J6xyaro8nvwXGA8wXEZHETBhjCTN/QDvo2RhMYGiJ1skWYLyc0SN2fCSjFwxbc3Q7MP4llHzA8C1gQgghhJApBp8AEkIIIWTS8eLJ0wD+oRpOf5DwBnBMPIkT5x6OmsGJKRvW/iJohzJIvS4VBVhOMS7tQSeUlU0bFh/iEy2qDZM7onx4xG/TENBKwpb86l3ZzbdlUSBs00kTwbTacb4pImADkzyhLQ7iUiiFF+pShD8SwvegVN2qt61sJUxJW3wokZmSjI9JEKW6JONBSS5Vq8upFbtc28A8bdNSdNKVt8IJynqpctgXkwoQHIPzWFWi2pKdUCZL2rI1lL7suMEEhJPaUsODkrNdDu1EgtMgCcD0FRGJIb3AWv2gjUWiWs+DGOxpbPkxeRzOszlWTJvxE2YM448dXaoNZQYxlvabT+vvQTmtcqdeB9prxInxEx1GKkzCS9J9N9lmvJki3Z96pW658IwuhaONim4w+5XnjifZp2UlWK6NzxrJiQqf11IFVfadIOEFS74iIhEcexLmXWQSkdLFbszmVZiIq1a41hqZDI7ZdJWeuwm4xkQmsSZvH0hJqvS8xoQPZfUiuuw7XOPOeVGzPqc+SC0S5loUloJNj2jQDslKO6Ia2M8jOuEHU5CS3VqigX8Tokrdt4Vtmf7zQ94hTTV4A0gIIYSQ3MD7zpxBDSAhhBBCyBSDTwDHIA48SZdlHtH73ebtuj54e8sGloPzf367cWmHElrUo0sffi24tpt1RuWuZGLf2PSgJBwMjp3gkNkAlGvM+v1eLOXpEgaWEX2bBIFJCjN0OdiDEmB6pk7cSLS4Mmncp9+MTMEbgvlnoOxWP1t9z8fSh3kL14N0kaDPJI3AW6Beny5v+eCOn+jTbz8OzYKSial8eflufPimpI3l6PyO8d+a9aFMGg/qbXtQ0rSlVvW9Cd62teVblbhi3zqHN3PDWW5cenvHT7KwyQIelpVtqRC3167fOo9nTXOL9ev5g33rd+tSXjAM58eWqjHhowtKnzYxogTGhnkjVOBN0vwOU2qHY8/rNW+1w5vsQaUpMcL8yXpTFY41qNbzJ8aUEijrBeZtYUzZCQZMUsts94aod0bLK7A0nZXogW+PmvQfHH8j9Tp5JNnv5hpKVTwjOcG+TVfo0mcSz92gHhsoxUn0jn9+vGHTBvMzXa7LvGrUmoQPfNsXy76pMvMW8LDrr0S7vuZHUFZWb6eLLrVH5g3h1CKXUmTELzoNyI5hOD/pcr29wZrMeYiC8cv6Hyh/QD6AHzb4BJAQQgghZIrBG0BCCCGEkCkGS8CEEEIIyQm0Z8kdvAEcAy8dSV7rOZ1RV49uBL0OOvaLiLblMFYVqK2xy4W1Th/kW20N6J2iMq2LwfUEp50eKFw0R30vOAW6O+PurxIWbBtoZGwKCdoTxEaHF3U4bdfwsumqzR8GLaHRtwRDTh8WFrvtxUndl3mgOcTkAhFjgWPsDrxipweKTQqBh+kLx/U601fWj34u3WUsLtqdxYXVTHllsP3WLrdt48SvdIwntGVLPB30VEavhekPnrEHiU67/fRnTFNtAlrVoKZaNaGlht/iji22x1bkNEyRsR1CqxJrH4R6Lb9Ij+d0JViX2H6A/YqNRUyMP1prIdC/4jkfXqoTavJPO41WZCw7glluDPudWjsqoCsLerTWLtEBY8xoE5U1U6znXVQCx2DGit/prkeooQs7tJ4SUzsCk+ISowZ5mj7/4b5Dbv/n6etICKknSm8mIn6l0yqm7LUPk4/gmoLLiIhgD2Vp5vogvcZojn3Uv57Ucxf73WqcVWqI0WFOlCCCGlG0ekHNn4jI4Gx3Dor3atshv9et3zN/D+JuSPgxYz2vucv9MNPM69POMijKM3/awUYp0a21kDJHn0sydeANICGEEEJyA18CyRnUABJCCCGETDH4BHAsPE+ignOvxi+uU03JRldiSM/RpYig25V8sIQpIpLEUpspU0VQMglqdHKCQOpFukIvl0y78mDHSldOKTumy5syzbVFheOf8oQ/V/3sQSkCkx9ERGLcz3adgOGXu5JP8X6dZBBWQ2mqVpefhiD9o3eu+zx98zG9bUgaiY2NSdSwYPTz4Ext7VC8zx2Pb20zICWg80YdZl+xx5U4UzP1ctFc1w/5TSb1pNfZ3ISLnJWNb6xewlOuPOQvv0i19Vzktlfxa2Ndg2U4k+jhVzhZQXqatiBJl7oSZ/728e1dRua7ElOiR5//VJkbi16o50FiX6PbjzmzVFtcDMv163XmHYayr5kH8bGm0c8DS/S48WAIjCwz8/WN/W5foBSefGW3+h7aNHX+6RWqrRpsVHou1mXL8mGwPKoYv5SW325KuVACDru1zMTvdOMmKjdykRmwfZAf+GVGjgLzoutyLcMoaXJz0DOlzmDZEveDSVUJr3DzIjhmpBAg58hrN2VyWE8I88efps/xcLXrv+JW3SepFQtHPyc7dElbIOGn57oFqqn8zWb3NTNHei9146HsTZ2qEYJ0wDNl+KHpYBkFcgFbtsay76F79bis3+yu0Yk9+vqGYGqPiEgMT8vQdkxEREBycvpKvdysPrDSMk/c2i/L/Bz++7i78cERi3jju1td8G0RDZ8AEkIIIYRMMfgEkBBCCCE5IJ5EDSAfAVr4BJAQQgghZIrBJ4Bj4IWhBO0ZDUpgo9nAQiHYb7QuoO0batA6pQBjm6yFQsppOdKgdRLRmpy8Rm2pEaLVxyVOG5Ro1xFrGKsVmGiu/uVOo+W/uUcvBzYTkdEAJkDnJ0ZPp+xwbOxdIRz7sImogn1L9sE6rNbllDtuG4Hmgf5MZmktn4rBMzFUApYqpY0mhuyM0zgOzJmn2ooanVYpbDFWD6DD8+AcD83Ueq2CAxD9VKC1o8UnYV/MPqN20MZqBXXuvHo7D+rt1TrtqI2CQ/KOwPGYfs4DeyIchyIiIVi9BNZOA7R2XoXWJqLO1LMRcjCm8tv0WOxe7DRZxVsPqzbU9sUw9rIse2B71dtMPBqMt+hSo02EdQ5X6nOX1w363TO6j9S4jfT4DkGz6e05otow8i2CffYKtd4V513RKa19S5xyljH23AlEp4UD+vqWPOv2y1pGRaCvC47reYAWLnkn3VwKT2qrH69u+ehnq7VNtoEu8uhxvRxEqZUe0pZEcYE7z7F50lT2WuO4bWo+mQjG/BbQ9pa6bWO8m4i2ekHNn4jIUC3EyfUZTSPoQ4MCrT8MZ7vx5+/Q8zoCS6KCDm3hI81Ou55atUg1TX8z8/8zRjo+afDBXM64IE8A33rrLfmbv/kbue2226Surk48z8u+gJ8jiiL59a9/LQ888IBcfvnlUlpaKvn5+bJw4UK599575dix8QWxIiKvvPKK3HjjjVJVVSUlJSWyevVq+f73v38hDoMQQgghZEpwQZ4APvjgg/L888+/q+8ePXpUrrvuOhERmTFjhlx//fUSBIG8+eab8vjjj8tTTz0lP/7xj+Waa67JWvaZZ56RT3/60xJFkVx33XVSU1MjP/vZz2TDhg2ya9cu+cY3vnEhDocQQgghk4BHH8Cc4cX22ffvwP/8n/9T+vv75YorrpArrrhC6uvrZXh4OOuxuojIkSNH5POf/7z81//6X+XjH//46JPC4eFhuffee+V73/uezJ07Vw4fPizJpCupnD17VubPny89PT3yzDPPyG233SYiImfOnJFrrrlGDh8+LL/4xS9kzZo17+tYGhoapOlIq1yz+P/L/OK0tjGJwLLBpiiEmGxhXeex1GaejnoJd5y+KYtFPbA9W2qFMlLY6spWmAKQ2Wewc0mbtA8sN1TqbSt3/EA/LMZ1+sW69BFBydlfXK/XCZYQkUk9UfsN+xXPNLYfA67UETU1q7ZgOqSEDJqaBhxPZMouqlyb0OXOuARST+x46AXXflOG9aGcFmMZySSnYHkzMlYVqjxoxg0mafjGUifd5GwtEjO0DQimMeC4ybS5bfggaQht2gfYU9jj9vKh7JbS4y3ud2XFyJQREzPdfobtxlIH7JAClB+IiEBKjU14weSRGEpkiQX1eh0gR4iMbAGPx+6XSmOxaTlQZsb9EDHJJsPGwgcSa7zZM/R+QuIHjmG7Drw2hWaeBWgZM11b+MQnWty2jYVP1OjGlD2eoBpK4yZdBOc8jpXs5CEY3+Z48PzLIm1XFe91ZXJro4XnMjIlbb/E9QMm24iIhFCy900Z1sohRtdRoKU9mPARm/mD586fb46n2ZXQ7T6ruZyvZQxqbnXrMYwpKPY6n1qWkbW8se1RmVdfI3v2aCnQB0VDQ4M0HWuTq1b85aRs79Wd/0vmza+dtOP7Q+CCPAH867/+63f93YULF8pPf/rTrN/n5+fLP/zDP8hzzz0nx48fl1dffVU+9rGPjbZ/5zvfkZ6eHrn55ptHb/5ERKZPny5f//rX5bbbbpNHHnnkfd8AEkIIIYR82Pm9egu4sLBQlizJvPTQ0tKi2l588UUREVm/fn3WcuvWrZOCggLZsmWLDJmXFQghhBDye0ocT85/JIvfqxvAKIqkqSnzFuyMGbr0sXPnThERWbVqVdZyeXl5cskll8jQ0JAcPHgwq50QQgghhDh+r2xgfvCDH0hra6vU1tbKVVddNfr7np4e6e7OaCjq6urGXLaurk62bdsmTU1Nsnz58jG/867xROJz8Ww2KklZo1iLkzKnTYqM5kNpX4z1hgf6utjqVMAyxsaxRYPuZ9SbWc3PeOsT0TqsyERSoQ7PahPjFGirUkb7BMfjDWotD2rJcB0iIoL7Av3g2zgstIGIx88Rsjo/pVvy9L99wg5nT5EwuqiowvVt0KfPD67T9m3Y4+wiUHeDWp1Mo9MU+TYmEPvBnjuIr8uyNUGdktGmhS3OEsL2XzwCmsMFoE2yGibQPgZmbISgU8vSReHPRueF2kSrKxxv2yIiwUz3j8WJNIAYGSaDplIA/eVNr1FN4ZFGtwrQXYpozaYX6jGldGWmn3Huqv0SUf0gZi57qCuFMWt1anj9Caoq9DrwmmJiHFGfGsFxi+hrTGQ0zqiNDEz/4TnxIK7Mnn/UzFm9azzkjsc7pnW/kb2O4HK4DfMUyMd9SYyt6xMZS6vqdIbq2Mw5iI0OT4Ea52ZjHwV6ysjomFFTa302IoietOMNNZpW4xwMnft7lIunZLGIMAouZ/ze3ACeOHFC7r//fhER+drXvib5cJHq63MDu8hcgM9TfE443ds7waQDGhoaxvz9kSNHJOGVjtlGCCGEEPJh4PfiBrC/v19uu+02aW9vl1tuuUXuvffeXO8SIYQQQj5gaAOTO3J+A5hKpeSOO+6Qbdu2yTXXXCNPPfVU1ndK4HX9gYEBKSsry/pO/7lyWGnpu3t6N96r4A0NDdK096TEew6JiEhsSoVY3rSWHQGU7/x6XaoOj7iED2sfg+Wu9Okzqg1LO7FxpMcSqgfpDoEt66GFgq+PJwHWMulTuhSBpamwTdufBJUueSTs7FRtWGKKTpnjgXJhbB3woVTpz6x36z+o0xBUqcKUisIzbj8DU8pNn3SlI5VIIrrUau1j/KNuudhKAmD7oT0ePA9wjrGMJ2LKZ2ZsJ+a75JGsch1IAkJbvodth806cUGVOwNjJQFjOjxw1C1SXTX+90x5GM9J3GvKczCmrJ0Lli2tTAJLecH0abqtCEpvHbqPlMUSyiRMX+JcSszRcxfL617dTNUmh1wf+Wa8obVMVh9NBJRhQ3M8qiQM/WyTehCbEpI+cdK1mVI72oXYkiBKGqxUAc9XdLhR7wCmscD2QlOtSVTDNeWksSeC8WxLsniNzJJ9TJB0g5KaLEsaIMt2CEqoXrGrSEVoAyYiXhLmvPm7hAkf9pqPZd+gqlK3wTy3sg9lcwTXDRFzHTbLBS2Z6w+mFZGpQU5fAomiSDZs2CAvvfSSrFy5Ul544QUpNBcrEZGysjIpL8/cOJw8eTKrHX8/b968MdsJIYQQ8nsG3wLOGTm9AfzLv/xL+cEPfiBLliyRf//3f5eKiopxv7tixQoREdm+fXtWWyqVkt27d0tBQcGojQwhhBBCCBmbnN0AfvnLX5Z/+Id/kLlz58rLL78s06ZNm/D769atExGRTZs2ZbVt3rxZhoaGZO3atVJgXdsJIYQQ8vsJnwDmjJxoAL/1rW/Jww8/LDNmzJAtW7bI3Llz33GZe+65Rx5++GF5/vnn5dlnnx1NA2ltbZUHHnhARES+9KUvXZD9i0sKZOi6y0REpPCU0ZTsOTz6WUUqibH3mDn+DW1WNBPEeGEMlIiIN9fFMfldWjODNjSDFzkrjII3D+n9Ah2MZ+0VqpwmL0gbDYiPWq4+1YTrDC5erJcDzaFndIvYJsYiJNXgxkHQ5/RTWetvc5pDa5uDGq10pX5jPIC3ya0uygetDfaliEhBk9te76Va51X2W4htajyu2hKgVQvr3HLpEq3BydvnNEXRHD1uvH3HYJ/NP24m0NOhBYm1JMJjTRt9oA/nxJs/x+3/vsP6e7AvQa2xzYH4Qr9+jmrzMJbQ6NYwcs03xxOCTsrGdvVe5PSJRUf1OUBNGy5n525UDvYqjdqEHjVsUak+B8Gi+aOfh2dX6MUK3PnJ/0XXuOvM0qlB1FnQ3KrbKqBfWp12VNmr2PUbvWvQsNS1NWpJjYpSM3rXqBq2fahJtaEOD8eNiEgE58QDOyTPaABH6ty2U8v0PCg62gXL6TmfbnbnK/qji1Vb3gk3d60WFvWCwUwTl4gRhiYGU+CaFtW440kt0uvIa3b7bGNRw9nuWO0fYbR6sdZcfTdfPvq59Kd7VZvSXpt4ToFY1aHV+nraOycz79LParso8uHngtwAvvjii/Lggw+O/jxyznvrox/96OjvvvKVr8i6detkx44dozdq8+fPl4cffnjMdd5zzz1yzTXXjP5cVVUlTzzxhNx5552yfv16WbNmjVRXV8uWLVukq6tLNm7cyBg4QgghhJB3wQW5AWxra5M33ngj6/f4u7Zzb5F2dXWN/mvotddek9dee23Mda5Zs0bdAIqI3H777bJ161Z56KGH5PXXX5eRkRFZtmyZ3HfffbJhw4YLcSiEEEIImSwmywiaZHFBbgDvuusuueuuu97Vd9esWZP1OPy9cPXVV8tLL730Oy//bvDSkRS2ZMqFfrcuAasi6TTteO+1gWXDaW2bgqU1tOEQEfHg8bwYo+twP5Sca/T20Mm+cL8rRcYzjB3FUVeusT3vtbgSU1ZCCVqXlOqSmaDtgy27QfpCsEy/lOMNuLJf1Kb7NvHGvtHPPpRkUjMr1PeS3a6UG7brchD2bHBM29qgjU5orBfQ5qTwgG4bXujKUSU/3qna8NplLRvQ+sU/6Pooz5x/lWxhE2Sg323KBY6peK4uW4c7XV/K6kv1OmFfEqb0hVYWeK48X0sHlAWFGTfBNDf+ohOmnAoSB2vZ4S9wb/CnwV7l3A6MfoxNGktet9u+b0q7KDlIgxWGd/kyve3DUAqdrfvEb+9y296jLYlimLsJU07NgzJcbO1W8AeTqiGha41n6bnsd7iSIKZxhCd1OgYmlngpY3EC119v3mzVpMq1pgwf73PHrhJWRF+bYjO+VYoQbNufb6Q/Q+5c5TXq6yfaDqXn67EegBQmcVzb5qD9SWySR1QpvNUsB7Ywvpl3Sj5y5MTox6wCKsiAPCOv8XdAZKmxD8KZZq1esOw7fOVS1YbSH6+jS+8LnMvCPXqsDFXXZ5bhjdiUI+c+gIQQQgiZgsTx5BlB80WQLHJqA0MIIYQQQiYfPgEkhBBCSG7gk7mcwRvAMfDSofhnMpoQa1WB1iiokRLRET4TRTNZIrCPSVg9CERZxdN1hBzqm6IjjW4XjXYHI7DERNthjJuNqIvA+iUo0Pq29Fm3nG90ixg95w1q3U0EUW1WR+SDDi9qdVFQiaTRT5XB8ZwyD7FPja9pVLFx9qIDmh8buZd/zO1zaHWSqNFJ6bZoqMt9HoTxEGk9kJd067B9oiyDzHIBaquOa70jrjNoNTFkGP93TNt5oJWEpCewKsFlwNpDRCTuhO0ZPVjc73R/WevsgDGVr61L8JzYORn86rduX2bPUm3ps6BBRP3ZAX3cqEv2jc1IDHM+MjoyLF/Faa21iwbdctZmJAY7nNCOm9373XINWuelItfAAslGumGcnI1c9Gc4bVpkoiExKtKuE8+J3Wc8r16sYwMVMA+srVH8ltO32dGGtj2JFq3XS6Odi9GqquhL32ivQUuMUYAiouZaZKym1Nfgmm/HrNKBG5seHEdev14/XnetbhHnp7X7Qk16bDTo6vpj+qjkZEZT6ad5IzbV4A0gIYQQQnIDnwDmDGoACSGEEEKmGHwCOAZx7NzYo0Xa1d4/Bq7z1abUmufKtR3XzVRtNT905Y24XlsvtF3uSmi1P9A2I3KJc23vm68tLjCF4tRfrB79XNihS5hlx9zj/9g8/u+Zf9Ho58p/NTnLkASQNrYp/qWuNOUN64JNAmw64nxtjpBe5Wxh8g5rZ/4z6xaMfu6f7fZz/jMd6ntY3vJNGQlLHe13Xa7apm1ypbWEKcnEJa6Mna7VbcGAK+2NLNYJBWGhKysV729XbXEJJE8Mu3UMztUl0/yfuXPuL79ItbWscaX3uk2NettQJvdMmdxf4Cw2YpNkEJa4MlIiNlYcUCZX6Rh1K9TXBstdibloh7EBGtS2GWr1YF2TqNLzABMXPCMrSJ9wFisDN65Ubd317thnv6zPgd/t5ow3x81Jr1MnLEQgaWi/XvdJ1S5X0m67daFqqzzkSodD1XqsF51y5Tt/p7aPUaXxWM/XkRuuGP1ceELvJyaBoD2JN11bRMVnXD9039ig2kqPuZJpolnPrRiuYTZBJl7m5meiRS8XdUBZdsTYzkAZM32Rs/oJOnXpc/AmN18L2nVJdjgfUlW26dJnYo4r+8dFJi0Hrj/BUW3T03eZG38lO7RdkQ+2M76RxgwtcTY0yW4orab1eYzy3Lg8faW+phR0uL8rFf9mrrswHhLz56kmTPiwVi9Y9t3/vxaptou/6s5X/0X6GnbijzN9O3LYlM8nCz4BzBl8AkgIIYQQMsXgE0BCCCGE5AYaUOcMPgEkhBBCCJli8AngGHi+N6pBCs50qbawx72i72tJiYp3qnlWWxXgq/cYqSQiMu2k0ylFNhZqr4uCKz2hNYAh2AXM/inYkTRrvR5aDlirguq3QfNltw06pSyrlwPH3Ge7HFjN+MayI3HMRSdZS5Vpz8B3MYYuaXSEqEc0+pFgutO31P7LbtUWYuSaZ/QusM/JPm3FE9VWjH4u2Kn1bl4+9LvpB68ZrFmg3wtPasuWCDQ/nrFzqdvkdFhZmiywrvDydB8pW6B6rWP1truYtchETSkLnzKndwt2HVbfC9D+xIwpjNGy2kS0pwnPmLjEcqeTisAmxS5XvGWPaiteBHrHE1pXGvW5OeIdanTbMpFxaHlSucfoA3cdGP0884weGzFYeOSZ8YxRjVblhDF4nrHKKXrbRXVl2VDBfiqtZYuZ82BdUrG9VbV5cH7smML5ZO1PAtA/h3YswrEnhoyVEehyE40QzWbslkp3gOWJ0REmcb9MP4cQN2httNQYM1rLomPuPFurHLxmxkb/XJBw5yvuGt/yCC1vZvUZvStco0Nz3cBYSoyyExERvBYauy/UP6PmT0Qkhn0u/q2+hs0fyuxba28sMoGDD/nwwRtAQgghhEw6XiyTFgXn8V2TLFgCJoQQQgiZYvAJ4BhEeQkZXpQpJead6VNtXhtYVZjSJJZBUpdpu4jgVVe28uFVfhGRaI6zFfBMeTi+GNYzoF3hfSih9C9ydiHFprTig+WFZyxB0nNdydTfZZzl0UXf/CsN00XiOp1y4He7ckpUokvHHpQ7PFOqHlrtLG88cKVP9uqSUjBByoEH+zy8eolqy9/hytaSsKVJdy6HF5vjGXL7PHDdAtVWtteV+mNT2lXJJpWu5Jiq0n2St89pCaJZuoQVQF/6Nk0AkyCMHY4PqQDSr21ZgjqwzbAlQChjxdCXvi3lFroxHJskAyz72nSZGKxLrIWPB2MqKNRzJDzl+tabp8tp7SsrRj/XHGtWbZikE8xy5zUu0GVrnBfeoLExgXLx0DK97fwWN7dGZumSXAwqg/z/0GVrJQkZ0SXAkfluTuYd0+XbqMZZCHndbtuY7iGiLWLCcjMHR6CEikkzIuIVuHMSlOoyOY5N35RoUQYS1mibIw8sduJK6KNWXabsb3DXQTEKjaKjbj+9lN62D9eDcLa2wwlK3ZiKQH4ioq+L8TQ9Tn0or+O4FNFWM1Glm5Ppcj2mEt1wvTbXz9QqZ9OS93ajavOgXCtGooHXyMI9eqzjmLJWL1j27bmyXrX1zMtsL9xBG5ipBp8AEkIIIYRMMfgEkBBCCCE5IFaBAx/4toiCTwAJIYQQQqYYfAI4BukiT1quyeg8ik5rXcf0Xqd36vhYnWorP+j0WgPTtHajotpp9KRI65u6ljkdSWnJxaotDpwu48xara2pOOJ0K+2Xwmv+07X+o2ov2MzkaauCwVqnkSqRxaot6HW2AmGp0ZhB/NtwrdYY5YOmo3mt9hUob3RaoTJjF9G20vXZSKlbRzCiz0HZMafJqXrpoGrrvtpFJ/XO0cc6+6TbF29Yb3tkjuvLUx/Vx5qCfSlutvYxbp1FlbofRgrd9EpDZFyqRP+7K7/RbW+kWm97aKkbGxXbtGYyMdeNv8GlWrdY0OxsVFo+ZXRr3e54ql8z2j7Q/Z38hBtvc57X+tPei9xx4xgVESk56radKtbzAEke17FtPatcVFvxMa299cHCp+NyrddqX+00YEXtS1Vb0ZuNbj/Bsqd7uV5HwVk3nluu0eNt5ivuHPTV6eMJCypGPw+X6/E2Uur6paZHz61EuzuesFlb1/QscNeHoY/Uq7Zkrzt308+48xPZCDT4uW2V0Y4m3H4FV1Sqtuq3Xb+nKnQ/DFWCVU6bXqcUuH45dou+Ts170elmW1e75YrO6GtD1yLXfwVn9dOagRqn7QtS+txVveK0cCev0TrMml3uGPJb9Xg7eWf96Ofyo9paphhtdSr0Ojs+4rZf2OaWG6wxf07nuG23X6aPZ/qb7rMX6ri3YMitMzCRe71zXD8PVdertpKTTkN5Pt7tPOetXkSc5u88Ox/4BxERufTFThHRfTspUAOYM/gEkBBCCCFkiuHFMW+/kdLSUukfHJRkVeZfnL7+h6Ek+twbaOki/RZwMOKeRERJfW8dDMATJ8+8iVsEb02m9OnAn8JC/aTFh1WG8ADANy8xBsPw1qwxQI7haYCfMpk8qM3wzZMvNAI2bxZ7EIqeLtH/2sR9xn/pioikysDkFhczI1Sto08/yYvgiVOkT48keuENZDPs4yQ8oSsyfQSHZ8cD/mz7L8Y+g36PzT+7gkG3EvuEFp+u+aa/8BgweF7EnINivU4PXjrFbZ9rdcuVuuWw70REonxjeguofrDjBreUMoa+Be6EZY1FeOs0LNVPpkJ48IpPyETMG70wTqMC01+hWy5tzn9iAPo5aeZgGufB+OMmGNLHg+cntsbGZW4yx6abPVhNAsZ+bE2IcX1FZkzh+szcUtcKc+7w+IIB8xYwfDdVrvs22QdjsRDeLDdDL4SHq77xlsedztpn2JdUqbkmD7sve4P6WpGudOPI103i98MT74TuvxCe7PswbqJg/LEemge0CXgxH8eQiKhrq5fSHZEuccfnmSmC6xkp0/uC8yLM120LazJvaR9pTEkyr1h60TD/A6ShoUGOHz4j18y9e1K29x/Hn5C5i6bLnj173vnLUwSWgA3FxZnyYqqnS0REFixcOMG3pxZHjmQsahb+ofbJ9Hf+ynvlD75P3i3vse9G+6V+kvul8p2/kiumzFix1I7fNGX7ZAI+kD6ZMOEjU/ZN5h0f/ftHpga8ATScPp3xG2toaBAR4b8WAPZJNuyTsWG/ZMM+yYZ9kg37hEwWvAEkhBBCyOQTy+S9BEKxWxZ8CYQQQgghZIrBJ4CEEEIIyQ2TZgRNLHwCSAghhBAyxeATQEIIIYTkgFgkjt75axdqW0RBH0BCCCGETCoNDQ1y/NBpuWb2hknZ3n80/6PMXTyDb1cDfAJICCGEkNzAZ1A5gxpAQgghhJApBp8AEkIIIWTyiWXy3gLmg8Ys+ASQEEIIIWSKwSeAhBBCCMkN1ADmDD4BJIQQQgiZYvAGkBBCCCFkisESMCGEEEJyA0vAOYNPAAkhhBBCphh8AkgIIYSQ3MAngDmDTwAJIYQQQqYYfAJICCGEkBwQi0TR5G2LKPgEkBBCCCFkisEngIQQQgiZfGKZPA0gHwBmwSeAhBBCCCFTDD4BJIQQQkhu4FvAOYNPAAkhhBBCphh8AkgIIYSQ3BDxCWCu4BNAQgghhJApBm8ACSGEEEKmGCwBE0IIIWTSiSWWOJ4cI+iYPjBZ8AkgIYQQQsgUg08ACSGEEDL5xDJ5L4HwAWAWfAJICCGEEDLF4BNAQgghhOQGGkHnDD4BJIQQQgiZYvAJICGEEEJyQzQ5bwGTbPgEkBBCCCFkisEngIQQQgjJDdQA5gw+ASSEEEIImWLwBpAQQgghZIrBEjAhhBBCJp84lniyXgJhqTkLPgEkhBBCCJli8AkgIYQQQnIDn8zlDD4BJIQQQgiZYvAJICGEEEJyQ8QngLmCTwAJIYQQQqYYfAJICCGEkNwQMwouV/AJICGEEELIFINPAAkhhBAy+cSxxJOlAeTbxlnwCSAhhBBCyLtgcHBQ/tt/+2+yZMkSKSgokFmzZsndd98tzc3Nud619wxvAAkhhBCSG+Jocv67AAwNDcn1118vDz74oPT19cnNN98sc+bMkSeffFIuu+wyOXr06AXZzmTBG0BCCCGEkHfgoYcektdff12uvPJKOXjwoPzrv/6rvPHGG/LII49IW1ub3H333bnexfcEbwAJIYQQQiZgZGREHnvsMRER+fu//3spKSkZbdu4caMsX75cfvWrX8lbb72Vq118z/AGkBBCCCE5IY7iSfnv/fLKK69Id3e3LFy4UC677LKs9vXr14uIyAsvvPC+tzVZ8AaQEEIIIWQCdu7cKSIiq1atGrP9/O937do1afv0fqENDCGEEEJywx+IEfTx48dFRKSurm7M9vO/b2pqmrR9er/wBpAQQgghk86A9Mlr8U8nbVtHjhyRhoaGMdv37Nkz4fJ9fX0iIlJUVDRme3FxsYiI9Pb2vo+9nFx4A0gIIYSQSWXhwoWTvs3zT/FIBt4AEkIIIWRS+dGPfpTrXXhPnH/rd2BgYMz2/v5+EREpLS2dtH16v/AlEEIIIYSQCZg7d66IiJw8eXLM9vO/nzdv3qTt0/uFN4CEEEIIIROwYsUKERHZvn37mO3nf798+fJJ26f3C28ACSGEEEIm4Oqrr5by8nI5cuSI7NixI6t906ZNIiJy0003TfKe/e7wBpAQQgghZALy8vLkvvvuExGRv/iLvxjV/ImIfPOb35Rdu3bJxz72Mbn88stztYvvGS+O4/dvkU0IIYQQ8iFmaGhI1qxZI2+88YbMnDlTrr32WmlqapI33nhDamtr5fXXX5cFCxbkejffNbwBJIQQQgh5FwwODsr/+B//Q5566ik5ceKEVFVVyQ033CAPPvjguCbRv6/wBpAQQgghZIpBDSAhhBBCyBSDN4CEEEIIIVMM3gASQgghhEwxeANICCGEEDLF4A0gIYQQQsgUgzeAhBBCCCFTDN4AEkIIIYRMMXgDSAghhBAyxeANICGEEELIFIM3gIQQQgghUwzeABJCCCGETDF4A0gIIYQQMsXgDSAhhBBCyBSDN4CEEEIIIVMM3gASQgghhEwxeANICCGEEDLF4A0gIYQQQsgUgzeAhBBCCCFTjP8flTHdkK/PU8cAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
],
"source": [
- "eigen_factors[\"activation_eigenvectors\"][\"2\"].shape"
- ],
+ "covariance_factors = analyzer.load_covariance_matrices(factors_name=\"tutorial_factor\")\n",
+ "plt.matshow(covariance_factors[\"activation_covariance\"][\"2\"])\n",
+ "plt.colorbar()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a8eb2c2d-32e4-46c8-b53e-c608f2f32091",
+ "metadata": {},
+ "source": [
+ "We can perform Eigendecomposition after fitting covariance matrices."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "31da64ca7f237819",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:00:45.840072Z",
- "start_time": "2024-03-12T21:00:45.835288Z"
+ "end_time": "2024-03-12T21:00:31.570596Z",
+ "start_time": "2024-03-12T21:00:31.553063Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "f0178839635f6aff"
- },
- {
- "cell_type": "code",
- "execution_count": 37,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Fitting Lambda matrices [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Fitting Lambda matrices [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
+ "Performing Eigendecomposition [4/4] 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "lambda_matrices = analyzer.fit_lambda_matrices(\n",
- " factors_name=\"ekfac\",\n",
- " dataset=train_dataset,\n",
- " per_device_batch_size=None,\n",
+ "analyzer.perform_eigendecomposition(\n",
+ " factors_name=\"tutorial_factor\",\n",
" overwrite_output_dir=True,\n",
")"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:01:00.458530Z",
- "start_time": "2024-03-12T21:01:00.113019Z"
- }
- },
- "id": "582867d0b427db3"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 38,
- "outputs": [
- {
- "data": {
- "text/plain": "torch.Size([128, 129])"
- },
- "execution_count": 38,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "39c411f2-c1c0-4483-9ec8-2d7ca966237a",
+ "metadata": {},
"source": [
- "lambda_matrices[\"lambda_matrix\"][\"2\"].shape"
- ],
+ "Next, we can fit the Lambda (corrected-eigenvalues for EKFAC) matrices with:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "582867d0b427db3",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:01:07.857067Z",
- "start_time": "2024-03-12T21:01:07.852205Z"
+ "end_time": "2024-03-12T21:01:00.458530Z",
+ "start_time": "2024-03-12T21:01:00.113019Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "526f2e3cb469d6a0"
- },
- {
- "cell_type": "code",
- "execution_count": 39,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "scores = analyzer.compute_pairwise_scores(\n",
- " scores_name=\"pairwise\",\n",
- " factors_name=\"ekfac\",\n",
- " query_dataset=query_dataset,\n",
- " train_dataset=train_dataset,\n",
- " per_device_query_batch_size=len(query_dataset),\n",
+ "analyzer.fit_lambda_matrices(\n",
+ " factors_name=\"tutorial_factor\",\n",
+ " dataset=train_dataset,\n",
+ " per_device_batch_size=None,\n",
" overwrite_output_dir=True,\n",
")"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:01:40.623332Z",
- "start_time": "2024-03-12T21:01:40.490302Z"
- }
- },
- "id": "8bdb3aa3d8aade4a"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 41,
- "outputs": [
- {
- "data": {
- "text/plain": "tensor([[ 5.0061e-02, -3.6199e-02, -1.2702e+00, ..., 2.3542e-03,\n 5.4149e-01, 9.2300e-01],\n [-4.9688e-01, -2.7395e-02, -3.8494e+00, ..., 5.6789e-01,\n -2.4231e+01, -2.9652e+00],\n [-7.3917e-01, -2.1874e-01, -4.9690e+01, ..., -2.0099e-01,\n -7.6540e-01, -1.0384e+00],\n ...,\n [ 6.8861e-01, 6.6297e-01, 9.4206e-01, ..., -8.3435e-01,\n 6.2277e+00, 7.0717e-02],\n [-1.9911e+00, 6.5527e-01, 6.2227e+00, ..., 9.6123e-01,\n -2.0532e+01, 7.6572e+00],\n [ 1.5878e+00, -2.6181e+00, -5.0869e+00, ..., -1.7254e-01,\n -3.7389e+00, 1.4460e+01]])"
- },
- "execution_count": 41,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "dfad35d4-e0f7-4483-a915-fb28a717c2ed",
+ "metadata": {},
"source": [
- "scores[\"all_modules\"]"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:01:47.451459Z",
- "start_time": "2024-03-12T21:01:47.448032Z"
- }
- },
- "id": "51d4f1a9ad39cfab"
+ "While we sequentially called `fit_covariance_matrices`, `perform_eigendecomposition`, and `fit_lambda_matrices` in the above example, we can instead fit all required factors with:"
+ ]
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": 18,
+ "id": "0f00c60c-c932-42f4-b72f-2a59025c9417",
+ "metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Performing Eigendecomposition [4/4] 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "score_args = ScoreArguments(per_module_score=True)\n",
- "\n",
- "per_module_scores = analyzer.compute_pairwise_scores(\n",
- " scores_name=\"per_module\",\n",
- " factors_name=\"ekfac\",\n",
- " query_dataset=query_dataset,\n",
- " train_dataset=train_dataset,\n",
- " score_args=score_args,\n",
- " per_device_query_batch_size=len(query_dataset),\n",
+ "analyzer.fit_all_factors(\n",
+ " factors_name=\"tutorial_factor\",\n",
+ " dataset=train_dataset,\n",
+ " per_device_batch_size=None,\n",
" overwrite_output_dir=True,\n",
")"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:02:49.326940Z",
- "start_time": "2024-03-12T21:02:49.187921Z"
- }
- },
- "id": "a1edac308383f728"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 45,
- "outputs": [
- {
- "data": {
- "text/plain": "{'0': tensor([[-2.6266e-02, -1.8842e-02, 1.1664e-01, ..., 2.4500e-03,\n 1.3508e-01, -4.2287e-02],\n [ 3.0197e-01, -1.4576e-01, 3.2981e-01, ..., -1.7151e-01,\n 2.1003e+00, -3.2144e+00],\n [ 1.1908e-02, -1.3091e-02, -3.8957e+00, ..., 4.9687e-03,\n -1.2466e+00, -7.2670e-03],\n ...,\n [ 8.1234e-01, -6.6214e-01, -7.0342e-02, ..., -2.6749e-01,\n 6.9416e-02, 2.1124e-02],\n [ 1.4178e+00, 3.2288e+00, -9.8175e-01, ..., 1.6657e-01,\n -4.7388e+00, -3.4997e+00],\n [-2.0218e-01, -1.7329e+00, -3.7108e+00, ..., -3.1222e-01,\n 1.6311e+00, 7.7284e+00]]),\n '2': tensor([[ 0.1232, -0.0557, -0.7605, ..., 0.1088, 0.3196, 0.7115],\n [ -1.1788, 0.1449, -2.5917, ..., 0.3668, -2.0784, 1.3429],\n [ -0.1844, -0.1768, -23.9932, ..., 0.3725, -0.4919, -1.0844],\n ...,\n [ -0.3336, 0.6093, 0.3979, ..., -0.9447, 3.0782, -0.2292],\n [ -2.0491, -3.4502, 1.9648, ..., -0.1059, -13.8598, 4.9501],\n [ 2.2986, -0.7076, -3.8665, ..., -0.3188, -0.5854, -6.6292]]),\n '4': tensor([[ -0.0514, 0.0343, -0.6465, ..., -0.0979, 0.2112, 0.2504],\n [ 0.5855, 0.0650, -2.1663, ..., 0.3206, -25.5599, -0.6195],\n [ -0.5678, -0.0391, -20.6871, ..., -0.6139, 1.4205, 0.0583],\n ...,\n [ 0.1469, 0.7100, 0.4384, ..., 0.2733, 2.7951, 0.3150],\n [ -1.4954, 0.8342, 5.7622, ..., 1.0790, -2.8883, 5.4326],\n [ -0.3669, -0.1428, 3.1085, ..., 0.4055, -4.4859, 12.0807]]),\n '6': tensor([[ 4.5021e-03, 4.0613e-03, 2.0121e-02, ..., -1.1026e-02,\n -1.2443e-01, 3.3208e-03],\n [-2.0554e-01, -9.1504e-02, 5.7879e-01, ..., 5.1960e-02,\n 1.3072e+00, -4.7417e-01],\n [ 1.1173e-03, 1.0219e-02, -1.1136e+00, ..., 3.5497e-02,\n -4.4738e-01, -4.9912e-03],\n ...,\n [ 6.2971e-02, 5.7528e-03, 1.7607e-01, ..., 1.0451e-01,\n 2.8499e-01, -3.6171e-02],\n [ 1.3561e-01, 4.2407e-02, -5.2260e-01, ..., -1.7835e-01,\n 9.5490e-01, 7.7421e-01],\n [-1.4177e-01, -3.4834e-02, -6.1821e-01, ..., 5.3028e-02,\n -2.9870e-01, 1.2801e+00]])}"
- },
- "execution_count": 45,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "8a7387c5-a4ba-41f1-8365-95b5785b742b",
+ "metadata": {},
"source": [
- "per_module_scores"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:02:52.412327Z",
- "start_time": "2024-03-12T21:02:52.406994Z"
- }
- },
- "id": "b439b36290e6a12c"
+ "## Computing Influence Scores"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 47,
- "outputs": [
- {
- "data": {
- "text/plain": "torch.Size([103, 927])"
- },
- "execution_count": 47,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "b57f42e9-ff52-4d13-8493-e00f7fcf3425",
+ "metadata": {},
"source": [
- "per_module_scores[\"2\"].shape"
- ],
+ "After computing all neccessary factors, we now compute the pairwise influence scores."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "8bdb3aa3d8aade4a",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:03:05.160179Z",
- "start_time": "2024-03-12T21:03:05.155732Z"
+ "end_time": "2024-03-12T21:01:40.623332Z",
+ "start_time": "2024-03-12T21:01:40.490302Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "d4d5dc4917ec0ca5"
- },
- {
- "cell_type": "code",
- "execution_count": 50,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Computing self-influence scores [9/9] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "self_scores = analyzer.compute_self_scores(\n",
- " scores_name=\"self\",\n",
- " factors_name=\"ekfac\",\n",
+ "analyzer.compute_pairwise_scores(\n",
+ " scores_name=\"tutorial_score\",\n",
+ " factors_name=\"tutorial_factor\",\n",
+ " query_dataset=query_dataset,\n",
" train_dataset=train_dataset,\n",
- " per_device_train_batch_size=len(query_dataset),\n",
+ " per_device_query_batch_size=len(query_dataset),\n",
" overwrite_output_dir=True,\n",
")"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:03:40.288919Z",
- "start_time": "2024-03-12T21:03:40.046890Z"
- }
- },
- "id": "c19a85a06f41213e"
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "outputs": [
- {
- "data": {
- "text/plain": "torch.Size([927])"
- },
- "execution_count": 53,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "self_scores[\"all_modules\"].shape"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:03:50.609012Z",
- "start_time": "2024-03-12T21:03:50.604147Z"
- }
- },
- "id": "7707710849ac2d0f"
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "outputs": [],
- "source": [],
- "metadata": {
- "collapsed": false
- },
- "id": "7d861065aa7bea66"
+ ]
},
{
"cell_type": "markdown",
+ "id": "b9194624-2311-44c6-adbf-06a24ad41ebd",
+ "metadata": {},
"source": [
- "## Counterfactual"
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "261a508a6c02267d"
+ "You can load the pairwise scores with `load_pairwise_scores`. The pairwise score will have the dimension `query_dataset_size x train_dataset_size`."
+ ]
},
{
"cell_type": "code",
- "execution_count": 56,
- "outputs": [],
- "source": [
- "small_query_dataset = torch.utils.data.Subset(query_dataset, list(range(10)))"
- ],
+ "execution_count": 20,
+ "id": "51d4f1a9ad39cfab",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:05:54.279349Z",
- "start_time": "2024-03-12T21:05:54.269910Z"
+ "end_time": "2024-03-12T21:01:47.451459Z",
+ "start_time": "2024-03-12T21:01:47.448032Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "4522bd15c0f00882"
- },
- {
- "cell_type": "code",
- "execution_count": 57,
"outputs": [
{
"data": {
- "text/plain": "10"
+ "text/plain": [
+ "torch.Size([103, 927])"
+ ]
},
- "execution_count": 57,
+ "execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "len(small_query_dataset)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:06:00.421397Z",
- "start_time": "2024-03-12T21:06:00.416579Z"
- }
- },
- "id": "407672278a2eb7d7"
+ "scores = analyzer.load_pairwise_scores(scores_name=\"tutorial_score\")\n",
+ "scores[\"all_modules\"].shape"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 58,
- "outputs": [
- {
- "data": {
- "text/plain": "0.10985381603240967"
- },
- "execution_count": 58,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "cell_type": "markdown",
+ "id": "5c914f47-4cf8-47d6-a638-1d0cf10357ed",
+ "metadata": {},
"source": [
- "evaluate(model=model, dataset=small_query_dataset, batch_size=eval_batch_size)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:06:27.168938Z",
- "start_time": "2024-03-12T21:06:27.161268Z"
- }
- },
- "id": "19a50d9bd3a7573"
+ "If you would like to obtain the influence score for each module, you can pass in `ScoreArguments` to `compute_pairwise_scores`."
+ ]
},
{
"cell_type": "code",
- "execution_count": 59,
+ "execution_count": 21,
+ "id": "a3a7267f-664f-42c5-9a0f-4f462c5a0bb9",
+ "metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [0/1] 0%| [time left: ?, time spent: 00:00]\n",
- "Computing dot products on training dataset [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n",
- "Computing pairwise influence scores [1/1] 100%|██████████ [time left: 00:00, time spent: 00:00]\n"
- ]
- }
- ],
- "source": [
- "scores = analyzer.compute_pairwise_scores(\n",
- " scores_name=\"counterfactual\",\n",
- " factors_name=\"ekfac\",\n",
- " query_dataset=small_query_dataset,\n",
- " train_dataset=train_dataset,\n",
- " per_device_query_batch_size=len(small_query_dataset),\n",
- " overwrite_output_dir=True,\n",
- ")"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:06:42.141007Z",
- "start_time": "2024-03-12T21:06:42.067707Z"
- }
- },
- "id": "8b3eb92fd287b0cc"
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "outputs": [],
- "source": [
- "summed_scores = scores[\"all_modules\"].sum(dim=0)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:08:01.250153Z",
- "start_time": "2024-03-12T21:08:01.244362Z"
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
+ ]
}
- },
- "id": "86fd82e97c1c0af9"
+ ],
+ "source": [
+ "from kronfluence import ScoreArguments\n",
+ "\n",
+ "score_args = ScoreArguments(per_module_score=True)\n",
+ "analyzer.compute_pairwise_scores(\n",
+ " score_args=score_args,\n",
+ " scores_name=\"tutorial_per_module_score\",\n",
+ " factors_name=\"tutorial_factor\",\n",
+ " query_dataset=query_dataset,\n",
+ " train_dataset=train_dataset,\n",
+ " per_device_query_batch_size=len(query_dataset),\n",
+ " overwrite_output_dir=True,\n",
+ ")"
+ ]
},
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": 22,
+ "id": "0156e383-a2da-4ea4-bccf-a0183c78e712",
+ "metadata": {},
"outputs": [
{
"data": {
- "text/plain": "tensor([647, 503, 326])"
+ "text/plain": [
+ "dict_keys(['0', '2', '4', '6'])"
+ ]
},
- "execution_count": 64,
+ "execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "torch.topk(summed_scores, 3).indices"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:08:07.688741Z",
- "start_time": "2024-03-12T21:08:07.682234Z"
- }
- },
- "id": "67c3033c9935f72"
+ "per_module_scores = analyzer.load_pairwise_scores(scores_name=\"tutorial_per_module_score\")\n",
+ "per_module_scores.keys()"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 65,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "95a869ff-70f0-49a4-a8f3-92f5c81a8ecf",
+ "metadata": {},
"source": [
- "def get_top_k_indices(current_score, top_k=1):\n",
- " return torch.topk(current_score, top_k).indices"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:08:23.455884Z",
- "start_time": "2024-03-12T21:08:23.450194Z"
- }
- },
- "id": "fc57a82158420f4d"
+ "We can also visualize the score matrix for the last module."
+ ]
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": 23,
+ "id": "065666a3-6dc5-49dc-9dff-d0ca3886a619",
+ "metadata": {},
"outputs": [
{
"data": {
- "text/plain": "tensor([647, 503, 326, 256, 217, 36, 221, 550, 288, 240])"
+ "text/plain": [
+ ""
+ ]
},
- "execution_count": 66,
+ "execution_count": 23,
"metadata": {},
"output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABugAAAEZCAYAAAB1paMzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAABcSAAAXEgFnn9JSAAEAAElEQVR4nOz9ebgmRZUnjn8i3+VuRdWlimJfhGKTUhC0sQt+1SCNiiigDm7TPgOl7TJqK+IyPSMqov040wiKgo1jCziDOygttG2LirRf2RRQhhLZKWSTqqK2W3d575sZvz8yI/JE5InMfN97b92q8nx43odbmRkRJyJOnHMi4sQJpbXWEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgE2wTRfBMgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEPw5QTboBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJtCNmgEwgEAoFAIBAIBAKBQCAQCAQCgUAgEAi2IWSDTiAQCAQCgUAgEAgEAoFAIBAIBAKBQCDYhpANOoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFgG0I26AQCgUAgEAgEAoFAIBAIBAKBQCAQCASCbQjZoBMIBAKBQCAQCAQCgUAgEAgEAoFAIBAItiFkg04gEAgEAoFAIBAIBAKBQCAQCAQCgUAg2IaQDTqBQCAQCAQCgUAgEAgEAoFAIBAIBAKBYBtCNugEAoFAIBAIBAKBQCAQCAQCgUAgEAgEgm0I2aATCAQCgUAgEAgEAoFAIBAIBAKBQCAQCLYhZINOIBAIBAKBQCAQCAQCgUAgEAgEAoFAINiGkA06gUAgEAgEAoFAIBAIBAKBQCAQCAQCgWAbQjboBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJtCNmgEwgEAoFAIBAIBAKBQCAQCAQCgUAgEDiYmJjAJz7xCRx66KEYHBzE3nvvjbe97W148skne85rw4YN+MAHPoADDjgAAwMDOOCAA3DOOedg48aN7Pdnn302lFLB3+WXXx4s6/rrr8cJJ5yAhQsXYuHChTjxxBPxr//6rz3TPNdQWms930QIBAKBQCAQCAQCgUAgEAgEAoFAIBAItg9MTk7iZS97GW677TbstddeWLlyJR577DHccccdWLp0KW677TYcdNBBtfJat24dVqxYgYceeggHHXQQXvKSl2D16tVYvXo1Dj30UNx6661YvHixk+bss8/G17/+dbzyla/EnnvuWcjzrLPOwste9rLC8y984Qv44Ac/iGaziZNPPhkDAwP4yU9+gomJCXzpS1/C+973vv4aZA4gG3QCgUAgEAgEAoFAIBAIBAKBQCAQCAQCi/POOw//8A//gBUrVuAnP/kJFixYAAC4+OKL8aEPfQgnnHACfvGLX9TK661vfSu+8Y1v4PWvfz2+853voNlsAgDe//7340tf+hLOOussXHXVVU4as0F300034cQTT6xVzv3334/ly5ej2WzipptuwooVKwAADzzwAI477jhs2rQJ9913Hw4++OBa+c01JMSlQCAQCAQCgUAgEAgEAoFAIBAIBAKBAADQ6XRw6aWXAgAuu+wyuzkHAOeeey6OPPJI3Hzzzbjzzjsr83r66afxrW99C+12G1/+8pft5hwAXHjhhVi6dCmuvvpqPPvsszOm+5JLLkEcx3j3u99tN+cA4NBDD8XHPvYxdLtdXHLJJTMuZ7YgG3QCgUAgEAgEAoFAIBAIBAKBQCAQCAQCAMCvfvUrbNq0CcuWLcPRRx9deH/mmWcCSO96q8KPf/xjJEmClStXYo899nDeDQwM4LTTTkMcx/jRj340Y7rNPXOGvn5p3lZoVn8iEAgEAoFAIBAIBAKBQCAQCAQCgUAg+HPA7373OwDAMcccw743z++5555ZyeuKK64I5vX9738f1157LeI4xoEHHojTTjsNhx9+eOG7jRs34vHHHwcAdlNxv/32w2677YY1a9Zg8+bNWLhwYSXtcw05QUcwMTGBT3ziEzj00EMxODiIvffeG29729vw5JNPzjdpAoFAUAvj4+O47rrr8Pa3vx2HHXYYBgcHMTIygqOOOgoXXHABxsbGgmmvuuoqHHvssViwYAEWL16MU089Fbfccktpeb/61a9w6qmnYvHixViwYAGOPfZY/J//839mu1oCgUDQF9avX4/dd98dSqnK+PIiAwUCwc6EtWvX4sMf/jAOO+wwDA0NYfHixTjmmGPwkY98hP3++uuvxwknnICFCxdi4cKFOPHEE633cQirV6/GG97wBixduhRDQ0N44QtfiC984QtIkmQuqiQQCAS18Otf/xpvfOMbsffee6PVamF0dBQrV67ElVdeCa114fs4jvH5z38eL3zhCzE0NISlS5fijW98I+67777ScvqRmwKBQNAvTj/9dCxfvryn3+mnnz6jMs1G17777su+N8/XrFkz53l96UtfwqWXXop/+qd/wkc/+lEcccQReO9734tut8uWs+uuu2JkZGTGdG8LyAZdhsnJSZx00kn49Kc/jbGxMZxxxhnYb7/9cOWVV+Loo4/GI488Mt8kCgQCQSW++c1v4nWvex2uuOIKNBoNnH766Vi5ciUeffRRfPKTn8Rf/MVfsPGczznnHKxatQr33nsvTj75ZBx77LG48cYb8Vd/9Ve47rrr2LKuvfZanHDCCfjxj3+MI488EqeccgoefPBBnHXWWfjwhz88xzUVCASCanzoQx/CunXrKr8TGSgQCHYm3HnnnXj+85+Piy66CK1WC2eccQb+8i//Es899xw+//nPF77/whe+gNNPPx233HILjj/+eJx00km444478JrXvMbeO+Lj1ltvxV/8xV/gmmuuwUEHHYTTTz8d69atwwc/+EG8+c1vZhfBBQKBYK5x7bXXYsWKFfje976HvfbaC69//etxzDHH4LbbbsPb3vY2vPWtb3W+T5IEb3jDG3DuuefiiSeewKtf/WosX74c11xzDV7ykpfgjjvuYMvpR24KBALBTPDwww/joYfuA7oP1fo99NB9+MlPfhLcvKsD4+Q/PDzMvjcbYFu2bJmzvI4++mhcfvnleOCBBzA+Po5HHnkEl112GUZHR/HlL3+54HxWVU6vdG8TaIHWWuuPfexjGoBesWKF3rJli31+0UUXaQD6hBNOmD/iBAKBoCauuuoq/c53vlP//ve/d54/9dRT+uijj9YA9Fve8hbn3Y033qgB6CVLlugHHnjAPr/lllt0u93Wo6OjesOGDU6a9evX64ULF2oA+tprr7XPn3nmGX3wwQdrAPqmm26a9foJBAJBXfz0pz/VAPQ73/lODUAvW7aM/U5koEAg2Jnw7LPP6t12200PDw/rf/mXfym8v/32251//+EPf9CNRkMPDAzoW265xT6///779ZIlS3Sz2dQPPvigk6bT6egDDzxQA9AXX3yxfb5lyxa9YsUKDUBfeeWVs1sxgUAgqMD09LTefffdNQD9jW98w3n3+9//Xi9evFgD0D//+c/t869+9asagD7kkEP0M888Y59fc801GoA++OCD9fT0tJNXP3JTIBAIZoojjjhCP//Qlp586sBav+cf2tIDAwP6iCOOYH918I53vEMD0B/7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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
],
"source": [
- "get_top_k_indices(summed_scores, top_k=10)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:08:31.179881Z",
- "start_time": "2024-03-12T21:08:31.158234Z"
- }
- },
- "id": "ced4a88e4f734621"
+ "plt.matshow(per_module_scores[\"6\"] / len(train_dataset))\n",
+ "plt.colorbar()"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 74,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "7c83722c-47fd-446b-96e5-cb6b8b264a1a",
+ "metadata": {},
"source": [
- "def get_keep_indices(remove_indices):\n",
- " remove_indices = [tensor.item() for tensor in remove_indices]\n",
- " return list(set(list(range(len(train_dataset)))) - set(remove_indices))"
- ],
+ "Note that the scores were divided by `len(train_dataset)`, as `compute_pairwise_scores` does not normalize the scores by the total number of training dataset."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "261a508a6c02267d",
"metadata": {
"collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:11:01.144295Z",
- "start_time": "2024-03-12T21:11:01.134291Z"
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "877e7b1d0b81a3c"
+ "source": [
+ "## Counterfactual Experiments"
+ ]
},
{
- "cell_type": "code",
- "execution_count": 76,
- "outputs": [],
+ "cell_type": "markdown",
+ "id": "35970418-4649-4a8f-886f-ecd4f8e7dbad",
+ "metadata": {},
"source": [
- "keep_indices = get_top_k_indices(summed_scores, top_k=10)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:11:39.837132Z",
- "start_time": "2024-03-12T21:11:39.833193Z"
- }
- },
- "id": "98f26bc51559a58d"
+ "How would the model's behaviors on some query data points change if one or more data points were removed from the training dataset? We can use influence functions to identify influential training data points for a randomly selected query dataset."
+ ]
},
{
"cell_type": "code",
- "execution_count": 72,
- "outputs": [
- {
- "data": {
- "text/plain": "{0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n 21,\n 22,\n 23,\n 24,\n 25,\n 26,\n 27,\n 28,\n 29,\n 30,\n 31,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 127,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255,\n 256,\n 257,\n 258,\n 259,\n 260,\n 261,\n 262,\n 263,\n 264,\n 265,\n 266,\n 267,\n 268,\n 269,\n 270,\n 271,\n 272,\n 273,\n 274,\n 275,\n 276,\n 277,\n 278,\n 279,\n 280,\n 281,\n 282,\n 283,\n 284,\n 285,\n 286,\n 287,\n 288,\n 289,\n 290,\n 291,\n 292,\n 293,\n 294,\n 295,\n 296,\n 297,\n 298,\n 299,\n 300,\n 301,\n 302,\n 303,\n 304,\n 305,\n 306,\n 307,\n 308,\n 309,\n 310,\n 311,\n 312,\n 313,\n 314,\n 315,\n 316,\n 317,\n 318,\n 319,\n 320,\n 321,\n 322,\n 323,\n 324,\n 325,\n 326,\n 327,\n 328,\n 329,\n 330,\n 331,\n 332,\n 333,\n 334,\n 335,\n 336,\n 337,\n 338,\n 339,\n 340,\n 341,\n 342,\n 343,\n 344,\n 345,\n 346,\n 347,\n 348,\n 349,\n 350,\n 351,\n 352,\n 353,\n 354,\n 355,\n 356,\n 357,\n 358,\n 359,\n 360,\n 361,\n 362,\n 363,\n 364,\n 365,\n 366,\n 367,\n 368,\n 369,\n 370,\n 371,\n 372,\n 373,\n 374,\n 375,\n 376,\n 377,\n 378,\n 379,\n 380,\n 381,\n 382,\n 383,\n 384,\n 385,\n 386,\n 387,\n 388,\n 389,\n 390,\n 391,\n 392,\n 393,\n 394,\n 395,\n 396,\n 397,\n 398,\n 399,\n 400,\n 401,\n 402,\n 403,\n 404,\n 405,\n 406,\n 407,\n 408,\n 409,\n 410,\n 411,\n 412,\n 413,\n 414,\n 415,\n 416,\n 417,\n 418,\n 419,\n 420,\n 421,\n 422,\n 423,\n 424,\n 425,\n 426,\n 427,\n 428,\n 429,\n 430,\n 431,\n 432,\n 433,\n 434,\n 435,\n 436,\n 437,\n 438,\n 439,\n 440,\n 441,\n 442,\n 443,\n 444,\n 445,\n 446,\n 447,\n 448,\n 449,\n 450,\n 451,\n 452,\n 453,\n 454,\n 455,\n 456,\n 457,\n 458,\n 459,\n 460,\n 461,\n 462,\n 463,\n 464,\n 465,\n 466,\n 467,\n 468,\n 469,\n 470,\n 471,\n 472,\n 473,\n 474,\n 475,\n 476,\n 477,\n 478,\n 479,\n 480,\n 481,\n 482,\n 483,\n 484,\n 485,\n 486,\n 487,\n 488,\n 489,\n 490,\n 491,\n 492,\n 493,\n 494,\n 495,\n 496,\n 497,\n 498,\n 499,\n 500,\n 501,\n 502,\n 503,\n 504,\n 505,\n 506,\n 507,\n 508,\n 509,\n 510,\n 511,\n 512,\n 513,\n 514,\n 515,\n 516,\n 517,\n 518,\n 519,\n 520,\n 521,\n 522,\n 523,\n 524,\n 525,\n 526,\n 527,\n 528,\n 529,\n 530,\n 531,\n 532,\n 533,\n 534,\n 535,\n 536,\n 537,\n 538,\n 539,\n 540,\n 541,\n 542,\n 543,\n 544,\n 545,\n 546,\n 547,\n 548,\n 549,\n 550,\n 551,\n 552,\n 553,\n 554,\n 555,\n 556,\n 557,\n 558,\n 559,\n 560,\n 561,\n 562,\n 563,\n 564,\n 565,\n 566,\n 567,\n 568,\n 569,\n 570,\n 571,\n 572,\n 573,\n 574,\n 575,\n 576,\n 577,\n 578,\n 579,\n 580,\n 581,\n 582,\n 583,\n 584,\n 585,\n 586,\n 587,\n 588,\n 589,\n 590,\n 591,\n 592,\n 593,\n 594,\n 595,\n 596,\n 597,\n 598,\n 599,\n 600,\n 601,\n 602,\n 603,\n 604,\n 605,\n 606,\n 607,\n 608,\n 609,\n 610,\n 611,\n 612,\n 613,\n 614,\n 615,\n 616,\n 617,\n 618,\n 619,\n 620,\n 621,\n 622,\n 623,\n 624,\n 625,\n 626,\n 627,\n 628,\n 629,\n 630,\n 631,\n 632,\n 633,\n 634,\n 635,\n 636,\n 637,\n 638,\n 639,\n 640,\n 641,\n 642,\n 643,\n 644,\n 645,\n 646,\n 647,\n 648,\n 649,\n 650,\n 651,\n 652,\n 653,\n 654,\n 655,\n 656,\n 657,\n 658,\n 659,\n 660,\n 661,\n 662,\n 663,\n 664,\n 665,\n 666,\n 667,\n 668,\n 669,\n 670,\n 671,\n 672,\n 673,\n 674,\n 675,\n 676,\n 677,\n 678,\n 679,\n 680,\n 681,\n 682,\n 683,\n 684,\n 685,\n 686,\n 687,\n 688,\n 689,\n 690,\n 691,\n 692,\n 693,\n 694,\n 695,\n 696,\n 697,\n 698,\n 699,\n 700,\n 701,\n 702,\n 703,\n 704,\n 705,\n 706,\n 707,\n 708,\n 709,\n 710,\n 711,\n 712,\n 713,\n 714,\n 715,\n 716,\n 717,\n 718,\n 719,\n 720,\n 721,\n 722,\n 723,\n 724,\n 725,\n 726,\n 727,\n 728,\n 729,\n 730,\n 731,\n 732,\n 733,\n 734,\n 735,\n 736,\n 737,\n 738,\n 739,\n 740,\n 741,\n 742,\n 743,\n 744,\n 745,\n 746,\n 747,\n 748,\n 749,\n 750,\n 751,\n 752,\n 753,\n 754,\n 755,\n 756,\n 757,\n 758,\n 759,\n 760,\n 761,\n 762,\n 763,\n 764,\n 765,\n 766,\n 767,\n 768,\n 769,\n 770,\n 771,\n 772,\n 773,\n 774,\n 775,\n 776,\n 777,\n 778,\n 779,\n 780,\n 781,\n 782,\n 783,\n 784,\n 785,\n 786,\n 787,\n 788,\n 789,\n 790,\n 791,\n 792,\n 793,\n 794,\n 795,\n 796,\n 797,\n 798,\n 799,\n 800,\n 801,\n 802,\n 803,\n 804,\n 805,\n 806,\n 807,\n 808,\n 809,\n 810,\n 811,\n 812,\n 813,\n 814,\n 815,\n 816,\n 817,\n 818,\n 819,\n 820,\n 821,\n 822,\n 823,\n 824,\n 825,\n 826,\n 827,\n 828,\n 829,\n 830,\n 831,\n 832,\n 833,\n 834,\n 835,\n 836,\n 837,\n 838,\n 839,\n 840,\n 841,\n 842,\n 843,\n 844,\n 845,\n 846,\n 847,\n 848,\n 849,\n 850,\n 851,\n 852,\n 853,\n 854,\n 855,\n 856,\n 857,\n 858,\n 859,\n 860,\n 861,\n 862,\n 863,\n 864,\n 865,\n 866,\n 867,\n 868,\n 869,\n 870,\n 871,\n 872,\n 873,\n 874,\n 875,\n 876,\n 877,\n 878,\n 879,\n 880,\n 881,\n 882,\n 883,\n 884,\n 885,\n 886,\n 887,\n 888,\n 889,\n 890,\n 891,\n 892,\n 893,\n 894,\n 895,\n 896,\n 897,\n 898,\n 899,\n 900,\n 901,\n 902,\n 903,\n 904,\n 905,\n 906,\n 907,\n 908,\n 909,\n 910,\n 911,\n 912,\n 913,\n 914,\n 915,\n 916,\n 917,\n 918,\n 919,\n 920,\n 921,\n 922,\n 923,\n 924,\n 925,\n 926}"
- },
- "execution_count": 72,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [],
+ "execution_count": 24,
+ "id": "4522bd15c0f00882",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:09:57.285981Z",
- "start_time": "2024-03-12T21:09:57.281092Z"
+ "end_time": "2024-03-12T21:05:54.279349Z",
+ "start_time": "2024-03-12T21:05:54.269910Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "92b8efa50738e47f"
- },
- {
- "cell_type": "code",
- "execution_count": 73,
"outputs": [
{
"data": {
- "text/plain": "{tensor(36),\n tensor(217),\n tensor(221),\n tensor(240),\n tensor(256),\n tensor(288),\n tensor(326),\n tensor(503),\n tensor(550),\n tensor(647)}"
+ "text/plain": [
+ "1"
+ ]
},
- "execution_count": 73,
+ "execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "set(get_top_k_indices(summed_scores, top_k=10))"
- ],
+ "single_query_dataset = torch.utils.data.Subset(query_dataset, list(range(1)))\n",
+ "len(single_query_dataset)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "760504c5-2b97-4c64-a80a-ce3ba0167d5e",
+ "metadata": {},
+ "source": [
+ "We can compute the averaged loss of this selected query data point over multiple random seeds (e.g., initialization, data ordering)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "d705577ebd58b8c8",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:10:05.051237Z",
- "start_time": "2024-03-12T21:10:05.035876Z"
+ "end_time": "2024-03-12T21:13:13.194949Z",
+ "start_time": "2024-03-12T21:13:13.178273Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "91540047fceda6b9"
- },
- {
- "cell_type": "code",
- "execution_count": 77,
"outputs": [],
"source": [
- "def train_and_evaluate(current_train_dataset, current_eval_dataset):\n",
+ "def train_and_evaluate(modified_train_dataset: data.Dataset, query_dataset: data.Dataset) -> float:\n",
" current_model = train(\n",
- " dataset=current_train_dataset,\n",
+ " dataset=modified_train_dataset,\n",
" batch_size=train_batch_size,\n",
" num_train_epochs=num_train_epochs,\n",
" learning_rate=learning_rate,\n",
" weight_decay=weight_decay,\n",
+ " disable_tqdm=True,\n",
" )\n",
- " return evaluate(model=current_model, dataset=current_eval_dataset, batch_size=eval_batch_size)"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:13:13.194949Z",
- "start_time": "2024-03-12T21:13:13.178273Z"
- }
- },
- "id": "d705577ebd58b8c8"
+ " return evaluate(model=current_model, dataset=query_dataset, batch_size=len(query_dataset))"
+ ]
},
{
"cell_type": "code",
- "execution_count": 78,
+ "execution_count": 26,
+ "id": "be1ab297-9260-47a9-82ec-56d1349fa862",
+ "metadata": {},
"outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 585.87batch/s, loss=0.911]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 638.57batch/s, loss=0.603]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 648.91batch/s, loss=0.42]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 635.11batch/s, loss=0.346]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 629.13batch/s, loss=0.296]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 619.84batch/s, loss=0.254]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 576.69batch/s, loss=0.221]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 671.24batch/s, loss=0.22]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 635.33batch/s, loss=0.204]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 637.90batch/s, loss=0.175]\n",
- "Epoch 10: 100%|██████████| 28/28 [00:00<00:00, 633.97batch/s, loss=0.169]\n",
- "Epoch 11: 100%|██████████| 28/28 [00:00<00:00, 661.69batch/s, loss=0.164]\n",
- "Epoch 12: 100%|██████████| 28/28 [00:00<00:00, 651.29batch/s, loss=0.157]\n",
- "Epoch 13: 100%|██████████| 28/28 [00:00<00:00, 666.77batch/s, loss=0.147]\n",
- "Epoch 14: 100%|██████████| 28/28 [00:00<00:00, 627.28batch/s, loss=0.139]\n",
- "Epoch 15: 100%|██████████| 28/28 [00:00<00:00, 613.12batch/s, loss=0.135]\n",
- "Epoch 16: 100%|██████████| 28/28 [00:00<00:00, 575.97batch/s, loss=0.126]\n",
- "Epoch 17: 100%|██████████| 28/28 [00:00<00:00, 592.14batch/s, loss=0.131]\n",
- "Epoch 18: 100%|██████████| 28/28 [00:00<00:00, 588.64batch/s, loss=0.121]\n",
- "Epoch 19: 100%|██████████| 28/28 [00:00<00:00, 574.55batch/s, loss=0.122]\n",
- "Epoch 20: 100%|██████████| 28/28 [00:00<00:00, 566.52batch/s, loss=0.112]\n",
- "Epoch 21: 100%|██████████| 28/28 [00:00<00:00, 538.18batch/s, loss=0.113]\n",
- "Epoch 22: 100%|██████████| 28/28 [00:00<00:00, 564.85batch/s, loss=0.13]\n",
- "Epoch 23: 100%|██████████| 28/28 [00:00<00:00, 560.32batch/s, loss=0.102]\n",
- "Epoch 24: 100%|██████████| 28/28 [00:00<00:00, 588.20batch/s, loss=0.101]\n",
- "Epoch 25: 100%|██████████| 28/28 [00:00<00:00, 444.86batch/s, loss=0.104]\n",
- "Epoch 26: 100%|██████████| 28/28 [00:00<00:00, 617.74batch/s, loss=0.0965]\n",
- "Epoch 27: 100%|██████████| 28/28 [00:00<00:00, 584.56batch/s, loss=0.0993]\n",
- "Epoch 28: 100%|██████████| 28/28 [00:00<00:00, 560.72batch/s, loss=0.101]\n",
- "Epoch 29: 100%|██████████| 28/28 [00:00<00:00, 598.80batch/s, loss=0.0893]\n",
- "Epoch 30: 100%|██████████| 28/28 [00:00<00:00, 598.30batch/s, loss=0.0995]\n",
- "Epoch 31: 100%|██████████| 28/28 [00:00<00:00, 548.75batch/s, loss=0.0889]\n",
- "Epoch 32: 100%|██████████| 28/28 [00:00<00:00, 676.57batch/s, loss=0.101]\n",
- "Epoch 33: 100%|██████████| 28/28 [00:00<00:00, 637.71batch/s, loss=0.089]\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 626.70batch/s, loss=0.086]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 584.80batch/s, loss=0.0824]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 606.39batch/s, loss=0.0985]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 578.46batch/s, loss=0.0771]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 577.56batch/s, loss=0.074]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 631.95batch/s, loss=0.0846]\n"
- ]
- },
{
"data": {
- "text/plain": "0.07795017957687378"
+ "text/plain": [
+ "0.02686239752540132"
+ ]
},
- "execution_count": 78,
+ "execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "train_and_evaluate(train_dataset, current_eval_dataset=small_query_dataset)"
- ],
+ "num_iter = 25\n",
+ "base_loss = 0.0\n",
+ "for _ in range(num_iter):\n",
+ " base_loss += train_and_evaluate(modified_train_dataset=train_dataset, query_dataset=single_query_dataset)\n",
+ "base_loss /= num_iter\n",
+ "base_loss"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "520de0b1-e6a9-45fc-ae52-ae6f935a4da8",
+ "metadata": {},
+ "source": [
+ "We repeat the procedure above to identify the top influential training data points for this data point."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "8b3eb92fd287b0cc",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:13:29.415683Z",
- "start_time": "2024-03-12T21:13:27.270171Z"
+ "end_time": "2024-03-12T21:06:42.141007Z",
+ "start_time": "2024-03-12T21:06:42.067707Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "16be6ab429b5fcd3"
- },
- {
- "cell_type": "code",
- "execution_count": 79,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 626.29batch/s, loss=0.916]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 605.61batch/s, loss=0.577]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 658.10batch/s, loss=0.399]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 642.07batch/s, loss=0.346]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 646.28batch/s, loss=0.299]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 640.60batch/s, loss=0.257]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 609.95batch/s, loss=0.23]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 644.70batch/s, loss=0.205]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 672.63batch/s, loss=0.191]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 643.22batch/s, loss=0.188]\n",
- "Epoch 10: 100%|██████████| 28/28 [00:00<00:00, 577.76batch/s, loss=0.191]\n",
- "Epoch 11: 100%|██████████| 28/28 [00:00<00:00, 639.78batch/s, loss=0.158]\n",
- "Epoch 12: 100%|██████████| 28/28 [00:00<00:00, 659.67batch/s, loss=0.157]\n",
- "Epoch 13: 100%|██████████| 28/28 [00:00<00:00, 651.89batch/s, loss=0.148]\n",
- "Epoch 14: 100%|██████████| 28/28 [00:00<00:00, 631.47batch/s, loss=0.15]\n",
- "Epoch 15: 100%|██████████| 28/28 [00:00<00:00, 642.57batch/s, loss=0.142]\n",
- "Epoch 16: 100%|██████████| 28/28 [00:00<00:00, 659.21batch/s, loss=0.134]\n",
- "Epoch 17: 100%|██████████| 28/28 [00:00<00:00, 701.93batch/s, loss=0.127]\n",
- "Epoch 18: 100%|██████████| 28/28 [00:00<00:00, 645.56batch/s, loss=0.127]\n",
- "Epoch 19: 100%|██████████| 28/28 [00:00<00:00, 637.15batch/s, loss=0.121]\n",
- "Epoch 20: 100%|██████████| 28/28 [00:00<00:00, 674.00batch/s, loss=0.119]\n",
- "Epoch 21: 100%|██████████| 28/28 [00:00<00:00, 588.97batch/s, loss=0.109]\n",
- "Epoch 22: 100%|██████████| 28/28 [00:00<00:00, 583.82batch/s, loss=0.113]\n",
- "Epoch 23: 100%|██████████| 28/28 [00:00<00:00, 597.69batch/s, loss=0.11]\n",
- "Epoch 24: 100%|██████████| 28/28 [00:00<00:00, 624.01batch/s, loss=0.0941]\n",
- "Epoch 25: 100%|██████████| 28/28 [00:00<00:00, 585.46batch/s, loss=0.103]\n",
- "Epoch 26: 100%|██████████| 28/28 [00:00<00:00, 600.24batch/s, loss=0.105]\n",
- "Epoch 27: 100%|██████████| 28/28 [00:00<00:00, 608.82batch/s, loss=0.105]\n",
- "Epoch 28: 100%|██████████| 28/28 [00:00<00:00, 663.98batch/s, loss=0.0937]\n",
- "Epoch 29: 100%|██████████| 28/28 [00:00<00:00, 699.09batch/s, loss=0.0936]\n",
- "Epoch 30: 100%|██████████| 28/28 [00:00<00:00, 685.94batch/s, loss=0.114]\n",
- "Epoch 31: 100%|██████████| 28/28 [00:00<00:00, 689.95batch/s, loss=0.0866]\n",
- "Epoch 32: 100%|██████████| 28/28 [00:00<00:00, 666.33batch/s, loss=0.0854]\n",
- "Epoch 33: 100%|██████████| 28/28 [00:00<00:00, 712.76batch/s, loss=0.0911]\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 710.28batch/s, loss=0.107]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 666.09batch/s, loss=0.0805]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 611.20batch/s, loss=0.0826]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 604.48batch/s, loss=0.08]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 580.85batch/s, loss=0.0743]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 604.00batch/s, loss=0.084]\n",
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 583.44batch/s, loss=0.869]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 577.74batch/s, loss=0.567]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 661.26batch/s, loss=0.403]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 668.64batch/s, loss=0.342]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 679.75batch/s, loss=0.296]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 640.19batch/s, loss=0.256]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 680.29batch/s, loss=0.224]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 655.48batch/s, loss=0.222]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 694.15batch/s, loss=0.185]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 665.41batch/s, loss=0.18]\n",
- "Epoch 10: 0%| | 0/28 [00:00, ?batch/s, loss=0.145] IOPub message rate exceeded.\n",
- "The Jupyter server will temporarily stop sending output\n",
- "to the client in order to avoid crashing it.\n",
- "To change this limit, set the config variable\n",
- "`--ServerApp.iopub_msg_rate_limit`.\n",
- "\n",
- "Current values:\n",
- "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
- "ServerApp.rate_limit_window=3.0 (secs)\n",
- "\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 641.11batch/s, loss=0.0883]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 628.71batch/s, loss=0.0917]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 592.04batch/s, loss=0.0919]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 655.16batch/s, loss=0.0932]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 640.88batch/s, loss=0.0908]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 634.47batch/s, loss=0.082]\n",
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 624.50batch/s, loss=0.841]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 580.80batch/s, loss=0.525]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 577.47batch/s, loss=0.394]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 648.99batch/s, loss=0.326]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 668.88batch/s, loss=0.279]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 667.94batch/s, loss=0.242]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 683.96batch/s, loss=0.23]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 580.20batch/s, loss=0.196]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 687.99batch/s, loss=0.182]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 694.38batch/s, loss=0.209]\n",
- "Epoch 10: 100%|██████████| 28/28 [00:00<00:00, 669.42batch/s, loss=0.197]\n",
- "Epoch 11: 100%|██████████| 28/28 [00:00<00:00, 588.89batch/s, loss=0.159]\n",
- "Epoch 12: 100%|██████████| 28/28 [00:00<00:00, 657.83batch/s, loss=0.157]\n",
- "Epoch 13: 100%|██████████| 28/28 [00:00<00:00, 658.81batch/s, loss=0.142]\n",
- "Epoch 14: 100%|██████████| 28/28 [00:00<00:00, 705.01batch/s, loss=0.132]\n",
- "Epoch 15: 100%|██████████| 28/28 [00:00<00:00, 640.02batch/s, loss=0.127]\n",
- "Epoch 16: 100%|██████████| 28/28 [00:00<00:00, 632.66batch/s, loss=0.132]\n",
- "Epoch 17: 100%|██████████| 28/28 [00:00<00:00, 645.73batch/s, loss=0.133]\n",
- "Epoch 18: 100%|██████████| 28/28 [00:00<00:00, 679.07batch/s, loss=0.136]\n",
- "Epoch 19: 100%|██████████| 28/28 [00:00<00:00, 687.83batch/s, loss=0.137]\n",
- "Epoch 20: 100%|██████████| 28/28 [00:00<00:00, 665.22batch/s, loss=0.117]\n",
- "Epoch 21: 100%|██████████| 28/28 [00:00<00:00, 663.43batch/s, loss=0.12]\n",
- "Epoch 22: 100%|██████████| 28/28 [00:00<00:00, 695.60batch/s, loss=0.119]\n",
- "Epoch 23: 100%|██████████| 28/28 [00:00<00:00, 691.36batch/s, loss=0.105]\n",
- "Epoch 24: 100%|██████████| 28/28 [00:00<00:00, 647.39batch/s, loss=0.106]\n",
- "Epoch 25: 100%|██████████| 28/28 [00:00<00:00, 688.87batch/s, loss=0.114]\n",
- "Epoch 26: 100%|██████████| 28/28 [00:00<00:00, 668.31batch/s, loss=0.0921]\n",
- "Epoch 27: 100%|██████████| 28/28 [00:00<00:00, 674.05batch/s, loss=0.096]\n",
- "Epoch 28: 100%|██████████| 28/28 [00:00<00:00, 630.65batch/s, loss=0.101]\n",
- "Epoch 29: 100%|██████████| 28/28 [00:00<00:00, 661.19batch/s, loss=0.0859]\n",
- "Epoch 30: 100%|██████████| 28/28 [00:00<00:00, 658.99batch/s, loss=0.0864]\n",
- "Epoch 31: 100%|██████████| 28/28 [00:00<00:00, 696.60batch/s, loss=0.0925]\n",
- "Epoch 32: 100%|██████████| 28/28 [00:00<00:00, 683.15batch/s, loss=0.0871]\n",
- "Epoch 33: 100%|██████████| 28/28 [00:00<00:00, 682.58batch/s, loss=0.102]\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 677.05batch/s, loss=0.0856]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 689.69batch/s, loss=0.0908]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 658.34batch/s, loss=0.081]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 714.27batch/s, loss=0.0855]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 680.21batch/s, loss=0.0835]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 660.05batch/s, loss=0.0739]\n",
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 668.96batch/s, loss=0.882]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 699.61batch/s, loss=0.557]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 657.45batch/s, loss=0.407]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 632.75batch/s, loss=0.345]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 643.68batch/s, loss=0.284]\n",
- "Epoch 5: 0%| | 0/28 [00:00, ?batch/s, loss=0.119] IOPub message rate exceeded.\n",
- "The Jupyter server will temporarily stop sending output\n",
- "to the client in order to avoid crashing it.\n",
- "To change this limit, set the config variable\n",
- "`--ServerApp.iopub_msg_rate_limit`.\n",
- "\n",
- "Current values:\n",
- "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
- "ServerApp.rate_limit_window=3.0 (secs)\n",
- "\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 717.65batch/s, loss=0.0986]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 627.46batch/s, loss=0.0763]\n",
- "Epoch 0: 100%|██████████| 28/28 [00:00<00:00, 623.86batch/s, loss=0.919]\n",
- "Epoch 1: 100%|██████████| 28/28 [00:00<00:00, 617.20batch/s, loss=0.616]\n",
- "Epoch 2: 100%|██████████| 28/28 [00:00<00:00, 603.53batch/s, loss=0.435]\n",
- "Epoch 3: 100%|██████████| 28/28 [00:00<00:00, 681.57batch/s, loss=0.356]\n",
- "Epoch 4: 100%|██████████| 28/28 [00:00<00:00, 641.98batch/s, loss=0.303]\n",
- "Epoch 5: 100%|██████████| 28/28 [00:00<00:00, 660.77batch/s, loss=0.262]\n",
- "Epoch 6: 100%|██████████| 28/28 [00:00<00:00, 654.50batch/s, loss=0.239]\n",
- "Epoch 7: 100%|██████████| 28/28 [00:00<00:00, 659.47batch/s, loss=0.208]\n",
- "Epoch 8: 100%|██████████| 28/28 [00:00<00:00, 629.04batch/s, loss=0.21]\n",
- "Epoch 9: 100%|██████████| 28/28 [00:00<00:00, 669.55batch/s, loss=0.18]\n",
- "Epoch 10: 100%|██████████| 28/28 [00:00<00:00, 631.27batch/s, loss=0.179]\n",
- "Epoch 11: 100%|██████████| 28/28 [00:00<00:00, 661.67batch/s, loss=0.178]\n",
- "Epoch 12: 100%|██████████| 28/28 [00:00<00:00, 655.55batch/s, loss=0.163]\n",
- "Epoch 13: 100%|██████████| 28/28 [00:00<00:00, 664.41batch/s, loss=0.145]\n",
- "Epoch 14: 100%|██████████| 28/28 [00:00<00:00, 628.10batch/s, loss=0.145]\n",
- "Epoch 15: 100%|██████████| 28/28 [00:00<00:00, 657.59batch/s, loss=0.144]\n",
- "Epoch 16: 100%|██████████| 28/28 [00:00<00:00, 657.85batch/s, loss=0.131]\n",
- "Epoch 17: 100%|██████████| 28/28 [00:00<00:00, 674.51batch/s, loss=0.127]\n",
- "Epoch 18: 100%|██████████| 28/28 [00:00<00:00, 673.06batch/s, loss=0.128]\n",
- "Epoch 19: 100%|██████████| 28/28 [00:00<00:00, 610.88batch/s, loss=0.12]\n",
- "Epoch 20: 100%|██████████| 28/28 [00:00<00:00, 664.52batch/s, loss=0.121]\n",
- "Epoch 21: 100%|██████████| 28/28 [00:00<00:00, 674.42batch/s, loss=0.134]\n",
- "Epoch 22: 100%|██████████| 28/28 [00:00<00:00, 622.56batch/s, loss=0.123]\n",
- "Epoch 23: 100%|██████████| 28/28 [00:00<00:00, 707.03batch/s, loss=0.109]\n",
- "Epoch 24: 100%|██████████| 28/28 [00:00<00:00, 653.96batch/s, loss=0.115]\n",
- "Epoch 25: 100%|██████████| 28/28 [00:00<00:00, 653.22batch/s, loss=0.108]\n",
- "Epoch 26: 100%|██████████| 28/28 [00:00<00:00, 636.35batch/s, loss=0.11]\n",
- "Epoch 27: 100%|██████████| 28/28 [00:00<00:00, 681.97batch/s, loss=0.104]\n",
- "Epoch 28: 100%|██████████| 28/28 [00:00<00:00, 685.58batch/s, loss=0.112]\n",
- "Epoch 29: 100%|██████████| 28/28 [00:00<00:00, 690.51batch/s, loss=0.112]\n",
- "Epoch 30: 100%|██████████| 28/28 [00:00<00:00, 648.40batch/s, loss=0.0954]\n",
- "Epoch 31: 100%|██████████| 28/28 [00:00<00:00, 632.37batch/s, loss=0.1]\n",
- "Epoch 32: 100%|██████████| 28/28 [00:00<00:00, 613.75batch/s, loss=0.111]\n",
- "Epoch 33: 100%|██████████| 28/28 [00:00<00:00, 679.04batch/s, loss=0.0878]\n",
- "Epoch 34: 100%|██████████| 28/28 [00:00<00:00, 634.20batch/s, loss=0.0952]\n",
- "Epoch 35: 100%|██████████| 28/28 [00:00<00:00, 680.44batch/s, loss=0.0894]\n",
- "Epoch 36: 100%|██████████| 28/28 [00:00<00:00, 690.66batch/s, loss=0.0918]\n",
- "Epoch 37: 100%|██████████| 28/28 [00:00<00:00, 665.56batch/s, loss=0.0822]\n",
- "Epoch 38: 100%|██████████| 28/28 [00:00<00:00, 654.85batch/s, loss=0.086]\n",
- "Epoch 39: 100%|██████████| 28/28 [00:00<00:00, 638.61batch/s, loss=0.0943]\n"
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting covariance matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Performing Eigendecomposition [4/4] 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Fitting Lambda matrices [1/1] 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "num_iter = 5\n",
- "base_loss = 0\n",
- "for _ in range(num_iter):\n",
- " base_loss += train_and_evaluate(current_train_dataset=train_dataset, current_eval_dataset=small_query_dataset)\n",
- "base_loss /= num_iter"
- ],
+ "analyzer.fit_all_factors(\n",
+ " factors_name=\"counterfactual_factors\",\n",
+ " dataset=train_dataset,\n",
+ " per_device_batch_size=None,\n",
+ " overwrite_output_dir=True,\n",
+ ")\n",
+ "analyzer.compute_pairwise_scores(\n",
+ " scores_name=\"counterfactual_scores\",\n",
+ " factors_name=\"counterfactual_factors\",\n",
+ " query_dataset=single_query_dataset,\n",
+ " train_dataset=train_dataset,\n",
+ " per_device_query_batch_size=len(single_query_dataset),\n",
+ " overwrite_output_dir=True,\n",
+ ")\n",
+ "scores = analyzer.load_pairwise_scores(scores_name=\"counterfactual_scores\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ec9776a5-203b-441d-abd5-27aabf50ff18",
+ "metadata": {},
+ "source": [
+ "We can visualize the distribution of influence scores."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "86fd82e97c1c0af9",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:14:35.612111Z",
- "start_time": "2024-03-12T21:14:26.657476Z"
+ "end_time": "2024-03-12T21:08:01.250153Z",
+ "start_time": "2024-03-12T21:08:01.244362Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "379eafac7ad1c3b4"
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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v6KiIkVF1dtCjgAAAABCzB6PyljHpolBHEngBDSM9erVSytWrNDu3bvPuc+ePXu0YsUKZWRkBPLUAAAAAEKYZxjrQBir7he/+IWKi4s1dOhQvfLKKyouLnZvKy4u1ty5czV06FCVlJTozjvvDOSpAQAAAISwUAxjAb1W8L/+67/08ccf66WXXtIdd9yhO+64Q02bNpUkHT16VJJkjNEvfvEL3XTTTYE8NQAAAIAQZYzRniMeYaxZaISxgC/O/+KLL+qtt97SFVdcoejoaB05ckRHjhxRdHS0Bg8erLfeekt//etfA31aAAAAACHqaEGZ8ksr3O9D5Z6xellF4/rrr9f111+viooKff/995KkJk2asGgHAAAAAJ8UlVXovxd85n6flhij1ISYII4ocOo1HUVFRemiiy6qz1MAAAAACGF/WPS51nz9vft952ZJQRxNYAX8OWPPPfectm3bds59tm3bpueee+68Ky4CAAAAgCRt3nfC8v7OoR2DM5B6ENAw9swzz+i+++5TcnLyOfdp1KiRpk6dqueeey6QpwYAAAAQgo4Xlblfv/bz/srsHjpX3gU0jH344Yfq06eP2rZte8592rVrpz59+mj58uWBPDUAAACAEFNR6VR+ydmFO9o3CY2FO1wCGsa++eYbdexYc9mwU6dO2r9/fyBPDQAAACDEnPIIYpKUmhAdpJHUj4CGscjISJWWlta4X2lpqSorKwN5agAAAAAh5oTHJYpREQ4lxYbW6uwBDWNdu3bVxx9/rKKionPuU1RUpI8//lhdunQJ5KkBAAAAhJjjReXu16kJ0XI4HEEcTeAFNIyNGzdOx44d02233abCwsJq24uKinT77bfr+PHjGjduXCBPDQAAACDEnCw+WxlLiQ+tSxSlAD9n7J577tFrr72mBQsWaOXKlbrxxhvVqVMnSVJubq7mz5+vw4cPq1u3bvrv//7vQJ4aAAAAQIg5YamMhcaDnj0FNIwlJCQoOztbN998s1asWKFnnnnGXUo0xkiShg0bptdee02JiaG1EgoAAACAwPK8TLFxiC3eIQU4jElSenq6srOztWHDBmVnZ+ubb76RJLVp00ZXXXWVLrvsskCfEgAAAEAIOlnkeZkilbFau+yyy9zBq6SkRCdOnFDTpk3r63QAAAAAQswxjzAWasvaS3VcwCM/P1+ffvqpdu3a5XX7V199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r759+yo+Pl7Lli3T1KlTddddd+mZZ57Rt99+a9n/xIkT2rdvnyR5/QfGNm3aqGnTpsrLy9OpU6fc7fwuDG0dO3ZUp06dtHPnTr355puWbTt27NDrr7+uxo0ba8yYMZLOzoeePXt6/Qckb/PB37mH0EYYQ41c/+Hw9sXHsz0vL6/BxoQL17PPPitJGj58uPtfGmuaQ4mJiUpNTdXx48eVn58vSTp16pROnjx53uOYe/bndDp12223KTU1VU888USN+zOXUNUXX3whSWrevLmuu+46jRgxQk8//bT++te/6te//rU6d+6s+fPnu/d3zaHGjRsrMTHRa5/e5gO/C0NbZGSk/v73vys1NVU33XSTLrnkEv30pz9VZmamMjIy1Lp1a3344Yfuf2T0Zz74O/cQ2ghjqJFrmfKEhASv213/QXF98UH4ev/99/XKK68oOjpaM2bMcLfXNIek6vPIc3l85l7o+vOf/6wNGzboySefdF/+cz7MJVR1/PhxSdK7776rf/3rX3r++ed1+PBh7d27V7/5zW9UXFysiRMnasuWLZL8m0O1OY45ZH+DBg3S6tWr1bFjR23evFkLFizQypUrFRERoR/96Efq2LGje19/5oO/cw+hjTAGICC+/PJL3XzzzTLG6Mknn3TfOwacy759+/TQQw9pyJAhmjRpUrCHA5tyPd+roqJC06dP11133aVmzZqpXbt2evLJJzV+/HiVl5frySefDPJIcaGbP3+++vfvrzZt2mj9+vUqKCjQrl27NGnSJM2cOVOZmZkqLS0N9jARYghjqFFSUpKk0w/69aawsFCS1KhRowYbEy4sBw4c0PDhw3X8+HFNnTpV9957r2V7TXNIqj6PXMec7zjmnr3dfffdKisr0wsvvFDrY5hLqMrzf19vC3i42lavXm3Z35c5VJvjmEP29tVXX2nixIlq2rSpli5dqv79+ysxMVFdunTRiy++qB//+MfavHmz5syZI8m/+eDv3ENoI4yhRm3btpUk7d+/3+t2V3u7du0abEy4cBw7dkxXX3218vLydOutt+qpp56qtk9Nc6iwsFAnTpxQ48aN3b+AkpOTlZKSct7jmHv2tnTpUiUkJOjOO+/U0KFD3X9++tOfSjod8l1thw4dksRcQnWu/80SEhLUrFmzatvbt28vSTp8+LCks3Po+PHj7i++VXmbD/wuDG3/+Mc/VF5eruHDh1sCvsuECRMkSR999JEk/+aDv3MPoY0whhq5LjfbvHmz1+2u9oyMjAYbEy4MBQUFuvbaa/XFF19o7Nixeumll+RwOKrt161bN8XGxurIkSM6cOBAte3nmkPnm3vl5eXatm2b4uLi1LVr10B8HATBiRMntHr1asuf9evXS5JKSkrcba4l55lLqMq1Kl1xcbHXS8iOHTsm6WxVIjU11f2l+LPPPqu2/zfffKOjR4+qXbt2Sk5OdrfzuzC0uUKQ6x9uqnK1u+5RdM2Hbdu2qby8vNr+3uaDv3MPoY0whhoNGjRIKSkpys3Ndd8A7SkrK0uSNGrUqAYeGYKptLRUo0eP1qeffqprrrlG8+fPV2RkpNd94+PjlZmZKUl66623qm0/1xxyPbvFtd3T0qVLVVJSoquuukpxcXF1+iwIDmOM1z979uyRJHXq1Mnd5qpuMJdQVdu2bdW7d28ZY9yXInpytXkuJX6++eDPHPrss8+0e/du9ezZ0z1XYS/p6emSTj8qwZsNGzZIOltp7dChg37wgx+ouLjY/ewwT/7MI75PhalgPW0a9vLggw8aSWbgwIGmoKDA3T5z5kwjyQwZMiR4g0ODq6ioMGPGjDGSzODBg01hYWGNxyxfvtxIMk2aNDG7du1yt69du9bExsaa1NRUc/z4ccsx33//vUlOTjaSzMKFC93t3333nencubORZFauXBmoj4ULxJ49e4wk06lTJ6/bmUuo6o033jCSTK9evcy3337rbv/ss89MWlqakWT++c9/utu//PJLExkZaWJjY80nn3zibt+1a5dp0qSJiYqKMl999ZXlHGVlZaZDhw5Gkpk1a5a7vaCgwAwYMMBIMnPnzq2/D4l6tWnTJiPJSDJ/+ctfLNs++eQTk5iYaCSZ5cuXu9tfeuklI8l06dLFfPfdd+72hQsXGkmmc+fOpry83NKXP3MPoY0whlopLi42l19+uZFkWrRoYSZMmOB+36xZM5ObmxvsIaIBPfPMM+5fWmPGjDETJ070+ufIkSOW4+69914jySQkJJjRo0eba6+91kRFRZnIyEjz9ttvez1XVlaWiYiIMA6HwwwbNsyMGzfOpKamGklm6tSpDfBp0dBqCmPGMJdQ3cSJE40kk5qaakaMGGGGDRtmYmNjjSRz++23V9t/1qxZRpKJiooy1157rRk9erSJj483ksxzzz3n9Rxr1qxx73P55ZebCRMmmBYtWhhJZty4ccbpdNb3x0Q9+s1vfuP+3dajRw8zfvx4M2jQIBMREWEkmTvuuMOyf2VlpfsfJhs3bmzGjRtnhg4dahwOh4mPjzfr1q3zeh5/5h5CF2EMtVZUVGQefvhh06lTJxMTE2PS09PNpEmTzDfffBPsoaGB/c///I/7F9b5/uzZs6fasXPnzjWXXHKJSUhIMKmpqWb48OFmzZo15z3fxx9/bIYPH25SU1NNQkKCufTSS828efPq6dMh2GoTxoxhLsHK6XSav/3tb+45kZiYaAYMGHDe/33fffddM3jwYJOUlGSSkpLM4MGDzZIlS857nm3btpnrr7/eNGnSxMTFxZkePXqYWbNmmcrKykB/JATBokWLzNVXX+2uUjVu3NgMGzbMvPnmm173r6ioMDNnzjQ9evQwcXFxpkmTJmbcuHFm+/bt5z2PP3MPoclhjDGBvvQRAAAAAHB+LOABAAAAAEFAGAMAAACAICCMAQAAAEAQEMYAAAAAIAgIYwAAAAAQBIQxAAAAAAgCwhgAAAAABAFhDAAAAACCgDAGAAAAAEFAGAMAAACAICCMAQAAAEAQEMYAAAAAIAgIYwAAAAAQBIQxAAAAAAgCwhgAAAAABAFhDAAAAACCgDAGAAAAAEHw/wG0DRcNWqMngQAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.plot(sorted(scores[\"all_modules\"].sum(dim=0) / len(train_dataset)))\n",
+ "plt.ylabel(\"Scores\")\n",
+ "plt.grid()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "16c3c019-a9b3-4176-8a30-4f1ce4b3e7e7",
+ "metadata": {},
+ "source": [
+ "What happens if we train the model without positively influential data points? Intuitively, the query loss should increase if the model was trained without these top influential data points."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "b07f18b5-7009-4458-aec2-4a49fd595348",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_topk_indices(current_score: torch.Tensor, topk: int = 1) -> torch.Tensor:\n",
+ " return torch.topk(current_score, topk).indices\n",
+ "\n",
+ "def get_topk_keep_indices(current_score: torch.Tensor, topk: int = 1) -> List[int]:\n",
+ " remove_indices = get_topk_indices(current_score, topk)\n",
+ " remove_indices = [tensor.item() for tensor in remove_indices]\n",
+ " return list(set(list(range(len(train_dataset)))) - set(remove_indices))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0960cc9-9606-41ed-b7aa-9971789611d3",
+ "metadata": {},
+ "source": [
+ "We define `get_topk_keep_indices`, which returns dataset indices with `topk` positively influential data points removed."
+ ]
},
{
"cell_type": "code",
- "execution_count": 80,
+ "execution_count": 30,
+ "id": "1a22d21e-3d87-4a88-9665-517487f71ef6",
+ "metadata": {},
"outputs": [
{
"data": {
- "text/plain": "0.1237425720691681"
+ "text/plain": [
+ "(917, 907)"
+ ]
},
- "execution_count": 80,
+ "execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "base_loss"
- ],
+ "len(get_topk_keep_indices(scores[\"all_modules\"].sum(dim=0), topk=10)), len(get_topk_keep_indices(scores[\"all_modules\"].sum(dim=0), topk=20))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "b90e2a6a-e6bc-4865-a0f8-4e8d6d8012c6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "topk_lst = [5, 10, 15, 20, 25, 30] \n",
+ "if_removed_loss_lst = []\n",
+ "\n",
+ "for topk in topk_lst:\n",
+ " keep_indices = get_topk_keep_indices(scores[\"all_modules\"].sum(dim=0), topk=topk)\n",
+ " \n",
+ " new_loss = 0.\n",
+ " for _ in range(num_iter):\n",
+ " new_loss += train_and_evaluate(modified_train_dataset=torch.utils.data.Subset(train_dataset, keep_indices), query_dataset=single_query_dataset)\n",
+ " new_loss /= num_iter\n",
+ " if_removed_loss_lst.append(new_loss)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6194cf30-e728-4484-b4a0-60736016feb6",
+ "metadata": {},
+ "source": [
+ "We compare the results with the random baseline, where the same number of data points are removed."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "868b1ff7796cfafa",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
- "end_time": "2024-03-12T21:14:39.883335Z",
- "start_time": "2024-03-12T21:14:39.876048Z"
+ "end_time": "2024-03-12T21:16:31.778208Z",
+ "start_time": "2024-03-12T21:16:22.922187Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "id": "4a2ab1743a8cf346"
+ "outputs": [],
+ "source": [
+ "random_indices = list(range(len(train_dataset)))\n",
+ "shuffle(random_indices)\n",
+ "random_removed_loss_lst = []\n",
+ "\n",
+ "for topk in topk_lst:\n",
+ " keep_indices = random_indices[topk:]\n",
+ " \n",
+ " new_loss = 0\n",
+ " for _ in range(num_iter):\n",
+ " new_loss += train_and_evaluate(modified_train_dataset=torch.utils.data.Subset(train_dataset, keep_indices), query_dataset=single_query_dataset)\n",
+ " new_loss /= num_iter\n",
+ " random_removed_loss_lst.append(new_loss)"
+ ]
},
{
"cell_type": "code",
- "execution_count": 84,
+ "execution_count": 33,
+ "id": "9e6fd656-c1e5-42cb-87f4-d7690f473fe9",
+ "metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
- "Epoch 0: 100%|██████████| 27/27 [00:00<00:00, 570.47batch/s, loss=0.926]\n",
- "Epoch 1: 100%|██████████| 27/27 [00:00<00:00, 567.78batch/s, loss=0.569]\n",
- "Epoch 2: 100%|██████████| 27/27 [00:00<00:00, 570.60batch/s, loss=0.386]\n",
- "Epoch 3: 100%|██████████| 27/27 [00:00<00:00, 584.24batch/s, loss=0.335]\n",
- "Epoch 4: 100%|██████████| 27/27 [00:00<00:00, 543.31batch/s, loss=0.276]\n",
- "Epoch 5: 100%|██████████| 27/27 [00:00<00:00, 611.63batch/s, loss=0.239]\n",
- "Epoch 6: 100%|██████████| 27/27 [00:00<00:00, 579.03batch/s, loss=0.213]\n",
- "Epoch 7: 100%|██████████| 27/27 [00:00<00:00, 587.25batch/s, loss=0.193]\n",
- "Epoch 8: 100%|██████████| 27/27 [00:00<00:00, 632.51batch/s, loss=0.175]\n",
- "Epoch 9: 100%|██████████| 27/27 [00:00<00:00, 581.18batch/s, loss=0.177]\n",
- "Epoch 10: 100%|██████████| 27/27 [00:00<00:00, 577.28batch/s, loss=0.158]\n",
- "Epoch 11: 100%|██████████| 27/27 [00:00<00:00, 419.68batch/s, loss=0.148]\n",
- "Epoch 12: 100%|██████████| 27/27 [00:00<00:00, 531.87batch/s, loss=0.157]\n",
- "Epoch 13: 100%|██████████| 27/27 [00:00<00:00, 535.44batch/s, loss=0.136]\n",
- "Epoch 14: 100%|██████████| 27/27 [00:00<00:00, 543.30batch/s, loss=0.134]\n",
- "Epoch 15: 100%|██████████| 27/27 [00:00<00:00, 586.75batch/s, loss=0.125]\n",
- "Epoch 16: 100%|██████████| 27/27 [00:00<00:00, 590.17batch/s, loss=0.13]\n",
- "Epoch 17: 100%|██████████| 27/27 [00:00<00:00, 407.74batch/s, loss=0.115]\n",
- "Epoch 18: 100%|██████████| 27/27 [00:00<00:00, 629.78batch/s, loss=0.124]\n",
- "Epoch 19: 100%|██████████| 27/27 [00:00<00:00, 629.34batch/s, loss=0.0994]\n",
- "Epoch 20: 100%|██████████| 27/27 [00:00<00:00, 682.78batch/s, loss=0.113]\n",
- "Epoch 21: 100%|██████████| 27/27 [00:00<00:00, 695.72batch/s, loss=0.103]\n",
- "Epoch 22: 100%|██████████| 27/27 [00:00<00:00, 654.56batch/s, loss=0.0986]\n",
- "Epoch 23: 100%|██████████| 27/27 [00:00<00:00, 657.21batch/s, loss=0.102]\n",
- "Epoch 24: 100%|██████████| 27/27 [00:00<00:00, 673.11batch/s, loss=0.0881]\n",
- "Epoch 25: 100%|██████████| 27/27 [00:00<00:00, 681.68batch/s, loss=0.0965]\n",
- "Epoch 26: 100%|██████████| 27/27 [00:00<00:00, 625.14batch/s, loss=0.0915]\n",
- "Epoch 27: 100%|██████████| 27/27 [00:00<00:00, 718.77batch/s, loss=0.0846]\n",
- "Epoch 28: 100%|██████████| 27/27 [00:00<00:00, 668.65batch/s, loss=0.0907]\n",
- "Epoch 29: 100%|██████████| 27/27 [00:00<00:00, 642.95batch/s, loss=0.0831]\n",
- "Epoch 30: 100%|██████████| 27/27 [00:00<00:00, 660.58batch/s, loss=0.083]\n",
- "Epoch 31: 100%|██████████| 27/27 [00:00<00:00, 720.57batch/s, loss=0.078]\n",
- "Epoch 32: 100%|██████████| 27/27 [00:00<00:00, 694.94batch/s, loss=0.0732]\n",
- "Epoch 33: 100%|██████████| 27/27 [00:00<00:00, 675.04batch/s, loss=0.0756]\n",
- "Epoch 34: 100%|██████████| 27/27 [00:00<00:00, 687.41batch/s, loss=0.0781]\n",
- "Epoch 35: 100%|██████████| 27/27 [00:00<00:00, 599.25batch/s, loss=0.076]\n",
- "Epoch 36: 100%|██████████| 27/27 [00:00<00:00, 679.97batch/s, loss=0.0754]\n",
- "Epoch 37: 100%|██████████| 27/27 [00:00<00:00, 693.84batch/s, loss=0.0751]\n",
- "Epoch 38: 100%|██████████| 27/27 [00:00<00:00, 676.10batch/s, loss=0.0732]\n",
- "Epoch 39: 100%|██████████| 27/27 [00:00<00:00, 586.66batch/s, loss=0.0777]\n",
- "Epoch 0: 100%|██████████| 27/27 [00:00<00:00, 680.81batch/s, loss=0.92]\n",
- "Epoch 1: 100%|██████████| 27/27 [00:00<00:00, 645.01batch/s, loss=0.606]\n",
- "Epoch 2: 100%|██████████| 27/27 [00:00<00:00, 659.31batch/s, loss=0.402]\n",
- "Epoch 3: 100%|██████████| 27/27 [00:00<00:00, 693.00batch/s, loss=0.345]\n",
- "Epoch 4: 100%|██████████| 27/27 [00:00<00:00, 680.05batch/s, loss=0.294]\n",
- "Epoch 5: 100%|██████████| 27/27 [00:00<00:00, 640.39batch/s, loss=0.258]\n",
- "Epoch 6: 100%|██████████| 27/27 [00:00<00:00, 653.25batch/s, loss=0.232]\n",
- "Epoch 7: 100%|██████████| 27/27 [00:00<00:00, 676.15batch/s, loss=0.196]\n",
- "Epoch 8: 100%|██████████| 27/27 [00:00<00:00, 662.82batch/s, loss=0.172]\n",
- "Epoch 9: 100%|██████████| 27/27 [00:00<00:00, 663.18batch/s, loss=0.157]\n",
- "Epoch 10: 100%|██████████| 27/27 [00:00<00:00, 665.84batch/s, loss=0.162]\n",
- "Epoch 11: 100%|██████████| 27/27 [00:00<00:00, 659.72batch/s, loss=0.143]\n",
- "Epoch 12: 0%| | 0/27 [00:00, ?batch/s, loss=0.0816] IOPub message rate exceeded.\n",
- "The Jupyter server will temporarily stop sending output\n",
- "to the client in order to avoid crashing it.\n",
- "To change this limit, set the config variable\n",
- "`--ServerApp.iopub_msg_rate_limit`.\n",
- "\n",
- "Current values:\n",
- "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
- "ServerApp.rate_limit_window=3.0 (secs)\n",
- "\n",
- "Epoch 2: 100%|██████████| 27/27 [00:00<00:00, 671.16batch/s, loss=0.435]\n",
- "Epoch 3: 100%|██████████| 27/27 [00:00<00:00, 610.88batch/s, loss=0.365]\n",
- "Epoch 4: 100%|██████████| 27/27 [00:00<00:00, 590.28batch/s, loss=0.292]\n",
- "Epoch 5: 100%|██████████| 27/27 [00:00<00:00, 605.03batch/s, loss=0.244]\n",
- "Epoch 6: 100%|██████████| 27/27 [00:00<00:00, 673.42batch/s, loss=0.224]\n",
- "Epoch 7: 100%|██████████| 27/27 [00:00<00:00, 618.40batch/s, loss=0.184]\n",
- "Epoch 8: 100%|██████████| 27/27 [00:00<00:00, 634.40batch/s, loss=0.169]\n",
- "Epoch 9: 100%|██████████| 27/27 [00:00<00:00, 610.38batch/s, loss=0.186]\n",
- "Epoch 10: 100%|██████████| 27/27 [00:00<00:00, 660.34batch/s, loss=0.17]\n",
- "Epoch 11: 100%|██████████| 27/27 [00:00<00:00, 669.33batch/s, loss=0.176]\n",
- "Epoch 12: 100%|██████████| 27/27 [00:00<00:00, 680.41batch/s, loss=0.163]\n",
- "Epoch 13: 100%|██████████| 27/27 [00:00<00:00, 659.60batch/s, loss=0.125]\n",
- "Epoch 14: 100%|██████████| 27/27 [00:00<00:00, 624.67batch/s, loss=0.131]\n",
- "Epoch 15: 100%|██████████| 27/27 [00:00<00:00, 635.34batch/s, loss=0.125]\n",
- "Epoch 16: 100%|██████████| 27/27 [00:00<00:00, 612.42batch/s, loss=0.119]\n",
- "Epoch 17: 100%|██████████| 27/27 [00:00<00:00, 653.22batch/s, loss=0.11]\n",
- "Epoch 18: 100%|██████████| 27/27 [00:00<00:00, 638.10batch/s, loss=0.114]\n",
- "Epoch 19: 100%|██████████| 27/27 [00:00<00:00, 662.94batch/s, loss=0.11]\n",
- "Epoch 20: 100%|██████████| 27/27 [00:00<00:00, 662.86batch/s, loss=0.108]\n",
- "Epoch 21: 100%|██████████| 27/27 [00:00<00:00, 667.19batch/s, loss=0.0998]\n",
- "Epoch 22: 100%|██████████| 27/27 [00:00<00:00, 659.81batch/s, loss=0.0976]\n",
- "Epoch 23: 100%|██████████| 27/27 [00:00<00:00, 663.01batch/s, loss=0.0966]\n",
- "Epoch 24: 100%|██████████| 27/27 [00:00<00:00, 671.12batch/s, loss=0.0964]\n",
- "Epoch 25: 100%|██████████| 27/27 [00:00<00:00, 548.85batch/s, loss=0.0913]\n",
- "Epoch 26: 100%|██████████| 27/27 [00:00<00:00, 565.04batch/s, loss=0.0894]\n",
- "Epoch 27: 100%|██████████| 27/27 [00:00<00:00, 576.94batch/s, loss=0.0996]\n",
- "Epoch 28: 100%|██████████| 27/27 [00:00<00:00, 570.40batch/s, loss=0.0798]\n",
- "Epoch 29: 100%|██████████| 27/27 [00:00<00:00, 507.49batch/s, loss=0.101]\n",
- "Epoch 30: 100%|██████████| 27/27 [00:00<00:00, 563.94batch/s, loss=0.0768]\n",
- "Epoch 31: 100%|██████████| 27/27 [00:00<00:00, 563.46batch/s, loss=0.0943]\n",
- "Epoch 32: 100%|██████████| 27/27 [00:00<00:00, 579.51batch/s, loss=0.0846]\n",
- "Epoch 33: 100%|██████████| 27/27 [00:00<00:00, 581.21batch/s, loss=0.0818]\n",
- "Epoch 34: 100%|██████████| 27/27 [00:00<00:00, 584.29batch/s, loss=0.0754]\n",
- "Epoch 35: 100%|██████████| 27/27 [00:00<00:00, 584.11batch/s, loss=0.0773]\n",
- "Epoch 36: 100%|██████████| 27/27 [00:00<00:00, 599.39batch/s, loss=0.0709]\n",
- "Epoch 37: 100%|██████████| 27/27 [00:00<00:00, 587.33batch/s, loss=0.0744]\n",
- "Epoch 38: 100%|██████████| 27/27 [00:00<00:00, 567.45batch/s, loss=0.0724]\n",
- "Epoch 39: 100%|██████████| 27/27 [00:00<00:00, 568.95batch/s, loss=0.0733]\n",
- "Epoch 0: 100%|██████████| 27/27 [00:00<00:00, 615.13batch/s, loss=0.939]\n",
- "Epoch 1: 100%|██████████| 27/27 [00:00<00:00, 552.07batch/s, loss=0.625]\n",
- "Epoch 2: 100%|██████████| 27/27 [00:00<00:00, 563.13batch/s, loss=0.416]\n",
- "Epoch 3: 100%|██████████| 27/27 [00:00<00:00, 596.68batch/s, loss=0.353]\n",
- "Epoch 4: 100%|██████████| 27/27 [00:00<00:00, 659.31batch/s, loss=0.294]\n",
- "Epoch 5: 100%|██████████| 27/27 [00:00<00:00, 676.61batch/s, loss=0.265]\n",
- "Epoch 6: 100%|██████████| 27/27 [00:00<00:00, 635.75batch/s, loss=0.232]\n",
- "Epoch 7: 100%|██████████| 27/27 [00:00<00:00, 654.39batch/s, loss=0.205]\n",
- "Epoch 8: 100%|██████████| 27/27 [00:00<00:00, 641.27batch/s, loss=0.193]\n",
- "Epoch 9: 100%|██████████| 27/27 [00:00<00:00, 696.74batch/s, loss=0.179]\n",
- "Epoch 10: 100%|██████████| 27/27 [00:00<00:00, 655.88batch/s, loss=0.175]\n",
- "Epoch 11: 100%|██████████| 27/27 [00:00<00:00, 658.08batch/s, loss=0.168]\n",
- "Epoch 12: 100%|██████████| 27/27 [00:00<00:00, 669.03batch/s, loss=0.169]\n",
- "Epoch 13: 100%|██████████| 27/27 [00:00<00:00, 677.54batch/s, loss=0.152]\n",
- "Epoch 14: 0%| | 0/27 [00:00, ?batch/s, loss=0.133] IOPub message rate exceeded.\n",
- "The Jupyter server will temporarily stop sending output\n",
- "to the client in order to avoid crashing it.\n",
- "To change this limit, set the config variable\n",
- "`--ServerApp.iopub_msg_rate_limit`.\n",
- "\n",
- "Current values:\n",
- "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n",
- "ServerApp.rate_limit_window=3.0 (secs)\n",
- "\n",
- "Epoch 2: 100%|██████████| 27/27 [00:00<00:00, 622.32batch/s, loss=0.422]\n",
- "Epoch 3: 100%|██████████| 27/27 [00:00<00:00, 635.38batch/s, loss=0.345]\n",
- "Epoch 4: 100%|██████████| 27/27 [00:00<00:00, 560.44batch/s, loss=0.292]\n",
- "Epoch 5: 100%|██████████| 27/27 [00:00<00:00, 555.98batch/s, loss=0.243]\n",
- "Epoch 6: 100%|██████████| 27/27 [00:00<00:00, 590.11batch/s, loss=0.224]\n",
- "Epoch 7: 100%|██████████| 27/27 [00:00<00:00, 562.11batch/s, loss=0.223]\n",
- "Epoch 8: 100%|██████████| 27/27 [00:00<00:00, 555.66batch/s, loss=0.177]\n",
- "Epoch 9: 100%|██████████| 27/27 [00:00<00:00, 585.24batch/s, loss=0.18]\n",
- "Epoch 10: 100%|██████████| 27/27 [00:00<00:00, 593.10batch/s, loss=0.167]\n",
- "Epoch 11: 100%|██████████| 27/27 [00:00<00:00, 586.73batch/s, loss=0.157]\n",
- "Epoch 12: 100%|██████████| 27/27 [00:00<00:00, 564.35batch/s, loss=0.14]\n",
- "Epoch 13: 100%|██████████| 27/27 [00:00<00:00, 588.99batch/s, loss=0.155]\n",
- "Epoch 14: 100%|██████████| 27/27 [00:00<00:00, 348.32batch/s, loss=0.142]\n",
- "Epoch 15: 100%|██████████| 27/27 [00:00<00:00, 529.69batch/s, loss=0.123]\n",
- "Epoch 16: 100%|██████████| 27/27 [00:00<00:00, 564.91batch/s, loss=0.132]\n",
- "Epoch 17: 100%|██████████| 27/27 [00:00<00:00, 576.25batch/s, loss=0.135]\n",
- "Epoch 18: 100%|██████████| 27/27 [00:00<00:00, 561.85batch/s, loss=0.116]\n",
- "Epoch 19: 100%|██████████| 27/27 [00:00<00:00, 571.07batch/s, loss=0.105]\n",
- "Epoch 20: 100%|██████████| 27/27 [00:00<00:00, 524.79batch/s, loss=0.116]\n",
- "Epoch 21: 100%|██████████| 27/27 [00:00<00:00, 614.11batch/s, loss=0.109]\n",
- "Epoch 22: 100%|██████████| 27/27 [00:00<00:00, 625.78batch/s, loss=0.106]\n",
- "Epoch 23: 100%|██████████| 27/27 [00:00<00:00, 600.83batch/s, loss=0.107]\n",
- "Epoch 24: 100%|██████████| 27/27 [00:00<00:00, 679.17batch/s, loss=0.0961]\n",
- "Epoch 25: 100%|██████████| 27/27 [00:00<00:00, 659.89batch/s, loss=0.0858]\n",
- "Epoch 26: 100%|██████████| 27/27 [00:00<00:00, 662.64batch/s, loss=0.0949]\n",
- "Epoch 27: 100%|██████████| 27/27 [00:00<00:00, 586.49batch/s, loss=0.0852]\n",
- "Epoch 28: 100%|██████████| 27/27 [00:00<00:00, 621.75batch/s, loss=0.104]\n",
- "Epoch 29: 100%|██████████| 27/27 [00:00<00:00, 686.93batch/s, loss=0.0779]\n",
- "Epoch 30: 100%|██████████| 27/27 [00:00<00:00, 663.94batch/s, loss=0.0853]\n",
- "Epoch 31: 100%|██████████| 27/27 [00:00<00:00, 675.86batch/s, loss=0.0961]\n",
- "Epoch 32: 100%|██████████| 27/27 [00:00<00:00, 655.45batch/s, loss=0.0767]\n",
- "Epoch 33: 100%|██████████| 27/27 [00:00<00:00, 686.73batch/s, loss=0.0767]\n",
- "Epoch 34: 100%|██████████| 27/27 [00:00<00:00, 660.16batch/s, loss=0.0816]\n",
- "Epoch 35: 100%|██████████| 27/27 [00:00<00:00, 664.14batch/s, loss=0.0777]\n",
- "Epoch 36: 100%|██████████| 27/27 [00:00<00:00, 650.24batch/s, loss=0.0839]\n",
- "Epoch 37: 100%|██████████| 27/27 [00:00<00:00, 640.31batch/s, loss=0.0757]\n",
- "Epoch 38: 100%|██████████| 27/27 [00:00<00:00, 668.68batch/s, loss=0.0675]\n",
- "Epoch 39: 100%|██████████| 27/27 [00:00<00:00, 650.60batch/s, loss=0.0791]\n"
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n",
+ "Computing pairwise scores (query gradient) [0/1] 0%| [time left: ?, time spent: 00:00]\n",
+ "Computing pairwise scores (training gradient) [1/1] 100%|███████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\u001b[A\n",
+ "Computing pairwise scores (query gradient) [1/1] 100%|██████████████████████████████████████████████████████████████████████████████████████████████████ [time left: 00:00, time spent: 00:00]\n"
]
}
],
"source": [
- "top_indices = get_top_k_indices(summed_scores, top_k=50)\n",
- "keep_indices = get_keep_indices(top_indices)\n",
+ "from kronfluence import FactorArguments\n",
"\n",
- "new_loss = 0\n",
- "for _ in range(num_iter):\n",
- " new_loss += train_and_evaluate(current_train_dataset=torch.utils.data.Subset(train_dataset, keep_indices), current_eval_dataset=small_query_dataset)\n",
- "new_loss /= num_iter"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:16:31.778208Z",
- "start_time": "2024-03-12T21:16:22.922187Z"
- }
- },
- "id": "868b1ff7796cfafa"
+ "factor_args = FactorArguments(strategy=\"identity\")\n",
+ "analyzer.fit_all_factors(\n",
+ " factors_name=\"counterfactual_identity_factors\",\n",
+ " dataset=train_dataset,\n",
+ " factor_args=factor_args,\n",
+ " per_device_batch_size=None,\n",
+ " overwrite_output_dir=True,\n",
+ ")\n",
+ "analyzer.compute_pairwise_scores(\n",
+ " scores_name=\"counterfactual_identity_scores\",\n",
+ " factors_name=\"counterfactual_identity_factors\",\n",
+ " query_dataset=single_query_dataset,\n",
+ " train_dataset=train_dataset,\n",
+ " per_device_query_batch_size=len(single_query_dataset),\n",
+ " overwrite_output_dir=True,\n",
+ ")\n",
+ "identity_scores = analyzer.load_pairwise_scores(scores_name=\"counterfactual_identity_scores\")[\"all_modules\"].sum(dim=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "220ea9ef-778c-48e5-8c65-6f1efac05233",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "id_removed_loss_lst = []\n",
+ "\n",
+ "for topk in topk_lst:\n",
+ " keep_indices = get_topk_keep_indices(identity_scores, topk=topk)\n",
+ " \n",
+ " new_loss = 0.\n",
+ " for _ in range(num_iter):\n",
+ " new_loss += train_and_evaluate(modified_train_dataset=torch.utils.data.Subset(train_dataset, keep_indices), query_dataset=single_query_dataset)\n",
+ " new_loss /= num_iter\n",
+ " id_removed_loss_lst.append(new_loss)"
+ ]
},
{
"cell_type": "code",
- "execution_count": 85,
+ "execution_count": 35,
+ "id": "6af9e2b1-b8c1-4825-97ef-e9accc6c2e91",
+ "metadata": {},
"outputs": [
{
"data": {
- "text/plain": "0.35664366722106927"
+ "text/plain": [
+ "Text(0.5, 0, 'Number of Training Samples Removed')"
+ ]
},
- "execution_count": 85,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAKHCAYAAACLonkvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAABcSAAAXEgFnn9JSAADt/UlEQVR4nOzdd3iT1fvH8XfapgtaVsveCFQZZU+RskRcqKhfQX8iKEO2IE42KkuULch0o8JXFFBBQJC9KXvv3VKgkzZt8vsj3wZiC7SQNkn7eV1XLn3Os+42bcn9nHPuY7BYLBZEREREREQkwzycHYCIiIiIiIi7USIlIiIiIiKSSUqkREREREREMkmJlIiIiIiISCYpkRIREREREckkJVIiIiIiIiKZpERKREREREQkk5RIiYiIiIiIZJISKRERERERkUxSIiUiIiIiIpJJSqREREREREQySYmUiIiIiIhIJimREhERERERySQvZweQWxQtWpS4uDhKly7t7FBERERERHK906dPkydPHi5evHhP56tHKpvExcVhMpmcHQZxcXHExcU5Owy5D3oP3ZveP/en99D96T10b3r/3J+rvIcmk+m+4lCPVDZJ7Ynat2+fU+NYtWoVAM2bN3dqHHLv9B66N71/7k/vofvTe+je9P65P1d5D6tUqXJf56tHSkREREREJJOUSImIiIiIiGSSEikREREREZFMUiIlIiIiIiKSSUqkREREREREMkmJlIiIiIiISCap/LkbsFgsWCwWh17TbDY79HqS/fQeugaDwYDBYHB2GCIiIpLNlEi5IIvFQkxMDNHR0cTHx5OSkuKwa+fJkweAQ4cOOeyakr30Hroeb29vAgICKFSoEJ6ens4OR0RERLKBEikXYzabuXjxItevX8+S66d+CBf3pffQ9SQlJXHlyhXi4uIoXbq0kikREZFcQImUi7l+/botiSpYsCABAQH4+Pg4bOhQdHQ0AIGBgQ65nmQ/vYeuxWw2ExcXx6VLl7hx4wZXrlyhcOHCzg5LREREspgSKRdz9epVAAoXLkyhQoUcfn0PDw+7/4r70XvoWjw8PMiXLx8A58+fJyYmRomUiIhILqBPYi7EYrGQmJgIqLdBxN2kDrlMSkpyeHEYERERcT1KpFzIrR++NMdCxL3c2kOoREpERCTnUyIlIiIiIiKSSUqkREREREREMkmJlIiI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ICYmBgMHDkRUVBSefPLJCjtWRdm6dStmzZoFtVqNX3/9FcePH8fw4cNx6NChCuk5sKfBgwdj9+7d6NWrF06fPo2ff/4ZQUFBOHDggLlqn60338+ePRvffPMNRo4cCaVSiQMHDmDDhg04d+4cOnXqhCVLluDUqVMW97q4uLjgwIEDGDduHFxdXbFjxw6cP38eEydOxO+//261LH5lWrFiBRYvXoxr165h69atkEgkGD9+PA4cOGC1BLY1bm5u+PXXX/HVV1+hc+fOOH/+PDZs2IBjx45BrVZjwYIFWLJkiXn7UaNGYerUqQgKCsKRI0ewceNGXLlyBY8++ih2796NV199tcKe30svvYTg4GCcPHkSv/zyCwCgdu3aOHjwIFasWIEWLVrg5MmT2LBhA06fPo1GjRph6dKleO211yosBmuCg4Nx9OhRTJ06FXK5HJs2bcLx48fx4IMPYteuXaW+BkV7oHr06FFitUmpVIqvv/4aW7duRe/evXHlyhVs3LgRf/31F1xdXTFt2jR88cUXFo9p1KgRDh8+jKeeegppaWnYsmULMjIysG7dukp/TYiqMokoT0klIiKiGqZv377YtWsXDh06hM6dOzs6nErVoEEDXLt2rVzVFomIair2SBERUY0XFxdX7D4eg8GADz/8ELt27UKzZs3QqVMnB0VHRERVEcufExFRjXfgwAGMHDkS7dq1Q0hICLRaLc6cOYOrV69CpVJh7dq1Dp3Pi4iIqh72SBERUY3Xvn17PPvss0hLS8Nvv/2GXbt2IT8/H8888wyOHj1apUrPExFR1cB7pIiIiIiIiMqJPVJERERERETlxESKiIiIiIionJhIERERERERlRMTKSIiIiIionJiIkVERERERFROTKSIiIiIiIjKiYkUERERERFROTGRIiIiIiIiKicmUkREREREROXERIqIiIiIiKicmEgRERERERGVExMpIiIiIiKicmIiRUREREREVE5MpIiIiIiIiMrp/wF7L8HRWfEzlgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
],
"source": [
- "new_loss"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-03-12T21:16:35.056487Z",
- "start_time": "2024-03-12T21:16:35.049529Z"
- }
- },
- "id": "86370ac8eb37aee5"
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "outputs": [],
- "source": [],
- "metadata": {
- "collapsed": false
- },
- "id": "669ce001a286fe6f"
+ "plt.plot([0] + topk_lst, [base_loss] + random_removed_loss_lst, \"o-\", label=\"Random\")\n",
+ "plt.plot([0] + topk_lst, [base_loss] + id_removed_loss_lst, \"o-\", label=\"TracIn (Identity)\")\n",
+ "plt.plot([0] + topk_lst, [base_loss] + if_removed_loss_lst, \"o-\", label=\"IF (EKFAC)\")\n",
+ "plt.grid()\n",
+ "plt.legend()\n",
+ "plt.ylabel(\"Query Loss\")\n",
+ "plt.xlabel(\"Number of Training Samples Removed\")"
+ ]
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
- "version": 2
+ "version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
- "pygments_lexer": "ipython2",
- "version": "2.7.6"
+ "pygments_lexer": "ipython3",
+ "version": "3.9.18"
}
},
"nbformat": 4,
diff --git a/examples/wikitext/README.md b/examples/wikitext/README.md
new file mode 100644
index 0000000..c08cd48
--- /dev/null
+++ b/examples/wikitext/README.md
@@ -0,0 +1,48 @@
+# WikiText & GPT-2 Example
+
+This directory contains scripts for fine-tuning GPT-2 on WikiText2 dataset. The pipeline is motivated from
+[HuggingFace Example](https://github.com/huggingface/transformers/tree/main/examples/pytorch/language-modeling).
+Please begin by installing necessary packages.
+```bash
+pip install -r requirements.txt
+```
+
+## Training
+
+To fine-tune GPT-2, run the following command:
+```bash
+python train.py --checkpoint_dir ./checkpoints \
+ --train_batch_size 8 \
+ --eval_batch_size 16 \
+ --learning_rate 3e-05 \
+ --weight_decay 0.01 \
+ --num_train_epochs 3
+```
+
+## Computing Pairwise Influence Scores
+
+To obtain a pairwise influence scores on 481 query data points using `ekfac`, run the following command:
+```bash
+python analyze.py --query_batch_size 32 \
+ --train_batch_size 64 \
+ --checkpoint_dir ./checkpoints \
+ --factor_strategy ekfac
+```
+You can also use `identity`, `diagonal`, and `kfac`. On A100 (80GB), it takes roughly 50 minutes to compute the
+pairwise scores (including computing EKFAC factors).
+
+
+## Counterfactual Experiment
+
+We can conduct counterfactual experiment by observing the increase in validation perplexity when removing top influential sequences.
+We show a simple demo in `run_counterfactual.py` (the code assumes that you have computed the pairwise influence scores with `ekfac` and `identity`).
+
+
+
+
+
+
+## Computing Linear Datamodeling Score
+
+We can also compute the [Linear Datamodeling Score (LDS)](https://arxiv.org/abs/2303.14186). The code in `evaluate_lds.py` measures the LDS obtained by
+retraining the network 600 times with different subsets of the dataset (5 repeats and 120 masks). We can obtain `0.37` LDS.
\ No newline at end of file
diff --git a/examples/wikitext/analyze.py b/examples/wikitext/analyze.py
new file mode 100644
index 0000000..d19b5e9
--- /dev/null
+++ b/examples/wikitext/analyze.py
@@ -0,0 +1,202 @@
+import argparse
+import logging
+import os
+from typing import Dict, List, Optional
+
+import torch
+import torch.nn.functional as F
+from torch import nn
+from transformers import default_data_collator
+
+from examples.wikitext.pipeline import construct_gpt2, get_wikitext_dataset
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments, ScoreArguments
+from kronfluence.task import Task
+from kronfluence.utils.dataset import DataLoaderKwargs
+
+BATCH_TYPE = Dict[str, torch.Tensor]
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Influence analysis on WikiText dataset.")
+
+ parser.add_argument(
+ "--checkpoint_dir",
+ type=str,
+ default="./checkpoints",
+ help="A path that is storing the final checkpoint of the model.",
+ )
+
+ parser.add_argument(
+ "--query_gradient_rank",
+ type=int,
+ default=-1,
+ help="Rank for the low-rank query gradient approximation.",
+ )
+ parser.add_argument(
+ "--use_half_precision",
+ type=bool,
+ default=False,
+ help="Whether to use half precision for computing factors and scores.",
+ )
+ parser.add_argument(
+ "--query_batch_size",
+ type=int,
+ default=8,
+ help="Batch size for computing query gradients.",
+ )
+ parser.add_argument(
+ "--train_batch_size",
+ type=int,
+ default=8,
+ help="Batch size for computing query gradients.",
+ )
+ parser.add_argument(
+ "--factor_strategy",
+ type=str,
+ default="ekfac",
+ help="Strategy to compute influence factors.",
+ )
+
+ args = parser.parse_args()
+
+ if args.checkpoint_dir is not None:
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+ return args
+
+
+class LanguageModelingTask(Task):
+ def compute_train_loss(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ sample: bool = False,
+ ) -> torch.Tensor:
+ logits = model(
+ input_ids=batch["input_ids"],
+ attention_mask=batch["attention_mask"],
+ ).logits
+
+ shift_logits = logits[..., :-1, :].contiguous()
+
+ if not sample:
+ labels = batch["labels"]
+ shift_labels = labels[..., 1:].contiguous()
+ reshaped_shift_logits = shift_logits.view(-1, shift_logits.size(-1))
+ summed_loss = F.cross_entropy(reshaped_shift_logits, shift_labels.view(-1), reduction="sum")
+ else:
+ reshaped_shift_logits = shift_logits.view(-1, shift_logits.size(-1))
+ with torch.no_grad():
+ probs = torch.nn.functional.softmax(reshaped_shift_logits, dim=-1)
+ sampled_labels = torch.multinomial(
+ probs,
+ num_samples=1,
+ ).flatten()
+ summed_loss = F.cross_entropy(reshaped_shift_logits, sampled_labels.detach(), reduction="sum")
+ return summed_loss
+
+ def compute_measurement(
+ self,
+ batch: BATCH_TYPE,
+ model: nn.Module,
+ ) -> torch.Tensor:
+ # We could also compute the log-likelihood or averaged margin.
+ return self.compute_train_loss(batch, model)
+
+ def tracked_modules(self) -> List[str]:
+ total_modules = []
+
+ for i in range(12):
+ total_modules.append(f"transformer.h.{i}.attn.c_attn")
+ total_modules.append(f"transformer.h.{i}.attn.c_proj")
+
+ for i in range(12):
+ total_modules.append(f"transformer.h.{i}.mlp.c_fc")
+ total_modules.append(f"transformer.h.{i}.mlp.c_proj")
+
+ return total_modules
+
+ def get_attention_mask(self, batch: BATCH_TYPE) -> Optional[torch.Tensor]:
+ return batch["attention_mask"]
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.INFO)
+
+ # Prepare the dataset.
+ train_dataset = get_wikitext_dataset(
+ split="eval_train",
+ )
+ eval_dataset = get_wikitext_dataset(
+ split="valid",
+ )
+
+ # Prepare the trained model.
+ model = construct_gpt2()
+ checkpoint_path = os.path.join(args.checkpoint_dir, "model.pth")
+ if not os.path.isfile(checkpoint_path):
+ raise ValueError(f"No checkpoint found at {checkpoint_path}.")
+ model.load_state_dict(torch.load(checkpoint_path))
+
+ # Define task and prepare model.
+ task = LanguageModelingTask()
+ model = prepare_model(model, task)
+
+ analyzer = Analyzer(
+ analysis_name="wikitext",
+ model=model,
+ task=task,
+ )
+ # Configure parameters for DataLoader.
+ dataloader_kwargs = DataLoaderKwargs(collate_fn=default_data_collator)
+ analyzer.set_dataloader_kwargs(dataloader_kwargs)
+
+ # Compute influence factors.
+ factors_name = args.factor_strategy
+ factor_args = FactorArguments(strategy=args.factor_strategy)
+ if args.use_half_precision:
+ factor_args.activation_covariance_dtype = torch.bfloat16
+ factor_args.gradient_covariance_dtype = torch.bfloat16
+ factor_args.lambda_dtype = torch.bfloat16
+ factors_name += "_half"
+
+ analyzer.fit_all_factors(
+ factors_name=factors_name,
+ dataset=train_dataset,
+ per_device_batch_size=None,
+ factor_args=factor_args,
+ overwrite_output_dir=False,
+ initial_per_device_batch_size_attempt=128,
+ )
+
+ # Compute pairwise scores.
+ rank = args.query_gradient_rank if args.query_gradient_rank != -1 else None
+ score_args = ScoreArguments(query_gradient_rank=rank, query_gradient_svd_dtype=torch.float32)
+ scores_name = f"{factor_args.strategy}_pairwise"
+ if rank is not None:
+ scores_name += f"_qlr{rank}"
+
+ if args.use_half_precision:
+ score_args.per_sample_gradient_dtype = torch.bfloat16
+ score_args.score_dtype = torch.bfloat16
+ score_args.cached_activation_cpu_offload = True
+ scores_name += "_half"
+
+ analyzer.compute_pairwise_scores(
+ scores_name=scores_name,
+ score_args=score_args,
+ factors_name=args.factor_strategy,
+ query_dataset=eval_dataset,
+ query_indices=list(range(min([len(eval_dataset), 2000]))),
+ train_dataset=train_dataset,
+ per_device_query_batch_size=args.query_batch_size,
+ per_device_train_batch_size=args.train_batch_size,
+ overwrite_output_dir=True,
+ )
+ scores = analyzer.load_pairwise_scores(scores_name)["all_modules"]
+ logging.info(f"Scores shape: {scores.shape}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/wikitext/evaluate_lds.py b/examples/wikitext/evaluate_lds.py
new file mode 100644
index 0000000..407e510
--- /dev/null
+++ b/examples/wikitext/evaluate_lds.py
@@ -0,0 +1,29 @@
+import logging
+
+import numpy as np
+import torch
+from scipy.stats import spearmanr
+
+from kronfluence.analyzer import Analyzer
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+
+ results = torch.load("files/lds_results.pt")
+ diff_loss = torch.from_numpy(results["diff_loss"])
+ mask = torch.from_numpy(results["mask"]).float()
+ mask = ((mask + 1) % 2).to(dtype=torch.float64).t()
+
+ # You might need to change the path.
+ scores = Analyzer.load_file("scores_pairwise/ekfac_pairwise.safetensors")["all_modules"].to(dtype=torch.float64)
+ preds = (scores @ mask).t().numpy()
+
+ corr_lst = []
+ for i in range(diff_loss.shape[1]):
+ corr_lst.append(spearmanr(diff_loss[:, i], preds[:, i])[0])
+ logging.info(f"LDS: {np.mean(corr_lst)}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/wikitext/figure/counterfactual.png b/examples/wikitext/figure/counterfactual.png
new file mode 100644
index 0000000..060e0fd
Binary files /dev/null and b/examples/wikitext/figure/counterfactual.png differ
diff --git a/examples/wikitext/pipeline.py b/examples/wikitext/pipeline.py
new file mode 100644
index 0000000..b0f5986
--- /dev/null
+++ b/examples/wikitext/pipeline.py
@@ -0,0 +1,102 @@
+from itertools import chain
+from typing import List
+
+from datasets import load_dataset
+from torch import nn
+from torch.utils import data
+from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
+from transformers.pytorch_utils import Conv1D
+
+
+def replace_conv1d_modules(model: nn.Module) -> None:
+ # GPT-2 is defined in terms of Conv1D. However, this does not work for Kronfluence.
+ # Here, we convert these Conv1D modules to linear modules recursively.
+ for name, module in model.named_children():
+ if len(list(module.children())) > 0:
+ replace_conv1d_modules(module)
+
+ if isinstance(module, Conv1D):
+ new_module = nn.Linear(in_features=module.weight.shape[0], out_features=module.weight.shape[1])
+ new_module.weight.data.copy_(module.weight.data.t())
+ new_module.bias.data.copy_(module.bias.data)
+ setattr(model, name, new_module)
+
+
+def construct_gpt2() -> nn.Module:
+ config = AutoConfig.from_pretrained(
+ "gpt2",
+ trust_remote_code=True,
+ )
+ model = AutoModelForCausalLM.from_pretrained(
+ "gpt2",
+ from_tf=False,
+ config=config,
+ ignore_mismatched_sizes=False,
+ trust_remote_code=True,
+ )
+ replace_conv1d_modules(model)
+ return model
+
+
+def get_wikitext_dataset(
+ split: str,
+ indices: List[int] = None,
+) -> data.Dataset:
+ assert split in ["train", "eval_train", "valid"]
+
+ raw_datasets = load_dataset("wikitext", "wikitext-2-raw-v1")
+ tokenizer = AutoTokenizer.from_pretrained("gpt2", use_fast=True, trust_remote_code=True)
+
+ column_names = raw_datasets["train"].column_names
+ text_column_name = "text" if "text" in column_names else column_names[0]
+
+ def tokenize_function(examples):
+ return tokenizer(examples[text_column_name])
+
+ tokenized_datasets = raw_datasets.map(
+ tokenize_function,
+ batched=True,
+ num_proc=None,
+ remove_columns=column_names,
+ load_from_cache_file=True,
+ desc="Running tokenizer on dataset",
+ )
+ block_size = 512
+
+ def group_texts(examples):
+ concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
+ total_length = len(concatenated_examples[list(examples.keys())[0]])
+ total_length = (total_length // block_size) * block_size
+ result = {
+ k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
+ for k, t in concatenated_examples.items()
+ }
+ result["labels"] = result["input_ids"].copy()
+ return result
+
+ lm_datasets = tokenized_datasets.map(
+ group_texts,
+ batched=True,
+ num_proc=None,
+ load_from_cache_file=True,
+ desc=f"Grouping texts in chunks of {block_size}",
+ )
+
+ if split in ["train", "eval_train"]:
+ train_dataset = lm_datasets["train"]
+ ds = train_dataset
+ else:
+ eval_dataset = lm_datasets["validation"]
+ ds = eval_dataset
+
+ if indices is not None:
+ ds = ds.select(indices)
+
+ return ds
+
+
+if __name__ == "__main__":
+ from kronfluence import Analyzer
+
+ model = construct_gpt2()
+ print(Analyzer.get_module_summary(model))
diff --git a/examples/wikitext/requirements.txt b/examples/wikitext/requirements.txt
new file mode 100644
index 0000000..cd62543
--- /dev/null
+++ b/examples/wikitext/requirements.txt
@@ -0,0 +1,4 @@
+transformers
+datasets
+matplotlib
+tueplots
\ No newline at end of file
diff --git a/examples/wikitext/run_counterfactual.py b/examples/wikitext/run_counterfactual.py
new file mode 100644
index 0000000..d682b7d
--- /dev/null
+++ b/examples/wikitext/run_counterfactual.py
@@ -0,0 +1,109 @@
+import logging
+import math
+from random import shuffle
+from typing import List
+
+import matplotlib.pyplot as plt
+import torch
+from tueplots import markers
+
+from examples.wikitext.pipeline import get_wikitext_dataset
+from examples.wikitext.train import evaluate_model, train
+from kronfluence.analyzer import Analyzer
+
+
+def main():
+ logging.basicConfig(level=logging.INFO)
+
+ train_dataset = get_wikitext_dataset(split="train")
+ # You might need to change the path.
+ identity_scores = Analyzer.load_file("analyses/wikitext/scores_identity_pairwise/pairwise_scores.safetensors")[
+ "all_modules"
+ ][:50].sum(dim=0)
+ ekfac_scores = Analyzer.load_file("analyses/wikitext/scores_ekfac_pairwise/pairwise_scores.safetensors")[
+ "all_modules"
+ ][:50].sum(dim=0)
+
+ def get_topk_indices(current_score: torch.Tensor, topk: int = 1) -> torch.Tensor:
+ return torch.topk(current_score, topk).indices
+
+ def get_topk_keep_indices(current_score: torch.Tensor, topk: int = 1) -> List[int]:
+ remove_indices = get_topk_indices(current_score, topk)
+ remove_indices = [tensor.item() for tensor in remove_indices]
+ return list(set(list(range(len(train_dataset)))) - set(remove_indices))
+
+ eval_train_dataset = get_wikitext_dataset(split="valid", indices=list(range(50)))
+
+ def train_and_evaluate(indices):
+ train_dataset = get_wikitext_dataset(split="train", indices=indices)
+ model = train(
+ dataset=train_dataset,
+ batch_size=8,
+ num_train_epochs=3,
+ learning_rate=3e-05,
+ weight_decay=0.01,
+ )
+ return evaluate_model(model, eval_train_dataset, batch_size=16)
+
+ num_iter = 1
+ topk_lst = [0, 50, 100, 150, 200]
+
+ ekfac_remove_perp_lst = []
+ for topk in topk_lst:
+ keep_indices = get_topk_keep_indices(ekfac_scores, topk=topk)
+
+ perp = 0.0
+ for _ in range(num_iter):
+ new_loss = train_and_evaluate(indices=keep_indices)
+ perp += math.exp(new_loss)
+ perp /= num_iter
+ ekfac_remove_perp_lst.append(perp)
+
+ logging.info(f"Removed {topk} data points. Perplexity: {perp}")
+ logging.info(f"EKFAC: {ekfac_remove_perp_lst}")
+
+ id_remove_perp_lst = []
+ for topk in topk_lst:
+ keep_indices = get_topk_keep_indices(identity_scores, topk=topk)
+
+ perp = 0.0
+ for _ in range(num_iter):
+ new_loss = train_and_evaluate(indices=keep_indices)
+ perp += math.exp(new_loss)
+ perp /= num_iter
+ id_remove_perp_lst.append(perp)
+
+ logging.info(f"Removed {topk} data points. Perplexity: {perp}")
+ logging.info(f"TracIn: {id_remove_perp_lst}")
+
+ random_indices = list(range(4656))
+ shuffle(random_indices)
+ random_remove_perp_lst = []
+ for topk in topk_lst:
+ keep_indices = random_indices[topk:]
+
+ perp = 0.0
+ for _ in range(num_iter):
+ new_loss = train_and_evaluate(indices=keep_indices)
+ perp += math.exp(new_loss)
+ perp /= num_iter
+ random_remove_perp_lst.append(perp)
+
+ logging.info(f"Removed {topk} data points. Perplexity: {perp}")
+ logging.info(f"Random: {random_remove_perp_lst}")
+
+ plt.rcParams.update({"figure.dpi": 150})
+ plt.rcParams.update(markers.with_edge())
+ plt.rcParams["axes.axisbelow"] = True
+ plt.plot(topk_lst, [ekfac_remove_perp_lst[0]] + random_remove_perp_lst[1:], "o-", label="Random")
+ plt.plot(topk_lst, [ekfac_remove_perp_lst[0]] + id_remove_perp_lst[1:], "o-", label="TracIn (Identity)")
+ plt.plot(topk_lst, ekfac_remove_perp_lst, "o-", label="IF (EKFAC)")
+ plt.grid()
+ plt.legend()
+ plt.xlabel("Number of Training Samples Removed")
+ plt.ylabel("Mean Query Perplexity")
+ plt.show()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/wikitext/train.py b/examples/wikitext/train.py
new file mode 100644
index 0000000..ebb880c
--- /dev/null
+++ b/examples/wikitext/train.py
@@ -0,0 +1,175 @@
+import argparse
+import logging
+import math
+import os
+import time
+
+import torch
+import torch.nn.functional as F
+from accelerate.utils import set_seed
+from torch import nn
+from torch.nn import CrossEntropyLoss
+from torch.utils import data
+from transformers import default_data_collator
+
+from examples.wikitext.pipeline import construct_gpt2, get_wikitext_dataset
+
+DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Fine-tune GPT-2 on WikiText dataset.")
+
+ parser.add_argument(
+ "--train_batch_size",
+ type=int,
+ default=8,
+ help="Batch size for the training dataloader.",
+ )
+ parser.add_argument(
+ "--eval_batch_size",
+ type=int,
+ default=16,
+ help="Batch size for the evaluation dataloader.",
+ )
+
+ parser.add_argument(
+ "--learning_rate",
+ type=float,
+ default=3e-05,
+ help="Fixed learning rate to train the model.",
+ )
+ parser.add_argument(
+ "--weight_decay",
+ type=float,
+ default=0.01,
+ help="Weight decay to train the model.",
+ )
+ parser.add_argument(
+ "--num_train_epochs",
+ type=int,
+ default=3,
+ help="Total number of epochs to train the model.",
+ )
+
+ parser.add_argument(
+ "--seed",
+ type=int,
+ default=0,
+ help="A seed for reproducible training pipeline.",
+ )
+ parser.add_argument(
+ "--checkpoint_dir",
+ type=str,
+ default="./checkpoints",
+ help="A path to store the final checkpoint.",
+ )
+
+ args = parser.parse_args()
+
+ if args.checkpoint_dir is not None:
+ os.makedirs(args.checkpoint_dir, exist_ok=True)
+
+ return args
+
+
+def train(
+ dataset: data.Dataset,
+ batch_size: int,
+ num_train_epochs: int,
+ learning_rate: float,
+ weight_decay: float,
+) -> nn.Module:
+ train_dataloader = data.DataLoader(
+ dataset=dataset,
+ batch_size=batch_size,
+ shuffle=True,
+ drop_last=True,
+ collate_fn=default_data_collator,
+ )
+
+ model = construct_gpt2().to(DEVICE)
+ optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate, weight_decay=weight_decay)
+ loss_fn = CrossEntropyLoss(reduction="mean")
+
+ start_time = time.time()
+ model.eval()
+ for epoch in range(num_train_epochs):
+ total_loss = 0.0
+ for batch in train_dataloader:
+ model.zero_grad()
+ lm_logits = model(
+ input_ids=batch["input_ids"].to(device=DEVICE),
+ attention_mask=batch["attention_mask"].to(device=DEVICE),
+ ).logits
+ labels = batch["labels"].to(device=DEVICE)
+ shift_logits = lm_logits[..., :-1, :].contiguous()
+ shift_labels = labels[..., 1:].contiguous()
+ loss = loss_fn(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
+ loss.backward()
+ optimizer.step()
+ total_loss += loss.detach().float()
+ logging.info(f"Epoch {epoch + 1} - Averaged Loss: {total_loss / len(dataset)}")
+ end_time = time.time()
+ elapsed_time = end_time - start_time
+ logging.info(f"Completed training in {elapsed_time:.2f} seconds.")
+ return model
+
+
+def evaluate_model(model: nn.Module, dataset: data.Dataset, batch_size: int) -> float:
+ dataloader = data.DataLoader(
+ dataset=dataset, batch_size=batch_size, shuffle=False, drop_last=False, collate_fn=default_data_collator
+ )
+
+ model.eval()
+ total_loss = 0.0
+ total_num = 0
+ for batch in dataloader:
+ with torch.no_grad():
+ lm_logits = model(
+ input_ids=batch["input_ids"].to(device=DEVICE),
+ attention_mask=batch["attention_mask"].to(device=DEVICE),
+ ).logits
+ labels = batch["labels"].to(device=DEVICE)
+ shift_logits = lm_logits[..., :-1, :].contiguous()
+ shift_labels = labels[..., 1:].contiguous()
+ reshaped_shift_logits = shift_logits.view(-1, shift_logits.size(-1))
+ loss = F.cross_entropy(reshaped_shift_logits, shift_labels.view(-1), reduction="sum").detach().float()
+ total_loss += loss
+ total_num += reshaped_shift_logits.shape[0]
+ return total_loss.item() / total_num
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=logging.INFO)
+ logger = logging.getLogger()
+
+ if args.seed is not None:
+ set_seed(args.seed)
+
+ train_dataset = get_wikitext_dataset(split="train")
+ model = train(
+ dataset=train_dataset,
+ batch_size=args.train_batch_size,
+ num_train_epochs=args.num_train_epochs,
+ learning_rate=args.learning_rate,
+ weight_decay=args.weight_decay,
+ )
+
+ eval_train_dataset = get_wikitext_dataset(split="eval_train")
+ train_loss = evaluate_model(model=model, dataset=eval_train_dataset, batch_size=args.eval_batch_size)
+ train_perplexity = math.exp(train_loss)
+ logger.info(f"Train perplexity: {train_perplexity}")
+
+ eval_dataset = get_wikitext_dataset(split="valid")
+ eval_loss = evaluate_model(model=model, dataset=eval_dataset, batch_size=args.eval_batch_size)
+ eval_perplexity = math.exp(eval_loss)
+ logger.info(f"Evaluation perplexity: {eval_perplexity}")
+
+ if args.checkpoint_dir is not None:
+ torch.save(model.state_dict(), os.path.join(args.checkpoint_dir, "model.pth"))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/kronfluence/__init__.py b/kronfluence/__init__.py
index fc62365..8b98251 100644
--- a/kronfluence/__init__.py
+++ b/kronfluence/__init__.py
@@ -1,11 +1,12 @@
from . import utils
-from .analyzer import Analyzer
+from .analyzer import Analyzer, prepare_model
from .arguments import FactorArguments, ScoreArguments
from .task import Task
from .version import __version__
__all__ = [
"Analyzer",
+ "prepare_model",
"FactorArguments",
"ScoreArguments",
"Task",
diff --git a/kronfluence/analyzer.py b/kronfluence/analyzer.py
index 7b8713c..710eb26 100644
--- a/kronfluence/analyzer.py
+++ b/kronfluence/analyzer.py
@@ -1,5 +1,5 @@
from pathlib import Path
-from typing import Dict, Optional
+from typing import Dict, Optional, Union
import torch
from accelerate.utils import extract_model_from_parallel
@@ -196,7 +196,7 @@ def fit_all_factors(
)
@staticmethod
- def load_file(path: Path) -> Dict[str, torch.Tensor]:
+ def load_file(path: Union[str, Path]) -> Dict[str, torch.Tensor]:
"""Loads the `.safetensors` file at the given path from disk.
See https://github.com/huggingface/safetensors.
@@ -209,6 +209,8 @@ def load_file(path: Path) -> Dict[str, torch.Tensor]:
Dict[str, torch.Tensor]:
The contents of the file, which is the dictionary mapping string to tensors.
"""
+ if isinstance(path, str):
+ path = Path(path).resolve()
if not path.exists():
raise FileNotFoundError(f"File does not exists at `{path}`.")
return load_file(path)
diff --git a/kronfluence/computer/computer.py b/kronfluence/computer/computer.py
index 49d6f7a..212d697 100644
--- a/kronfluence/computer/computer.py
+++ b/kronfluence/computer/computer.py
@@ -36,7 +36,6 @@
from kronfluence.utils.exceptions import (
FactorsNotFoundError,
TrackedModuleNotFoundError,
- UnsupportableModuleError,
)
from kronfluence.utils.logger import PassThroughProfiler, Profiler, get_logger
from kronfluence.utils.save import (
@@ -74,16 +73,15 @@ def __init__(
self.model = model
self.task = task
- try:
- tracked_module_names = get_tracked_module_names(self.model)
- except TrackedModuleNotFoundError as e:
+ tracked_module_names = get_tracked_module_names(self.model)
+ if len(tracked_module_names) == 0:
error_msg = (
f"No tracked modules found in the provided model: {self.model}. "
f"Please make sure to run `prepare_model` before passing it in to the "
f"Analyzer."
)
self.logger.error(error_msg)
- raise UnsupportableModuleError(error_msg) from e
+ raise TrackedModuleNotFoundError(error_msg)
self.logger.info(f"Tracking modules with names: {tracked_module_names}.")
if self.state.use_distributed and not isinstance(model, (DDP, FSDP)):
diff --git a/kronfluence/computer/score_computer.py b/kronfluence/computer/score_computer.py
index f435e99..628a23c 100644
--- a/kronfluence/computer/score_computer.py
+++ b/kronfluence/computer/score_computer.py
@@ -301,8 +301,11 @@ def compute_pairwise_scores(
)
if query_indices is not None:
query_dataset = data.Subset(dataset=query_dataset, indices=query_indices)
+ del query_indices
+
if train_indices is not None:
train_dataset = data.Subset(dataset=train_dataset, indices=train_indices)
+ del train_indices
with self.profiler.profile("Load All Factors"):
loaded_factors = self.load_all_factors(
@@ -592,6 +595,7 @@ def compute_self_scores(
)
if train_indices is not None:
train_dataset = data.Subset(dataset=train_dataset, indices=train_indices)
+ del train_indices
with self.profiler.profile("Load All Factors"):
loaded_factors = self.load_all_factors(
diff --git a/kronfluence/version.py b/kronfluence/version.py
index b1a19e3..3b93d0b 100644
--- a/kronfluence/version.py
+++ b/kronfluence/version.py
@@ -1 +1 @@
-__version__ = "0.0.5"
+__version__ = "0.0.2"
diff --git a/pyproject.toml b/pyproject.toml
index f6b3690..a8ddb26 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,7 +17,7 @@ docstring-code-line-length = "dynamic"
[tool.pylint.format]
max-line-length = "120"
-max-locals = 40
+max-locals = 45
max-args = 20
max-branches = 30
max-statements = 90
diff --git a/tests/factors/test_covariances.py b/tests/factors/test_covariances.py
index f1eba04..c731a08 100644
--- a/tests/factors/test_covariances.py
+++ b/tests/factors/test_covariances.py
@@ -8,13 +8,13 @@
from kronfluence.analyzer import Analyzer, prepare_model
from kronfluence.arguments import FactorArguments
+from kronfluence.task import Task
from kronfluence.utils.constants import (
ACTIVATION_COVARIANCE_MATRIX_NAME,
COVARIANCE_FACTOR_NAMES,
GRADIENT_COVARIANCE_MATRIX_NAME,
NUM_COVARIANCE_PROCESSED,
)
-from kronfluence.task import Task
from kronfluence.utils.dataset import DataLoaderKwargs
from tests.utils import ATOL, RTOL, check_tensor_dict_equivalence, prepare_test
diff --git a/tests/factors/test_eigens.py b/tests/factors/test_eigens.py
index 39544e6..bb83049 100644
--- a/tests/factors/test_eigens.py
+++ b/tests/factors/test_eigens.py
@@ -8,6 +8,7 @@
from kronfluence.analyzer import Analyzer, prepare_model
from kronfluence.arguments import FactorArguments
+from kronfluence.task import Task
from kronfluence.utils.constants import (
ACTIVATION_EIGENVECTORS_NAME,
EIGENDECOMPOSITION_FACTOR_NAMES,
@@ -16,7 +17,6 @@
LAMBDA_MATRIX_NAME,
NUM_LAMBDA_PROCESSED,
)
-from kronfluence.task import Task
from kronfluence.utils.dataset import DataLoaderKwargs
from tests.utils import ATOL, RTOL, check_tensor_dict_equivalence, prepare_test
diff --git a/tests/gpu_tests/ddp_variation_test.py b/tests/gpu_tests/ddp_variation_test.py
index b2a6d3c..7d2dbb3 100644
--- a/tests/gpu_tests/ddp_variation_test.py
+++ b/tests/gpu_tests/ddp_variation_test.py
@@ -14,7 +14,7 @@
from kronfluence.arguments import FactorArguments, ScoreArguments
from kronfluence.task import Task
from tests.gpu_tests.ddp_test import OLD_FACTOR_NAME
-from tests.gpu_tests.pipeline import BATCH_DTYPE, construct_test_mlp, get_mnist_dataset
+from tests.gpu_tests.pipeline import BATCH_TYPE, construct_test_mlp, get_mnist_dataset
LOCAL_RANK = int(os.environ["LOCAL_RANK"])
WORLD_RANK = int(os.environ["RANK"])
@@ -27,7 +27,7 @@
class GpuVariationTask(Task):
def compute_train_loss(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
sample: bool = False,
) -> torch.Tensor:
@@ -45,7 +45,7 @@ def compute_train_loss(
def compute_measurement(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
) -> torch.Tensor:
inputs, labels = batch
diff --git a/tests/gpu_tests/pipeline.py b/tests/gpu_tests/pipeline.py
index b4b991e..117ec52 100644
--- a/tests/gpu_tests/pipeline.py
+++ b/tests/gpu_tests/pipeline.py
@@ -10,13 +10,13 @@
from kronfluence.task import Task
-BATCH_DTYPE = Tuple[torch.Tensor, torch.Tensor]
+BATCH_TYPE = Tuple[torch.Tensor, torch.Tensor]
class GpuTestTask(Task):
def compute_train_loss(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
sample: bool = False,
) -> torch.Tensor:
@@ -34,7 +34,7 @@ def compute_train_loss(
def compute_measurement(
self,
- batch: BATCH_DTYPE,
+ batch: BATCH_TYPE,
model: nn.Module,
) -> torch.Tensor:
inputs, labels = batch
diff --git a/tests/scores/test_pairwise_scores.py b/tests/scores/test_pairwise_scores.py
index 3e04016..19045a4 100644
--- a/tests/scores/test_pairwise_scores.py
+++ b/tests/scores/test_pairwise_scores.py
@@ -8,8 +8,8 @@
from kronfluence.analyzer import Analyzer, prepare_model
from kronfluence.arguments import FactorArguments, ScoreArguments
-from kronfluence.utils.constants import ALL_MODULE_NAME
from kronfluence.task import Task
+from kronfluence.utils.constants import ALL_MODULE_NAME
from kronfluence.utils.dataset import DataLoaderKwargs
from tests.utils import ATOL, RTOL, check_tensor_dict_equivalence, prepare_test
diff --git a/tests/scores/test_self_scores.py b/tests/scores/test_self_scores.py
index 4803706..e4e40fa 100644
--- a/tests/scores/test_self_scores.py
+++ b/tests/scores/test_self_scores.py
@@ -8,8 +8,8 @@
from kronfluence.analyzer import Analyzer, prepare_model
from kronfluence.arguments import FactorArguments, ScoreArguments
-from kronfluence.utils.constants import ALL_MODULE_NAME
from kronfluence.task import Task
+from kronfluence.utils.constants import ALL_MODULE_NAME
from kronfluence.utils.dataset import DataLoaderKwargs
from tests.utils import ATOL, RTOL, check_tensor_dict_equivalence, prepare_test
diff --git a/tests/test_per_sample_gradients.py b/tests/test_per_sample_gradients.py
index 18c8cd8..b3634ec 100644
--- a/tests/test_per_sample_gradients.py
+++ b/tests/test_per_sample_gradients.py
@@ -13,13 +13,10 @@
from kronfluence.analyzer import Analyzer, prepare_model
from kronfluence.arguments import FactorArguments
-from kronfluence.utils.constants import (
- LAMBDA_MATRIX_NAME,
- PRECONDITIONED_GRADIENT_NAME,
-)
from kronfluence.module.tracked_module import ModuleMode, TrackedModule
from kronfluence.module.utils import set_mode, update_factor_args
from kronfluence.task import Task
+from kronfluence.utils.constants import LAMBDA_MATRIX_NAME, PRECONDITIONED_GRADIENT_NAME
from kronfluence.utils.dataset import DataLoaderKwargs
from tests.utils import (
ATOL,
@@ -98,6 +95,7 @@ def for_loop_per_sample_gradient(
"conv",
"conv_bn",
"bert",
+ "gpt",
],
)
@pytest.mark.parametrize("use_measurement", [True, False])
@@ -180,7 +178,11 @@ def test_for_loop_per_sample_gradient_equivalence(
task=task,
use_measurement=use_measurement,
)
+
for i in range(num_batches):
+ if "lm_head" in for_loop_per_sample_gradients[i]:
+ del for_loop_per_sample_gradients[i]["lm_head"]
+
assert check_tensor_dict_equivalence(
per_sample_gradients[i],
for_loop_per_sample_gradients[i],
@@ -195,6 +197,7 @@ def test_for_loop_per_sample_gradient_equivalence(
"mlp",
"repeated_mlp",
"conv",
+ "gpt",
],
)
@pytest.mark.parametrize("train_size", [32])
@@ -274,9 +277,8 @@ def test_lambda_equivalence(
)
-@pytest.mark.parametrize("seed", [0])
def test_precondition_gradient(
- seed: int,
+ seed: int = 0,
) -> None:
input_dim = 128
output_dim = 256
@@ -329,9 +331,8 @@ def test_precondition_gradient(
assert torch.allclose(raw_results, results, atol=1e-5, rtol=1e-3)
-@pytest.mark.parametrize("seed", [0])
def test_query_gradient_svd(
- seed: int,
+ seed: int = 0,
) -> None:
input_dim = 2048
output_dim = 1024
@@ -391,7 +392,6 @@ def test_query_gradient_svd(
assert torch.allclose(score, lr_score_reconst_matmul)
# These should be able to avoid explicit reconstruction.
-
# This should be used when input_dim > output_dim.
intermediate = opt_einsum.contract("qki,toi->qtko", right_mat, new_gradient)
final = opt_einsum.contract("qtko,qok->qt", intermediate, left_mat)
@@ -477,9 +477,8 @@ def test_query_gradient_svd_reconst(
assert intermediate.numel() <= reconst_numel
-@pytest.mark.parametrize("seed", [0])
def test_compute_score_matmul(
- seed: int,
+ seed: int = 0,
) -> None:
input_dim = 1024
output_dim = 2048
@@ -498,29 +497,3 @@ def test_compute_score_matmul(
assert torch.allclose(score, unsqueeze_score)
path = opt_einsum.contract_path("t...,q...->tq", gradient, new_gradient)
print(path)
-
-
-@pytest.mark.parametrize("seed", [0])
-def test_compute_score_fast_matmul(
- seed: int,
-) -> None:
- input_dim = 512
- output_dim = 1024
- seq_len = 32
- batch_dim = 8
- query_batch_dim = 16
-
- set_seed(seed)
-
- input_activation = torch.rand(size=(batch_dim, seq_len, input_dim), dtype=torch.float64)
- output_gradient = torch.rand(size=(batch_dim, seq_len, output_dim), dtype=torch.float64)
- per_sample_gradient = opt_einsum.contract("b...i,b...o->bio", output_gradient, input_activation)
- gradient = torch.rand(size=(query_batch_dim, output_dim, input_dim), dtype=torch.float64)
- score = opt_einsum.contract("toi,qoi->tq", per_sample_gradient, gradient)
- print(score)
-
- all_score = opt_einsum.contract("tco,tci,qoi->tq", output_gradient, input_activation, gradient)
- assert torch.allclose(score, all_score)
-
- path = opt_einsum.contract_path("tco,tci,qoi->tq", output_gradient, input_activation, gradient, optimize="optimal")
- print(path)
diff --git a/tests/test_regression.py b/tests/test_regression.py
new file mode 100644
index 0000000..bc9aaea
--- /dev/null
+++ b/tests/test_regression.py
@@ -0,0 +1,146 @@
+# pylint: skip-file
+
+import torch
+
+from kronfluence.analyzer import Analyzer, prepare_model
+from kronfluence.arguments import FactorArguments
+from kronfluence.utils.dataset import DataLoaderKwargs
+from tests.utils import prepare_test
+
+
+def test_mlp_regression(
+ test_name: str = "mlp",
+ strategy: str = "ekfac",
+ seed: int = 0,
+ train_size: int = 32,
+ query_size: int = 16,
+) -> None:
+ model, train_dataset, query_dataset, data_collator, task = prepare_test(
+ test_name=test_name,
+ train_size=train_size,
+ query_size=query_size,
+ seed=seed,
+ )
+ assert round(list(model.named_parameters())[0][1].sum().item(), 2) == -2.45
+
+ model = prepare_model(model=model, task=task)
+ analyzer = Analyzer(
+ analysis_name=f"pytest_regression_{test_name}",
+ model=model,
+ task=task,
+ disable_model_save=True,
+ cpu=True,
+ )
+ kwargs = DataLoaderKwargs(collate_fn=data_collator)
+ factor_args = FactorArguments(strategy=strategy, use_empirical_fisher=True)
+ analyzer.fit_covariance_matrices(
+ factors_name=f"pytest_{test_name}",
+ dataset=train_dataset,
+ per_device_batch_size=1,
+ dataloader_kwargs=kwargs,
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ covariance_matrices = analyzer.load_covariance_matrices(f"pytest_{test_name}")
+ assert round(torch.sum(covariance_matrices["activation_covariance"]["0"] / train_size).item(), 2) == 7.81
+
+ analyzer.perform_eigendecomposition(
+ factors_name=f"pytest_{test_name}",
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ eigen_factors = analyzer.load_eigendecomposition(f"pytest_{test_name}")
+ assert round(eigen_factors["activation_eigenvectors"]["0"].sum().item(), 2) == 2.64
+
+ analyzer.fit_lambda_matrices(
+ factors_name=f"pytest_{test_name}",
+ dataset=train_dataset,
+ per_device_batch_size=1,
+ dataloader_kwargs=kwargs,
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ lambda_matrices = analyzer.load_lambda_matrices(f"pytest_{test_name}")
+ assert round((lambda_matrices["lambda_matrix"]["0"] / train_size).sum().item(), 2) == 15.14
+
+ analyzer.compute_pairwise_scores(
+ scores_name="pairwise",
+ factors_name=f"pytest_{test_name}",
+ query_dataset=query_dataset,
+ per_device_query_batch_size=1,
+ train_dataset=train_dataset,
+ per_device_train_batch_size=1,
+ dataloader_kwargs=kwargs,
+ overwrite_output_dir=True,
+ )
+ scores = analyzer.load_pairwise_scores("pairwise")
+ assert round(scores["all_modules"].sum().item(), 2) == 145.53
+
+
+def test_conv_regression(
+ test_name: str = "conv",
+ strategy: str = "ekfac",
+ seed: int = 0,
+ train_size: int = 32,
+ query_size: int = 16,
+) -> None:
+ model, train_dataset, query_dataset, data_collator, task = prepare_test(
+ test_name=test_name,
+ train_size=train_size,
+ query_size=query_size,
+ seed=seed,
+ )
+ assert round(list(model.named_parameters())[0][1].sum().item(), 2) == -0.75
+
+ model = prepare_model(model=model, task=task)
+ analyzer = Analyzer(
+ analysis_name=f"pytest_regression_{test_name}",
+ model=model,
+ task=task,
+ disable_model_save=True,
+ cpu=True,
+ )
+ kwargs = DataLoaderKwargs(collate_fn=data_collator)
+ factor_args = FactorArguments(strategy=strategy, use_empirical_fisher=True)
+ analyzer.fit_covariance_matrices(
+ factors_name=f"pytest_{test_name}",
+ dataset=train_dataset,
+ per_device_batch_size=1,
+ dataloader_kwargs=kwargs,
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ covariance_matrices = analyzer.load_covariance_matrices(f"pytest_{test_name}")
+ assert round(torch.sum(covariance_matrices["activation_covariance"]["0"] / train_size).item(), 2) == 42299.42
+
+ analyzer.perform_eigendecomposition(
+ factors_name=f"pytest_{test_name}",
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ eigen_factors = analyzer.load_eigendecomposition(f"pytest_{test_name}")
+ assert round(eigen_factors["activation_eigenvectors"]["0"].sum().item(), 2) == 4.34
+
+ analyzer.fit_lambda_matrices(
+ factors_name=f"pytest_{test_name}",
+ dataset=train_dataset,
+ per_device_batch_size=1,
+ dataloader_kwargs=kwargs,
+ factor_args=factor_args,
+ overwrite_output_dir=True,
+ )
+ lambda_matrices = analyzer.load_lambda_matrices(f"pytest_{test_name}")
+ assert round((lambda_matrices["lambda_matrix"]["0"] / train_size).sum().item(), 2) == 0.18
+
+ analyzer.compute_pairwise_scores(
+ scores_name="pairwise",
+ factors_name=f"pytest_{test_name}",
+ query_dataset=query_dataset,
+ per_device_query_batch_size=1,
+ train_dataset=train_dataset,
+ per_device_train_batch_size=1,
+ dataloader_kwargs=kwargs,
+ overwrite_output_dir=True,
+ )
+ scores = analyzer.load_pairwise_scores("pairwise")
+ assert round(scores["all_modules"].sum().item(), 2) == 6268.84
diff --git a/tests/testable_tasks/classification.py b/tests/testable_tasks/classification.py
index a8d18c2..ad80a09 100644
--- a/tests/testable_tasks/classification.py
+++ b/tests/testable_tasks/classification.py
@@ -6,10 +6,11 @@
import torch.nn.functional as F
import torchvision
from accelerate.utils import set_seed
-from kronfluence.task import Task
from torch import nn
from torch.utils import data
+from kronfluence.task import Task
+
BATCH_TYPE = Tuple[torch.Tensor, torch.Tensor]
diff --git a/tests/testable_tasks/language_modeling.py b/tests/testable_tasks/language_modeling.py
index 39cfd26..72d2f5a 100644
--- a/tests/testable_tasks/language_modeling.py
+++ b/tests/testable_tasks/language_modeling.py
@@ -6,11 +6,12 @@
import torch
import torch.nn.functional as F
from datasets import load_dataset
-from kronfluence.task import Task
from torch import nn
from torch.utils import data
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer, Conv1D
+from kronfluence.task import Task
+
BATCH_TYPE = Dict[str, torch.Tensor]
@@ -130,11 +131,11 @@ def compute_measurement(
def tracked_modules(self) -> List[str]:
total_modules = []
- for i in range(4):
+ for i in range(5):
total_modules.append(f"transformer.h.{i}.attn.c_attn")
total_modules.append(f"transformer.h.{i}.attn.c_proj")
- for i in range(4):
+ for i in range(5):
total_modules.append(f"transformer.h.{i}.mlp.c_fc")
total_modules.append(f"transformer.h.{i}.mlp.c_proj")
diff --git a/tests/testable_tasks/text_classification.py b/tests/testable_tasks/text_classification.py
index 893c546..30fe9c3 100644
--- a/tests/testable_tasks/text_classification.py
+++ b/tests/testable_tasks/text_classification.py
@@ -5,11 +5,12 @@
import torch
import torch.nn.functional as F
from datasets import load_dataset
-from kronfluence.task import Task
from torch import nn
from torch.utils import data
from transformers import AutoConfig, AutoModelForSequenceClassification, AutoTokenizer
+from kronfluence.task import Task
+
BATCH_TYPE = Dict[str, torch.Tensor]
diff --git a/tests/utils.py b/tests/utils.py
index 2079921..7ecc0e0 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -108,6 +108,9 @@ def reshape_parameter_gradient_to_module_matrix(
remove_gradient: bool = True,
) -> torch.Tensor:
if isinstance(module, nn.Linear):
+ if module_name == "lm_head":
+ # Edge case for small GPT model.
+ return
gradient_matrix = gradient_dict[module_name + ".weight"]
if remove_gradient:
del gradient_dict[module_name + ".weight"]