From e460e446052c8bd1c324158ce50123cefff7f8ff Mon Sep 17 00:00:00 2001
From: pat-alt <altmeyerpat@gmail.com>
Date: Mon, 13 Feb 2023 10:05:45 +0100
Subject: [PATCH] work on proposal and extended abstract

---
 .../dev/proposal/execute-results/html.json    |   4 +-
 bib.bib                                       |  22 +++
 build/dev/proposal.html                       | 165 ++++++++++++------
 build/dev/www/mnist_9to4_latent.png           | Bin 0 -> 13939 bytes
 build/dev/www/you_may_not_like_it.png         | Bin 0 -> 17193 bytes
 dev/proposal.qmd                              | 145 ++++++++++++---
 dev/www/you_may_not_like_it.png               | Bin 0 -> 17193 bytes
 7 files changed, 256 insertions(+), 80 deletions(-)
 create mode 100644 build/dev/www/mnist_9to4_latent.png
 create mode 100644 build/dev/www/you_may_not_like_it.png
 create mode 100644 dev/www/you_may_not_like_it.png

diff --git a/_freeze/dev/proposal/execute-results/html.json b/_freeze/dev/proposal/execute-results/html.json
index 7363fbbe..1d98ce87 100644
--- a/_freeze/dev/proposal/execute-results/html.json
+++ b/_freeze/dev/proposal/execute-results/html.json
@@ -1,7 +1,7 @@
 {
-  "hash": "a2ac106a6b675eafee9a47455706943d",
+  "hash": "d7b4f9bf7f4bff7ce610fc8be4dcfb8b",
   "result": {
-    "markdown": "---\ntitle: Conformal Counterfactual Explanations\nsubtitle: Research Proposal\nabstract: |\n    We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.\n---\n\n\n\n## Motivation\n\nCounterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse. \n\n### From Adversarial Examples to Counterfactual Explanations\n\nMost state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\\in\\mathcal{X}$ into a black-box model $f: \\mathcal{X} \\mapsto \\mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\\in\\mathcal{Y}$. Formally, this boils down to defining some loss function $\\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example.\n\n> You may not like it, but this is what counterfactuals look like\n\n\n\n\n\nThe crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be \"plausible\" or \"realistic\". To fulfill this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. This ensures that the generated counterfactuals comply with the (learned) data-generating process (DGB). Similarly, @poyiadzi2020face use density ...\n\n- Show DiCE for weak MLP\n- Show Latent for same weak MLP\n- Latent can be manipulated: \n    - train biased model\n    - train VAE with biased variable removed/attacked (use Boston housing dataset)\n    - hypothesis: will generate bias-free explanations\n\n::: {#prp-surrogate}\n\n## Avoid Surrogates\n\nSince we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.\n\n:::\n\n## Introduction to Conformal Prediction\n\n- distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification\n\n### Post-hoc\n\n- Take any fitted model and turn it into a conformal model using calibration data.\n\n### Intrinsic --- Conformal Training [MAYBE]\n\n- Model explicitly trained for conformal prediction.\n\n## Conformal Counterfactuals\n\n- Realistic counterfactuals by minimizing predictive uncertainty [@schut2021generating].\n- Problem: restricted to Bayesian models.\n- Solution: post-hoc predictive uncertainty quantification. \n- Conformal prediction is instance-based. So is CE. \n- Does the coverage guarantee carry over to counterfactuals?\n\n### Research Questions\n\n- Is CP alone enough to ensure realistic counterfactuals?\n- Do counterfactuals improve further as the models get better?\n- Do counterfactuals get more realistic as coverage\n- What happens as we vary coverage and setsize?\n- What happens as we improve the model robustness?\n- What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)?\n\n## Experiments\n\n- Maybe: conformalised Laplace\n- Benchmarking:\n    - add PROBE into the mix\n    - compare travel costs to domain shits.\n\n## References\n\n",
+    "markdown": "---\ntitle: High-Fidelity Counterfactual Explanations through Conformal Prediction\nsubtitle: Research Proposal\nabstract: |\n    We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.\n---\n\n\n\n## Motivation\n\nCounterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse. \n\n### Counterfactual Explanations or Adversarial Examples?\n\nMost state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\\in\\mathcal{X}$ into a black-box model $f: \\mathcal{X} \\mapsto \\mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\\in\\mathcal{Y}$. Formally, this boils down to defining some loss function $\\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In @fig-adv, for example, generic counterfactual search as in @wachter2017counterfactual has been applied to MNIST data.\n\n\n\n\n\n![You may not like it, but this is what stripped-down counterfactuals look like. Here we have used @wachter2017counterfactual to generate multiple counterfactuals for turning an 8 (eight) into a 3 (three).](www/you_may_not_like_it.png){#fig-adv}\n\nThe crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be \"plausible\", \"realistic\" or \"feasible\". To fulfil this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). \n\n::: {#def-plausible}\n\n## Plausible Counterfactuals\n\nFormally, if $x \\sim \\mathcal{X}$ and for the corresponding counterfactual we have $x^{\\prime}\\sim\\mathcal{X}^{\\prime}$, then for $x^{\\prime}$ to be considered a plausible counterfactual, we need: $\\mathcal{X} \\approxeq \\mathcal{X}^{\\prime}$.\n\n:::\n\nIn the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn $\\mathcal{X}$, for example, has very serious implications for the generated counterfactuals. @fig-latent compares the results of applying REVISE [@joshi2019realistic] to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in $\\mathcal{X}$ and hence the counterfactual search in the learned latent space is doomed. \n\n![Counterfactual explanations for MNIST using a Latent Space generator: turning a nine (9) into a four (4).](www/mnist_9to4_latent.png){#fig-latent}\n\n> Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g. Boston housing).\n\n- Latent can be manipulated: \n    - train biased model\n    - train VAE with biased variable removed/attacked (use Boston housing dataset)\n    - hypothesis: will generate bias-free explanations\n\n### From Plausible to High-Fidelity Counterfactuals {#sec-fidelity}\n\nIn light of the findings, we propose to generally avoid using surrogate models to learn $\\mathcal{X}$ in the context of Counterfactual Explanations.\n\n::: {#prp-surrogate}\n\n## Avoid Surrogates\n\nSince we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.\n\n:::\n\nIn cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model [@molnar2020interpretable]. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model. \n\nIn the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual $x^{\\prime}$ is considered valid if and only if $f(x^{\\prime})=t$, where $t$ denote some target outcome. \n\nDoes fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual $x^{\\prime}$ complies with the class-conditional distribution $\\mathcal{X}_{\\theta} = p_{\\theta}(X|y)$ where $\\theta$ denote the black-box model parameters. \n\n::: {#def-fidele}\n\n## High-Fidelity Counterfactuals\n\nLet $\\mathcal{X}_{\\theta}|y = p_{\\theta}(X|y)$ denote the class-conditional distribution of $X$ defined by $\\theta$. Then for $x^{\\prime}$ to be considered a high-fidelity counterfactual, we need: $\\mathcal{X}_{\\theta}|t \\approxeq \\mathcal{X}^{\\prime}$ where $t$ denotes the target outcome.\n\n:::\n\nIn order to assess the fidelity of counterfactuals, we propose the following two-step procedure:\n\n1) Generate samples $X_{\\theta}|y$ and $X^{\\prime}$ from $\\mathcal{X}_{\\theta}|t$ and $\\mathcal{X}^{\\prime}$, respectively.\n2) Compute the Maximum Mean Discrepancy (MMD) between $X_{\\theta}|y$ and $X^{\\prime}$. \n\nIf the computed value is different from zero, we can reject the null-hypothesis of fidelity.\n\n> Two challenges here: 1) implementing the sampling procedure in @grathwohl2020your; 2) it is unclear if MMD is really the right way to measure this. \n\n## Conformal Counterfactual Explanations\n\nIn @sec-fidelity, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models. \n\n### Minimizing Predictive Uncertainty\n\n@schut2021generating demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, @antoran2020getting ...\n\n- Problem: restricted to Bayesian models.\n- Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction. \n\n### Background on Conformal Prediction\n\n- Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification.\n- Conformal prediction is instance-based. So is CE. \n- Take any fitted model and turn it into a conformal model using calibration data.\n- Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway. \n\n> Does the coverage guarantee carry over to counterfactuals?\n\n### Generating Conformal Counterfactuals\n\nWhile Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, @stutz2022learning introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search ...\n\n> Challenge: still need to implement these loss functions. \n\n## Experiments\n\n### Research Questions\n\n- Is CP alone enough to ensure realistic counterfactuals?\n- Do counterfactuals improve further as the models get better?\n- Do counterfactuals get more realistic as coverage\n- What happens as we vary coverage and setsize?\n- What happens as we improve the model robustness?\n- What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)?\n- What happens if we combine with DiCE, ClaPROAR, Gravitational?\n- What about CE robustness to endogenous shifts [@altmeyer2023endogenous]?\n\n- Benchmarking:\n    - add PROBE [@pawelczyk2022probabilistically] into the mix.\n    - compare travel costs to domain shits.\n\n> Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace? \n\n## References\n\n",
     "supporting": [
       "proposal_files/figure-html"
     ],
diff --git a/bib.bib b/bib.bib
index 1b1dca6b..6aab437e 100644
--- a/bib.bib
+++ b/bib.bib
@@ -2403,4 +2403,26 @@
   shorttitle   = {Probabilistically {Robust} {Recourse}},
 }
 
+@InProceedings{stutz2022learning,
+  author   = {Stutz, David and Dvijotham, Krishnamurthy Dj and Cemgil, Ali Taylan and Doucet, Arnaud},
+  date     = {2022-05},
+  title    = {Learning {Optimal} {Conformal} {Classifiers}},
+  language = {en},
+  url      = {https://openreview.net/forum?id=t8O-4LKFVx},
+  urldate  = {2023-02-13},
+  abstract = {Modern deep learning based classifiers show very high accuracy on test data but this does not provide sufficient guarantees for safe deployment, especially in high-stake AI applications such as medical diagnosis. Usually, predictions are obtained without a reliable uncertainty estimate or a formal guarantee. Conformal prediction (CP) addresses these issues by using the classifier's predictions, e.g., its probability estimates, to predict confidence sets containing the true class with a user-specified probability. However, using CP as a separate processing step after training prevents the underlying model from adapting to the prediction of confidence sets. Thus, this paper explores strategies to differentiate through CP during training with the goal of training model with the conformal wrapper end-to-end. In our approach, conformal training (ConfTr), we specifically "simulate" conformalization on mini-batches during training. Compared to standard training, ConfTr reduces the average confidence set size (inefficiency) of state-of-the-art CP methods applied after training. Moreover, it allows to "shape" the confidence sets predicted at test time, which is difficult for standard CP. On experiments with several datasets, we show ConfTr can influence how inefficiency is distributed across classes, or guide the composition of confidence sets in terms of the included classes, while retaining the guarantees offered by CP.},
+  file     = {:stutz2022learning - Learning Optimal Conformal Classifiers.pdf:PDF},
+}
+
+@InProceedings{grathwohl2020your,
+  author   = {Grathwohl, Will and Wang, Kuan-Chieh and Jacobsen, Joern-Henrik and Duvenaud, David and Norouzi, Mohammad and Swersky, Kevin},
+  date     = {2020-03},
+  title    = {Your classifier is secretly an energy based model and you should treat it like one},
+  language = {en},
+  url      = {https://openreview.net/forum?id=Hkxzx0NtDB},
+  urldate  = {2023-02-13},
+  abstract = {We propose to reinterpret a standard discriminative classifier of p(y{\textbar}x) as an energy based model for the joint distribution p(x, y). In this setting, the standard class probabilities can be easily computed as well as unnormalized values of p(x) and p(x{\textbar}y). Within this framework, standard discriminative architectures may be used and the model can also be trained on unlabeled data. We demonstrate that energy based training of the joint distribution improves calibration, robustness, and out-of-distribution detection while also enabling our models to generate samples rivaling the quality of recent GAN approaches. We improve upon recently proposed techniques for scaling up the training of energy based models and present an approach which adds little overhead compared to standard classification training. Our approach is the first to achieve performance rivaling the state-of-the-art in both generative and discriminative learning within one hybrid model.},
+  file     = {:grathwohl2020your - Your Classifier Is Secretly an Energy Based Model and You Should Treat It like One.pdf:PDF},
+}
+
 @Comment{jabref-meta: databaseType:biblatex;}
diff --git a/build/dev/proposal.html b/build/dev/proposal.html
index eea1c51f..afcdf814 100644
--- a/build/dev/proposal.html
+++ b/build/dev/proposal.html
@@ -7,7 +7,7 @@
 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
 
 
-<title>Conformal Counterfactual Explanations</title>
+<title>High-Fidelity Counterfactual Explanations through Conformal Prediction</title>
 <style>
 code{white-space: pre-wrap;}
 span.smallcaps{font-variant: small-caps;}
@@ -67,18 +67,19 @@ div.csl-indent {
   <ul>
   <li><a href="#motivation" id="toc-motivation" class="nav-link active" data-scroll-target="#motivation">Motivation</a>
   <ul class="collapse">
-  <li><a href="#from-adversarial-examples-to-counterfactual-explanations" id="toc-from-adversarial-examples-to-counterfactual-explanations" class="nav-link" data-scroll-target="#from-adversarial-examples-to-counterfactual-explanations">From Adversarial Examples to Counterfactual Explanations</a></li>
+  <li><a href="#counterfactual-explanations-or-adversarial-examples" id="toc-counterfactual-explanations-or-adversarial-examples" class="nav-link" data-scroll-target="#counterfactual-explanations-or-adversarial-examples">Counterfactual Explanations or Adversarial Examples?</a></li>
+  <li><a href="#sec-fidelity" id="toc-sec-fidelity" class="nav-link" data-scroll-target="#sec-fidelity">From Plausible to High-Fidelity Counterfactuals</a></li>
   </ul></li>
-  <li><a href="#introduction-to-conformal-prediction" id="toc-introduction-to-conformal-prediction" class="nav-link" data-scroll-target="#introduction-to-conformal-prediction">Introduction to Conformal Prediction</a>
+  <li><a href="#conformal-counterfactual-explanations" id="toc-conformal-counterfactual-explanations" class="nav-link" data-scroll-target="#conformal-counterfactual-explanations">Conformal Counterfactual Explanations</a>
   <ul class="collapse">
-  <li><a href="#post-hoc" id="toc-post-hoc" class="nav-link" data-scroll-target="#post-hoc">Post-hoc</a></li>
-  <li><a href="#intrinsic-conformal-training-maybe" id="toc-intrinsic-conformal-training-maybe" class="nav-link" data-scroll-target="#intrinsic-conformal-training-maybe">Intrinsic — Conformal Training [MAYBE]</a></li>
+  <li><a href="#minimizing-predictive-uncertainty" id="toc-minimizing-predictive-uncertainty" class="nav-link" data-scroll-target="#minimizing-predictive-uncertainty">Minimizing Predictive Uncertainty</a></li>
+  <li><a href="#background-on-conformal-prediction" id="toc-background-on-conformal-prediction" class="nav-link" data-scroll-target="#background-on-conformal-prediction">Background on Conformal Prediction</a></li>
+  <li><a href="#generating-conformal-counterfactuals" id="toc-generating-conformal-counterfactuals" class="nav-link" data-scroll-target="#generating-conformal-counterfactuals">Generating Conformal Counterfactuals</a></li>
   </ul></li>
-  <li><a href="#conformal-counterfactuals" id="toc-conformal-counterfactuals" class="nav-link" data-scroll-target="#conformal-counterfactuals">Conformal Counterfactuals</a>
+  <li><a href="#experiments" id="toc-experiments" class="nav-link" data-scroll-target="#experiments">Experiments</a>
   <ul class="collapse">
   <li><a href="#research-questions" id="toc-research-questions" class="nav-link" data-scroll-target="#research-questions">Research Questions</a></li>
   </ul></li>
-  <li><a href="#experiments" id="toc-experiments" class="nav-link" data-scroll-target="#experiments">Experiments</a></li>
   <li><a href="#references" id="toc-references" class="nav-link" data-scroll-target="#references">References</a></li>
   </ul>
 </nav>
@@ -87,7 +88,7 @@ div.csl-indent {
 
 <header id="title-block-header" class="quarto-title-block default">
 <div class="quarto-title">
-<h1 class="title">Conformal Counterfactual Explanations</h1>
+<h1 class="title">High-Fidelity Counterfactual Explanations through Conformal Prediction</h1>
 <p class="subtitle lead">Research Proposal</p>
 </div>
 
@@ -103,7 +104,7 @@ div.csl-indent {
 <div>
   <div class="abstract">
     <div class="abstract-title">Abstract</div>
-    <p>We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.</p>
+    <p>We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.</p>
   </div>
 </div>
 
@@ -111,17 +112,31 @@ div.csl-indent {
 
 <section id="motivation" class="level2">
 <h2 class="anchored" data-anchor-id="motivation">Motivation</h2>
-<p>Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse.</p>
-<section id="from-adversarial-examples-to-counterfactual-explanations" class="level3">
-<h3 class="anchored" data-anchor-id="from-adversarial-examples-to-counterfactual-explanations">From Adversarial Examples to Counterfactual Explanations</h3>
-<p>Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs <span class="math inline">\(x\in\mathcal{X}\)</span> into a black-box model <span class="math inline">\(f: \mathcal{X} \mapsto \mathcal{Y}\)</span> in order to change the model output <span class="math inline">\(f(x)\)</span> to some pre-specified target value <span class="math inline">\(t\in\mathcal{Y}\)</span>. Formally, this boils down to defining some loss function <span class="math inline">\(\ell(f(x),t)\)</span> and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example.</p>
+<p>Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse.</p>
+<section id="counterfactual-explanations-or-adversarial-examples" class="level3">
+<h3 class="anchored" data-anchor-id="counterfactual-explanations-or-adversarial-examples">Counterfactual Explanations or Adversarial Examples?</h3>
+<p>Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs <span class="math inline">\(x\in\mathcal{X}\)</span> into a black-box model <span class="math inline">\(f: \mathcal{X} \mapsto \mathcal{Y}\)</span> in order to change the model output <span class="math inline">\(f(x)\)</span> to some pre-specified target value <span class="math inline">\(t\in\mathcal{Y}\)</span>. Formally, this boils down to defining some loss function <span class="math inline">\(\ell(f(x),t)\)</span> and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In <a href="#fig-adv">Figure&nbsp;1</a>, for example, generic counterfactual search as in <span class="citation" data-cites="wachter2017counterfactual">Wachter, Mittelstadt, and Russell (<a href="#ref-wachter2017counterfactual" role="doc-biblioref">2017</a>)</span> has been applied to MNIST data.</p>
+<div id="fig-adv" class="quarto-figure quarto-figure-center anchored">
+<figure class="figure">
+<p><img src="www/you_may_not_like_it.png" class="img-fluid figure-img"></p>
+<p></p><figcaption class="figure-caption">Figure&nbsp;1: You may not like it, but this is what stripped-down counterfactuals look like. Here we have used <span class="citation" data-cites="wachter2017counterfactual">Wachter, Mittelstadt, and Russell (<a href="#ref-wachter2017counterfactual" role="doc-biblioref">2017</a>)</span> to generate multiple counterfactuals for turning an 8 (eight) into a 3 (three).</figcaption><p></p>
+</figure>
+</div>
+<p>The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be “plausible”, “realistic” or “feasible”. To fulfil this latter goal, researchers have come up with a myriad of ways. <span class="citation" data-cites="joshi2019realistic">Joshi et al. (<a href="#ref-joshi2019realistic" role="doc-biblioref">2019</a>)</span> were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, <span class="citation" data-cites="poyiadzi2020face">Poyiadzi et al. (<a href="#ref-poyiadzi2020face" role="doc-biblioref">2020</a>)</span> use density … Finally, <span class="citation" data-cites="karimi2021algorithmic">Karimi, Schölkopf, and Valera (<a href="#ref-karimi2021algorithmic" role="doc-biblioref">2021</a>)</span> argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include … All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB).</p>
+<div id="def-plausible" class="theorem definition">
+<p><span class="theorem-title"><strong>Definition 1 (Plausible Counterfactuals) </strong></span>Formally, if <span class="math inline">\(x \sim \mathcal{X}\)</span> and for the corresponding counterfactual we have <span class="math inline">\(x^{\prime}\sim\mathcal{X}^{\prime}\)</span>, then for <span class="math inline">\(x^{\prime}\)</span> to be considered a plausible counterfactual, we need: <span class="math inline">\(\mathcal{X} \approxeq \mathcal{X}^{\prime}\)</span>.</p>
+</div>
+<p>In the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn <span class="math inline">\(\mathcal{X}\)</span>, for example, has very serious implications for the generated counterfactuals. <a href="#fig-latent">Figure&nbsp;2</a> compares the results of applying REVISE <span class="citation" data-cites="joshi2019realistic">(<a href="#ref-joshi2019realistic" role="doc-biblioref">Joshi et al. 2019</a>)</span> to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in <span class="math inline">\(\mathcal{X}\)</span> and hence the counterfactual search in the learned latent space is doomed.</p>
+<div id="fig-latent" class="quarto-figure quarto-figure-center anchored">
+<figure class="figure">
+<p><img src="www/mnist_9to4_latent.png" class="img-fluid figure-img"></p>
+<p></p><figcaption class="figure-caption">Figure&nbsp;2: Counterfactual explanations for MNIST using a Latent Space generator: turning a nine (9) into a four (4).</figcaption><p></p>
+</figure>
+</div>
 <blockquote class="blockquote">
-<p>You may not like it, but this is what counterfactuals look like</p>
+<p>Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g.&nbsp;Boston housing).</p>
 </blockquote>
-<p>The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be “plausible” or “realistic”. To fulfill this latter goal, researchers have come up with a myriad of ways. <span class="citation" data-cites="joshi2019realistic">Joshi et al. (<a href="#ref-joshi2019realistic" role="doc-biblioref">2019</a>)</span> were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. This ensures that the generated counterfactuals comply with the (learned) data-generating process (DGB). Similarly, <span class="citation" data-cites="poyiadzi2020face">Poyiadzi et al. (<a href="#ref-poyiadzi2020face" role="doc-biblioref">2020</a>)</span> use density …</p>
 <ul>
-<li>Show DiCE for weak MLP</li>
-<li>Show Latent for same weak MLP</li>
 <li>Latent can be manipulated:
 <ul>
 <li>train biased model</li>
@@ -129,60 +144,84 @@ div.csl-indent {
 <li>hypothesis: will generate bias-free explanations</li>
 </ul></li>
 </ul>
+</section>
+<section id="sec-fidelity" class="level3">
+<h3 class="anchored" data-anchor-id="sec-fidelity">From Plausible to High-Fidelity Counterfactuals</h3>
+<p>In light of the findings, we propose to generally avoid using surrogate models to learn <span class="math inline">\(\mathcal{X}\)</span> in the context of Counterfactual Explanations.</p>
 <div id="prp-surrogate" class="theorem proposition">
 <p><span class="theorem-title"><strong>Proposition 1 (Avoid Surrogates) </strong></span>Since we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.</p>
 </div>
+<p>In cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model <span class="citation" data-cites="molnar2020interpretable">(<a href="#ref-molnar2020interpretable" role="doc-biblioref">Molnar 2020</a>)</span>. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model.</p>
+<p>In the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual <span class="math inline">\(x^{\prime}\)</span> is considered valid if and only if <span class="math inline">\(f(x^{\prime})=t\)</span>, where <span class="math inline">\(t\)</span> denote some target outcome.</p>
+<p>Does fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual <span class="math inline">\(x^{\prime}\)</span> complies with the class-conditional distribution <span class="math inline">\(\mathcal{X}_{\theta} = p_{\theta}(X|y)\)</span> where <span class="math inline">\(\theta\)</span> denote the black-box model parameters.</p>
+<div id="def-fidele" class="theorem definition">
+<p><span class="theorem-title"><strong>Definition 2 (High-Fidelity Counterfactuals) </strong></span>Let <span class="math inline">\(\mathcal{X}_{\theta}|y = p_{\theta}(X|y)\)</span> denote the class-conditional distribution of <span class="math inline">\(X\)</span> defined by <span class="math inline">\(\theta\)</span>. Then for <span class="math inline">\(x^{\prime}\)</span> to be considered a high-fidelity counterfactual, we need: <span class="math inline">\(\mathcal{X}_{\theta}|t \approxeq \mathcal{X}^{\prime}\)</span> where <span class="math inline">\(t\)</span> denotes the target outcome.</p>
+</div>
+<p>In order to assess the fidelity of counterfactuals, we propose the following two-step procedure:</p>
+<ol type="1">
+<li>Generate samples <span class="math inline">\(X_{\theta}|y\)</span> and <span class="math inline">\(X^{\prime}\)</span> from <span class="math inline">\(\mathcal{X}_{\theta}|t\)</span> and <span class="math inline">\(\mathcal{X}^{\prime}\)</span>, respectively.</li>
+<li>Compute the Maximum Mean Discrepancy (MMD) between <span class="math inline">\(X_{\theta}|y\)</span> and <span class="math inline">\(X^{\prime}\)</span>.</li>
+</ol>
+<p>If the computed value is different from zero, we can reject the null-hypothesis of fidelity.</p>
+<blockquote class="blockquote">
+<p>Two challenges here: 1) implementing the sampling procedure in <span class="citation" data-cites="grathwohl2020your">Grathwohl et al. (<a href="#ref-grathwohl2020your" role="doc-biblioref">2020</a>)</span>; 2) it is unclear if MMD is really the right way to measure this.</p>
+</blockquote>
 </section>
 </section>
-<section id="introduction-to-conformal-prediction" class="level2">
-<h2 class="anchored" data-anchor-id="introduction-to-conformal-prediction">Introduction to Conformal Prediction</h2>
-<ul>
-<li>distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification</li>
-</ul>
-<section id="post-hoc" class="level3">
-<h3 class="anchored" data-anchor-id="post-hoc">Post-hoc</h3>
-<ul>
-<li>Take any fitted model and turn it into a conformal model using calibration data.</li>
-</ul>
-</section>
-<section id="intrinsic-conformal-training-maybe" class="level3">
-<h3 class="anchored" data-anchor-id="intrinsic-conformal-training-maybe">Intrinsic — Conformal Training [MAYBE]</h3>
+<section id="conformal-counterfactual-explanations" class="level2">
+<h2 class="anchored" data-anchor-id="conformal-counterfactual-explanations">Conformal Counterfactual Explanations</h2>
+<p>In <a href="#sec-fidelity">Section&nbsp;1.2</a>, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models.</p>
+<section id="minimizing-predictive-uncertainty" class="level3">
+<h3 class="anchored" data-anchor-id="minimizing-predictive-uncertainty">Minimizing Predictive Uncertainty</h3>
+<p><span class="citation" data-cites="schut2021generating">Schut et al. (<a href="#ref-schut2021generating" role="doc-biblioref">2021</a>)</span> demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, <span class="citation" data-cites="antoran2020getting">Antorán et al. (<a href="#ref-antoran2020getting" role="doc-biblioref">2020</a>)</span> …</p>
 <ul>
-<li>Model explicitly trained for conformal prediction.</li>
+<li>Problem: restricted to Bayesian models.</li>
+<li>Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction.</li>
 </ul>
 </section>
-</section>
-<section id="conformal-counterfactuals" class="level2">
-<h2 class="anchored" data-anchor-id="conformal-counterfactuals">Conformal Counterfactuals</h2>
+<section id="background-on-conformal-prediction" class="level3">
+<h3 class="anchored" data-anchor-id="background-on-conformal-prediction">Background on Conformal Prediction</h3>
 <ul>
-<li>Realistic counterfactuals by minimizing predictive uncertainty <span class="citation" data-cites="schut2021generating">(<a href="#ref-schut2021generating" role="doc-biblioref">Schut et al. 2021</a>)</span>.</li>
-<li>Problem: restricted to Bayesian models.</li>
-<li>Solution: post-hoc predictive uncertainty quantification.</li>
+<li>Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification.</li>
 <li>Conformal prediction is instance-based. So is CE.</li>
-<li>Does the coverage guarantee carry over to counterfactuals?</li>
-</ul>
-<section id="research-questions" class="level3">
-<h3 class="anchored" data-anchor-id="research-questions">Research Questions</h3>
-<ul>
-<li>Is CP alone enough to ensure realistic counterfactuals?</li>
-<li>Do counterfactuals improve further as the models get better?</li>
-<li>Do counterfactuals get more realistic as coverage</li>
-<li>What happens as we vary coverage and setsize?</li>
-<li>What happens as we improve the model robustness?</li>
-<li>What happens as we improve the model’s ability to incorporate predictive uncertainty (deep ensemble, laplace)?</li>
+<li>Take any fitted model and turn it into a conformal model using calibration data.</li>
+<li>Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway.</li>
 </ul>
+<blockquote class="blockquote">
+<p>Does the coverage guarantee carry over to counterfactuals?</p>
+</blockquote>
+</section>
+<section id="generating-conformal-counterfactuals" class="level3">
+<h3 class="anchored" data-anchor-id="generating-conformal-counterfactuals">Generating Conformal Counterfactuals</h3>
+<p>While Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, <span class="citation" data-cites="stutz2022learning">Stutz et al. (<a href="#ref-stutz2022learning" role="doc-biblioref">2022</a>)</span> introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search …</p>
+<blockquote class="blockquote">
+<p>Challenge: still need to implement these loss functions.</p>
+</blockquote>
 </section>
 </section>
 <section id="experiments" class="level2">
 <h2 class="anchored" data-anchor-id="experiments">Experiments</h2>
+<section id="research-questions" class="level3">
+<h3 class="anchored" data-anchor-id="research-questions">Research Questions</h3>
 <ul>
-<li>Maybe: conformalised Laplace</li>
-<li>Benchmarking:
+<li><p>Is CP alone enough to ensure realistic counterfactuals?</p></li>
+<li><p>Do counterfactuals improve further as the models get better?</p></li>
+<li><p>Do counterfactuals get more realistic as coverage</p></li>
+<li><p>What happens as we vary coverage and setsize?</p></li>
+<li><p>What happens as we improve the model robustness?</p></li>
+<li><p>What happens as we improve the model’s ability to incorporate predictive uncertainty (deep ensemble, laplace)?</p></li>
+<li><p>What happens if we combine with DiCE, ClaPROAR, Gravitational?</p></li>
+<li><p>What about CE robustness to endogenous shifts <span class="citation" data-cites="altmeyer2023endogenous">(<a href="#ref-altmeyer2023endogenous" role="doc-biblioref">Altmeyer et al. 2023</a>)</span>?</p></li>
+<li><p>Benchmarking:</p>
 <ul>
-<li>add PROBE into the mix</li>
+<li>add PROBE <span class="citation" data-cites="pawelczyk2022probabilistically">(<a href="#ref-pawelczyk2022probabilistically" role="doc-biblioref">Pawelczyk et al. 2022</a>)</span> into the mix.</li>
 <li>compare travel costs to domain shits.</li>
 </ul></li>
 </ul>
+<blockquote class="blockquote">
+<p>Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace?</p>
+</blockquote>
+</section>
 </section>
 <section id="references" class="level2 unnumbered">
 
@@ -190,15 +229,39 @@ div.csl-indent {
 </section>
 
 <div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" role="doc-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
+<div id="ref-altmeyer2023endogenous" class="csl-entry" role="doc-biblioentry">
+Altmeyer, Patrick, Giovan Angela, Aleksander Buszydlik, Karol Dobiczek, Arie van Deursen, and Cynthia Liem. 2023. <span>“Endogenous <span>Macrodynamics</span> in <span>Algorithmic</span> <span>Recourse</span>.”</span> In <em>First <span>IEEE</span> <span>Conference</span> on <span>Secure</span> and <span>Trustworthy</span> <span>Machine</span> <span>Learning</span></em>.
+</div>
+<div id="ref-antoran2020getting" class="csl-entry" role="doc-biblioentry">
+Antorán, Javier, Umang Bhatt, Tameem Adel, Adrian Weller, and José Miguel Hernández-Lobato. 2020. <span>“Getting a Clue: <span>A</span> Method for Explaining Uncertainty Estimates.”</span> <a href="https://arxiv.org/abs/2006.06848">https://arxiv.org/abs/2006.06848</a>.
+</div>
+<div id="ref-grathwohl2020your" class="csl-entry" role="doc-biblioentry">
+Grathwohl, Will, Kuan-Chieh Wang, Joern-Henrik Jacobsen, David Duvenaud, Mohammad Norouzi, and Kevin Swersky. 2020. <span>“Your Classifier Is Secretly an Energy Based Model and You Should Treat It Like One.”</span> In. <a href="https://openreview.net/forum?id=Hkxzx0NtDB">https://openreview.net/forum?id=Hkxzx0NtDB</a>.
+</div>
 <div id="ref-joshi2019realistic" class="csl-entry" role="doc-biblioentry">
 Joshi, Shalmali, Oluwasanmi Koyejo, Warut Vijitbenjaronk, Been Kim, and Joydeep Ghosh. 2019. <span>“Towards Realistic Individual Recourse and Actionable Explanations in Black-Box Decision Making Systems.”</span> <a href="https://arxiv.org/abs/1907.09615">https://arxiv.org/abs/1907.09615</a>.
 </div>
+<div id="ref-karimi2021algorithmic" class="csl-entry" role="doc-biblioentry">
+Karimi, Amir-Hossein, Bernhard Schölkopf, and Isabel Valera. 2021. <span>“Algorithmic Recourse: From Counterfactual Explanations to Interventions.”</span> In <em>Proceedings of the 2021 <span>ACM Conference</span> on <span>Fairness</span>, <span>Accountability</span>, and <span>Transparency</span></em>, 353–62.
+</div>
+<div id="ref-molnar2020interpretable" class="csl-entry" role="doc-biblioentry">
+Molnar, Christoph. 2020. <em>Interpretable Machine Learning</em>. <span>Lulu. com</span>.
+</div>
+<div id="ref-pawelczyk2022probabilistically" class="csl-entry" role="doc-biblioentry">
+Pawelczyk, Martin, Teresa Datta, Johannes van-den-Heuvel, Gjergji Kasneci, and Himabindu Lakkaraju. 2022. <span>“Probabilistically <span>Robust</span> <span>Recourse</span>: <span>Navigating</span> the <span>Trade</span>-Offs Between <span>Costs</span> and <span>Robustness</span> in <span>Algorithmic</span> <span>Recourse</span>.”</span> <em>arXiv Preprint arXiv:2203.06768</em>.
+</div>
 <div id="ref-poyiadzi2020face" class="csl-entry" role="doc-biblioentry">
 Poyiadzi, Rafael, Kacper Sokol, Raul Santos-Rodriguez, Tijl De Bie, and Peter Flach. 2020. <span>“<span>FACE</span>: <span>Feasible</span> and Actionable Counterfactual Explanations.”</span> In <em>Proceedings of the <span>AAAI</span>/<span>ACM Conference</span> on <span>AI</span>, <span>Ethics</span>, and <span>Society</span></em>, 344–50.
 </div>
 <div id="ref-schut2021generating" class="csl-entry" role="doc-biblioentry">
 Schut, Lisa, Oscar Key, Rory Mc Grath, Luca Costabello, Bogdan Sacaleanu, Yarin Gal, et al. 2021. <span>“Generating <span>Interpretable Counterfactual Explanations By Implicit Minimisation</span> of <span>Epistemic</span> and <span>Aleatoric Uncertainties</span>.”</span> In <em>International <span>Conference</span> on <span>Artificial Intelligence</span> and <span>Statistics</span></em>, 1756–64. <span>PMLR</span>.
 </div>
+<div id="ref-stutz2022learning" class="csl-entry" role="doc-biblioentry">
+Stutz, David, Krishnamurthy Dj Dvijotham, Ali Taylan Cemgil, and Arnaud Doucet. 2022. <span>“Learning <span>Optimal</span> <span>Conformal</span> <span>Classifiers</span>.”</span> In. <a href="https://openreview.net/forum?id=t8O-4LKFVx">https://openreview.net/forum?id=t8O-4LKFVx</a>.
+</div>
+<div id="ref-wachter2017counterfactual" class="csl-entry" role="doc-biblioentry">
+Wachter, Sandra, Brent Mittelstadt, and Chris Russell. 2017. <span>“Counterfactual Explanations Without Opening the Black Box: <span>Automated</span> Decisions and the <span>GDPR</span>.”</span> <em>Harv. JL &amp; Tech.</em> 31: 841.
+</div>
 </div></section></div></main>
 <!-- /main column -->
 <script id="quarto-html-after-body" type="application/javascript">
diff --git a/build/dev/www/mnist_9to4_latent.png b/build/dev/www/mnist_9to4_latent.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f6b3a53c7295ef3678d841e79dc5e0bd38f6e3c
GIT binary patch
literal 13939
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
IdH31>0e~*Y^#A|>

literal 0
HcmV?d00001

diff --git a/build/dev/www/you_may_not_like_it.png b/build/dev/www/you_may_not_like_it.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b48e585ebcd285c9aa0b2bfabe1c1ff627bbbba
GIT binary patch
literal 17193
zcmb7sbySt>*1aATDU}jLkWMM-2E`51NOvfy(nyyQ(%n+J5$TYS25H!opnxFK8>CCR
zerumQ?)S%c$2acp>~n@7@$Tn+p0(zhbFTFo@>u!NHQd{{7cN}5CMSzfyKvzW4Se2(
z{TKY1xkjV}AF!S(JVIPJ$NcxMAt&y_1)2+ThzA;OX=~~3CQ91-XZuQY#N-T!Xqkv?
zd3405g|`aBUlZRB_ZHmECt=id%41z{&vj>iUaT9Pd<Ewzb_)IjDYNL4vmaCYXUe0s
zHH-5L4A(LSjJJha8y5@f25OI2Ex8_gc+|ps!|UkDuASiDpH16b!qHl985pqp^6KKb
z3!9^8)9K#Nt{8f!)t3$q4z#qiuV24*-I(+~J*w=sIoe$rEz+-I&#;=TclYt}Ay034
zx;{}ueCyUNQc{cN#uDSEMxRp;6O(E9L3MTY@}cnL<Ya{;&U6vyyYOP`?3NI)o%m5@
zH?=sBx!AizL`?kf;X`zhoV+|wP2ZoTZ>fTIXYipg&1!%Bm-o@1kjTh>)B~X#)Drmk
z`1Ouxd3pKJD|J1k_&7Lnva((Bys@#dQV$=hWQe)Xbwm_WG9T-FwjTTP`chn6oYTTf
z92}f&QO}i;qHyJ-9<C-nyGbz)4h}Zv@oERtCZE&Uxw&#j0%Z*i4OsGUfi}mB$-Y!U
z^m<50$dN!V(a@CFHmtLgL@8BZc#EA)s}L@p5_y#`Bq-<+>_GW3yB#0w50?Lv?fGtD
z`{J>3%OqBHnM3dHRKbl`7cXUqd&+!f*Dg*=O47E7YO<S>phW~-zcZg%=ej{E#jaC&
zKj>o)=9MYxTI`5Mb#%b5FTm<=?<*-QXYf6Xh3`4IGBf9VGVQ!uCG2&unapjfS7Ajf
z$fouoxclKXDzR#-K_se2r_`j`VXh<l<422K;^oe{&Zu7#6OAX^J(NPDjo!yzUS8JL
z*5PDr<KwlO1zIyRGiE)-hIP2KNF<WS`Q-O+tE*RoLT|D)x^2;ki;MH{3^g~u*Df*g
zsFdX4*$(4sEG;`~np&iyqS{#;7;QX;K#)9`zBFf9RawcHbc#w~Q~#)Vc(hWYkjTzj
zRpWauAuOw>H=ZW!beqr0#Ky)(?7QbigP`4HeMJS|9f=Rh6LqcwgM*)pn|xr~A}9p4
zavwLl8P8X)eSQDX%#2}dyL>=`Sn9)v4`#~;qb0^wWo7x=B^eW2%fkg)T3Yln;a>|*
z;V!OG2=Lv)FWZt1BQ>nDP4DpjHZ(-aWpr|Oyg?yZ=kNb;W3nOPXPUUDOG^Nb&3FZ?
zR$=l46Dw=C8Lvfe@?f5N4(xh&82PPRR%6T_6hwvf?mM`&&qoS%H!|_bc@UlD)pd2E
zqM|Eq_v2`q)v{$GZo?ixRKcoY|2*8>Dr|nbY)&_yot+uhzU)ro$|OK~>@I(>D`Rhd
z{`K91K-`=2>W|eLJa(l5aoamPEgQDpzkgp`T#V)aUcbr~c9UAj{#_B~wFYObfjM{E
z;rxW&0JsWzV`HksSdyALv!wAzzD9R#ywY6K+|JI9sd;;Ai`A&!tuyjY5bVM8@3|vI
z`aKiKM^RL|=gA)2_S5(Mo9)r41UUZHvGN^s&uGQ7Z?7+1Jvu(#-<WE$pJ|c8R#8#e
zX0KpxzAfQZT~M$BkspDA*n_2T8P>+{c64@jCUF@XVGou*X?^wT6}M>z3CrXA*n|WG
z@626&eSOLAt^KUp-`}U^vwD1bw5t%$@_wRYU_hlq6SC3ltc{pmSiscWTr)>Go%Z3I
za4PX5IMld-g&6ur7N@4m(#LyiYpbhtbaal>2Bsb105{JDk?rpu_@A7fdhV~Ut*>(i
zu;`Y}f6Gxx(AP^e*<Brr3-~QK<ux}wZ4U=qC@3KyptT@w?6uWCQRC!$w8RWA|K@kx
zow0U4X=!P-FPCOFHYDw*zr5vtp_Qj5U8A(vpPq24DT6bz(R6NmGDh!tmqCY4L_|b?
z!0$4fp#AC(ZrXs%OymAEP9~-|C$}3t_ltvqf(V}WBy!0A^1Hlpa=4?ctUOw5s2&Qi
zc2lZ1Rd8TdfFj2GceTS@IEvc$gf<}e@%xsQ(UQK6<CT&oT-xRDdBkL7Io~tI+>s|v
z0GDjq#r1Hyu-|<QIwy7Rt3N)8xo>0B+D=r*gha*Lw6(Vji-?RA8;V*g?;mW<&Ci=<
zZ*QY}@-+)^Y2VzSF8<CTTbd#13;+8NWdcNdm{;&TeEzGpa;w1MaNFF|^VsWfyS=R~
zc}hES(8JR+C@_$9w=;^G?R=uv8FLH%etv+PxTNe>Jk9cQa!Ws}?5wPE)eM?^8k$W?
zKYt!U$7DLM|EjaJvHA5;DK$;_S8LD>xqcEdGVRaSy0mQ&OYyZ=aI{{&tcZ*IHkkD&
zVRp**yw87x$L!7ba!ZvgN7%?0FIFJt^Ul(YDxW71APs698I)yxcRQ(l*^TNCU=<yL
zIZVWb4}-4vz2#qN3nAu$FAw;h`CnFGYz_?%pZIL^vrxDEqe><Km<w;~B}g1NhEyJN
z6l}&onlQa*bdE|U*43+Z)z$N`n+LwPGQ;42>j1=rl?@CG?CtLz4sQcw!0Ng5KU)Jx
z1BO37YvkLuWzqpO!oPmq2R7{a^JPG4%o~|B`@vr9aELlDGXw~^uBWNiIIn2Ib-FLb
zpG*7Hnx{`Tc*eCcrZehrb8|O0Hv={?A4_=rVG$A%Vqjnp7x#wKgv4f~5cAyY1%!Lr
z9;$0Se|o%s4a+|@RsZQzq*{{c4QA!Ed*vGt*mvMXNl7K<_HOGX;F$#xdz?mzks<ch
zVy5r&DaLYyj11hMq}Rbcaq&|qjOCUC8T>CspwJv90)!EqdkItgeTm-8m8GR6RaI43
z)Hqk93@L{mLx9y-S+*Jjjuybby?rUq86y<7GGh-&Ryfs;DC&VI<2*ISt5>gXcXhKr
zd-lx8$VdvC=Q}eqO@Es3x0CgRyP8B&tH0{BkI8xEOL?RkiH+-AiuTma5+OgkC73xl
z)_xCW@mludV`JYF-V=WQon_l}_3ZQ*7QvLMMMy{ppXAFuw@49kpc^QX^JApe@p`3B
zZWl(zmBDLyeT)XKaJoOm_4wVF0_~Erp)RO7!otF1KYm0LPQWc-)1Dp7-QYd``0*pe
zF$F$Wobg)ty*Lxr2Y%VHCj8Ha+76VpXV=#oZGH-r=_)FQ*C)wi3Pnanqtl{tbFNm=
z+pSgj+q@MJ3sNckJ0jn6*^L_w8Vz}#nwt-2J-XrOKh<|xp)q3olj)=O(3=sXogEz(
zP%Kb=v2k%b3w`?4_D`}Q5)9%@^;lV1q0m%TRt`6`E`NRRPvEE6MUSHel{JP=8vcx=
zmMpgRjkwJpKmg#t?{vbX^cI`8t4qs5_tVor0;J8)&xrGxAnE{urjzZk6mK-kZFdSQ
zDm)_glx6dLm0otBFvL=qFJA^gBSV!K0afVQFSh7=D}{~bLOLz><IpNbKI6BWG{AoE
zEs!b$5z84s6Xz`Jmk=APR-nZ}d)fUv1|>HXq8p<V*t9LOV_-uQ9zI4up=}^Q!s;#d
z8oUn62#{`Dvne8`7R2oCu39BV>3QX5p#X_S*q;D8pt@7|qfGAM-@5lI{2EY_j*bo)
z;S2PgoACDCw2B$xmNA6%GT5{-QB*}Fa()TP$t+IB=6B-~6Gv*DU(mJ<NS<3S9Bf}*
z1Pm!3>dJZ)g-h$@?HwXv*-uG}0A|;>>iPRCEi9KJSH7P?=iE0D{SyU20m%Piq;Lt1
zzDZ3Dbg40fnECUI(e;)<JjYcH?3n22$H3YkQZOWPV4&pX(h#JfWq(@CT;_1T=FcWy
z-=CjtfOrDI<aC9C(yhUZ%*tvym<<!K8INaCZRzh{2Rwj%)-N*)0dnPq|4PF9D4x^s
zXudlR!XIiCFqW^ug!G}L9OKyvWHk>SKmH0UyUqXn!$bj`0bq$SWHsP&gxyFWfvD@c
z*XHyCsAXshaoPaNZA}{)sMC<tif7s$9!CoROtup`A7o<y&fW^kHv3%}E!6!6Rc>$X
zr*XCYgZ_Y90@gYvCMI<*YqhQ$wiZ**hx6Bd)$Icb?>O)}J2?cFqM^UOynOfAingut
z#b^LQdl(t>Pt5HcG?CK|Xy&P9Lk{+)3GWPLD?~;{!d6fS*_$j4WoxFsmv?mB2E3M%
zl7j1^=jP&eFTJ&d0Kb0yI;_1==hG}O`ZxIGWfpz61qG`BS$eJ+HF}YgkZ636B@`B*
z-`d)OH$VY9foqs?vV;T&{{W2dj%AFvF$%Q|ASz!V3vf=p^8&4qkQ<=v=g*(LkN5bU
z2q-90VZlcS2M33Tnt*G2XB2R=^==NpivWTwER2QC+~&Io=M+h311fZrJ5i|oC#`R`
zr^wqA(jtnvi`OR`j(^%UUBSZon4PT&l@+uI&x>9WSQKC=fz+)g?6FQbt%+a1Zcqw6
z{-~G|9UTpU>;nLH1&@@H*CKp^29yUod!bskyd(Dgp$~F#uuJEMi<vPoG18$V+{;Ov
zh9XW2ij~iY!>5AbgvCAn$X1d=`nWhb_5Ah)?I8vs2F%dsc&*Cf`cpf*rYEgf#>P_+
zIU2<Vx+0#CqLt1oBO=brw<Kfa0Du~SV9`H{<g*#qxC^Mkv&0>ho^JT7)*0PYK4c7c
z1Nq?P1;ParZzLpUHa2T>bKf9*53d{weq!h9(d^nhJ(!E~K9`g6pXo{BB9rnuKi!v+
z?!Sw{^pqM_^1kLFA-{I_lLLqMQh^4Bh6!9PQ)ohVE-o(gOFQ9TsGgo4H}82BuQR87
zNPfR-^nx!&6tNv3?Xr-3oGGsdaP>gUl$4Z2MX5kg0_%e`!CT+s5x%O>kx=n)W1{Ap
z$-VfynxUcuIH>|QMCT`iE(^Wn92`lPiest7JpkDVOd!JFT%!mexOSWG-nR?F0ek2q
zV?BL+Q6V7>VD!Von%FbHe^*-$P{q|*kvHGwei~3xVh1>DXkb8j=Z@#@a`y30eZP~X
zr#3c4UfRc-GY>5-E!o%#AT(vskYiHVwjzo2?x;wRCEkC24@w2Is(-w7^Ke`*0m@+X
zT&A#-%$~+Z!+r(<63F?4uZiRJ5o6y|^YCm6L0chF(Z#-0ZRf5X03xa2D2XFk*5}V^
z0KpxO-FFsn)Gyrwq#%__&dk0$mBeo|{=L1uy`$qJa21}`d$;h_bCmn6N)#hZx~Waa
z#24ivO@Nr)-RJ?{yEEUN<%LrR?0^;loTGa^j#-7&I`Z{uTfFJd?H9QysDj;F0CjA0
z`49|1_kB)}yfk{}DGMPZ{)R*229KMRl-8D(iwg@b`|E}~+Vny~I@qdBKHgbG6ch#7
zXw>4zv_E4xD%6gf@7~eSA|U7b_}-~xN=OAKa_EZ)2?1#30ATZ26c!cr)w4z0e8EoC
z0!H0c@FjeNICcXs{zeh(6E<x}1Vs*CwS}Oqtu4I$WW_Ue9i1OR)IQ0ki+z=URz^XL
z4IWq)=~Y7T`T%2vw>z{@;+&^%5|ckWo;vS``Z?1QxQ$LHfXhFfYV>AQNaQ<{B9b~e
z*%<)&t!jfMc?N{0wY3$(?eyf(2~LrW%LvHq7PWqwYL?6$agUckoLk>q!(eZE`rphl
zJ-w3ee$8`LKvYPgY!8toL|hlY$$?OTMsL)7cc2a6_IDt@kc}e3!VO?9^d@tIy4?Vs
z=;r2T5oE{s>C-1*PI7W`T*i$RRaL%wtGZHBe&#_a5)QqJ#|tA@a7liTSFV5zg0nvR
z<vN8!J6~&X(unyR?0`<A*C7O&xf#Z}INU}9cJXY)KxL8caSL&5z?TEcrl>eKJ3F5V
zNbr3-1hj;JSywcm^4{|B3T*5^rlc`YT!(sI`uVF2VbRY**vv~<=0ZD56RTtK!q>*i
za{wKIS0+Us0ZKS84WWSq7wT7WHX%};!kGey{`vDK{u@?V>h(J!EI|xFrca?<6a$fj
z2r8pTu@rm!`OOWIH4u;NI<<s>2ZM2=SB=Y>9vN9uNz>VQweI=ZDSAbDXY)8CI-17!
zA`1P@sKF!KoIw$L5a@G*=RT)#<4M!`>BjqqLBMRPY=14Ut=af+QE7vo(VLYQF5O=q
zW_$9?p!;kY$~O@21pw%Ir4$euaBZk>`cR+%L-Pcf>Pj&Pm7M9nyE)Se*VD?^2)TT8
zmD-C&Fj{b6WMt$dUrd*>SzbXwzw)`JKi0MShK6ikRPa#J7H5>n+C)v<?``d0z((dX
zK^PNBK@sw!e$f9uCa&|_`M&;G@4(ZZ;IOb%@IN9VBC@jRQ@*{83A-mEGM>C|^#==d
zuPU}Gz;z*?W@F%dL16a`H+n!x8LkyT0MZ)8Jq<2HiVV9!b@WDTp0Ez^(CvN?cX#s@
znncRx+q@R|gGubVbR?2VWSj;p0S6nt=RHw0op-g0^cc_Mc`uJwzR0l?B_<{Y@?=<Q
z^1xPppi4SAHg>z4IkT(!Xz!;Te@0h-e?JO!m#qiUEzIrZlR-%ZD4m(&4V>*Rg%{vt
z_9VbLEkdT}<ul6WaWISER>Hy*KKC!jb>$|DdkPFPE4^hP2}6WaOB$Kon^KMRxZUXw
z8Iz`Z*&;9?AOMaU)jbCruYRU2!`TuLaCxre6a=Pfk1nVcrT`Z3e6-$TY%Ofsqx}t)
zKcEe8E8RVZOrDsUJ~Wc>+8x%G3Jy<Pip?aX*U_B?nWmYqQ3D0e_iQJ#KV7tkQ7(`G
z=!_tz0>_T=jT<-6e$KUXi;IFF#{I6~eYP5G>FH5m3WU_Zj*E+${cFtb+DT4^MmV0h
zsIV~WxyBIqeZ<Vl?BIL=WWWpLS$Sn8zw%@(_&X{+Pf>vM^yH<4+S;Q~)q!||F8l<)
zVbI`FxjZN)CU#e=@Yc<n=+)JUMsLsIwf1v~ciWu?YHDf-M8I++P?U~cG4M#Z0;cI*
z)MCz42_5AhfhdVjCC7gQnFr{<076nvB9OekzJ8%Uor0Xa2ABs_{u8L4x?=C#-3+>)
zxp&;mH8)5(Nf0yn@+yVbl2fljR)Wy{E|am`t&oU_;j)9eoE+v)HMc%hRc-wElob}%
z1M&-0-EWt*@jR+Ns0aYw%qkfqQeC<o`QS=1Ff;d528JUIj9bO9{F|$%bHcAtX@ixh
zU{F(Ai?JH=1fLC=f!K!#`?}4lSZ3N834{;o;_76BXy?aYW{kx^v#Y=dz?}2`tD*aM
zjaMi_LPLjmEGxj$Bkv;z=4e-9)BwVw@pMlg3>O|x{wzaaag5po3H>;lZoUbLiA=r@
zDIi%osyTDRBS7QF*;MRnWB4JxrqWx!G4MG@jtdGm6Pa}`UcBhKJ`vNpB*QHt;&HG!
z(;=Cjo_-DMp`v0h*cBXIpXRxw=wi7#04xBDHS68Brl(EN0SMv4OR@*4o_Sq9@+T#a
z;tYjn3Q8KccXspvIl=YVTOHe(ZuSS{il!<B4-#a0ejj}O%^@us1W@=L(LEqs`9VZd
zy#Sry+dvJ1g0Td!NO_+pYE?ZxqUq&QY+}-5aA1>m!~+Sovw!$sz0oDWqsl9JN2&4U
zboyKTUtmS$e@5V8ZmQ9{uA?XUrkeqH9N6vj4~(A2l|(5d+}&Nu$pk5VkAVTIj<m8}
z61|rUFk2+!uu-{19~eib7XCmIbai!qRXfmwa>#o0F$NAsDMM_muaAS1vlwLUg9i^#
zWSmSfb20M@@7pUe=H&??OOE7JlW(SVmU!_&xOJYD9Ft-hC~>gmP$MHQQ2!k{AM{77
z8pNET%nZB%CnO{!9P^Js_$X&eoC0jfQfI~h2iX8ET}ciWoS+_oBAt^^gmDFM2`-4o
zJ?(T+SAk+}ORPy_ai0?%1p{{vkK4xVsA`nFZ-T19(y*~^hkk}hcNK@({QcXd5nwpP
zbLj5@R>96N(H1kno-)0lfZuu(6qNJv<6S&sg3;D&g`}aOq1%GCh4_BpRrD-e>^|IC
z?3O2Y^g76jl8E&M<Mjddld_K)MMXAHYaqz$&3i}>E9hJCrGk~yMV_&CGBLkQec)0k
z-}zJq<D~v5eFFIf*2(&hPjet|;O^OsgOeXvyhhz*!@YU;L$*}5qh7Ls=_x1}Fcnb3
zd_%Wh7`*<)0L3r;-jf#48^N59L}dpl!UlcF%drm|DQ;#7mV#M?<xiWX7XkK!sN3dr
zETh7_K?NjUOic!8>LH%E@b3n*V&JuKa6n4R^w1XpKLgVP$mw{Qxx)SXU%<UY$9wSt
zMnm=|AQP+A&Q=Q_zn20L)!Nd6aaqDIlWRLKf9G~e)2n<AHUk2IU|?h%8yh2c)_wT3
ztXc$|Q@CDXVd2@yj>?YZ=p6|@x;c3l^%iSi#(>|y>Rf@`Byt&Zmg7zuS6Yv$^~}>Q
zMc?z^<I;mmMNx^buCAVe`#c3&AxiS>mayY|Jga)|M*AG9x%q*D0c#UKs51abanC(#
zFRyy;hd19Iv(X~l+=P}^%80aUpNyrp8w92Z>o`U`f&C!E$j@I1OP$T^2*4p`!ls23
zvam4MH#Rn=ZG-R%o`ekF8aR9i+$8?9*BmALl8Ws}VT$9UrA|Vr6Yy4KwhS};HNnL|
z`*8=|peB_fVbkgr5?o*UmIIaAyeE<0J$iG~9@rYVYCSe(Mp5jnta8Pwa&1`GZe!E>
z9L!wJ?q4(k?;2wSnB42C<fEsf!zE!cv9!#o?T<(ku?NM+{@GZjaH!s8dtT1J`7sDb
zbg%!VtJgu3s=L>MfvH<ARTHdjZC$7+o`59ebt;{mosD03+zsU?`{GZb23FB%r&8GU
z@VK3!Z{JLxK83|FXa14-WIa{}06Xtki7{V7NgP~VAzO0O)9>8C!Mj%@y9CG+NC1JQ
z8R~UiOHWS^N>KZ`wH4rIELXc?zmf)BW_<pO*ZFjd1JEq_k=xeMQCn9RCwC9BCPUbX
zNmpL`b~q5LCmL$%>gMktU4P9l_4YQ4xU6EB;rtIxQb~=Eu(;K=wS=Nt_nnUs5lYbe
ziTH*Ky#^>@AY+syw7`p9UtKjQ)Zqq31|_M<>yT&V+MELhp)KX38Mh873*+NSgyS?h
zt0<_c&zrAO-@<<bxt}VTm!{XLRF;B<LQZndCjoY|C>YY9Ge&vhUvv_PmZwGK^2IiJ
z?8-Ne_FGBw9d5QuWi2Pmm73W^1BZe(#2!=<M?THHRn+AbbWf7wYCa?`7$J4g+yHt8
zq8Rzow#WDuCjTH;ptgtK2|Ah40XYr$KqcwpHHegkQXSW%6@fDXW``MScP>g2l`z#A
zPHy_*1zQkhv`P2no}WMK06qb|Zd|)&2>f$Zr#o#5Di{>waMHoVhBqnwBI>Zg<6~nW
zGHihpVAMX;`lhC)UNNZ9T}Rns&9TaK=7b@JbuM|u-=p8YU0zz!&3#O(Cg1)Sln{o+
zIgmHv_wLyPFW!!grFz5}z4J{)lC_;f|MM+;EMOAkycU$OWJsg!PCo80P*9+o2Da>e
zB3BbeQ=Z?LD|Z3P%E`$IjPNZ`1kg&5vJ!5aCWmLA;0{uX-XyY``JvY^FVGZ6rKP2J
zL|wWrs+RE-dC8jnVdpNsWX9f;E*(n7H3{91t+~z;NJ6lU0C5uJ-ZV6v0{xHI-@dG{
zAP22Z!L!Y;)oT9i!%4g22<WeXpZTiUWOHXn)M2&_-hKXY9~eIIsom7k(5=x31sN3Q
zR1DeZ^ZV<2xUnvD8!C~b;KadsZJghfru%(T<Q-9zWJFvgwYUd^r%z2R=@a-J-IHXC
zXq?2VD%Y_xbC54oq@<tScPtKdz+Oc<DhQv8WKk=0G+R3^v3HD()qvX<$E2hOr4L+x
zCgn61%R*>nf$G$(VN@vv+0JzK%(&WZ3)#@%4Gut`D1N?19<t{~)Qi#LZes~R7YX<6
zc_=XEZxAEp(Rd;ic2h>I84}*(z<nnt&qj@X!7BL;7y3XCY&;(|;0C<cG@y%Z3jCqN
z9G<|?$VdTOrWNbY&xhsDYG9)ky>qL?Fv4KvXH|)#ta0Nt66<Fe+TweNPBPmxt}%FQ
zZM|xl>1{#TAXq$qcC`C~NB9#^R%qc8pT8trpK3A|&TH@Q=cJ*zf4!8pITmLG%4&jy
zjlRA<n#(Z6AP-$N<-_ZqhB?n15^Af8SI{GH#H&b17zR$)-*XUsSwX@uU#m!dn_-MU
z_0xNhXOGNQy}H>URv$NRfr8BBe?dCdVdj?rF0%C)54uegz|r<sZOkVY-N04`8M{>=
z(FZII;OIma`SXLPnSE@CJy@X475n2?z56#5Y8e_o0`6(S!PvqVr$Hmt@)d&J;8mMb
zQo_ac1VK~?cHNKhacCb#htfIH?n2cx<0Bv<ZugOL|Mx5aF&GLN5Ufi>XF$W|DqLv;
znoWKKS*ZB{T@%oYKwP?wS!I?-iWKrg?+Dq`WL5L%`Dfd4(|4)s8i!A+q17~@R|@?V
z#!HKi%Ja~VR;20_;*u{RnggcA9CeQt0Zt{CLG}I541aH9QDLE*l9jF$20qAjSD|F$
zWBD6Nia}m}SY-o?0U}nJGq3wH8#E(8cGBS;3fN7ieemAidP0Q0P@0lgYo;ltiN7>H
z^0ucBdQEH`97Tu_B61~FKn!u;GcRxu!IgY5oNsPpbBBs5gIR^@Z0`uP2z1dwM!N#K
zV}z|Ex(f@K19%dE<7MUL>Tg;A*P!KtX(vLcL2+n;CJz%+2RKZ^OUqzd{%cIZ+0_*@
zgHTs@425NGZVr!((>m>&2Z$(8gyxI8oL?aoz=k)hwg=Y?7Xl9!=KS*I$)9g333#G%
zpp2o7IkUVBPJsDj0u-NY_-UA4h^>@#rlq5soox?;Rl(YzsQ_wfrie(&>tH4b>`0lC
zDd_UR*a03Xdv2NvO@OSNT+Gk<^Rr_nGQ;DAR6CeUAR;A|p^_rqfvW()m64XNsj1<&
z{t>NW7!?uWy|<c@nwm;!rWqR@y}3W-`$$FxJda^;i>(g1x1sqHo=A#m`#X+z!ui=v
zR1@C0V*?uk@);bG{C?*i5pYJR`JaD>vf#0|>b^9@c<A^U0Q$s}BLGG=4#8LOK0ovJ
zxdXyPz09l|T4^A~5+0?SLj#fl7$rERK#P6PPJq8MF+YQXVFPsmx=PzKw4V52%^kMB
z<>TStP#Q~NIRtVM1impe=MFu%SLz|Xf$)K`;An53Ygi|6V-y%NxM@(zw*QFm^Y22d
z2)>JoV~&c7x{*T46d<dp$gtu}4mCZ=$rZ{ku;V1vor#HwGOjOJH>kuwhXPjw@VLvu
z@*6aSfPethl|+A?06-fsQ&#}>QPO7&z(99)cZ)O&5)CwT$)1{;4y21RQ>%gTv$?y=
zU-Q%$h}1a@CqMx{?4cDAIf7sU7R-G5@aQ}-dUt!ftg;f_NzVPW4Z4s(qw|s)XoQ6i
zA#nj@U0hs>wM(crtib{T*K>Y;zHNmLIO81&uLB6&y}doCM7%XpIx=DJAfaz5HFg-i
zg`aIXzUpLl_s%66(P(;|6U#(7r~^!A!X^E|X=}1ZW%KytMg9q_EiEme@7xTfO~@TD
z_f$u|b%zvzuN=r4fwdY<`!Ik2beo6Z<Mi;6W)unZ?*P?{z)c%rX7c-U9$~U2zs4l&
zFbmj_EMRl{oXg#b_jp8(j7RS(n>wf<P@@+6wTE_m%XmpIbVaaV^*(hl00$}?E&;X^
zALh8B5t=6CFbi$@<<Sx@C44(N=w3lpDl}lcsq?1YVHa9f*C~bUp#pU{htK1l0YQGt
zYZ(bl<q$WvCI!w2Dt;eOy^@(KSAwv)<v10IC9vE;p{uK@eb@$jZF6%IsAiE-1N7vF
z77E@jSip>h`n&rVYwGXb3prwI0gQRMGNR;x4iM1ia_foi5nKu5DV}F*0i1bTe=zOi
z9A{U(2X^WxNoiG;-OtY)#(vV30;InBohoKt>$g>l#VSCp!x29#Rcq14FT-yncx7;3
z7pKXfL&DJbz)7!?f?Lj|a~Ku_rn_E=k+@o@d?JBri*Z5rhYx9@uF6Ng0Dx}=Z1UL;
z*=ei3l=Zait2Jt2XoHoN72NXy9+Tl$B3`|xQ7Qw|nF`L*=4V9m3VN;kvC;~=(&XCP
zH=jVQ)mSlS)y|5B2uT-nS1ZncZfg1s)Cn)+m&z>k5Nj2N8ewDvj9F0@T+d+)J<!wg
z!t%TF09lJjyH|-%abx<`s|&+(U;T4kF2dHXk5?9Wg_v#^P8W5Sb>_IoJ1{OPZ`mA}
z4)pYdu{eGrX7u7zkWm=CrCR(XaWKR!U1;*o=ID;DZl+!cdsqPj4^J$MS007#jDo9M
zPVeaWu#`)urilqn$|UEEF4xBCA=1@roVeynq9N&I7U^A$U>3a*yK;OE?$*WTO&m2b
z)j4f?7?|-gbtB3%Pmn!3;L}~D4P%*G2Ijpmy2sZtx;_y38OJ86zpST#OwZ$<L|l|U
z`N5i&Au`eR`-ws)S<K?aG*xF)-gyHX(+fOE7^XURA^xH-t6aQtZSu~%yxWCbzsq=-
zakTrE(Iyu$pZvxrV#j>Ekp95$3g+WG-tS^pzBKuDoBJK=;gEBb79fUsyJoPqp;3^#
z-u{bC@2w^IghOjL(*RA-R3W9PvjumJ;v3S3#E+aQ8Vcjb7Rl$WY8>>&vwHk!CcZDM
zttpY%n#{ZM?tc;YuU82J%jYPh;^3mw5O3Gu_Dx>nGg;&^`TQo0;9)hb&Ym-q$$wv=
zY$;}?7hYm<N=38X)7^@%lXNW7R}!sfFTTQ9%!kz0wD3!;`w}L+thq0;V$VFT|H>$V
zz&+r%CQoddLeCR`znoenH@9lEO&N)ir)u)uxXzx?m09v$2{$nvtymQWgC%E9&1&yh
zw)%KaSy|Z;l?cNBy-okK2pm$(VqW#rG-KutFMK7h#(q$IKg>{;tJ+gK4B37qtDUxM
ze>U)wn++n8G%7h!pupC2?15vHWpteBXCV&4mYW>Tryys8W0R9}Ysns!C_H%`6k|*o
znYdt{i8G21g<)<MJSu15>g9w%qGuC}T^ra<FTJ=X$#h-jDiGLqQ4!aaR5c8X6Nd@r
zGakU00bb<8FWCQkT?{&y^<5D0|KB^@tN)vhUF`$5D%N#M*?2Gz^QbK6yJ8SH*w{4k
z&^}|*zp6O5w$>-zQy7@fMArD4bPi|#+Tr0LA-Zm(QC++rdITY5Ce42hlQJ<f=27Y5
z=~?TN3iXub{eDs`73LoLC0+f5rXF_@m{D+x=^I|>Wep^T36NGW3k&P+8YFuAYdmb>
z;oWHRGkWtNE_$GA<91Np+JRH_zV=CXSBiwUh$@)mGVxtqvcq%s)x?QY1{{OQN;(!j
zjQ=2B7C2rKavIeqvw*in8%oNC0`n}m3}zjXU!-%%K-kYC<Kl=_53Y>PuFaBC_>tcD
z4)%QT5TMF%1B_Zp#e>@r!2)e@E%EEFgxk1p#PTaOD(5OUyM`Zgob75M+nZ!K(-ZO9
zH?a4as;mb6Sb$d1g*G&ZtAafy6%Qqa5Df!lh(WcksJe!Ou}qkT@t~Z2GiO}u%3CZn
zFXce?K2dhgVYuGi3Aw5Nh3$r;$_i$Js<D~rXX`-w3KbIrLvU}_ZS8ZqTmO!?|NC4i
zB)c1Y&(9E`p(3wz;#|ANC=V4Wq=k7u;ug0b3yiJNqo6*AY)>~|!qYo&F?BHfiv!Ky
zRnZB(u9#~F6NeA{u?VGm;$0+~c<AW-Sin(4%zT?X4Df*VCo)aK`z=f2&BEz#Y26=G
zIn<*L*+&idhrj>D&hitP{Q-yTV_Qze&c<Jo+n~Qg)Sw%Uv`_8-@yRqq?bB0fBv{n`
zEHH~igUe;olGCsga!4BeLIJ%Qa^5oJp+%Z3d!X_1jPhi)d_Y5`FRIms;3TA@j~L8%
zCS1Y&fS@4az|Ms7a$Z%i1e8f8J>&AW^sFxnlS=>hjrkwYb8j^Wm>}miN0A_blo14`
zigtvPKa2;ZNt_LQKHu~3=!huL(;XVlh<K<cxbKMdCZ4xxxAb^;ogFSBw)Xd#arfJ+
ztE&mJVTu9)gc?`%u6D5^$$B&N@^MvB@vIMF=%JQCTA};S_5FvsCU0h4XAC!Q5?x|C
ze+5;C2?cdG--FK9;VmZ07X~s_;-R5L7)Uk%T$dJiqomelO`c?(ZGMuIBjW+yUo=T>
zSi*_qSb+k@42SERc2=OhgIiADPmuS8Jq7zNlm#;tB@Yf+@b=DtByl#-Z^Vqz60|ai
z0wu2=W>04tR;DQzhmwc?pC#Zwu&w?HXG?T60n*-18yt)fo@YZ0$jxOt%EnP}z(a@#
z2=0>@Wh)HtUf_{Z&}41AwqLRps~-Sz3c2YKQ_nOCTp*;(ZR_a{Gm#Wnn~5y-dzAaZ
zTTv-6R7`T#4AyT*%P*se8`5c_UY9tOa|L^NbJ4`lLS$NCWHlIO@)VGp<Ig9^i?T;3
zTm!bAC&2Iu>`l5`pb*tFy{<Us8>+Hi+tp>C-Ve|Z+u3q<mQ~YbzMaYfnw~l(om_iH
z%%n(z3Mc0cZb^URRRT>{q`f4~#y7X1FI-njtPVf=|NrBAieRs_8+4J8;E)EhOi1h0
zzI<lbe|E5CiWCwSCPc&73t}dr{*{bI!Al(V1rpm#TK>6%Cs{~jFcFL=j*9`iN7_HS
z<$A%P;5(=%&4K<EW*{G7EGKGKc?6w5v-B(@jGx$M^z~V7xj4v@JbSH;oImvs3c9K)
zpKw>2WF5-o4<}bw?O#lMeDN%gA}MJ@&D(!fQ!DY`uDRJ?Cc10)zTFb_bD&8n|FhEi
zU|4uK18&KUT(oePe;V6~>9!H4fB+l;iZ*CpOwU$uOMYiTcfo(;%0CMTseaHIAsAJH
z#7xp9IqhytWwK1<WM$vJQ+f+xRg*Z4R3?&AE*?Y_F-G1Y4%h28f?FCiCftvpOF)nf
zQ-BEFD%(4%Zhb;Mk2xYc1iz|b#cU*`o*Gjcb*Pf%%wrH*4Jag1XTf7ZnUhL84Z2Q*
z(qX<M&CRb_CPq8BlJdKi6?(0<2+#GcLhL7LH}~QOa?zL0K!zY@RFEKG@~DCy-i^bh
z#WZ)2n-VtQE+GboICjEX3y8Ocs;0wIOdSIM$@x!8yB+V@AUE?B!TLhXIKPFKuVOr$
z4PiELZ-lVhCXFf>3JDIT53~l=*22g}=lJ_IW{mFI^12`WVf_~<l$PE@!ca>J3ur$^
z6l7;Gk69N166PzDSSF0KuGl83@;}VGeZxsuZ#+|JlFukC`jIS5283*Hby5?fLD?c$
zwTmfLq2-_$5AvHJ@Ytx*%e!L2b{H=gO`|uFS96skQ&!=FE`g^QmD{e`y8Hg#9uo@u
zyWp1N0%#Z!ph4;)$YFq~BchK0^5}>UPccb&LAw1PPzQ<)I(S5Y76niitXAh@gM=wY
zxB-XOsu^2^kuLi_Nr%THx6>nj)dP;l9L1e8#gtUq^`FT~{11n<jq_|<Q^eePRKZRR
zX)%<lXQy{Xo2iG~AAXV1GgDOg#XUbTH<txzKcxkut085c`?g3JQV3%adnyc1MIanp
zT$oVMwhU=07~F#690c<`)h;~oi|29eH|x*>u-lOn_3m*jfQxh}Fq49Z3Uzsr*1u{K
zSn4IFVVsHYv%1{tzpg+~{?z;Hiyuw*r|On}cK7ptU=EN4Tm~k27}f}B0ha4XyuW?<
z$`#!qgb8b6%JfTa)K>MZ>UWsfL!Ru88s|p{LvKY@IYUe?9vpk*rla1(8VnZFoiRE(
z^$A6iY7@HNUfw2$9+^@+h()4o_zW>a*dqP`#?a|eV3LN!g3YQK=-UfzY=XefoGWJE
zZuWDZwck#kXorUv;I6A3{8`|!4qDuj;-1qU@MY+6qhzi}sQ`E+ZVKM{C#fFDDP`pU
zY_=@~F>`ZPOk7+uYISbzVLUvGKpZIQ`YO`O0j)DFHhWeF?OLQ54EeFZz$}eC2)W?d
z>1n78D@8yf5Hk+#Y<&*Q+AuTn*x%FrOgiVu`hzfECH~@rN^~&`_=?E3wl)Iu@42do
z8O?bZWe8~ro6s!MOJK?LIbv0<_8jK{Yb>NiQgrOiMoUB5$-{;v<yLFIeJtqx(xATQ
zsfP@~EH`p9BYNs1opdNcHaIc}n7?Df-LQngt&o;uok(EHda}`*ocjPui0)6x&Hv!E
zfhNySKzEV_`o&DRCD<J^%B_&Sgys;Oh!p5?s8$EgH2Yu8x4cUCGvC``;9Xc4o@%v9
z&~cN?>W>HU;9?NBkB#Z>u7dH)hypJum<PN%sFC(CTZ5SCPlv|}2m`<K&rwlw*p>+5
z^%zLEnPj&|b#pP5uy#|ldfqg87U@e^O&@-21XFnT<Dm;o7&tWnW)yLtCl($F%l-Ja
zHUv8J#D9m_0d2U6AIsL-WUFT|kOs^dY5k-0HA{Wdtk<8xM~IoN8t6YF4~~zCvvoc_
zMY!*+lB-r|7%+<8jUxBCSZTm%_)jE+=nUPwPoj#%A;Ot!J#1$0GFXgA7)H#yd(s8A
zG9wDwU?FACzA+)|{Wa$+H0b7jM*n3$A=Tna8_E16e~8j`erwro;!5kx;_PrEm={tQ
zAwn3ay)=7$1SUR+&7seNpf#eh_57~(XS1)R4A-^o>mOhSWv?;(`apb^j2A3T#377H
z0UmtbvI>ukWJ1ByFpuKFW+e=Kbo<5yqhU^V_HdR7RfS#y0Gq1jM!Zc<zq(266S;Un
zJ0qn1DDVE%aGrV)3s`XoR>N98RhYsGZkekG6Bt2$&*asz(S-P&TeoE60qF??z0`*3
zl7(?({w+xVLks=~H=o2Iqb*_UEMRq5=uLST579!Lt&yjOAQySbq6%K39Et7oTkxbx
zKF`xOY$Rr`@o<sC@N0CPNdPN7{v!oe!C{oT7n!ZqEN)fCO-_SkmWj3YJ6RJqx_%h}
z%ztozX5xq1J{Z0XmJ<66juQjLZ?$u7ODiyP$lO`gs4h&b=Pd6zzI@3*v6(zmiCwt~
zEi!^YQBvQtLrbV>eiP!qK=2^{{9Vn9dOf8kbGGEuVeatpnfvLHb6GQmhGp~=AuYnn
zibeH+dDg-#GXGaB1-jy8f)|(3wP<QfAod7o9^tD(Cn~tbGlSaa;5Ccb8yL(g$={qT
z14j%c32a$OpmbFs2k#%yb?)5Tf_h+W0uzT3qSLACc9E~UWTAl-(!yrx;AT^DaNsuF
zP@Ve5Gpzc-vy+1@#NlS^jgY_V5)AqzOLjp6uTMaWZER-!6MON2#Y94DACDgHUqsbT
zp`+>ZNoa7=5YUUkQFXK7;@GsBr%tP~1WAC{g3^f_#isTm{HKeXL7tWhuiSbF8x^g=
zjDz&}z>5N13*+rSe;5E0wS!x@s=={aj&V<TxPF^WuL5={XPTe0rl5axG>HYeR@!I6
zQ0mK?p`l|H#zD8=mXO%z7IGi2MMi;J>1+ZfWi-Y6k2jiBNYn~6l0(IP%+~ql2fo2D
z070N+9k_{#@xbv}&re_sqYG<-Kh5;?=06F+5WRpz)sKqgNTA|c&Rn+qL$l)ZyG?27
z=^;ZfosWdUc$V||_O3sUgbP#^B-iGnQ(I15CwRMH2$oy5y6KHz)YK!R8|yF>nQysh
z%Qb0XL>@QVJg+R+*au%r@P)~_H0x5BnnPM~bE7S)3uJqk>9C#{=_}#Y<66SQEYEk`
z-1~r<5&lg<-~q$OHaE78QUW^h_hY<w`UDY}M%(rPL`uxHifZhsLfLO>VbPvgFzwxI
z_XTL1+w{8gq$C3qQ$Bc7z7x`2;{FpwUK^9*e{=AE70hA7pOr5j#X~or<@^LlQ#Te&
zs**f6Q#W|>za5bO5rqHag8f?pEu`BMf;0JwrRn@kRQ2TKBp4=)t|KdKf4#+UT{38<
zFyp#DuUFc<`>Z8?shg+ds_QyIHCs?Bv3vJDD(x^*4m#8g$&>r>K!6Fe0r(MP4W5Fk
z2Uiz;zCazp<*)wv8wvx0*8IQ?r(CeByPa(XM_o`Euf8|;3O}d2bPx2^@~K?F#zo9r
zp>w|@XcTV)U01|R%s^9!o(I)Bd!5H_{<4uBCu!$R!Sj5dCO5H7JMJJI!axF;xTZsa
zp&!Cy^5p_@voROL!eN~8wrWLNIH~U`_@kNw(nrtFnk%D~#BcqRAj04nnhyg~_S)Db
z?lAezgxs9fg;oM>=-*{8&I%Gx>KZ)!wnG7hJ(r4M6qzmmR;Ic$Ldex^SCE78dW}=i
z=+Nx`Cum(E4ngM!^T2bX$W7TfppN{75Fdyc2_DEHjoj#a3K|+Dst0IPWusKYn+F_g
zi$)r1sEFeYHw~w%J0(V_6maELCE!^}B+SUkIhTN8MvR8eDI@N_i#HrUVrH<bNWcCO
z<LN!F^*l6Z{gOjF$Lk4c*-*W0yWGU$jN`9|;&hrP0ePW`1~X?zf8+ai-kTq1>tRY6
z^V^<=Mi&ze)HvGt4h^T#63!Rt|1U%BKf`GwAS}8SPf96WB;jw%Lmp5pcpDl!#OT%=
zk_>;_G8luzrtjqHgv!juM#)K>zVM_(g<G&j)r@OmE8c(u89w)M@`MG9fgx(3DW~d#
z0c@}RU#<v@Qy>q1LvSn%kpf#LsAAtL;C7ssMP~w9kl2ZeS+KKQ=mctN#IWxJ&E^1>
z`envXY`C;AvLJ<V)sUDmJ_I@ca}w3RiI?X+7<@r)p2Zo1=4vbdY}QRw_JGp?dpS5!
zrHzZ}b?41<QkZ=r3Oo)Jo-mg5_+y2vcs?A;Qh%K(sseBgzL8hyC0d=D%GOrX1W!D?
zmx+|V{omtjCsNsQ5qboXEMRNUp`hOw(vm~9zdEL#w71#)M!VR676s#d&cfQZuT)lV
zetbUow+h#@$cm$5_Ig8~Y0!<QWdC>FDe#5q1p`e$Q$~4kx<ZCvy!&7Dv_289NyzN4
zI)YgkAi<<#m76{b3`mk4p1kmxb6dh6-oAZuv?JH%^-(M{ytg%D!+Ej)4stWEv%Z6n
z%i|kHLu^W^)lcHt?Qk`nNX29Pgw^p%g=EH2QUjEho3C{7r6@Y8w2A4K#r~biFJsWf
zgI<W5CN#ID<6$};e1ngz$83{SXEkn1!nQ<Z@0wZ|TruwKE5V!p!5RL;tA8DKkGL0x
zp`9t#_x{qmryGQ*6biX#E;eJqIZOVjx3Dc;ePXDqN2q>((i7pnIek$Trcn^_;MEYD
z!{g_O!CBoNZpWgZVLvYgvV!BNCR{Ip!~J~A9~gmagy5SbnHj>K^fwSz|Dv@AL9?U+
z>$zyg_Z43Tq$RF28Po`bz6{vco=|)=tsVPl5KK7@m9{}O<)Ct_LAqg^H`nigXZ0L-
zir{}g^Z)Uqr|B-&`~~B&oQ`ol(BchgDPozpmAy<izYbGA+k}C24b`VXqULT_IE_{!
zQW+}`DBV+Q`XY{_-0+0wSM^q9^`K)liWW-o)7B@J!Weq!nbsi0Os3wh--}Ol+iz1(
zinm0PC;0c~yNQw2wY5ZnqCE#iGmSYHF8tMj`F8<0rd8A5zLh887|b<Kt?K6QXlify
z-ac=&R3h8i(p2t6=40u;5ucnaOF}iYz7C>n>&wlv=EE3wPq+Qzup4?M_sV;p%KZc0
zjBgM?qfJ0Y)+ue9aTjC3)6vt1Jbk^Q6sG>B&ZIgi$g}Ohp}IW0^&0y`c6K{$ZaZN|
zH&a!TT$YuKI^YE-)|D%S?R|X_5Kx`8NlC`~RH60#G)*tWRu3Hx($PORS%%cA<9u<c
z4)spT$4I2>u}#6jE1yFwuo^dtkwL5fVLWuF2^iVg6?dmUn9jHcutDtO#_Cx+K!>3R
zI*L9~Y!lDAqI&OCdQnidf=i%TA*RcI;UA!%J)xh$1Mn_t+%Of|K28B<0)pY6BrrWQ
z&_lgmy0U-t%t0Hyoo@rrR3T>e16wyNuG`PH;c%on3}BwF3ULI_rZ*#9+w7ZKxk}i>
z$2~P}tIvcZ6B{&oy!EiEa<*=?+a$x-<-k!MZ&<fp0Hu-E&|ejQv<(K;91^Bpa5$@0
z#v6Qhq~x&a|1_yaHb8Urzpq|3bDoNt+7|}x8i^#`Tz^zMWNi<?s9|!_t1k9nwpZ1E
zja{6@HM>gMmhiwC%LjVnFhkVFcK@|&BA7qBFytS0^?|{~zc4=&%ocseDuiwKU%caj
r8E)@?HShnkhWwk7VEvyeW9R(Bs~@+`d`eq~Fjyidt&Av^GV%L=(F!i>

literal 0
HcmV?d00001

diff --git a/dev/proposal.qmd b/dev/proposal.qmd
index 0987858c..08bdb0e7 100644
--- a/dev/proposal.qmd
+++ b/dev/proposal.qmd
@@ -1,41 +1,100 @@
 ---
-title: Conformal Counterfactual Explanations
+title: High-Fidelity Counterfactual Explanations through Conformal Prediction
 subtitle: Research Proposal
 abstract: |
-    We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data generating process. While this an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces an significant engineering overhead, but also reallocates the task of creating realistic model explanations from the model itsel to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.
+    We propose Conformal Counterfactual Explanations: an effortless and rigorous way to produce realistic and faithful Counterfactual Explanations using Conformal Prediction. To address the need for realistic counterfactuals, existing work has primarily relied on separate generative models to learn the data-generating process. While this is an effective way to produce plausible and model-agnostic counterfactual explanations, it not only introduces a significant engineering overhead but also reallocates the task of creating realistic model explanations from the model itself to the generative model. Recent work has shown that there is no need for any of this when working with probabilistic models that explicitly quantify their own uncertainty. Unfortunately, most models used in practice still do not fulfil that basic requirement, in which case we would like to have a way to quantify predictive uncertainty in a post-hoc fashion.
 ---
 
+```{julia}
+using CounterfactualExplanations
+using CounterfactualExplanations.Data: load_mnist
+using CounterfactualExplanations.Models: load_mnist_mlp
+using Images
+using MLDatasets
+using MLDatasets: convert2image
+using Plots
+www_path = "dev/www"
+```
+
 ## Motivation
 
-Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models, but also enable affected individuals to challenge them though the means of Algorithmic Recourse. 
+Counterfactual Explanations are a powerful, flexible and intuitive way to not only explain black-box models but also enable affected individuals to challenge them through the means of Algorithmic Recourse. 
 
 ### Counterfactual Explanations or Adversarial Examples?
 
-Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\in\mathcal{X}$ into a black-box model $f: \mathcal{X} \mapsto \mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\in\mathcal{Y}$. Formally, this boils down to defining some loss function $\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped down counterfactual explanation is therefore little different from an adversarial example.
-
-> You may not like it, but this is what counterfactuals look like ...
-
-The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intened to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be "plausible", "realistic" or "feasible". To fulfill this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argue that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). 
+Most state-of-the-art approaches to generating Counterfactual Explanations (CE) rely on gradient descent in the feature space. The key idea is to perturb inputs $x\in\mathcal{X}$ into a black-box model $f: \mathcal{X} \mapsto \mathcal{Y}$ in order to change the model output $f(x)$ to some pre-specified target value $t\in\mathcal{Y}$. Formally, this boils down to defining some loss function $\ell(f(x),t)$ and taking gradient steps in the minimizing direction. The so-generated counterfactuals are considered valid as soon as the predicted label matches the target label. A stripped-down counterfactual explanation is therefore little different from an adversarial example. In @fig-adv, for example, generic counterfactual search as in @wachter2017counterfactual has been applied to MNIST data.
+
+```{julia}
+# Data:
+counterfactual_data = load_mnist()
+X, y = CounterfactualExplanations.DataPreprocessing.unpack_data(counterfactual_data)
+input_dim, n_obs = size(counterfactual_data.X)
+M = load_mnist_mlp()
+# Target:
+factual_label = 8
+x = reshape(X[:,rand(findall(predict_label(M, counterfactual_data).==factual_label))],input_dim,1)
+target = 3
+factual = predict_label(M, counterfactual_data, x)[1]
+# Search:
+n_ce = 3
+generator = GenericGenerator()
+ces = generate_counterfactual(x, target, counterfactual_data, M, generator; num_counterfactuals=n_ce)
+```
+
+```{julia}
+image_size = 200
+p1 = plot(
+    convert2image(MNIST, reshape(x,28,28)),
+    axis=nothing, 
+    size=(image_size, image_size),
+    title="Factual"
+)
+plts = [p1]
+
+counterfactuals = CounterfactualExplanations.counterfactual(ces)
+phat = target_probs(ces)
+for x in zip(eachslice(counterfactuals; dims=3), eachslice(phat; dims=3))
+    ce, _phat = (x[1],x[2])
+    _title = "p(y=$(target)|x′)=$(round(_phat[1]; digits=3))"
+    plt = plot(
+        convert2image(MNIST, reshape(ce,28,28)),
+        axis=nothing, 
+        size=(image_size, image_size),
+        title=_title
+    )
+    plts = [plts..., plt]
+end
+plt = plot(plts...; size=(image_size * (n_ce + 1),image_size), layout=(1,(n_ce + 1)))
+savefig(plt, joinpath(www_path, "you_may_not_like_it.png"))
+```
+
+![You may not like it, but this is what stripped-down counterfactuals look like. Here we have used @wachter2017counterfactual to generate multiple counterfactuals for turning an 8 (eight) into a 3 (three).](www/you_may_not_like_it.png){#fig-adv}
+
+The crucial difference between adversarial examples and counterfactuals is one of intent. While adversarial examples are typically intended to go unnoticed, counterfactuals in the context of Explainable AI are generally sought to be "plausible", "realistic" or "feasible". To fulfil this latter goal, researchers have come up with a myriad of ways. @joshi2019realistic were among the first to suggest that instead of searching counterfactuals in the feature space, we can instead traverse a latent embedding learned by a surrogate generative model. Similarly, @poyiadzi2020face use density ... Finally, @karimi2021algorithmic argues that counterfactuals should comply with the causal model that generates them [CHECK IF WE CAN PHASE THIS LIKE THIS]. Other related approaches include ... All of these different approaches have a common goal: they aim to ensure that the generated counterfactuals comply with the (learned) data-generating process (DGB). 
 
 ::: {#def-plausible}
 
 ## Plausible Counterfactuals
 
-Since we are in the business of explaining a black-box model, the task of learning realistic representations of the data should not be reallocated from the model itself to some surrogate model.
+Formally, if $x \sim \mathcal{X}$ and for the corresponding counterfactual we have $x^{\prime}\sim\mathcal{X}^{\prime}$, then for $x^{\prime}$ to be considered a plausible counterfactual, we need: $\mathcal{X} \approxeq \mathcal{X}^{\prime}$.
 
 :::
 
-Formally, if $x \sim \mathcal{X}$ and for the corresponding counterfactual we have $x^{\prime}\sim\mathcal{X}x^{\prime}$, then 
+In the context of Algorithmic Recourse, it makes sense to strive for plausible counterfactuals, since anything else would essentially require individuals to move to out-of-distribution states. But it is worth noting that our ambition to meet this goal, may have implications on our ability to faithfully explain the behaviour of the underlying black-box model (arguably our principal goal). By essentially decoupling the task of learning plausible representations of the data from the model itself, we open ourselves up to vulnerabilities. Using a separate generative model to learn $\mathcal{X}$, for example, has very serious implications for the generated counterfactuals. @fig-latent compares the results of applying REVISE [@joshi2019realistic] to MNIST data using two different Variational Auto-Encoders: while the counterfactual generated using an expressive (strong) VAE is compelling, the result relying on a less expressive (weak) VAE is not even valid. In this latter case, the decoder step of the VAE fails to yield values in $\mathcal{X}$ and hence the counterfactual search in the learned latent space is doomed. 
 
-![](www/mnist_9to4_latent.png)
+![Counterfactual explanations for MNIST using a Latent Space generator: turning a nine (9) into a four (4).](www/mnist_9to4_latent.png){#fig-latent}
+
+> Here it would be nice to have another example where we poison the data going into the generative model to hide biases present in the data (e.g. Boston housing).
 
-- Show DiCE for weak MLP
-- Show Latent for same weak MLP
 - Latent can be manipulated: 
     - train biased model
     - train VAE with biased variable removed/attacked (use Boston housing dataset)
     - hypothesis: will generate bias-free explanations
 
+### From Plausible to High-Fidelity Counterfactuals {#sec-fidelity}
+
+In light of the findings, we propose to generally avoid using surrogate models to learn $\mathcal{X}$ in the context of Counterfactual Explanations.
+
 ::: {#prp-surrogate}
 
 ## Avoid Surrogates
@@ -44,25 +103,56 @@ Since we are in the business of explaining a black-box model, the task of learni
 
 :::
 
-## Introduction to Conformal Prediction
+In cases where the use of surrogate models cannot be avoided, we propose to weigh the plausibility of counterfactuals against their fidelity to the black-box model. In the context of Explainable AI, fidelity is defined as describing how an explanation approximates the prediction of the black-box model [@molnar2020interpretable]. Fidelity has become the default metric for evaluating Local Model-Agnostic Models, since they often involve local surrogate models whose predictions need not always match those of the black-box model. 
 
-- distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification
+In the case of Counterfactual Explanations, the concept of fidelity has so far been ignored. This is not altogether surprising, since by construction and design, Counterfactual Explanations work with the predictions of the black-box model directly: as stated above, a counterfactual $x^{\prime}$ is considered valid if and only if $f(x^{\prime})=t$, where $t$ denote some target outcome. 
 
-### Post-hoc
+Does fidelity even make sense in the context of CE, and if so, how can we define it? In light of the examples in the previous section, we think it is urgent to introduce a notion of fidelity in this context, that relates to the distributional properties of the generated counterfactuals. In particular, we propose that a high-fidelity counterfactual $x^{\prime}$ complies with the class-conditional distribution $\mathcal{X}_{\theta} = p_{\theta}(X|y)$ where $\theta$ denote the black-box model parameters. 
 
-- Take any fitted model and turn it into a conformal model using calibration data.
+::: {#def-fidele}
+
+## High-Fidelity Counterfactuals
+
+Let $\mathcal{X}_{\theta}|y = p_{\theta}(X|y)$ denote the class-conditional distribution of $X$ defined by $\theta$. Then for $x^{\prime}$ to be considered a high-fidelity counterfactual, we need: $\mathcal{X}_{\theta}|t \approxeq \mathcal{X}^{\prime}$ where $t$ denotes the target outcome.
+
+:::
+
+In order to assess the fidelity of counterfactuals, we propose the following two-step procedure:
+
+1) Generate samples $X_{\theta}|y$ and $X^{\prime}$ from $\mathcal{X}_{\theta}|t$ and $\mathcal{X}^{\prime}$, respectively.
+2) Compute the Maximum Mean Discrepancy (MMD) between $X_{\theta}|y$ and $X^{\prime}$. 
+
+If the computed value is different from zero, we can reject the null-hypothesis of fidelity.
 
-### Intrinsic --- Conformal Training [MAYBE]
+> Two challenges here: 1) implementing the sampling procedure in @grathwohl2020your; 2) it is unclear if MMD is really the right way to measure this. 
 
-- Model explicitly trained for conformal prediction.
+## Conformal Counterfactual Explanations
 
-## Conformal Counterfactuals
+In @sec-fidelity, we have advocated for avoiding surrogate models in the context of Counterfactual Explanations. In this section, we introduce an alternative way to generate high-fidelity Counterfactual Explanations. In particular, we propose Conformal Counterfactual Explanations (CCE), that is Counterfactual Explanations that minimize the predictive uncertainty of conformal models. 
+
+### Minimizing Predictive Uncertainty
+
+@schut2021generating demonstrated that the goal of generating realistic (plausible) counterfactuals can also be achieved by seeking counterfactuals that minimize the predictive uncertainty of the underlying black-box model. Similarly, @antoran2020getting ...
 
-- Realistic counterfactuals by minimizing predictive uncertainty [@schut2021generating].
 - Problem: restricted to Bayesian models.
-- Solution: post-hoc predictive uncertainty quantification. 
+- Solution: post-hoc predictive uncertainty quantification. In particular, Conformal Prediction. 
+
+### Background on Conformal Prediction
+
+- Distribution-free, model-agnostic and scalable approach to predictive uncertainty quantification.
 - Conformal prediction is instance-based. So is CE. 
-- Does the coverage guarantee carry over to counterfactuals?
+- Take any fitted model and turn it into a conformal model using calibration data.
+- Our approach, therefore, relaxes the restriction on the family of black-box models, at the cost of relying on a subset of the data. Arguably, data is often abundant and in most applications practitioners tend to hold out a test data set anyway. 
+
+> Does the coverage guarantee carry over to counterfactuals?
+
+### Generating Conformal Counterfactuals
+
+While Conformal Prediction has recently grown in popularity, it does introduce a challenge in the context of classification: the predictions of Conformal Classifiers are set-valued and therefore difficult to work with, since they are, for example, non-differentiable. Fortunately, @stutz2022learning introduced carefully designed differentiable loss functions that make it possible to evaluate the performance of conformal predictions in training. We can leverage these recent advances in the context of gradient-based counterfactual search ...
+
+> Challenge: still need to implement these loss functions. 
+
+## Experiments
 
 ### Research Questions
 
@@ -72,14 +162,15 @@ Since we are in the business of explaining a black-box model, the task of learni
 - What happens as we vary coverage and setsize?
 - What happens as we improve the model robustness?
 - What happens as we improve the model's ability to incorporate predictive uncertainty (deep ensemble, laplace)?
+- What happens if we combine with DiCE, ClaPROAR, Gravitational?
+- What about CE robustness to endogenous shifts [@altmeyer2023endogenous]?
 
-## Experiments
-
-- Maybe: conformalised Laplace
 - Benchmarking:
-    - add PROBE into the mix
+    - add PROBE [@pawelczyk2022probabilistically] into the mix.
     - compare travel costs to domain shits.
 
+> Nice to have: What about using Laplace Approximation, then Conformal Prediction? What about using Conformalised Laplace? 
+
 ## References
 
 
diff --git a/dev/www/you_may_not_like_it.png b/dev/www/you_may_not_like_it.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b48e585ebcd285c9aa0b2bfabe1c1ff627bbbba
GIT binary patch
literal 17193
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

literal 0
HcmV?d00001

-- 
GitLab